Browse Source

Add 'Zfhmin' extension (#880)

Zfhmin is a subset of Zfh (half-precision IEEE 754 binary16 floating
point) extension, consisting only of data transfer and conversion
instructions.

This commit adds `EXT_ZFHMIN` to `isa_extension_t`, permits "zfhmin"
as a multi-letter extension and adjusts feature gate for
data transfer / conversion instructions.

*   FLH / FSH
*   FMV.X.H / FMV.H.X
*   FCVT.S.H / FCVT.H.S
*   FCVT.D.H / FCVT.H.D (if 'D' extension is also present)
*   FCVT.Q.H / FCVT.H.Q (if 'Q' extension is also present)
pull/882/head
Tsukasa #01 (a4lg) 4 years ago
committed by GitHub
parent
commit
a68c7b12e6
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 2
      riscv/insns/fcvt_d_h.h
  2. 2
      riscv/insns/fcvt_h_d.h
  3. 2
      riscv/insns/fcvt_h_q.h
  4. 2
      riscv/insns/fcvt_h_s.h
  5. 2
      riscv/insns/fcvt_q_h.h
  6. 2
      riscv/insns/fcvt_s_h.h
  7. 2
      riscv/insns/flh.h
  8. 2
      riscv/insns/fmv_h_x.h
  9. 2
      riscv/insns/fmv_x_h.h
  10. 2
      riscv/insns/fsh.h
  11. 8
      riscv/processor.cc
  12. 1
      riscv/processor.h

2
riscv/insns/fcvt_d_h.h

@ -1,4 +1,4 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_extension('D');
require_fp;
softfloat_roundingMode = RM;

2
riscv/insns/fcvt_h_d.h

@ -1,4 +1,4 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_extension('D');
require_fp;
softfloat_roundingMode = RM;

2
riscv/insns/fcvt_h_q.h

@ -1,4 +1,4 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_extension('Q');
require_fp;
softfloat_roundingMode = RM;

2
riscv/insns/fcvt_h_s.h

@ -1,4 +1,4 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_fp;
softfloat_roundingMode = RM;
WRITE_FRD(f32_to_f16(f32(FRS1)));

2
riscv/insns/fcvt_q_h.h

@ -1,4 +1,4 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_extension('Q');
require_fp;
softfloat_roundingMode = RM;

2
riscv/insns/fcvt_s_h.h

@ -1,4 +1,4 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_fp;
softfloat_roundingMode = RM;
WRITE_FRD(f16_to_f32(f16(FRS1)));

2
riscv/insns/flh.h

@ -1,3 +1,3 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_fp;
WRITE_FRD(f16(MMU.load_uint16(RS1 + insn.i_imm())));

2
riscv/insns/fmv_h_x.h

@ -1,3 +1,3 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_fp;
WRITE_FRD(f16(RS1));

2
riscv/insns/fmv_x_h.h

@ -1,3 +1,3 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_fp;
WRITE_RD(sext32((int16_t)(FRS1.v[0])));

2
riscv/insns/fsh.h

@ -1,3 +1,3 @@
require_extension(EXT_ZFH);
require_extension(EXT_ZFHMIN);
require_fp;
MMU.store_uint16(RS1 + insn.s_imm(), FRS2.v[0]);

8
riscv/processor.cc

@ -250,10 +250,12 @@ void processor_t::parse_isa_string(const char* str)
auto end = p;
do ++end; while (*end && *end != '_');
auto ext_str = std::string(p, end);
if (ext_str == "zfh") {
if (ext_str == "zfh" || ext_str == "zfhmin") {
if (!((max_isa >> ('f' - 'a')) & 1))
bad_isa_string(str, "'Zfh' extension requires 'F'");
extension_table[EXT_ZFH] = true;
bad_isa_string(str, ("'" + ext_str + "' extension requires 'F'").c_str());
extension_table[EXT_ZFHMIN] = true;
if (ext_str == "zfh")
extension_table[EXT_ZFH] = true;
} else if (ext_str == "zicsr") {
// Spike necessarily has Zicsr, because
// Zicsr is implied by the privileged architecture

1
riscv/processor.h

@ -230,6 +230,7 @@ typedef enum {
typedef enum {
// 65('A') ~ 90('Z') is reserved for standard isa in misa
EXT_ZFH,
EXT_ZFHMIN,
EXT_ZBA,
EXT_ZBB,
EXT_ZBC,

Loading…
Cancel
Save