23 package org.graalvm.compiler.hotspot.aarch64; |
23 package org.graalvm.compiler.hotspot.aarch64; |
24 |
24 |
25 import static jdk.vm.ci.aarch64.AArch64.zr; |
25 import static jdk.vm.ci.aarch64.AArch64.zr; |
26 import static jdk.vm.ci.code.ValueUtil.asRegister; |
26 import static jdk.vm.ci.code.ValueUtil.asRegister; |
27 import static jdk.vm.ci.code.ValueUtil.isRegister; |
27 import static jdk.vm.ci.code.ValueUtil.isRegister; |
|
28 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC; |
28 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.HINT; |
29 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.HINT; |
29 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL; |
30 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL; |
30 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; |
31 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; |
31 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK; |
32 import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK; |
32 |
33 |
33 import org.graalvm.compiler.asm.Label; |
34 import org.graalvm.compiler.asm.Label; |
|
35 import org.graalvm.compiler.asm.aarch64.AArch64Address; |
34 import org.graalvm.compiler.asm.aarch64.AArch64Assembler; |
36 import org.graalvm.compiler.asm.aarch64.AArch64Assembler; |
35 import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler; |
37 import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler; |
36 import org.graalvm.compiler.core.common.CompressEncoding; |
38 import org.graalvm.compiler.core.common.CompressEncoding; |
|
39 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig; |
|
40 import org.graalvm.compiler.lir.LIRInstruction; |
37 import org.graalvm.compiler.lir.LIRInstructionClass; |
41 import org.graalvm.compiler.lir.LIRInstructionClass; |
38 import org.graalvm.compiler.lir.StandardOp.LoadConstantOp; |
42 import org.graalvm.compiler.lir.StandardOp.LoadConstantOp; |
39 import org.graalvm.compiler.lir.aarch64.AArch64LIRInstruction; |
43 import org.graalvm.compiler.lir.aarch64.AArch64LIRInstruction; |
40 import org.graalvm.compiler.lir.asm.CompilationResultBuilder; |
44 import org.graalvm.compiler.lir.asm.CompilationResultBuilder; |
41 |
45 |
76 |
80 |
77 @Override |
81 @Override |
78 public Constant getConstant() { |
82 public Constant getConstant() { |
79 return constant; |
83 return constant; |
80 } |
84 } |
|
85 } |
|
86 |
|
87 public static final class BaseMove extends AArch64LIRInstruction { |
|
88 public static final LIRInstructionClass<BaseMove> TYPE = LIRInstructionClass.create(BaseMove.class); |
|
89 |
|
90 @LIRInstruction.Def({REG, HINT}) protected AllocatableValue result; |
|
91 private final GraalHotSpotVMConfig config; |
|
92 |
|
93 public BaseMove(AllocatableValue result, GraalHotSpotVMConfig config) { |
|
94 super(TYPE); |
|
95 this.result = result; |
|
96 this.config = config; |
|
97 } |
|
98 |
|
99 @Override |
|
100 public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { |
|
101 try (AArch64MacroAssembler.ScratchRegister sc = masm.getScratchRegister()) { |
|
102 Register scratch = sc.getRegister(); |
|
103 masm.adrp(scratch); |
|
104 masm.add(64, scratch, scratch, 1); |
|
105 masm.ldr(64, asRegister(result), AArch64Address.createBaseRegisterOnlyAddress(scratch)); |
|
106 masm.nop(); |
|
107 crb.recordMark(config.MARKID_NARROW_KLASS_BASE_ADDRESS); |
|
108 } |
|
109 } |
|
110 |
81 } |
111 } |
82 |
112 |
83 /** |
113 /** |
84 * Compresses a 8-byte pointer as a 4-byte int. |
114 * Compresses a 8-byte pointer as a 4-byte int. |
85 */ |
115 */ |
115 masm.movx(resultRegister, ptr); |
145 masm.movx(resultRegister, ptr); |
116 } |
146 } |
117 } else if (nonNull) { |
147 } else if (nonNull) { |
118 masm.sub(64, resultRegister, ptr, base); |
148 masm.sub(64, resultRegister, ptr, base); |
119 if (encoding.hasShift()) { |
149 if (encoding.hasShift()) { |
120 masm.shl(64, resultRegister, resultRegister, encoding.getShift()); |
150 masm.lshr(64, resultRegister, resultRegister, encoding.getShift()); |
121 } |
151 } |
122 } else { |
152 } else { |
123 // if ptr is null it still has to be null after compression |
153 // if ptr is null it still has to be null after compression |
124 masm.cmp(64, ptr, 0); |
154 masm.cmp(64, ptr, 0); |
125 masm.cmov(64, resultRegister, ptr, base, AArch64Assembler.ConditionFlag.NE); |
155 masm.cmov(64, resultRegister, ptr, base, AArch64Assembler.ConditionFlag.NE); |
190 // masm.cmp(32, ptr, 0); |
220 // masm.cmp(32, ptr, 0); |
191 // masm.add(64, result, heapBase, ptr, ARMv8Assembler.ExtendType.UXTX, alignment); |
221 // masm.add(64, result, heapBase, ptr, ARMv8Assembler.ExtendType.UXTX, alignment); |
192 // masm.cmov(64, result, result, ARMv8.zr, ARMv8Assembler.ConditionFlag.NE); |
222 // masm.cmov(64, result, result, ARMv8.zr, ARMv8Assembler.ConditionFlag.NE); |
193 // } |
223 // } |
194 |
224 |
195 public static void decodeKlassPointer(AArch64MacroAssembler masm, Register result, Register ptr, Register klassBase, CompressEncoding encoding) { |
225 public static void decodeKlassPointer(CompilationResultBuilder crb, AArch64MacroAssembler masm, Register result, Register ptr, CompressEncoding encoding, GraalHotSpotVMConfig config) { |
196 // result = klassBase + ptr << shift |
226 try (AArch64MacroAssembler.ScratchRegister sc = masm.getScratchRegister()) { |
197 if (encoding.hasShift() || encoding.hasBase()) { |
227 Register scratch = sc.getRegister(); |
198 masm.add(64, result, klassBase, ptr, AArch64Assembler.ExtendType.UXTX, encoding.getShift()); |
228 boolean pic = GeneratePIC.getValue(crb.getOptions()); |
199 } |
229 if (pic || encoding.hasBase() || encoding.getShift() != 0) { |
200 } |
230 if (pic) { |
201 |
231 masm.addressOf(scratch); |
|
232 masm.ldr(64, scratch, AArch64Address.createBaseRegisterOnlyAddress(scratch)); |
|
233 masm.add(64, result, scratch, ptr, AArch64Assembler.ExtendType.UXTX, encoding.getShift()); |
|
234 crb.recordMark(config.MARKID_NARROW_KLASS_BASE_ADDRESS); |
|
235 } else { |
|
236 masm.mov(scratch, encoding.getBase()); |
|
237 masm.add(64, result, scratch, ptr, AArch64Assembler.ExtendType.UXTX, encoding.getShift()); |
|
238 } |
|
239 } |
|
240 } |
|
241 } |
202 } |
242 } |