From 3e18d4ccc0af9d72e692889533638d1c9568ea38 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Sun, 22 Aug 2010 22:13:51 -0700 Subject: [PATCH] [xcc,sim] added fused multiply-add and its cousins --- riscv/execute.h | 56 +++++++++++++++++++++++++++++++++++++++++++ riscv/insns/madd_d.h | 3 +++ riscv/insns/madd_s.h | 3 +++ riscv/insns/msub_d.h | 3 +++ riscv/insns/msub_s.h | 3 +++ riscv/insns/nmadd_d.h | 3 +++ riscv/insns/nmadd_s.h | 3 +++ riscv/insns/nmsub_d.h | 3 +++ riscv/insns/nmsub_s.h | 3 +++ 9 files changed, 80 insertions(+) create mode 100644 riscv/insns/madd_d.h create mode 100644 riscv/insns/madd_s.h create mode 100644 riscv/insns/msub_d.h create mode 100644 riscv/insns/msub_s.h create mode 100644 riscv/insns/nmadd_d.h create mode 100644 riscv/insns/nmadd_s.h create mode 100644 riscv/insns/nmsub_d.h create mode 100644 riscv/insns/nmsub_s.h diff --git a/riscv/execute.h b/riscv/execute.h index 4386742..823697a 100644 --- a/riscv/execute.h +++ b/riscv/execute.h @@ -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 index 0000000..e1b9206 --- /dev/null +++ b/riscv/insns/madd_d.h @@ -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 index 0000000..3433adf --- /dev/null +++ b/riscv/insns/madd_s.h @@ -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 index 0000000..a35dc19 --- /dev/null +++ b/riscv/insns/msub_d.h @@ -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 index 0000000..60f10a4 --- /dev/null +++ b/riscv/insns/msub_s.h @@ -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 index 0000000..73ab2bf --- /dev/null +++ b/riscv/insns/nmadd_d.h @@ -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 index 0000000..c060355 --- /dev/null +++ b/riscv/insns/nmadd_s.h @@ -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 index 0000000..0c06f47 --- /dev/null +++ b/riscv/insns/nmsub_d.h @@ -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 index 0000000..d9fe109 --- /dev/null +++ b/riscv/insns/nmsub_s.h @@ -0,0 +1,3 @@ +require_fp; +FRC = f32_mulAdd(FRA, FRB, FRD ^ (uint32_t)INT32_MIN) ^ (uint32_t)INT32_MIN; +set_fp_exceptions; -- 2.30.2