# HG changeset patch # User Josef Eisl # Date 1426609144 -3600 # Node ID 3bc0ac89fa5aaba4d0b55709cfb55956905210da # Parent 1fed7073f288a4358d14b6057d2d285d95049b70 {AMD64,SPARC}HotSpotLIRGenerator: implement createBenchmarkCounter(). diff -r 1fed7073f288 -r 3bc0ac89fa5a graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue Mar 17 17:18:47 2015 +0100 +++ b/graal/com.oracle.graal.hotspot.amd64/src/com/oracle/graal/hotspot/amd64/AMD64HotSpotLIRGenerator.java Tue Mar 17 17:19:04 2015 +0100 @@ -39,9 +39,11 @@ import com.oracle.graal.compiler.common.*; import com.oracle.graal.compiler.common.calc.*; import com.oracle.graal.compiler.common.spi.*; +import com.oracle.graal.debug.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.HotSpotVMConfig.CompressEncoding; import com.oracle.graal.hotspot.amd64.AMD64HotSpotMove.HotSpotStoreConstantOp; +import com.oracle.graal.hotspot.debug.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.stubs.*; import com.oracle.graal.lir.*; @@ -54,6 +56,8 @@ import com.oracle.graal.lir.amd64.AMD64Move.LoadOp; import com.oracle.graal.lir.amd64.AMD64Move.MoveFromRegOp; import com.oracle.graal.lir.amd64.AMD64Move.StoreOp; +import com.oracle.graal.lir.asm.*; +import com.oracle.graal.lir.framemap.*; import com.oracle.graal.lir.gen.*; /** @@ -118,6 +122,41 @@ SaveRbp saveRbp; + private static final class RescueSlotDummyOp extends LIRInstruction { + public static final LIRInstructionClass TYPE = LIRInstructionClass.create(RescueSlotDummyOp.class); + + @Alive({OperandFlag.STACK, OperandFlag.UNINITIALIZED}) private StackSlotValue slot; + + public RescueSlotDummyOp(FrameMapBuilder frameMapBuilder, LIRKind kind) { + super(TYPE); + slot = frameMapBuilder.allocateSpillSlot(kind); + } + + public StackSlotValue getSlot() { + return slot; + } + + @Override + public void emitCode(CompilationResultBuilder crb) { + } + } + + private RescueSlotDummyOp rescueSlotOp; + + private StackSlotValue getOrInitRescueSlot() { + if (rescueSlotOp == null) { + // create dummy instruction to keep the rescue slot alive + rescueSlotOp = new RescueSlotDummyOp(getResult().getFrameMapBuilder(), getLIRKindTool().getWordKind()); + // insert dummy instruction into the start block + LIR lir = getResult().getLIR(); + List instructions = lir.getLIRforBlock(lir.getControlFlowGraph().getStartBlock()); + // Note: we do not insert at position 1 to avoid interference with the save rpb op + instructions.add(instructions.size() - 1, rescueSlotOp); + Debug.dump(lir, "created rescue dummy op"); + } + return rescueSlotOp.getSlot(); + } + /** * List of epilogue operations that need to restore RBP. */ @@ -440,6 +479,10 @@ for (AMD64HotSpotEpilogueOp op : epilogueOps) { op.savedRbp = savedRbp; } + if (BenchmarkCounters.enabled) { + // ensure that the rescue slot is available + getOrInitRescueSlot(); + } } private static LIRKind toStackKind(LIRKind kind) { @@ -626,4 +669,20 @@ return super.canInlineConstant(c); } } + + @Override + public LIRInstruction createBenchmarkCounter(String name, String group, Value increment) { + if (BenchmarkCounters.enabled) { + return new AMD64HotSpotCounterOp(name, group, increment, getProviders().getRegisters(), config, getOrInitRescueSlot()); + } + return null; + } + + @Override + public LIRInstruction createMultiBenchmarkCounter(String[] names, String[] groups, Value[] increments) { + if (BenchmarkCounters.enabled) { + return new AMD64HotSpotCounterOp(names, groups, increments, getProviders().getRegisters(), config, getOrInitRescueSlot()); + } + return null; + } } diff -r 1fed7073f288 -r 3bc0ac89fa5a graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java --- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Tue Mar 17 17:18:47 2015 +0100 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotLIRGenerator.java Tue Mar 17 17:19:04 2015 +0100 @@ -37,6 +37,7 @@ import com.oracle.graal.compiler.sparc.*; import com.oracle.graal.hotspot.*; import com.oracle.graal.hotspot.HotSpotVMConfig.CompressEncoding; +import com.oracle.graal.hotspot.debug.*; import com.oracle.graal.hotspot.meta.*; import com.oracle.graal.hotspot.stubs.*; import com.oracle.graal.lir.*; @@ -48,6 +49,7 @@ import com.oracle.graal.lir.sparc.SPARCMove.NullCheckOp; import com.oracle.graal.lir.sparc.SPARCMove.StoreConstantOp; import com.oracle.graal.lir.sparc.SPARCMove.StoreOp; +import com.oracle.graal.sparc.*; public class SPARCHotSpotLIRGenerator extends SPARCLIRGenerator implements HotSpotLIRGenerator { @@ -362,4 +364,32 @@ assert kind == Kind.Object || kind == Kind.Long : address + " - " + kind + " not an object!"; append(new NullCheckOp(load(address), state)); } + + @Override + public LIRInstruction createBenchmarkCounter(String name, String group, Value increment) { + if (BenchmarkCounters.enabled) { + try (SPARCScratchRegister sc0 = SPARCScratchRegister.get()) { + RegisterValue scratch0 = sc0.getRegister().asValue(getLIRKindTool().getWordKind()); + try (SPARCScratchRegister sc1 = SPARCScratchRegister.get()) { + RegisterValue scratch1 = sc1.getRegister().asValue(getLIRKindTool().getWordKind()); + return new SPARCHotSpotCounterOp(name, group, increment, getProviders().getRegisters(), config, scratch0, scratch1); + } + } + } + return null; + } + + @Override + public LIRInstruction createMultiBenchmarkCounter(String[] names, String[] groups, Value[] increments) { + if (BenchmarkCounters.enabled) { + try (SPARCScratchRegister sc0 = SPARCScratchRegister.get()) { + RegisterValue scratch0 = sc0.getRegister().asValue(getLIRKindTool().getWordKind()); + try (SPARCScratchRegister sc1 = SPARCScratchRegister.get()) { + RegisterValue scratch1 = sc1.getRegister().asValue(getLIRKindTool().getWordKind()); + return new SPARCHotSpotCounterOp(names, groups, increments, getProviders().getRegisters(), config, scratch0, scratch1); + } + } + } + return null; + } }