Mercurial > hg > truffle
diff graal/GraalCompiler/src/com/sun/c1x/target/amd64/AMD64GlobalStubEmitter.java @ 2677:0ea5f12e873a
use com.oracle.max.asm project for assembler
author | Christian.Wimmer@Oracle.com |
---|---|
date | Fri, 13 May 2011 17:09:20 -0700 |
parents | 16b9a8b5ad39 |
children | a2f62de90c76 |
line wrap: on
line diff
--- a/graal/GraalCompiler/src/com/sun/c1x/target/amd64/AMD64GlobalStubEmitter.java Fri May 13 14:03:03 2011 -0700 +++ b/graal/GraalCompiler/src/com/sun/c1x/target/amd64/AMD64GlobalStubEmitter.java Fri May 13 17:09:20 2011 -0700 @@ -26,10 +26,12 @@ import java.util.*; +import com.oracle.max.asm.*; +import com.oracle.max.asm.target.amd64.*; +import com.oracle.max.asm.target.amd64.AMD64Assembler.*; import com.sun.c1x.*; import com.sun.c1x.asm.*; import com.sun.c1x.globalstub.*; -import com.sun.c1x.target.amd64.AMD64Assembler.ConditionFlag; import com.sun.cri.ci.*; import com.sun.cri.ci.CiRegister.RegisterFlag; import com.sun.cri.ri.*; @@ -52,6 +54,7 @@ private static final CiRegister negateArgument = AMD64.xmm0; private static final CiRegister negateTemp = AMD64.xmm1; + private TargetMethodAssembler tasm; private AMD64MacroAssembler asm; private final CiTarget target; private int argsSize; @@ -73,7 +76,8 @@ } private void reset(CiKind resultKind, CiKind[] argTypes) { - asm = new AMD64MacroAssembler.WithCompiler(compiler, compiler.globalStubRegisterConfig); + asm = new AMD64MacroAssembler(compiler.target, compiler.globalStubRegisterConfig); + tasm = new TargetMethodAssembler(asm); saveSize = 0; argsSize = 0; argOffsets = new int[argTypes.length]; @@ -98,7 +102,7 @@ reset(runtimeCall.resultKind, runtimeCall.arguments); emitStandardForward(null, runtimeCall); String name = "stub-" + runtimeCall; - CiTargetMethod targetMethod = asm.finishTargetMethod(name, runtime, registerRestoreEpilogueOffset, true); + CiTargetMethod targetMethod = tasm.finishTargetMethod(name, runtime, registerRestoreEpilogueOffset, true); Object stubObject = runtime.registerGlobalStub(targetMethod, name); return new GlobalStub(null, runtimeCall.resultKind, stubObject, argsSize, argOffsets, resultOffset); } @@ -128,7 +132,7 @@ } String name = "stub-" + stub; - CiTargetMethod targetMethod = asm.finishTargetMethod(name, runtime, registerRestoreEpilogueOffset, true); + CiTargetMethod targetMethod = tasm.finishTargetMethod(name, runtime, registerRestoreEpilogueOffset, true); Object stubObject = runtime.registerGlobalStub(targetMethod, name); return new GlobalStub(stub, stub.resultKind, stubObject, argsSize, argOffsets, resultOffset); } @@ -171,6 +175,7 @@ compilation.frameMap().setFrameSize(frameSize()); AMD64LIRAssembler assembler = new AMD64LIRAssembler(compilation); asm = assembler.masm; + tasm = assembler.tasm; ArrayList<CiRegister> allocatableRegisters = new ArrayList<CiRegister>(Arrays.asList(compiler.globalStubRegisterConfig.getCategorizedAllocatableRegisters().get(RegisterFlag.CPU))); for (XirTemp t : template.temps) { @@ -237,7 +242,7 @@ assert template.marks.length == 0 : "marks not supported in global stubs"; assembler.emitXirInstructions(null, template.fastPath, labels, operands, null); epilogue(); - CiTargetMethod targetMethod = asm.finishTargetMethod(template.name, runtime, registerRestoreEpilogueOffset, true); + CiTargetMethod targetMethod = tasm.finishTargetMethod(template.name, runtime, registerRestoreEpilogueOffset, true); Object stubObject = runtime.registerGlobalStub(targetMethod, template.name); return new GlobalStub(null, template.resultOperand.kind, stubObject, argsSize, argOffsets, resultOffset); } @@ -263,14 +268,14 @@ private void emitDNEG() { negatePrologue(); - asm.movsd(negateTemp, asm.recordDataReferenceInCode(CiConstant.forLong(DoubleSignFlip))); + asm.movsd(negateTemp, tasm.recordDataReferenceInCode(CiConstant.forLong(DoubleSignFlip))); asm.xorpd(negateArgument, negateTemp); negateEpilogue(); } private void emitFNEG() { negatePrologue(); - asm.movsd(negateTemp, asm.recordDataReferenceInCode(CiConstant.forLong(FloatSignFlip))); + asm.movsd(negateTemp, tasm.recordDataReferenceInCode(CiConstant.forLong(FloatSignFlip))); asm.xorps(negateArgument, negateTemp); negateEpilogue(); } @@ -304,9 +309,9 @@ private void emitCOMISSD(boolean isDouble, boolean isInt) { convertPrologue(); if (isDouble) { - asm.ucomisd(convertArgument, asm.recordDataReferenceInCode(CiConstant.DOUBLE_0)); + asm.ucomisd(convertArgument, tasm.recordDataReferenceInCode(CiConstant.DOUBLE_0)); } else { - asm.ucomiss(convertArgument, asm.recordDataReferenceInCode(CiConstant.FLOAT_0)); + asm.ucomiss(convertArgument, tasm.recordDataReferenceInCode(CiConstant.FLOAT_0)); } Label nan = new Label(); Label ret = new Label(); @@ -372,7 +377,7 @@ index++; } - asm.setFrameSize(frameSize()); + tasm.setFrameSize(frameSize()); this.savedAllRegisters = false; } @@ -385,7 +390,7 @@ asm.nop(entryCodeOffset); } asm.subq(AMD64.rsp, frameSize()); - asm.setFrameSize(frameSize()); + tasm.setFrameSize(frameSize()); int frameToCSA = 0; asm.save(csa, frameToCSA); this.savedAllRegisters = true; @@ -426,7 +431,10 @@ } // Call to the runtime - asm.directCall(call, null); + int before = asm.codeBuffer.position(); + asm.call(); + int after = asm.codeBuffer.position(); + tasm.recordDirectCall(before, after, call, null); if (call.resultKind != CiKind.Void) { CiRegister returnRegister = compiler.globalStubRegisterConfig.getReturnRegister(call.resultKind);