[xcc,sim] added fused multiply-add and its cousins
authorAndrew Waterman <waterman@ubuntu.(none)>
Mon, 23 Aug 2010 05:13:51 +0000 (22:13 -0700)
committerAndrew Waterman <waterman@ubuntu.(none)>
Mon, 23 Aug 2010 05:13:51 +0000 (22:13 -0700)
riscv/execute.h
riscv/insns/madd_d.h [new file with mode: 0644]
riscv/insns/madd_s.h [new file with mode: 0644]
riscv/insns/msub_d.h [new file with mode: 0644]
riscv/insns/msub_s.h [new file with mode: 0644]
riscv/insns/nmadd_d.h [new file with mode: 0644]
riscv/insns/nmadd_s.h [new file with mode: 0644]
riscv/insns/nmsub_d.h [new file with mode: 0644]
riscv/insns/nmsub_s.h [new file with mode: 0644]

index 4386742ae3a8e89d9f93bd6bc683951cac49dd28..823697a76e13928fd04b1585832a23b1ddbc2c78 100644 (file)
@@ -277,6 +277,62 @@ switch((insn.bits >> 0x19) & 0x7f)
         }
         #include "insns/unimp.h"
       }
+      case 0x4:
+      {
+        if((insn.bits & 0xfe007c00) == 0xd0004000)
+        {
+          #include "insns/madd_s.h"
+          break;
+        }
+        if((insn.bits & 0xfe007c00) == 0xd0004c00)
+        {
+          #include "insns/madd_d.h"
+          break;
+        }
+        #include "insns/unimp.h"
+      }
+      case 0x5:
+      {
+        if((insn.bits & 0xfe007c00) == 0xd0005000)
+        {
+          #include "insns/msub_s.h"
+          break;
+        }
+        if((insn.bits & 0xfe007c00) == 0xd0005c00)
+        {
+          #include "insns/msub_d.h"
+          break;
+        }
+        #include "insns/unimp.h"
+      }
+      case 0x6:
+      {
+        if((insn.bits & 0xfe007c00) == 0xd0006000)
+        {
+          #include "insns/nmadd_s.h"
+          break;
+        }
+        if((insn.bits & 0xfe007c00) == 0xd0006c00)
+        {
+          #include "insns/nmadd_d.h"
+          break;
+        }
+        #include "insns/unimp.h"
+      }
+      case 0x7:
+      {
+        if((insn.bits & 0xfe007c00) == 0xd0007c00)
+        {
+          #include "insns/nmsub_d.h"
+          break;
+        }
+        if((insn.bits & 0xfe007c00) == 0xd0007000)
+        {
+          #include "insns/nmsub_s.h"
+          break;
+        }
+        #include "insns/unimp.h"
+      }
       default:
       {
         #include "insns/unimp.h"
diff --git a/riscv/insns/madd_d.h b/riscv/insns/madd_d.h
new file mode 100644 (file)
index 0000000..e1b9206
--- /dev/null
@@ -0,0 +1,3 @@
+require_fp;
+FRC = f64_mulAdd(FRA, FRB, FRD);
+set_fp_exceptions;
diff --git a/riscv/insns/madd_s.h b/riscv/insns/madd_s.h
new file mode 100644 (file)
index 0000000..3433adf
--- /dev/null
@@ -0,0 +1,3 @@
+require_fp;
+FRC = f32_mulAdd(FRA, FRB, FRD);
+set_fp_exceptions;
diff --git a/riscv/insns/msub_d.h b/riscv/insns/msub_d.h
new file mode 100644 (file)
index 0000000..a35dc19
--- /dev/null
@@ -0,0 +1,3 @@
+require_fp;
+FRC = f64_mulAdd(FRA, FRB, FRD ^ (uint32_t)INT64_MIN);
+set_fp_exceptions;
diff --git a/riscv/insns/msub_s.h b/riscv/insns/msub_s.h
new file mode 100644 (file)
index 0000000..60f10a4
--- /dev/null
@@ -0,0 +1,3 @@
+require_fp;
+FRC = f32_mulAdd(FRA, FRB, FRD ^ (uint32_t)INT32_MIN);
+set_fp_exceptions;
diff --git a/riscv/insns/nmadd_d.h b/riscv/insns/nmadd_d.h
new file mode 100644 (file)
index 0000000..73ab2bf
--- /dev/null
@@ -0,0 +1,3 @@
+require_fp;
+FRC = f64_mulAdd(FRA, FRB, FRD) ^ (uint64_t)INT64_MIN;
+set_fp_exceptions;
diff --git a/riscv/insns/nmadd_s.h b/riscv/insns/nmadd_s.h
new file mode 100644 (file)
index 0000000..c060355
--- /dev/null
@@ -0,0 +1,3 @@
+require_fp;
+FRC = f32_mulAdd(FRA, FRB, FRD) ^ (uint32_t)INT32_MIN;
+set_fp_exceptions;
diff --git a/riscv/insns/nmsub_d.h b/riscv/insns/nmsub_d.h
new file mode 100644 (file)
index 0000000..0c06f47
--- /dev/null
@@ -0,0 +1,3 @@
+require_fp;
+FRC = f64_mulAdd(FRA, FRB, FRD ^ (uint64_t)INT64_MIN) ^ (uint64_t)INT64_MIN;
+set_fp_exceptions;
diff --git a/riscv/insns/nmsub_s.h b/riscv/insns/nmsub_s.h
new file mode 100644 (file)
index 0000000..d9fe109
--- /dev/null
@@ -0,0 +1,3 @@
+require_fp;
+FRC = f32_mulAdd(FRA, FRB, FRD ^ (uint32_t)INT32_MIN) ^ (uint32_t)INT32_MIN;
+set_fp_exceptions;