# HG changeset patch # User Stefan Anzinger # Date 1410459983 25200 # Node ID a3fa16378eaad13d84e1beed2faa0c347dbb18e6 # Parent dbc4d605eb8f3dbf60c69bf61923bc704a356ff3# Parent fc94fd8a28dc125113ff7760bc079632e53397fa Merge diff -r fc94fd8a28dc -r a3fa16378eaa graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java --- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Wed Sep 10 23:14:58 2014 +0200 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Thu Sep 11 11:26:23 2014 -0700 @@ -865,7 +865,7 @@ } private void moveBetweenFpGp(AllocatableValue dst, AllocatableValue src) { - StackSlot tempSlot = getTempSlot(LIRKind.derive(dst)); + StackSlot tempSlot = getTempSlot(LIRKind.value(Kind.Long)); append(new MoveFpGp(dst, src, tempSlot)); } diff -r fc94fd8a28dc -r a3fa16378eaa graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java Wed Sep 10 23:14:58 2014 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCArithmetic.java Thu Sep 11 11:26:23 2014 -0700 @@ -346,7 +346,7 @@ SPARCAddress addr = (SPARCAddress) crb.recordDataReferenceInCode(asConstant(src2), 4); try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { Register scratch = sc.getRegister(); - addr = SPARCMove.guaranueeLoadable(addr, masm, scratch); + addr = SPARCMove.generateSimm13OffsetLoad(addr, masm, scratch); new Lddf(addr, asDoubleReg(dst)).emit(masm); } new Fandd(asDoubleReg(src1), asDoubleReg(dst), asDoubleReg(dst)).emit(masm); diff -r fc94fd8a28dc -r a3fa16378eaa graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java --- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Wed Sep 10 23:14:58 2014 +0200 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMove.java Thu Sep 11 11:26:23 2014 -0700 @@ -111,6 +111,7 @@ this.result = result; this.input = input; this.temp = temp; + assert this.temp.getPlatformKind() == Kind.Long; } public Value getInput() { @@ -123,42 +124,66 @@ @Override public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { - PlatformKind inputKind = input.getPlatformKind(); - PlatformKind resultKind = result.getPlatformKind(); + Kind inputKind = (Kind) input.getPlatformKind(); + Kind resultKind = (Kind) result.getPlatformKind(); + int resultKindSize = crb.target.getSizeInBytes(resultKind); try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { Register scratch = sc.getRegister(); - SPARCAddress tempAddress = guaranueeLoadable((SPARCAddress) crb.asAddress(temp), masm, scratch); - if (inputKind == Kind.Float) { - new Stf(asFloatReg(input), tempAddress).emit(masm); - } else if (inputKind == Kind.Double) { - new Stdf(asDoubleReg(input), tempAddress).emit(masm); - } else if (inputKind == Kind.Int) { - new Stw(asIntReg(input), tempAddress).emit(masm); - } else if (inputKind == Kind.Short || inputKind == Kind.Char) { - new Sth(asIntReg(input), tempAddress).emit(masm); - } else if (inputKind == Kind.Byte) { - new Stb(asIntReg(input), tempAddress).emit(masm); - } else if (inputKind == Kind.Long) { - new Stx(asLongReg(input), tempAddress).emit(masm); - } else { - GraalInternalError.shouldNotReachHere(); + SPARCAddress tempAddress = generateSimm13OffsetLoad((SPARCAddress) crb.asAddress(temp), masm, scratch); + switch (inputKind) { + case Float: + assert resultKindSize == 4; + new Stf(asFloatReg(input), tempAddress).emit(masm); + break; + case Double: + assert resultKindSize == 8; + new Stdf(asDoubleReg(input), tempAddress).emit(masm); + break; + case Long: + case Int: + case Short: + case Char: + case Byte: + if (resultKindSize == 8) { + new Stx(asLongReg(input), tempAddress).emit(masm); + } else if (resultKindSize == 4) { + new Stw(asIntReg(input), tempAddress).emit(masm); + } else if (resultKindSize == 2) { + new Sth(asIntReg(input), tempAddress).emit(masm); + } else if (resultKindSize == 1) { + new Stb(asIntReg(input), tempAddress).emit(masm); + } else { + throw GraalInternalError.shouldNotReachHere(); + } + break; + default: + GraalInternalError.shouldNotReachHere(); } - if (resultKind == Kind.Int) { - new Ldsw(tempAddress, asIntReg(result)).emit(masm); - } else if (inputKind == Kind.Short) { - new Ldsh(tempAddress, asIntReg(input)).emit(masm); - } else if (inputKind == Kind.Char) { - new Lduh(tempAddress, asIntReg(input)).emit(masm); - } else if (inputKind == Kind.Byte) { - new Ldsb(tempAddress, asIntReg(input)).emit(masm); - } else if (resultKind == Kind.Float) { - new Ldf(tempAddress, asFloatReg(result)).emit(masm); - } else if (resultKind == Kind.Long) { - new Ldx(tempAddress, asLongReg(result)).emit(masm); - } else if (resultKind == Kind.Double) { - new Lddf(tempAddress, asDoubleReg(result)).emit(masm); - } else { - GraalInternalError.shouldNotReachHere(); + switch (resultKind) { + case Long: + new Ldx(tempAddress, asLongReg(result)).emit(masm); + break; + case Int: + new Ldsw(tempAddress, asIntReg(result)).emit(masm); + break; + case Short: + new Ldsh(tempAddress, asIntReg(input)).emit(masm); + break; + case Char: + new Lduh(tempAddress, asIntReg(input)).emit(masm); + break; + case Byte: + new Ldsb(tempAddress, asIntReg(input)).emit(masm); + break; + case Float: + new Ldf(tempAddress, asFloatReg(result)).emit(masm); + break; + case Double: + new Lddf(tempAddress, asDoubleReg(result)).emit(masm); + break; + default: + GraalInternalError.shouldNotReachHere(); + break; } } } @@ -208,7 +233,7 @@ public void emitMemAccess(SPARCMacroAssembler masm) { try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { Register scratch = sc.getRegister(); - final SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm, scratch); + final SPARCAddress addr = generateSimm13OffsetLoad(address.toAddress(), masm, scratch); final Register dst = asRegister(result); switch (kind) { case Boolean: @@ -385,7 +410,7 @@ assert isRegister(input); try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { Register scratch = sc.getRegister(); - SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm, scratch); + SPARCAddress addr = generateSimm13OffsetLoad(address.toAddress(), masm, scratch); switch (kind) { case Boolean: case Byte: @@ -433,7 +458,7 @@ public void emitMemAccess(SPARCMacroAssembler masm) { try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { Register scratch = sc.getRegister(); - SPARCAddress addr = guaranueeLoadable(address.toAddress(), masm, scratch); + SPARCAddress addr = generateSimm13OffsetLoad(address.toAddress(), masm, scratch); switch (kind) { case Boolean: case Byte: @@ -538,15 +563,16 @@ } /** - * Guarantees that the given SPARCAddress given before is loadable by subsequent call. If the - * displacement exceeds the imm13 value, the value is put into a scratch register o7, which must - * be used as soon as possible. + * Guarantees that the given SPARCAddress given before is loadable by subsequent load/store + * instruction. If the displacement exceeds the simm13 value range, the value is put into a + * scratch register. * * @param addr Address to modify - * @param masm assembler to output the prior stx command + * @param masm assembler to output the potential code to store the value in the scratch register + * @param scratch The register as scratch to use * @return a loadable SPARCAddress */ - public static SPARCAddress guaranueeLoadable(SPARCAddress addr, SPARCMacroAssembler masm, Register scratch) { + public static SPARCAddress generateSimm13OffsetLoad(SPARCAddress addr, SPARCMacroAssembler masm, Register scratch) { boolean displacementOutOfBound = addr.getIndex().equals(Register.None) && !SPARCAssembler.isSimm13(addr.getDisplacement()); if (displacementOutOfBound) { new Setx(addr.getDisplacement(), scratch, false).emit(masm); @@ -560,7 +586,7 @@ SPARCAddress dst = (SPARCAddress) crb.asAddress(result); try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { Register scratch = sc.getRegister(); - dst = guaranueeLoadable(dst, masm, scratch); + dst = generateSimm13OffsetLoad(dst, masm, scratch); Register src = asRegister(input); switch (input.getKind()) { case Byte: @@ -594,7 +620,7 @@ SPARCAddress src = (SPARCAddress) crb.asAddress(input); try (SPARCScratchRegister sc = SPARCScratchRegister.get()) { Register scratch = sc.getRegister(); - src = guaranueeLoadable(src, masm, scratch); + src = generateSimm13OffsetLoad(src, masm, scratch); Register dst = asRegister(result); switch (input.getKind()) { case Boolean: