The PPC port adds some minor extensions to the C2 compiler to support the PPC architecture. We also implemented some new optimizations.
Extend adl/adlc by effect TEMP_DEF.
Adl is the language used to express code generation patterns in the C2 compiler of hotspot. Effects are used to specify additional properties of IR nodes that can not be derived from the match rules. E.g., the USE_DEF effect allows to specify that a register used by a node and a register defined by the node must be identical, as required by two-address assembler instructions.
The new TEMP_DEF effect is similar to USE_DEF, except that a TEMP node will be generated that represents the USE.
With this effect one can express that the def'ed register must be different from the used ones corresponding to ins. Currently this is already possible by specifying effect TEMP for the operand with effect DEF from the match rule.
Introducing this new identifyer makes the code more readable and allows to specify the effect for nodes without match rules.
An example is an optimized encode node, if the base of the compressed heap is 35G aligned, i.e., the shifted narrow oop can be merged with the base by an or instruction.
On PPC we can shift and or with a single instruction, so we can implement Decode with these instructions:
mov Rdst = Rbase
rldimi Rdst = Rdst || (Rsrc << 3)
As the move is off the critical path, this is superior to do a shift and an add. Unfortunately we must guarantee that Rdst != Rsrc. which we do with a TEMP_DEF effect:
instruct decodeN(iRegPdst dst, iRegNsrc src) %{
match(Set dst (DecodeN src));
effect(TEMP_DEF dst);
ImplicitNullChecks on operating systems where the zero page is not read protected.
...