# HG changeset patch # User Roland Schatz # Date 1361903562 -3600 # Node ID 14b52a26009999b2edacea27fd5114798ca0a334 # Parent cc9b45598a4f05044b7be8923a64cc25c13123e1 Separate store op for storing constants. diff -r cc9b45598a4f -r 14b52a260099 graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java --- a/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Tue Feb 26 18:26:13 2013 +0100 +++ b/graal/com.oracle.graal.compiler.amd64/src/com/oracle/graal/compiler/amd64/AMD64LIRGenerator.java Tue Feb 26 19:32:42 2013 +0100 @@ -68,6 +68,7 @@ import com.oracle.graal.lir.amd64.AMD64Move.NullCheckOp; import com.oracle.graal.lir.amd64.AMD64Move.SpillMoveOp; import com.oracle.graal.lir.amd64.AMD64Move.StackLeaOp; +import com.oracle.graal.lir.amd64.AMD64Move.StoreConstantOp; import com.oracle.graal.lir.amd64.AMD64Move.StoreOp; import com.oracle.graal.nodes.*; import com.oracle.graal.nodes.calc.*; @@ -211,8 +212,18 @@ @Override public void emitStore(Kind kind, Value base, int displacement, Value index, int scale, Value inputVal, boolean canTrap) { AMD64Address storeAddress = prepareAddress(kind, base, displacement, index, scale); - Value input = loadForStore(inputVal, storeAddress.getKind()); - append(new StoreOp(storeAddress, input, canTrap ? state() : null)); + LIRFrameState state = canTrap ? state() : null; + + if (isConstant(inputVal)) { + Constant c = asConstant(inputVal); + if (canStoreConstant(c)) { + append(new StoreConstantOp(storeAddress, c, state)); + return; + } + } + + Variable input = load(inputVal); + append(new StoreOp(storeAddress, input, state)); } @Override diff -r cc9b45598a4f -r 14b52a260099 graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java --- a/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Tue Feb 26 18:26:13 2013 +0100 +++ b/graal/com.oracle.graal.compiler.ptx/src/com/oracle/graal/compiler/ptx/PTXLIRGenerator.java Tue Feb 26 19:32:42 2013 +0100 @@ -156,7 +156,7 @@ @Override public void emitStore(Kind kind, Value base, int displacement, Value index, int scale, Value inputVal, boolean canTrap) { PTXAddress storeAddress = prepareAddress(kind, base, displacement, index, scale); - Value input = loadForStore(inputVal, storeAddress.getKind()); + Value input = load(inputVal); append(new StoreOp(storeAddress, input, canTrap ? state() : null)); } diff -r cc9b45598a4f -r 14b52a260099 graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java --- a/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue Feb 26 18:26:13 2013 +0100 +++ b/graal/com.oracle.graal.compiler/src/com/oracle/graal/compiler/gen/LIRGenerator.java Tue Feb 26 19:32:42 2013 +0100 @@ -197,18 +197,6 @@ return value; } - public Value loadForStore(Value value, Kind storeKind) { - if (isConstant(value) && canStoreConstant((Constant) value)) { - return value; - } - if (storeKind == Kind.Byte || storeKind == Kind.Boolean) { - Variable tempVar = new Variable(value.getKind(), lir.nextVariable(), Register.RegisterFlag.Byte); - emitMove(tempVar, value); - return tempVar; - } - return load(value); - } - protected LabelRef getLIRBlock(FixedNode b) { Block result = lir.cfg.blockFor(b); int suxIndex = currentBlock.getSuccessors().indexOf(result); diff -r cc9b45598a4f -r 14b52a260099 graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java --- a/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java Tue Feb 26 18:26:13 2013 +0100 +++ b/graal/com.oracle.graal.lir.amd64/src/com/oracle/graal/lir/amd64/AMD64Move.java Tue Feb 26 19:32:42 2013 +0100 @@ -136,14 +136,45 @@ @Override public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { - load(tasm, masm, result, address, state); + if (state != null) { + tasm.recordImplicitException(masm.codeBuffer.position(), state); + } + switch (address.getKind()) { + case Boolean: + case Byte: + masm.movsxb(asRegister(result), address); + break; + case Char: + masm.movzxl(asRegister(result), address); + break; + case Short: + masm.movswl(asRegister(result), address); + break; + case Int: + masm.movslq(asRegister(result), address); + break; + case Long: + masm.movq(asRegister(result), address); + break; + case Float: + masm.movflt(asFloatReg(result), address); + break; + case Double: + masm.movdbl(asDoubleReg(result), address); + break; + case Object: + masm.movq(asRegister(result), address); + break; + default: + throw GraalInternalError.shouldNotReachHere(); + } } } public static class StoreOp extends AMD64LIRInstruction { @Use({ADDR}) protected AMD64Address address; - @Use({REG, CONST}) protected Value input; + @Use({REG}) protected Value input; @State protected LIRFrameState state; public StoreOp(AMD64Address address, Value input, LIRFrameState state) { @@ -154,7 +185,93 @@ @Override public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { - store(tasm, masm, address, input, state); + if (state != null) { + tasm.recordImplicitException(masm.codeBuffer.position(), state); + } + + assert isRegister(input); + switch (address.getKind()) { + case Boolean: + case Byte: + masm.movb(address, asRegister(input)); + break; + case Char: + case Short: + masm.movw(address, asRegister(input)); + break; + case Int: + masm.movl(address, asRegister(input)); + break; + case Long: + masm.movq(address, asRegister(input)); + break; + case Float: + masm.movflt(address, asFloatReg(input)); + break; + case Double: + masm.movsd(address, asDoubleReg(input)); + break; + case Object: + masm.movq(address, asRegister(input)); + break; + default: + throw GraalInternalError.shouldNotReachHere(); + } + } + } + + public static class StoreConstantOp extends AMD64LIRInstruction { + + @Use({ADDR}) protected AMD64Address address; + @Use({CONST}) protected Constant input; + @State protected LIRFrameState state; + + public StoreConstantOp(AMD64Address address, Constant input, LIRFrameState state) { + this.address = address; + this.input = input; + this.state = state; + } + + @Override + public void emitCode(TargetMethodAssembler tasm, AMD64MacroAssembler masm) { + if (state != null) { + tasm.recordImplicitException(masm.codeBuffer.position(), state); + } + + switch (address.getKind()) { + case Boolean: + case Byte: + masm.movb(address, input.asInt() & 0xFF); + break; + case Char: + case Short: + masm.movw(address, input.asInt() & 0xFFFF); + break; + case Int: + masm.movl(address, input.asInt()); + break; + case Long: + if (NumUtil.isInt(input.asLong())) { + masm.movslq(address, (int) input.asLong()); + } else { + throw GraalInternalError.shouldNotReachHere("Cannot store 64-bit constants to memory"); + } + break; + case Float: + masm.movl(address, floatToRawIntBits(input.asFloat())); + break; + case Double: + throw GraalInternalError.shouldNotReachHere("Cannot store 64-bit constants to memory"); + case Object: + if (input.isNull()) { + masm.movptr(address, 0); + } else { + throw GraalInternalError.shouldNotReachHere("Cannot store 64-bit constants to memory"); + } + break; + default: + throw GraalInternalError.shouldNotReachHere(); + } } } @@ -432,116 +549,6 @@ } } - public static void load(TargetMethodAssembler tasm, AMD64MacroAssembler masm, Value result, AMD64Address loadAddr, LIRFrameState info) { - if (info != null) { - tasm.recordImplicitException(masm.codeBuffer.position(), info); - } - switch (loadAddr.getKind()) { - case Boolean: - case Byte: - masm.movsxb(asRegister(result), loadAddr); - break; - case Char: - masm.movzxl(asRegister(result), loadAddr); - break; - case Short: - masm.movswl(asRegister(result), loadAddr); - break; - case Int: - masm.movslq(asRegister(result), loadAddr); - break; - case Long: - masm.movq(asRegister(result), loadAddr); - break; - case Float: - masm.movflt(asFloatReg(result), loadAddr); - break; - case Double: - masm.movdbl(asDoubleReg(result), loadAddr); - break; - case Object: - masm.movq(asRegister(result), loadAddr); - break; - default: - throw GraalInternalError.shouldNotReachHere(); - } - } - - public static void store(TargetMethodAssembler tasm, AMD64MacroAssembler masm, AMD64Address storeAddr, Value input, LIRFrameState info) { - if (info != null) { - tasm.recordImplicitException(masm.codeBuffer.position(), info); - } - - if (isRegister(input)) { - switch (storeAddr.getKind()) { - case Boolean: - case Byte: - masm.movb(storeAddr, asRegister(input)); - break; - case Char: - case Short: - masm.movw(storeAddr, asRegister(input)); - break; - case Int: - masm.movl(storeAddr, asRegister(input)); - break; - case Long: - masm.movq(storeAddr, asRegister(input)); - break; - case Float: - masm.movflt(storeAddr, asFloatReg(input)); - break; - case Double: - masm.movsd(storeAddr, asDoubleReg(input)); - break; - case Object: - masm.movq(storeAddr, asRegister(input)); - break; - default: - throw GraalInternalError.shouldNotReachHere(); - } - } else if (isConstant(input)) { - Constant c = (Constant) input; - switch (storeAddr.getKind()) { - case Boolean: - case Byte: - masm.movb(storeAddr, c.asInt() & 0xFF); - break; - case Char: - case Short: - masm.movw(storeAddr, c.asInt() & 0xFFFF); - break; - case Int: - masm.movl(storeAddr, c.asInt()); - break; - case Long: - if (NumUtil.isInt(c.asLong())) { - masm.movslq(storeAddr, (int) c.asLong()); - } else { - throw GraalInternalError.shouldNotReachHere("Cannot store 64-bit constants to memory"); - } - break; - case Float: - masm.movl(storeAddr, floatToRawIntBits(c.asFloat())); - break; - case Double: - throw GraalInternalError.shouldNotReachHere("Cannot store 64-bit constants to memory"); - case Object: - if (c.isNull()) { - masm.movptr(storeAddr, 0); - } else { - throw GraalInternalError.shouldNotReachHere("Cannot store 64-bit constants to memory"); - } - break; - default: - throw GraalInternalError.shouldNotReachHere(); - } - - } else { - throw GraalInternalError.shouldNotReachHere(); - } - } - protected static void compareAndSwap(TargetMethodAssembler tasm, AMD64MacroAssembler masm, Value result, AMD64Address address, Value cmpValue, Value newValue) { assert asRegister(cmpValue) == AMD64.rax && asRegister(result) == AMD64.rax;