Mercurial > hg > truffle
changeset 17117:d980377abc6f
[SPARC] MathIntrinsic for sqrt and abs
author | Stefan Anzinger <stefan.anzinger@oracle.com> |
---|---|
date | Tue, 16 Sep 2014 17:49:13 -0700 |
parents | dced35fd40f7 |
children | be9c24f5fa2b |
files | graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMathIntrinsicOp.java graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MathSubstitutionsX86.java |
diffstat | 4 files changed, 46 insertions(+), 13 deletions(-) [+] |
line wrap: on
line diff
--- a/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Tue Sep 16 15:36:00 2014 -0700 +++ b/graal/com.oracle.graal.asm.sparc/src/com/oracle/graal/asm/sparc/SPARCAssembler.java Tue Sep 16 17:49:13 2014 -0700 @@ -3430,6 +3430,18 @@ } } + public static class Fabss extends Fmt3p { + public Fabss(Register src2, Register dst) { + super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fabss, SPARC.r0, src2, dst); + } + } + + public static class Fabsd extends Fmt3p { + public Fabsd(Register src2, Register dst) { + super(Ops.ArithOp, Op3s.Fpop1, Opfs.Fabsd, SPARC.r0, src2, dst); + } + } + public static class Fsrc1d extends Fmt3p { public Fsrc1d(Register src1, Register dst) {
--- a/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Sep 16 15:36:00 2014 -0700 +++ b/graal/com.oracle.graal.compiler.sparc/src/com/oracle/graal/compiler/sparc/SPARCLIRGenerator.java Tue Sep 16 17:49:13 2014 -0700 @@ -411,9 +411,7 @@ @Override public Value emitMathAbs(Value input) { Variable result = newVariable(LIRKind.derive(input)); - AllocatableValue mask = newVariable(LIRKind.value(Kind.Double)); - emitMove(mask, Constant.forDouble(Double.longBitsToDouble(0x7FFFFFFFFFFFFFFFL))); - append(new BinaryRegReg(DAND, result, asAllocatable(input), mask)); + append(new SPARCMathIntrinsicOp(ABS, result, asAllocatable(input))); return result; }
--- a/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMathIntrinsicOp.java Tue Sep 16 15:36:00 2014 -0700 +++ b/graal/com.oracle.graal.lir.sparc/src/com/oracle/graal/lir/sparc/SPARCMathIntrinsicOp.java Tue Sep 16 17:49:13 2014 -0700 @@ -25,7 +25,7 @@ import static com.oracle.graal.api.code.ValueUtil.*; import com.oracle.graal.api.meta.*; -import com.oracle.graal.asm.sparc.SPARCAssembler.Fsqrtd; +import com.oracle.graal.asm.sparc.SPARCAssembler.*; import com.oracle.graal.asm.sparc.*; import com.oracle.graal.compiler.common.*; import com.oracle.graal.lir.*; @@ -39,7 +39,8 @@ COS, TAN, LOG, - LOG10 + LOG10, + ABS } @Opcode private final IntrinsicOpcode opcode; @@ -54,9 +55,31 @@ @Override public void emitCode(CompilationResultBuilder crb, SPARCMacroAssembler masm) { + Kind inputKind = (Kind) input.getLIRKind().getPlatformKind(); switch (opcode) { case SQRT: - new Fsqrtd(asDoubleReg(input), asDoubleReg(result)).emit(masm); + switch (inputKind) { + case Float: + new Fsqrts(asFloatReg(input), asFloatReg(result)).emit(masm); + break; + case Double: + new Fsqrtd(asDoubleReg(input), asDoubleReg(result)).emit(masm); + break; + default: + GraalInternalError.shouldNotReachHere(); + } + break; + case ABS: + switch (inputKind) { + case Float: + new Fabss(asFloatReg(input), asFloatReg(result)).emit(masm); + break; + case Double: + new Fabsd(asDoubleReg(input), asDoubleReg(result)).emit(masm); + break; + default: + GraalInternalError.shouldNotReachHere(); + } break; case LOG: case LOG10:
--- a/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MathSubstitutionsX86.java Tue Sep 16 15:36:00 2014 -0700 +++ b/graal/com.oracle.graal.replacements/src/com/oracle/graal/replacements/MathSubstitutionsX86.java Tue Sep 16 17:49:13 2014 -0700 @@ -33,7 +33,7 @@ /** * Substitutions for {@link java.lang.Math} methods. */ -@ClassSubstitution(value = java.lang.Math.class, defaultGuard = UnsafeSubstitutions.GetAndSetGuard.class) +@ClassSubstitution(value = java.lang.Math.class) public class MathSubstitutionsX86 { private static final double PI_4 = Math.PI / 4; @@ -48,12 +48,12 @@ return MathIntrinsicNode.compute(x, Operation.SQRT); } - @MethodSubstitution + @MethodSubstitution(guard = UnsafeSubstitutions.GetAndSetGuard.class) public static double log(double x) { return MathIntrinsicNode.compute(x, Operation.LOG); } - @MethodSubstitution + @MethodSubstitution(guard = UnsafeSubstitutions.GetAndSetGuard.class) public static double log10(double x) { return MathIntrinsicNode.compute(x, Operation.LOG10); } @@ -61,7 +61,7 @@ /** * Special cases from {@link Math#pow} and __ieee754_pow (in sharedRuntimeTrans.cpp). */ - @MethodSubstitution + @MethodSubstitution(guard = UnsafeSubstitutions.GetAndSetGuard.class) public static double pow(double x, double y) { // If the second argument is positive or negative zero, then the result is 1.0. if (y == 0) { @@ -107,7 +107,7 @@ // accurate within [-pi/4, pi/4]. Examine the passed value and provide // a slow path for inputs outside of that interval. - @MethodSubstitution + @MethodSubstitution(guard = UnsafeSubstitutions.GetAndSetGuard.class) public static double sin(double x) { if (abs(x) < PI_4) { return MathIntrinsicNode.compute(x, Operation.SIN); @@ -116,7 +116,7 @@ } } - @MethodSubstitution + @MethodSubstitution(guard = UnsafeSubstitutions.GetAndSetGuard.class) public static double cos(double x) { if (abs(x) < PI_4) { return MathIntrinsicNode.compute(x, Operation.COS); @@ -125,7 +125,7 @@ } } - @MethodSubstitution + @MethodSubstitution(guard = UnsafeSubstitutions.GetAndSetGuard.class) public static double tan(double x) { if (abs(x) < PI_4) { return MathIntrinsicNode.compute(x, Operation.TAN);