src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMove.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Cdiff src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMove.java

src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMove.java

Print this page

        

*** 20,39 **** * or visit www.oracle.com if you need additional information or have any * questions. */ package org.graalvm.compiler.hotspot.aarch64; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.HINT; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK; - import static jdk.vm.ci.code.ValueUtil.asRegister; import org.graalvm.compiler.asm.aarch64.AArch64Assembler; import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler; ! import org.graalvm.compiler.debug.GraalError; ! import org.graalvm.compiler.hotspot.CompressEncoding; import org.graalvm.compiler.lir.LIRInstructionClass; import org.graalvm.compiler.lir.StandardOp.LoadConstantOp; import org.graalvm.compiler.lir.aarch64.AArch64LIRInstruction; import org.graalvm.compiler.lir.asm.CompilationResultBuilder; --- 20,40 ---- * or visit www.oracle.com if you need additional information or have any * questions. */ package org.graalvm.compiler.hotspot.aarch64; + import static jdk.vm.ci.aarch64.AArch64.zr; + import static jdk.vm.ci.code.ValueUtil.asRegister; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.HINT; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.ILLEGAL; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.REG; import static org.graalvm.compiler.lir.LIRInstruction.OperandFlag.STACK; + import org.graalvm.compiler.asm.Label; import org.graalvm.compiler.asm.aarch64.AArch64Assembler; import org.graalvm.compiler.asm.aarch64.AArch64MacroAssembler; ! import org.graalvm.compiler.core.common.CompressEncoding; import org.graalvm.compiler.lir.LIRInstructionClass; import org.graalvm.compiler.lir.StandardOp.LoadConstantOp; import org.graalvm.compiler.lir.aarch64.AArch64LIRInstruction; import org.graalvm.compiler.lir.asm.CompilationResultBuilder;
*** 59,69 **** @Override protected void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { crb.recordInlineDataInCode(constant); if (constant.isCompressed()) { // masm.forceMov(asRegister(result), 0); ! throw GraalError.unimplemented(); } else { masm.movNativeAddress(asRegister(result), 0); } } --- 60,70 ---- @Override protected void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { crb.recordInlineDataInCode(constant); if (constant.isCompressed()) { // masm.forceMov(asRegister(result), 0); ! masm.movNarrowAddress(asRegister(result), 0); } else { masm.movNativeAddress(asRegister(result), 0); } }
*** 104,134 **** public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { Register resultRegister = asRegister(result); Register ptr = asRegister(input); Register base = asRegister(baseRegister); // result = (ptr - base) >> shift ! if (encoding.base == 0) { ! if (encoding.shift == 0) { ! masm.movx(resultRegister, ptr); } else { ! assert encoding.alignment == encoding.shift : "Encode algorithm is wrong"; ! masm.lshr(64, resultRegister, ptr, encoding.shift); } } else if (nonNull) { masm.sub(64, resultRegister, ptr, base); ! if (encoding.shift != 0) { ! assert encoding.alignment == encoding.shift : "Encode algorithm is wrong"; ! masm.shl(64, resultRegister, resultRegister, encoding.shift); } } else { // if ptr is null it still has to be null after compression masm.cmp(64, ptr, 0); masm.cmov(64, resultRegister, ptr, base, AArch64Assembler.ConditionFlag.NE); masm.sub(64, resultRegister, resultRegister, base); ! if (encoding.shift != 0) { ! assert encoding.alignment == encoding.shift : "Encode algorithm is wrong"; ! masm.lshr(64, resultRegister, resultRegister, encoding.shift); } } } } --- 105,132 ---- public void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { Register resultRegister = asRegister(result); Register ptr = asRegister(input); Register base = asRegister(baseRegister); // result = (ptr - base) >> shift ! if (!encoding.hasBase()) { ! if (encoding.hasShift()) { ! masm.lshr(64, resultRegister, ptr, encoding.getShift()); } else { ! masm.movx(resultRegister, ptr); } } else if (nonNull) { masm.sub(64, resultRegister, ptr, base); ! if (encoding.hasShift()) { ! masm.shl(64, resultRegister, resultRegister, encoding.getShift()); } } else { // if ptr is null it still has to be null after compression masm.cmp(64, ptr, 0); masm.cmov(64, resultRegister, ptr, base, AArch64Assembler.ConditionFlag.NE); masm.sub(64, resultRegister, resultRegister, base); ! if (encoding.hasShift()) { ! masm.lshr(64, resultRegister, resultRegister, encoding.getShift()); } } } }
*** 159,176 **** Register ptr = asRegister(input); Register resultRegister = asRegister(result); Register base = asRegister(baseRegister); // result = base + (ptr << shift) if (nonNull) { ! assert encoding.shift == encoding.alignment; ! masm.add(64, resultRegister, base, ptr, AArch64Assembler.ShiftType.ASR, encoding.shift); } else { // if ptr is null it has to be null after decompression ! // masm.cmp(64, ); ! throw GraalError.unimplemented(); } - } } // // private static void decompressPointer(CompilationResultBuilder crb, ARMv8MacroAssembler masm, --- 157,179 ---- Register ptr = asRegister(input); Register resultRegister = asRegister(result); Register base = asRegister(baseRegister); // result = base + (ptr << shift) if (nonNull) { ! masm.add(64, resultRegister, base, ptr, AArch64Assembler.ShiftType.LSL, encoding.getShift()); ! } else if (!encoding.hasBase()) { ! masm.add(64, resultRegister, zr, ptr, AArch64Assembler.ShiftType.LSL, encoding.getShift()); } else { // if ptr is null it has to be null after decompression ! Label done = new Label(); ! if (!resultRegister.equals(ptr)) { ! masm.mov(32, resultRegister, ptr); ! } ! masm.cbz(32, resultRegister, done); ! masm.add(64, resultRegister, base, resultRegister, AArch64Assembler.ShiftType.LSL, encoding.getShift()); ! masm.bind(done); } } } // // private static void decompressPointer(CompilationResultBuilder crb, ARMv8MacroAssembler masm,
*** 186,198 **** // masm.cmov(64, result, result, ARMv8.zr, ARMv8Assembler.ConditionFlag.NE); // } public static void decodeKlassPointer(AArch64MacroAssembler masm, Register result, Register ptr, Register klassBase, CompressEncoding encoding) { // result = klassBase + ptr << shift ! if (encoding.shift != 0 || encoding.base != 0) { ! // (shift != 0 -> shift == alignment) ! assert (encoding.shift == 0 || encoding.shift == encoding.alignment) : "Decode algorithm is wrong: " + encoding; ! masm.add(64, result, klassBase, ptr, AArch64Assembler.ExtendType.UXTX, encoding.shift); } } } --- 189,199 ---- // masm.cmov(64, result, result, ARMv8.zr, ARMv8Assembler.ConditionFlag.NE); // } public static void decodeKlassPointer(AArch64MacroAssembler masm, Register result, Register ptr, Register klassBase, CompressEncoding encoding) { // result = klassBase + ptr << shift ! if (encoding.hasShift() || encoding.hasBase()) { ! masm.add(64, result, klassBase, ptr, AArch64Assembler.ExtendType.UXTX, encoding.getShift()); } } }
src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMove.java
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File