(sqrtsf2, sinsf2, sindf2, sinxf2): Define.
authorRichard Kenner <kenner@gcc.gnu.org>
Wed, 21 Dec 1994 20:36:31 +0000 (15:36 -0500)
committerRichard Kenner <kenner@gcc.gnu.org>
Wed, 21 Dec 1994 20:36:31 +0000 (15:36 -0500)
(cossf2, cosdf2, cosxf2): Likewise.
(sqrtxf2): Operand 1 now XFmode.

From-SVN: r8685

gcc/config/m68k/m68k.md

index 196df8b678ee3e643d7572fed6d95f1ccd21723a..761bb4f7023126c1b54e98d01b60f32043bda7d5 100644 (file)
 ;;- "%$"    single-precision fp specifier ("s" or "")  f%$add.x fp0,fp1
 ;;- "%&"    double-precision fp specifier ("d" or "")  f%&add.x fp0,fp1
 
+;; UNSPEC usage:
+;; 1  This is a `sin' operation.  The mode of the UNSPEC is MODE_FLOAT.
+;;    operand 1 is the argument for `sin'.
+;; 2  This is a `cos' operation.  The mode of the UNSPEC is MODE_FLOAT.
+;;    operand 1 is the argument for `cos'.
+
 ;;- Information about 68040 port.
 
 ;;- The 68040 executes all 68030 and 68881/2 instructions, but some must
 \f
 ;; Sqrt instruction for the 68881
 
+(define_insn "sqrtsf2"
+  [(set (match_operand:SF 0 "general_operand" "=f")
+       (sqrt:SF (match_operand:SF 1 "general_operand" "fm")))]
+  "TARGET_68881"
+  "*
+{
+  if (FP_REG_P (operands[1]))
+    return \"fsqrt%.x %1,%0\";
+  else
+    return \"fsqrt%.s %1,%0\";
+}")
+
 (define_insn "sqrtdf2"
   [(set (match_operand:DF 0 "general_operand" "=f")
        (sqrt:DF (match_operand:DF 1 "general_operand" "fm")))]
 
 (define_insn "sqrtxf2"
   [(set (match_operand:XF 0 "general_operand" "=f")
-       (sqrt:XF (match_operand:DF 1 "nonimmediate_operand" "fm")))]
+       (sqrt:XF (match_operand:XF 1 "nonimmediate_operand" "fm")))]
   "TARGET_68881"
   "*
 {
     return \"fsqrt%.x %1,%0\";
 }")
+
+(define_insn "sinsf2"
+  [(set (match_operand:SF 0 "general_operand" "=f")
+       (unspec:SF [(match_operand:SF 1 "general_operand" "fm")] 1))]
+  "TARGET_68881 && flag_fast_math"
+  "*
+{
+  if (FP_REG_P (operands[1]))
+    return \"fsin%.x %1,%0\";
+  else
+    return \"fsin%.s %1,%0\";
+}")
+
+(define_insn "sindf2"
+  [(set (match_operand:DF 0 "general_operand" "=f")
+       (unspec:DF [(match_operand:DF 1 "general_operand" "fm")] 1))]
+  "TARGET_68881 && flag_fast_math"
+  "*
+{
+  if (FP_REG_P (operands[1]))
+    return \"fsin%.x %1,%0\";
+  else
+    return \"fsin%.d %1,%0\";
+}")
+
+(define_insn "sinxf2"
+  [(set (match_operand:XF 0 "general_operand" "=f")
+       (unspec:XF [(match_operand:XF 1 "nonimmediate_operand" "fm")] 1))]
+  "TARGET_68881 && flag_fast_math"
+  "*
+{
+    return \"fsin%.x %1,%0\";
+}")
+
+(define_insn "cossf2"
+  [(set (match_operand:SF 0 "general_operand" "=f")
+       (unspec:SF [(match_operand:SF 1 "general_operand" "fm")] 2))]
+  "TARGET_68881 && flag_fast_math"
+  "*
+{
+  if (FP_REG_P (operands[1]))
+    return \"fcos%.x %1,%0\";
+  else
+    return \"fcos%.s %1,%0\";
+}")
+
+(define_insn "cosdf2"
+  [(set (match_operand:DF 0 "general_operand" "=f")
+       (unspec:DF [(match_operand:DF 1 "general_operand" "fm")] 2))]
+  "TARGET_68881 && flag_fast_math"
+  "*
+{
+  if (FP_REG_P (operands[1]))
+    return \"fcos%.x %1,%0\";
+  else
+    return \"fcos%.d %1,%0\";
+}")
+
+(define_insn "cosxf2"
+  [(set (match_operand:XF 0 "general_operand" "=f")
+       (unspec:XF [(match_operand:XF 1 "nonimmediate_operand" "fm")] 2))]
+  "TARGET_68881 && flag_fast_math"
+  "*
+{
+    return \"fcos%.x %1,%0\";
+}")