24
25 import static jdk.vm.ci.amd64.AMD64.rbp;
26 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
27 import static org.graalvm.compiler.hotspot.HotSpotBackend.INITIALIZE_KLASS_BY_SYMBOL;
28 import static org.graalvm.compiler.hotspot.HotSpotBackend.RESOLVE_KLASS_BY_SYMBOL;
29 import static org.graalvm.compiler.hotspot.HotSpotBackend.RESOLVE_METHOD_BY_SYMBOL_AND_LOAD_COUNTERS;
30 import static org.graalvm.compiler.hotspot.HotSpotBackend.RESOLVE_STRING_BY_SYMBOL;
31
32 import java.util.ArrayList;
33 import java.util.List;
34
35 import org.graalvm.compiler.asm.amd64.AMD64Address.Scale;
36 import org.graalvm.compiler.core.amd64.AMD64ArithmeticLIRGenerator;
37 import org.graalvm.compiler.core.amd64.AMD64LIRGenerator;
38 import org.graalvm.compiler.core.amd64.AMD64LIRKindTool;
39 import org.graalvm.compiler.core.amd64.AMD64MoveFactoryBase.BackupSlotProvider;
40 import org.graalvm.compiler.core.common.CompressEncoding;
41 import org.graalvm.compiler.core.common.LIRKind;
42 import org.graalvm.compiler.core.common.spi.ForeignCallLinkage;
43 import org.graalvm.compiler.core.common.spi.LIRKindTool;
44 import org.graalvm.compiler.debug.Debug;
45 import org.graalvm.compiler.debug.GraalError;
46 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
47 import org.graalvm.compiler.hotspot.HotSpotBackend;
48 import org.graalvm.compiler.hotspot.HotSpotDebugInfoBuilder;
49 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
50 import org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult;
51 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
52 import org.graalvm.compiler.hotspot.HotSpotLockStack;
53 import org.graalvm.compiler.hotspot.debug.BenchmarkCounters;
54 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
55 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
56 import org.graalvm.compiler.hotspot.stubs.Stub;
57 import org.graalvm.compiler.lir.LIR;
58 import org.graalvm.compiler.lir.LIRFrameState;
59 import org.graalvm.compiler.lir.LIRInstruction;
60 import org.graalvm.compiler.lir.LIRInstructionClass;
61 import org.graalvm.compiler.lir.LabelRef;
62 import org.graalvm.compiler.lir.StandardOp.NoOp;
63 import org.graalvm.compiler.lir.SwitchStrategy;
64 import org.graalvm.compiler.lir.Variable;
538 public void beforeRegisterAllocation() {
539 super.beforeRegisterAllocation();
540 boolean hasDebugInfo = getResult().getLIR().hasDebugInfo();
541 AllocatableValue savedRbp = saveRbp.finalize(hasDebugInfo);
542 if (hasDebugInfo) {
543 getResult().setDeoptimizationRescueSlot(((AMD64FrameMapBuilder) getResult().getFrameMapBuilder()).allocateDeoptimizationRescueSlot());
544 }
545
546 getResult().setMaxInterpreterFrameSize(debugInfoBuilder.maxInterpreterFrameSize());
547
548 for (AMD64HotSpotRestoreRbpOp op : epilogueOps) {
549 op.setSavedRbp(savedRbp);
550 }
551 if (BenchmarkCounters.enabled) {
552 // ensure that the rescue slot is available
553 LIRInstruction op = getOrInitRescueSlotOp();
554 // insert dummy instruction into the start block
555 LIR lir = getResult().getLIR();
556 ArrayList<LIRInstruction> instructions = lir.getLIRforBlock(lir.getControlFlowGraph().getStartBlock());
557 instructions.add(1, op);
558 Debug.dump(Debug.INFO_LEVEL, lir, "created rescue dummy op");
559 }
560 }
561
562 @Override
563 public Value emitCompress(Value pointer, CompressEncoding encoding, boolean nonNull) {
564 LIRKind inputKind = pointer.getValueKind(LIRKind.class);
565 assert inputKind.getPlatformKind() == AMD64Kind.QWORD;
566 if (inputKind.isReference(0)) {
567 // oop
568 Variable result = newVariable(LIRKind.reference(AMD64Kind.DWORD));
569 append(new AMD64HotSpotMove.CompressPointer(result, asAllocatable(pointer), getProviders().getRegisters().getHeapBaseRegister().asValue(), encoding, nonNull));
570 return result;
571 } else {
572 // metaspace pointer
573 Variable result = newVariable(LIRKind.value(AMD64Kind.DWORD));
574 AllocatableValue base = Value.ILLEGAL;
575 OptionValues options = getResult().getLIR().getOptions();
576 if (encoding.hasBase() || GeneratePIC.getValue(options)) {
577 if (GeneratePIC.getValue(options)) {
578 Variable baseAddress = newVariable(LIRKind.value(AMD64Kind.QWORD));
|
24
25 import static jdk.vm.ci.amd64.AMD64.rbp;
26 import static org.graalvm.compiler.core.common.GraalOptions.GeneratePIC;
27 import static org.graalvm.compiler.hotspot.HotSpotBackend.INITIALIZE_KLASS_BY_SYMBOL;
28 import static org.graalvm.compiler.hotspot.HotSpotBackend.RESOLVE_KLASS_BY_SYMBOL;
29 import static org.graalvm.compiler.hotspot.HotSpotBackend.RESOLVE_METHOD_BY_SYMBOL_AND_LOAD_COUNTERS;
30 import static org.graalvm.compiler.hotspot.HotSpotBackend.RESOLVE_STRING_BY_SYMBOL;
31
32 import java.util.ArrayList;
33 import java.util.List;
34
35 import org.graalvm.compiler.asm.amd64.AMD64Address.Scale;
36 import org.graalvm.compiler.core.amd64.AMD64ArithmeticLIRGenerator;
37 import org.graalvm.compiler.core.amd64.AMD64LIRGenerator;
38 import org.graalvm.compiler.core.amd64.AMD64LIRKindTool;
39 import org.graalvm.compiler.core.amd64.AMD64MoveFactoryBase.BackupSlotProvider;
40 import org.graalvm.compiler.core.common.CompressEncoding;
41 import org.graalvm.compiler.core.common.LIRKind;
42 import org.graalvm.compiler.core.common.spi.ForeignCallLinkage;
43 import org.graalvm.compiler.core.common.spi.LIRKindTool;
44 import org.graalvm.compiler.debug.DebugContext;
45 import org.graalvm.compiler.debug.GraalError;
46 import org.graalvm.compiler.hotspot.GraalHotSpotVMConfig;
47 import org.graalvm.compiler.hotspot.HotSpotBackend;
48 import org.graalvm.compiler.hotspot.HotSpotDebugInfoBuilder;
49 import org.graalvm.compiler.hotspot.HotSpotForeignCallLinkage;
50 import org.graalvm.compiler.hotspot.HotSpotLIRGenerationResult;
51 import org.graalvm.compiler.hotspot.HotSpotLIRGenerator;
52 import org.graalvm.compiler.hotspot.HotSpotLockStack;
53 import org.graalvm.compiler.hotspot.debug.BenchmarkCounters;
54 import org.graalvm.compiler.hotspot.meta.HotSpotConstantLoadAction;
55 import org.graalvm.compiler.hotspot.meta.HotSpotProviders;
56 import org.graalvm.compiler.hotspot.stubs.Stub;
57 import org.graalvm.compiler.lir.LIR;
58 import org.graalvm.compiler.lir.LIRFrameState;
59 import org.graalvm.compiler.lir.LIRInstruction;
60 import org.graalvm.compiler.lir.LIRInstructionClass;
61 import org.graalvm.compiler.lir.LabelRef;
62 import org.graalvm.compiler.lir.StandardOp.NoOp;
63 import org.graalvm.compiler.lir.SwitchStrategy;
64 import org.graalvm.compiler.lir.Variable;
538 public void beforeRegisterAllocation() {
539 super.beforeRegisterAllocation();
540 boolean hasDebugInfo = getResult().getLIR().hasDebugInfo();
541 AllocatableValue savedRbp = saveRbp.finalize(hasDebugInfo);
542 if (hasDebugInfo) {
543 getResult().setDeoptimizationRescueSlot(((AMD64FrameMapBuilder) getResult().getFrameMapBuilder()).allocateDeoptimizationRescueSlot());
544 }
545
546 getResult().setMaxInterpreterFrameSize(debugInfoBuilder.maxInterpreterFrameSize());
547
548 for (AMD64HotSpotRestoreRbpOp op : epilogueOps) {
549 op.setSavedRbp(savedRbp);
550 }
551 if (BenchmarkCounters.enabled) {
552 // ensure that the rescue slot is available
553 LIRInstruction op = getOrInitRescueSlotOp();
554 // insert dummy instruction into the start block
555 LIR lir = getResult().getLIR();
556 ArrayList<LIRInstruction> instructions = lir.getLIRforBlock(lir.getControlFlowGraph().getStartBlock());
557 instructions.add(1, op);
558 lir.getDebug().dump(DebugContext.INFO_LEVEL, lir, "created rescue dummy op");
559 }
560 }
561
562 @Override
563 public Value emitCompress(Value pointer, CompressEncoding encoding, boolean nonNull) {
564 LIRKind inputKind = pointer.getValueKind(LIRKind.class);
565 assert inputKind.getPlatformKind() == AMD64Kind.QWORD;
566 if (inputKind.isReference(0)) {
567 // oop
568 Variable result = newVariable(LIRKind.reference(AMD64Kind.DWORD));
569 append(new AMD64HotSpotMove.CompressPointer(result, asAllocatable(pointer), getProviders().getRegisters().getHeapBaseRegister().asValue(), encoding, nonNull));
570 return result;
571 } else {
572 // metaspace pointer
573 Variable result = newVariable(LIRKind.value(AMD64Kind.DWORD));
574 AllocatableValue base = Value.ILLEGAL;
575 OptionValues options = getResult().getLIR().getOptions();
576 if (encoding.hasBase() || GeneratePIC.getValue(options)) {
577 if (GeneratePIC.getValue(options)) {
578 Variable baseAddress = newVariable(LIRKind.value(AMD64Kind.QWORD));
|