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);