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