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