Mercurial > hg > truffle
comparison graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Call.java @ 13238:b429ec5c46d6
Merge.
author | Doug Simon <doug.simon@oracle.com> |
---|---|
date | Tue, 03 Dec 2013 18:19:56 +0100 |
parents | 1a66453f73db eb03a7335eb0 |
children | 390c4b742890 |
comparison
equal
deleted
inserted
replaced
13237:bc1b0ff498f4 | 13238:b429ec5c46d6 |
---|---|
23 package com.oracle.graal.lir.amd64; | 23 package com.oracle.graal.lir.amd64; |
24 | 24 |
25 import static com.oracle.graal.api.code.ValueUtil.*; | 25 import static com.oracle.graal.api.code.ValueUtil.*; |
26 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; | 26 import static com.oracle.graal.lir.LIRInstruction.OperandFlag.*; |
27 | 27 |
28 import com.oracle.graal.amd64.*; | |
28 import com.oracle.graal.api.code.*; | 29 import com.oracle.graal.api.code.*; |
29 import com.oracle.graal.api.meta.*; | 30 import com.oracle.graal.api.meta.*; |
31 import com.oracle.graal.asm.amd64.AMD64Assembler.ConditionFlag; | |
30 import com.oracle.graal.asm.amd64.*; | 32 import com.oracle.graal.asm.amd64.*; |
31 import com.oracle.graal.asm.amd64.AMD64Assembler.*; | |
32 import com.oracle.graal.lir.*; | 33 import com.oracle.graal.lir.*; |
33 import com.oracle.graal.lir.asm.*; | 34 import com.oracle.graal.lir.asm.*; |
34 import com.oracle.graal.nodes.spi.*; | |
35 | 35 |
36 public class AMD64Call { | 36 public class AMD64Call { |
37 | 37 |
38 public abstract static class CallOp extends AMD64LIRInstruction { | 38 public abstract static class CallOp extends AMD64LIRInstruction { |
39 | 39 |
133 @Opcode("FAR_FOREIGN_CALL") | 133 @Opcode("FAR_FOREIGN_CALL") |
134 public static class DirectFarForeignCallOp extends ForeignCallOp { | 134 public static class DirectFarForeignCallOp extends ForeignCallOp { |
135 | 135 |
136 @Temp({REG}) protected AllocatableValue callTemp; | 136 @Temp({REG}) protected AllocatableValue callTemp; |
137 | 137 |
138 public DirectFarForeignCallOp(LIRGeneratorTool gen, ForeignCallLinkage callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState state) { | 138 public DirectFarForeignCallOp(ForeignCallLinkage callTarget, Value result, Value[] parameters, Value[] temps, LIRFrameState state) { |
139 super(callTarget, result, parameters, temps, state); | 139 super(callTarget, result, parameters, temps, state); |
140 callTemp = gen.newVariable(Kind.Long); | 140 /* |
141 * The register allocator does not support virtual registers that are used at the call | |
142 * site, so use a fixed register. | |
143 */ | |
144 callTemp = AMD64.rax.asValue(Kind.Long); | |
145 assert ValueUtil.differentRegisters(parameters, callTemp); | |
141 } | 146 } |
142 | 147 |
143 @Override | 148 @Override |
144 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { | 149 public void emitCode(CompilationResultBuilder crb, AMD64MacroAssembler masm) { |
145 directCall(crb, masm, callTarget, ((RegisterValue) callTemp).getRegister(), false, state); | 150 directCall(crb, masm, callTarget, ((RegisterValue) callTemp).getRegister(), false, state); |