src/jdk.internal.vm.compiler/share/classes/org.graalvm.compiler.hotspot.aarch64/src/org/graalvm/compiler/hotspot/aarch64/AArch64HotSpotMove.java
changeset 50330 2cbc42a5764b
parent 49451 e06f9607f370
child 50858 2d3e99a72541
equal deleted inserted replaced
50329:18fba780c1d1 50330:2cbc42a5764b
    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 }