From 68ddbd26c3643ebe13aa34e58d7dad5dbc1ddbd3 Mon Sep 17 00:00:00 2001 From: Andrew Waterman Date: Tue, 28 Sep 2010 17:17:04 -0700 Subject: [PATCH] [opcodes, sim, xcc] added mffl.d instruction ...to be used instead of mff.s when doing int -> DP FP moves on a 32-bit cpu --- riscv/execute.h | 221 ++++++++++++++++++++++--------------------- riscv/insns/mffl_d.h | 2 + 2 files changed, 115 insertions(+), 108 deletions(-) create mode 100644 riscv/insns/mffl_d.h diff --git a/riscv/execute.h b/riscv/execute.h index 2c500c4..15f4e1a 100644 --- a/riscv/execute.h +++ b/riscv/execute.h @@ -62,291 +62,296 @@ switch((insn.bits >> 0x19) & 0x7f) break; } case 0x68: + { + switch((insn.bits >> 0xc) & 0x7) + { + case 0x2: + { + #include "insns/l_s.h" + break; + } + case 0x3: + { + #include "insns/l_d.h" + break; + } + default: + { + #include "insns/unimp.h" + } + } + break; + } + case 0x69: + { + switch((insn.bits >> 0xc) & 0x7) + { + case 0x2: + { + #include "insns/s_s.h" + break; + } + case 0x3: + { + #include "insns/s_d.h" + break; + } + default: + { + #include "insns/unimp.h" + } + } + break; + } + case 0x6a: { switch((insn.bits >> 0xc) & 0x7) { case 0x0: { - if((insn.bits & 0xfe007fe0) == 0xd0000820) + if((insn.bits & 0xfe007fe0) == 0xd4000820) { #include "insns/c_eq_s.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd00000a0) + if((insn.bits & 0xfe007fe0) == 0xd40000a0) { #include "insns/sgninj_s.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd00004c0) + if((insn.bits & 0xfff07fe0) == 0xd40004c0) { #include "insns/cvt_s_w.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0000440) + if((insn.bits & 0xfff07fe0) == 0xd4000440) { #include "insns/trunc_w_s.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0000000) + if((insn.bits & 0xfe007fe0) == 0xd4000000) { #include "insns/add_s.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd00000c0) + if((insn.bits & 0xfe007fe0) == 0xd40000c0) { #include "insns/sgninjn_s.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0000400) + if((insn.bits & 0xfff07fe0) == 0xd4000400) { #include "insns/trunc_l_s.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd00004e0) + if((insn.bits & 0xfff07fe0) == 0xd40004e0) { #include "insns/cvtu_s_w.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0000420) + if((insn.bits & 0xfff07fe0) == 0xd4000420) { #include "insns/truncu_l_s.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd00004a0) + if((insn.bits & 0xfff07fe0) == 0xd40004a0) { #include "insns/cvtu_s_l.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0000020) + if((insn.bits & 0xfe007fe0) == 0xd4000020) { #include "insns/sub_s.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0000080) + if((insn.bits & 0xfff07fe0) == 0xd4000080) { #include "insns/sqrt_s.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0000840) + if((insn.bits & 0xfe007fe0) == 0xd4000840) { #include "insns/c_lt_s.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd00000e0) + if((insn.bits & 0xfe007fe0) == 0xd40000e0) { #include "insns/sgnmul_s.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0000480) + if((insn.bits & 0xfff07fe0) == 0xd4000480) { #include "insns/cvt_s_l.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0000060) + if((insn.bits & 0xfe007fe0) == 0xd4000060) { #include "insns/div_s.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0000660) + if((insn.bits & 0xfff07fe0) == 0xd4000660) { #include "insns/cvt_s_d.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0000860) + if((insn.bits & 0xfe007fe0) == 0xd4000860) { #include "insns/c_le_s.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0000040) + if((insn.bits & 0xfe007fe0) == 0xd4000040) { #include "insns/mul_s.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0000460) + if((insn.bits & 0xfff07fe0) == 0xd4000460) { #include "insns/truncu_w_s.h" break; } #include "insns/unimp.h" } + case 0x1: + { + if((insn.bits & 0xfff07fe0) == 0xd4001400) + { + #include "insns/mffl_d.h" + break; + } + if((insn.bits & 0xfff07fe0) == 0xd4001420) + { + #include "insns/mffh_d.h" + break; + } + if((insn.bits & 0xfff07fe0) == 0xd4001800) + { + #include "insns/mff_s.h" + break; + } + if((insn.bits & 0xfff07fe0) == 0xd4001c00) + { + #include "insns/mtf_s.h" + break; + } + #include "insns/unimp.h" + } case 0x6: { - if((insn.bits & 0xfe007fe0) == 0xd00060a0) + if((insn.bits & 0xfe007fe0) == 0xd40060a0) { #include "insns/sgninj_d.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0006060) + if((insn.bits & 0xfe007fe0) == 0xd4006060) { #include "insns/div_d.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0006820) + if((insn.bits & 0xfe007fe0) == 0xd4006820) { #include "insns/c_eq_d.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd00064a0) + if((insn.bits & 0xfff07fe0) == 0xd40064a0) { #include "insns/cvtu_d_l.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0006440) + if((insn.bits & 0xfff07fe0) == 0xd4006440) { #include "insns/trunc_w_d.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd00064e0) + if((insn.bits & 0xfff07fe0) == 0xd40064e0) { #include "insns/cvtu_d_w.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0006000) + if((insn.bits & 0xfe007fe0) == 0xd4006000) { #include "insns/add_d.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0006860) + if((insn.bits & 0xfe007fe0) == 0xd4006860) { #include "insns/c_le_d.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd00060e0) + if((insn.bits & 0xfe007fe0) == 0xd40060e0) { #include "insns/sgnmul_d.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd00060c0) + if((insn.bits & 0xfe007fe0) == 0xd40060c0) { #include "insns/sgninjn_d.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0006600) + if((insn.bits & 0xfff07fe0) == 0xd4006600) { #include "insns/cvt_d_s.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0006400) + if((insn.bits & 0xfff07fe0) == 0xd4006400) { #include "insns/trunc_l_d.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0006420) + if((insn.bits & 0xfff07fe0) == 0xd4006420) { #include "insns/truncu_l_d.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0006020) + if((insn.bits & 0xfe007fe0) == 0xd4006020) { #include "insns/sub_d.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0006080) + if((insn.bits & 0xfff07fe0) == 0xd4006080) { #include "insns/sqrt_d.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd00064c0) + if((insn.bits & 0xfff07fe0) == 0xd40064c0) { #include "insns/cvt_d_w.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0006480) + if((insn.bits & 0xfff07fe0) == 0xd4006480) { #include "insns/cvt_d_l.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd0006460) + if((insn.bits & 0xfff07fe0) == 0xd4006460) { #include "insns/truncu_w_d.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0006040) + if((insn.bits & 0xfe007fe0) == 0xd4006040) { #include "insns/mul_d.h" break; } - if((insn.bits & 0xfe007fe0) == 0xd0006840) + if((insn.bits & 0xfe007fe0) == 0xd4006840) { #include "insns/c_lt_d.h" break; } #include "insns/unimp.h" } - default: - { - #include "insns/unimp.h" - } - } - break; - } - case 0x69: - { - switch((insn.bits >> 0xc) & 0x7) - { - case 0x0: - { - #include "insns/l_s.h" - break; - } - case 0x1: - { - #include "insns/s_s.h" - break; - } - case 0x6: - { - #include "insns/l_d.h" - break; - } case 0x7: { - #include "insns/s_d.h" - break; - } - default: - { - #include "insns/unimp.h" - } - } - break; - } - case 0x6a: - { - switch((insn.bits >> 0xc) & 0x7) - { - case 0x0: - { - if((insn.bits & 0xfff07fe0) == 0xd4000000) - { - #include "insns/mff_s.h" - break; - } - if((insn.bits & 0xfff07fe0) == 0xd4000800) - { - #include "insns/mtf_s.h" - break; - } - #include "insns/unimp.h" - } - case 0x6: - { - if((insn.bits & 0xfff07fe0) == 0xd4006000) + if((insn.bits & 0xfff07fe0) == 0xd4007800) { #include "insns/mff_d.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd4006400) - { - #include "insns/mffh_d.h" - break; - } - if((insn.bits & 0xfe007fe0) == 0xd4006c00) + if((insn.bits & 0xfe007fe0) == 0xd4007000) { #include "insns/mtflh_d.h" break; } - if((insn.bits & 0xfff07fe0) == 0xd4006800) + if((insn.bits & 0xfff07fe0) == 0xd4007c00) { #include "insns/mtf_d.h" break; @@ -366,12 +371,12 @@ switch((insn.bits >> 0x19) & 0x7f) { case 0x0: { - if((insn.bits & 0xfe007c00) == 0xd6000800) + if((insn.bits & 0xfe007c00) == 0xd6000c00) { #include "insns/nmadd_s.h" break; } - if((insn.bits & 0xfe007c00) == 0xd6000c00) + if((insn.bits & 0xfe007c00) == 0xd6000800) { #include "insns/nmsub_s.h" break; @@ -390,12 +395,12 @@ switch((insn.bits >> 0x19) & 0x7f) } case 0x6: { - if((insn.bits & 0xfe007c00) == 0xd6006800) + if((insn.bits & 0xfe007c00) == 0xd6006c00) { #include "insns/nmadd_d.h" break; } - if((insn.bits & 0xfe007c00) == 0xd6006c00) + if((insn.bits & 0xfe007c00) == 0xd6006800) { #include "insns/nmsub_d.h" break; diff --git a/riscv/insns/mffl_d.h b/riscv/insns/mffl_d.h new file mode 100644 index 0000000..a258aa0 --- /dev/null +++ b/riscv/insns/mffl_d.h @@ -0,0 +1,2 @@ +require_fp; +RDR = sext32(FRS1); -- 2.30.2