Add vx variant support to `vsha` and `vshl`
PiperOrigin-RevId: 557259090
diff --git a/sim/kelvin_shift.bin_fmt b/sim/kelvin_shift.bin_fmt
index fb061ed..ba2f37f 100644
--- a/sim/kelvin_shift.bin_fmt
+++ b/sim/kelvin_shift.bin_fmt
@@ -45,31 +45,55 @@
//vsha
vsha_b_vv : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b00, m == 0b00, func1 == 0b010, form == 0b00;
+ vsha_b_vx : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b00, m == 0b00, func1 == 0b010, form == 0b10;
vsha_b_vv_m : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b00, m == 0b01, func1 == 0b010, form == 0b00;
+ vsha_b_vx_m : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b00, m == 0b01, func1 == 0b010, form == 0b10;
vsha_h_vv : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b01, m == 0b00, func1 == 0b010, form == 0b00;
+ vsha_h_vx : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b01, m == 0b00, func1 == 0b010, form == 0b10;
vsha_h_vv_m : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b01, m == 0b01, func1 == 0b010, form == 0b00;
+ vsha_h_vx_m : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b01, m == 0b01, func1 == 0b010, form == 0b10;
vsha_w_vv : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b10, m == 0b00, func1 == 0b010, form == 0b00;
+ vsha_w_vx : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b10, m == 0b00, func1 == 0b010, form == 0b10;
vsha_w_vv_m : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b10, m == 0b01, func1 == 0b010, form == 0b00;
+ vsha_w_vx_m : KelvinV2ArgsType : func2 == 0b00'1000, sz == 0b10, m == 0b01, func1 == 0b010, form == 0b10;
vsha_b_r_vv : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b00, m == 0b00, func1 == 0b010, form == 0b00;
+ vsha_b_r_vx : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b00, m == 0b00, func1 == 0b010, form == 0b10;
vsha_b_r_vv_m : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b00, m == 0b01, func1 == 0b010, form == 0b00;
+ vsha_b_r_vx_m : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b00, m == 0b01, func1 == 0b010, form == 0b10;
vsha_h_r_vv : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b01, m == 0b00, func1 == 0b010, form == 0b00;
+ vsha_h_r_vx : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b01, m == 0b00, func1 == 0b010, form == 0b10;
vsha_h_r_vv_m : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b01, m == 0b01, func1 == 0b010, form == 0b00;
+ vsha_h_r_vx_m : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b01, m == 0b01, func1 == 0b010, form == 0b10;
vsha_w_r_vv : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b10, m == 0b00, func1 == 0b010, form == 0b00;
+ vsha_w_r_vx : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b10, m == 0b00, func1 == 0b010, form == 0b10;
vsha_w_r_vv_m : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b10, m == 0b01, func1 == 0b010, form == 0b00;
+ vsha_w_r_vx_m : KelvinV2ArgsType : func2 == 0b00'1010, sz == 0b10, m == 0b01, func1 == 0b010, form == 0b10;
//vshl
vshl_b_vv : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b00, m == 0b00, func1 == 0b010, form == 0b00;
+ vshl_b_vx : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b00, m == 0b00, func1 == 0b010, form == 0b10;
vshl_b_vv_m : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b00, m == 0b01, func1 == 0b010, form == 0b00;
+ vshl_b_vx_m : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b00, m == 0b01, func1 == 0b010, form == 0b10;
vshl_h_vv : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b01, m == 0b00, func1 == 0b010, form == 0b00;
+ vshl_h_vx : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b01, m == 0b00, func1 == 0b010, form == 0b10;
vshl_h_vv_m : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b01, m == 0b01, func1 == 0b010, form == 0b00;
+ vshl_h_vx_m : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b01, m == 0b01, func1 == 0b010, form == 0b10;
vshl_w_vv : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b10, m == 0b00, func1 == 0b010, form == 0b00;
+ vshl_w_vx : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b10, m == 0b00, func1 == 0b010, form == 0b10;
vshl_w_vv_m : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b10, m == 0b01, func1 == 0b010, form == 0b00;
+ vshl_w_vx_m : KelvinV2ArgsType : func2 == 0b00'1001, sz == 0b10, m == 0b01, func1 == 0b010, form == 0b10;
vshl_b_r_vv : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b00, m == 0b00, func1 == 0b010, form == 0b00;
+ vshl_b_r_vx : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b00, m == 0b00, func1 == 0b010, form == 0b10;
vshl_b_r_vv_m : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b00, m == 0b01, func1 == 0b010, form == 0b00;
+ vshl_b_r_vx_m : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b00, m == 0b01, func1 == 0b010, form == 0b10;
vshl_h_r_vv : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b01, m == 0b00, func1 == 0b010, form == 0b00;
+ vshl_h_r_vx : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b01, m == 0b00, func1 == 0b010, form == 0b10;
vshl_h_r_vv_m : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b01, m == 0b01, func1 == 0b010, form == 0b00;
+ vshl_h_r_vx_m : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b01, m == 0b01, func1 == 0b010, form == 0b10;
vshl_w_r_vv : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b10, m == 0b00, func1 == 0b010, form == 0b00;
+ vshl_w_r_vx : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b10, m == 0b00, func1 == 0b010, form == 0b10;
vshl_w_r_vv_m : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b10, m == 0b01, func1 == 0b010, form == 0b00;
+ vshl_w_r_vx_m : KelvinV2ArgsType : func2 == 0b00'1011, sz == 0b10, m == 0b01, func1 == 0b010, form == 0b10;
//vnot
vnot_v : KelvinV2ArgsType : func2 == 0b00'0011, vs2 == 0, m == 0b00, func1 == 0b001, form == 0b10;
diff --git a/sim/kelvin_shift.isa b/sim/kelvin_shift.isa
index 9477806..fcc671c 100644
--- a/sim/kelvin_shift.isa
+++ b/sim/kelvin_shift.isa
@@ -133,78 +133,150 @@
//vsha
vsha_b_vv{: vs1, vs2 : vd},
disasm: "vsha.b.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ false)";
+ vsha_b_vx{: vs1, vs2 : vd},
+ disasm: "vsha.b.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ false)";
vsha_b_vv_m{: vs1, vs2 : vd},
disasm: "vsha.b.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ true)";
+ vsha_b_vx_m{: vs1, vs2 : vd},
+ disasm: "vsha.b.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ true)";
vsha_h_vv{: vs1, vs2 : vd},
disasm: "vsha.h.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ false)";
+ vsha_h_vx{: vs1, vs2 : vd},
+ disasm: "vsha.h.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ false)";
vsha_h_vv_m{: vs1, vs2 : vd},
disasm: "vsha.h.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ true)";
+ vsha_h_vx_m{: vs1, vs2 : vd},
+ disasm: "vsha.h.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ true)";
vsha_w_vv{: vs1, vs2 : vd},
disasm: "vsha.w.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ false)";
+ vsha_w_vx{: vs1, vs2 : vd},
+ disasm: "vsha.w.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ false)";
vsha_w_vv_m{: vs1, vs2 : vd},
disasm: "vsha.w.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ true)";
+ vsha_w_vx_m{: vs1, vs2 : vd},
+ disasm: "vsha.w.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ true)";
vsha_b_r_vv{: vs1, vs2 : vd},
disasm: "vsha.b.r.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ false)";
+ vsha_b_r_vx{: vs1, vs2 : vd},
+ disasm: "vsha.b.r.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ false)";
vsha_b_r_vv_m{: vs1, vs2 : vd},
disasm: "vsha.b.r.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ true)";
+ vsha_b_r_vx_m{: vs1, vs2 : vd},
+ disasm: "vsha.b.r.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int8_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ true)";
vsha_h_r_vv{: vs1, vs2 : vd},
disasm: "vsha.h.r.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ false)";
+ vsha_h_r_vx{: vs1, vs2 : vd},
+ disasm: "vsha.h.r.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ false)";
vsha_h_r_vv_m{: vs1, vs2 : vd},
disasm: "vsha.h.r.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ true)";
+ vsha_h_r_vx_m{: vs1, vs2 : vd},
+ disasm: "vsha.h.r.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int16_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ true)";
vsha_w_r_vv{: vs1, vs2 : vd},
disasm: "vsha.w.r.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ false)";
+ vsha_w_r_vx{: vs1, vs2 : vd},
+ disasm: "vsha.w.r.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ false)";
vsha_w_r_vv_m{: vs1, vs2 : vd},
disasm: "vsha.w.r.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ true)";
+ vsha_w_r_vx_m{: vs1, vs2 : vd},
+ disasm: "vsha.w.r.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<int32_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ true)";
//vshl
vshl_b_vv{: vs1, vs2 : vd},
disasm: "vshl.b.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ false)";
+ vshl_b_vx{: vs1, vs2 : vd},
+ disasm: "vshl.b.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ false)";
vshl_b_vv_m{: vs1, vs2 : vd},
disasm: "vshl.b.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ true)";
+ vshl_b_vx_m{: vs1, vs2 : vd},
+ disasm: "vshl.b.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ true)";
vshl_h_vv{: vs1, vs2 : vd},
disasm: "vshl.h.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ false)";
+ vshl_h_vx{: vs1, vs2 : vd},
+ disasm: "vshl.h.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ false)";
vshl_h_vv_m{: vs1, vs2 : vd},
disasm: "vshl.h.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ true)";
+ vshl_h_vx_m{: vs1, vs2 : vd},
+ disasm: "vshl.h.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ true)";
vshl_w_vv{: vs1, vs2 : vd},
disasm: "vshl.w.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ false)";
+ vshl_w_vx{: vs1, vs2 : vd},
+ disasm: "vshl.w.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ false)";
vshl_w_vv_m{: vs1, vs2 : vd},
disasm: "vshl.w.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /* scalar */ false, /*strip_mine*/ true)";
+ vshl_w_vx_m{: vs1, vs2 : vd},
+ disasm: "vshl.w.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ false, /* scalar */ true, /*strip_mine*/ true)";
vshl_b_r_vv{: vs1, vs2 : vd},
disasm: "vshl.b.r.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ false)";
+ vshl_b_r_vx{: vs1, vs2 : vd},
+ disasm: "vshl.b.r.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ false)";
vshl_b_r_vv_m{: vs1, vs2 : vd},
disasm: "vshl.b.r.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ true)";
+ vshl_b_r_vx_m{: vs1, vs2 : vd},
+ disasm: "vshl.b.r.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint8_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ true)";
vshl_h_r_vv{: vs1, vs2 : vd},
disasm: "vshl.h.r.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ false)";
+ vshl_h_r_vx{: vs1, vs2 : vd},
+ disasm: "vshl.h.r.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ false)";
vshl_h_r_vv_m{: vs1, vs2 : vd},
disasm: "vshl.h.r.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ true)";
+ vshl_h_r_vx_m{: vs1, vs2 : vd},
+ disasm: "vshl.h.r.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint16_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ true)";
vshl_w_r_vv{: vs1, vs2 : vd},
disasm: "vshl.w.r.vv", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /*strip_mine*/ false)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ false)";
+ vshl_w_r_vx{: vs1, vs2 : vd},
+ disasm: "vshl.w.r.vx", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ false)";
vshl_w_r_vv_m{: vs1, vs2 : vd},
disasm: "vshl.w.r.vv.m", "%vd, %vs1, %vs2",
- semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /*strip_mine*/ true)";
+ semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /* scalar */ false, /*strip_mine*/ true)";
+ vshl_w_r_vx_m{: vs1, vs2 : vd},
+ disasm: "vshl.w.r.vx.m", "%vd, %vs1, %vs2",
+ semfunc: "absl::bind_front(&KelvinVShift<uint32_t>, /* round */ true, /* scalar */ true, /*strip_mine*/ true)";
//vnot
vnot_v{: vs1 : vd},
diff --git a/sim/kelvin_vector_instructions.cc b/sim/kelvin_vector_instructions.cc
index da4c8d7..432d91d 100644
--- a/sim/kelvin_vector_instructions.cc
+++ b/sim/kelvin_vector_instructions.cc
@@ -777,17 +777,17 @@
}
template <typename T>
-void KelvinVShift(bool round, bool strip_mine, Instruction *inst) {
+void KelvinVShift(bool round, bool scalar, bool strip_mine, Instruction *inst) {
KelvinBinaryVectorOp(
- inst, false /* scalar */, strip_mine,
+ inst, scalar, strip_mine,
std::function<T(T, T)>(absl::bind_front(&KelvinVShiftHelper<T>, round)));
}
-template void KelvinVShift<int8_t>(bool, bool, Instruction *);
-template void KelvinVShift<int16_t>(bool, bool, Instruction *);
-template void KelvinVShift<int32_t>(bool, bool, Instruction *);
-template void KelvinVShift<uint8_t>(bool, bool, Instruction *);
-template void KelvinVShift<uint16_t>(bool, bool, Instruction *);
-template void KelvinVShift<uint32_t>(bool, bool, Instruction *);
+template void KelvinVShift<int8_t>(bool, bool, bool, Instruction *);
+template void KelvinVShift<int16_t>(bool, bool, bool, Instruction *);
+template void KelvinVShift<int32_t>(bool, bool, bool, Instruction *);
+template void KelvinVShift<uint8_t>(bool, bool, bool, Instruction *);
+template void KelvinVShift<uint16_t>(bool, bool, bool, Instruction *);
+template void KelvinVShift<uint32_t>(bool, bool, bool, Instruction *);
// Bitwise not.
template <typename T>
diff --git a/sim/kelvin_vector_instructions.h b/sim/kelvin_vector_instructions.h
index 64a31c1..79887a8 100644
--- a/sim/kelvin_vector_instructions.h
+++ b/sim/kelvin_vector_instructions.h
@@ -108,7 +108,7 @@
void KelvinVSrl(bool scalar, bool strip_mine, Instruction *inst);
template <typename T>
-void KelvinVShift(bool round, bool strip_mine, Instruction *inst);
+void KelvinVShift(bool round, bool scalar, bool strip_mine, Instruction *inst);
template <typename T>
void KelvinVNot(bool strip_mine, Instruction *inst);
diff --git a/sim/test/kelvin_vector_instructions_test.cc b/sim/test/kelvin_vector_instructions_test.cc
index 8b5ed9c..5dd7bb6 100644
--- a/sim/test/kelvin_vector_instructions_test.cc
+++ b/sim/test/kelvin_vector_instructions_test.cc
@@ -204,29 +204,20 @@
void KelvinVectorShiftBinaryOpHelper(absl::string_view name) {
const auto name_with_type = absl::StrCat(name, KelvinTestTypeSuffix<T>());
- // Vector OP vector-vector.
- BinaryOpTestHelper<T, T, T>(
- absl::bind_front(F<T, T, T>::KelvinOp, kNonRounding, kNonStripmine),
- absl::StrCat(name_with_type, "VV"), kNonScalar, kNonStripmine,
- absl::bind_front(F<T, T, T>::Op, kNonRounding));
-
- // Vector OP vector-vector stripmined.
- BinaryOpTestHelper<T, T, T>(
- absl::bind_front(F<T, T, T>::KelvinOp, kNonRounding, kIsStripmine),
- absl::StrCat(name_with_type, "VVM"), kNonScalar, kIsStripmine,
- absl::bind_front(F<T, T, T>::Op, kNonRounding));
-
- // Vector OP vector-vector with rounding.
- BinaryOpTestHelper<T, T, T>(
- absl::bind_front(F<T, T, T>::KelvinOp, kIsRounding, kNonStripmine),
- absl::StrCat(name_with_type, "RVV"), kNonScalar, kNonStripmine,
- absl::bind_front(F<T, T, T>::Op, kIsRounding));
-
- // Vector OP vector-vector stripmined with rounding.
- BinaryOpTestHelper<T, T, T>(
- absl::bind_front(F<T, T, T>::KelvinOp, kIsRounding, kIsStripmine),
- absl::StrCat(name_with_type, "RVVM"), kNonScalar, kIsStripmine,
- absl::bind_front(F<T, T, T>::Op, kIsRounding));
+ // Test {R}.[VV, VX].{M} variants.
+ for (auto rounding : {kNonRounding, kIsRounding}) {
+ for (auto scalar : {kNonScalar, kIsScalar}) {
+ for (auto stripmine : {kNonStripmine, kIsStripmine}) {
+ auto op_name = absl::StrCat(name_with_type, rounding ? "R" : "", "V",
+ scalar ? "X" : "V", stripmine ? "M" : "");
+ BinaryOpTestHelper<T, T, T>(
+ absl::bind_front(F<T, T, T>::KelvinOp, rounding, scalar,
+ stripmine),
+ op_name, scalar, stripmine,
+ absl::bind_front(F<T, T, T>::Op, rounding));
+ }
+ }
+ }
}
template <template <typename, typename, typename> class F, typename T,
@@ -1058,8 +1049,9 @@
}
}
- static void KelvinOp(bool round, bool strip_mine, Instruction *inst) {
- KelvinVShift<Vd>(round, strip_mine, inst);
+ static void KelvinOp(bool round, bool scalar, bool strip_mine,
+ Instruction *inst) {
+ KelvinVShift<Vd>(round, scalar, strip_mine, inst);
}
};