Mercurial > hg > graal-jvmci-8
changeset 16429:3943a1a46a53
[SPARC] Fixing i2d and l2f and handling of implicit exceptions
author | Stefan Anzinger <stefan.anzinger@gmail.com> |
---|---|
date | Tue, 08 Jul 2014 17:57:32 -0700 |
parents | 78ddecd6255f |
children | dfd4530c3cd2 |
files | graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotRegisterConfig.java graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_l2f.java |
diffstat | 3 files changed, 33 insertions(+), 4 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Jul 08 21:38:21 2014 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Jul 08 17:57:32 2014 -0700 @@ -609,7 +609,7 @@ append(new BinaryRegReg(IDIV, result, a, loadNonConst(b))); break; case Long: - append(new BinaryRegReg(LDIV, result, a, loadNonConst(b))); + append(new BinaryRegReg(LDIV, result, a, loadNonConst(b), state)); break; case Float: append(new Op2Stack(FDIV, result, a, loadNonConst(b))); @@ -825,13 +825,21 @@ conversionInstruction = F2I; break; case I2D: - return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Double), I2D, input); + // Implemented in two steps, as this consists of sign extension and then move the + // bits over to the double register and then convert to double, in fact this does + // not generate any overhead in generated code + { + AllocatableValue tmp = emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Long), I2L, input); + return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Double), L2D, tmp); + } case I2F: return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Float), I2F, input); case L2D: return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Double), L2D, input); - case L2F: - return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Float), L2F, input); + case L2F: { + AllocatableValue tmp = emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Double), L2D, input); + return emitConvert2Op(LIRKind.derive(inputVal).changeType(Kind.Float), D2F, tmp); + } default: throw GraalInternalError.shouldNotReachHere(); }
--- a/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotRegisterConfig.java Tue Jul 08 21:38:21 2014 +0200 +++ b/graal/com.oracle.graal.hotspot.sparc/src/com/oracle/graal/hotspot/sparc/SPARCHotSpotRegisterConfig.java Tue Jul 08 17:57:32 2014 -0700 @@ -220,6 +220,17 @@ locations[i] = register.asValue(target.getLIRKind(kind)); } break; + case Double: + if (!stackOnly && currentFloating < fpuParameterRegisters.length) { + if (currentFloating % 2 != 0) { + // Make register number even to be a double reg + currentFloating++; + } + Register register = fpuParameterRegisters[currentFloating]; + currentFloating += 2; // Only every second is a double register + locations[i] = register.asValue(kind); + } + break; case Float: if (!stackOnly && currentFloating < fpuParameterRegisters.length) { Register register = fpuParameterRegisters[currentFloating++];
--- a/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_l2f.java Tue Jul 08 21:38:21 2014 +0200 +++ b/graal/com.oracle.graal.jtt/src/com/oracle/graal/jtt/bytecode/BC_l2f.java Tue Jul 08 17:57:32 2014 -0700 @@ -49,4 +49,14 @@ runTest("test", -74652389L); } + @Test + public void run3() throws Throwable { + runTest("test", Long.MAX_VALUE); + } + + @Test + public void run4() throws Throwable { + runTest("test", Long.MIN_VALUE); + } + }