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
*** old/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMove.java	Mon Mar 20 17:38:05 2017
--- new/src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMove.java	Mon Mar 20 17:38:05 2017

*** 20,39 **** --- 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 static jdk.vm.ci.code.ValueUtil.asRegister; + import org.graalvm.compiler.asm.Label; 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.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 **** --- 60,70 ---- @Override protected void emitCode(CompilationResultBuilder crb, AArch64MacroAssembler masm) { crb.recordInlineDataInCode(constant); if (constant.isCompressed()) { // masm.forceMov(asRegister(result), 0); ! throw GraalError.unimplemented(); ! masm.movNarrowAddress(asRegister(result), 0); } else { masm.movNativeAddress(asRegister(result), 0); } }
*** 104,134 **** --- 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.base == 0) { ! if (encoding.shift == 0) { ! masm.movx(resultRegister, ptr); ! if (!encoding.hasBase()) { ! if (encoding.hasShift()) { ! masm.lshr(64, resultRegister, ptr, encoding.getShift()); } else { ! assert encoding.alignment == encoding.shift : "Encode algorithm is wrong"; masm.lshr(64, resultRegister, ptr, encoding.shift); ! masm.movx(resultRegister, ptr); } } 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); ! 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.shift != 0) { ! assert encoding.alignment == encoding.shift : "Encode algorithm is wrong"; masm.lshr(64, resultRegister, resultRegister, encoding.shift); ! if (encoding.hasShift()) { ! masm.lshr(64, resultRegister, resultRegister, encoding.getShift()); } } } }
*** 159,176 **** --- 157,179 ---- 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); ! 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 ! // masm.cmp(64, ); throw GraalError.unimplemented(); ! 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 **** --- 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.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); ! 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