Skip to content

Commit e3dc14a

Browse files
committed
Implement Zvfbqdot8f
1 parent a07e440 commit e3dc14a

File tree

7 files changed

+56
-0
lines changed

7 files changed

+56
-0
lines changed

disasm/isa_parser.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@ isa_parser_t::isa_parser_t(const char* str, const char *priv)
330330
extension_table[EXT_ZVQBDOT8I] = true;
331331
} else if (ext_str == "zvqbdot16i") {
332332
extension_table[EXT_ZVQBDOT16I] = true;
333+
} else if (ext_str == "zvfqbdot8f") {
334+
extension_table[EXT_ZVFQBDOT8F] = true;
333335
} else if (ext_str == "zvfwbdot16bf") {
334336
extension_table[EXT_ZVFWBDOT16BF] = true;
335337
} else if (ext_str == "zvfbdot32f") {

riscv/insns/vfqbdot_alt_vv.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
VI_VFP_BASE;
2+
ZVBDOT_INIT(4);
3+
4+
#define COMMA ,
5+
6+
switch (P.VU.vsew) {
7+
case 8: {
8+
require_extension(EXT_ZVFQBDOT8F);
9+
if (P.VU.altfmt) {
10+
ZVBDOT_LOOP(uint8_t, uint8_t, float32_t, zvfqbdot8f_dot_acc<ofp8_e5m2 COMMA ofp8_e5m2>);
11+
} else {
12+
ZVBDOT_LOOP(uint8_t, uint8_t, float32_t, zvfqbdot8f_dot_acc<ofp8_e4m3 COMMA ofp8_e5m2>);
13+
}
14+
break;
15+
}
16+
default: require(false);
17+
}

riscv/insns/vfqbdot_vv.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
VI_VFP_BASE;
2+
ZVBDOT_INIT(4);
3+
4+
#define COMMA ,
5+
6+
switch (P.VU.vsew) {
7+
case 8: {
8+
require_extension(EXT_ZVFQBDOT8F);
9+
if (P.VU.altfmt) {
10+
ZVBDOT_LOOP(uint8_t, uint8_t, float32_t, zvfqbdot8f_dot_acc<ofp8_e5m2 COMMA ofp8_e4m3>);
11+
} else {
12+
ZVBDOT_LOOP(uint8_t, uint8_t, float32_t, zvfqbdot8f_dot_acc<ofp8_e4m3 COMMA ofp8_e4m3>);
13+
}
14+
break;
15+
}
16+
default: require(false);
17+
}

riscv/isa_parser.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ typedef enum {
7070
EXT_ZVQDOTQ,
7171
EXT_ZVQBDOT8I,
7272
EXT_ZVQBDOT16I,
73+
EXT_ZVFQBDOT8F,
7374
EXT_ZVFWBDOT16BF,
7475
EXT_ZVFBDOT32F,
7576
EXT_ZVQLDOT8I,

riscv/riscv.mk.in

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1079,6 +1079,8 @@ riscv_insn_ext_zvbdot = \
10791079
vqbdots_vv \
10801080
vfwbdot_vv \
10811081
vfbdot_vv \
1082+
vfqbdot_vv \
1083+
vfqbdot_alt_vv \
10821084

10831085
riscv_insn_ext_zvldot = \
10841086
vqldotu_vv \

riscv/vector_unit.cc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,8 @@ reg_t vectorUnit_t::vectorUnit_t::set_vl(int rd, int rs1, reg_t reqVL, reg_t new
4646
ill_altfmt = false;
4747
else if (p->extension_enabled(EXT_ZVQBDOT16I) && vsew == 16)
4848
ill_altfmt = false;
49+
else if (p->extension_enabled(EXT_ZVFQBDOT8F) && vsew == 8)
50+
ill_altfmt = false;
4951
else if (p->extension_enabled(EXT_ZVFWBDOT16BF) && vsew == 16)
5052
ill_altfmt = false;
5153
else if (p->extension_enabled(EXT_ZVQLDOT8I) && vsew == 8)

riscv/zvbdot.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,19 @@ static inline float32_t zvfwbdot16bf_dot_acc(const std::vector<uint16_t>& a, con
4141
return f32_add_odd(f32(res.out), c);
4242
}
4343

44+
template<typename A, typename B>
45+
float32_t zvfqbdot8f_dot_acc(const std::vector<uint8_t>& a, const std::vector<uint8_t>& b, float32_t c)
46+
{
47+
std::vector<A> fa(a.size());
48+
std::transform(a.begin(), a.end(), fa.begin(), [](auto f) { return f; });
49+
50+
std::vector<B> fb(b.size());
51+
std::transform(b.begin(), b.end(), fb.begin(), [](auto f) { return f; });
52+
53+
DotConfig cfg(a.size(), int_log2(a.size()) + ((a.size() & (a.size() - 1)) != 0));
54+
auto res = bulk_norm_dot_ofp8(cfg, &fa[0], &fb[0]);
55+
softfloat_exceptionFlags |= res.flags;
56+
return f32_add_odd(f32(res.out), c);
57+
}
58+
4459
#endif

0 commit comments

Comments
 (0)