| // This file define the kelvin base isa for mpact-sim. For more info on mpact-sim |
| // isa format, check: go/mpact-sim-codelabs-riscv-instruction-decoder |
| |
| // First disasm field is 18 char wide and left justified. |
| disasm widths = {-18}; |
| |
| slot kelvin_memory { |
| includes { |
| #include "sim/kelvin_instructions.h" |
| } |
| default size = 4; |
| default latency = global_latency; |
| opcodes { |
| flushall{}, |
| disasm: "flushall", |
| semfunc: "&KelvinNopInstruction"; |
| flushat{: rs1 :}, |
| disasm: "flushat", "%rs1", |
| semfunc: "&KelvinNopInstruction"; |
| } |
| } |
| |
| // Kelvin simd instructions: |
| // https://spacebeaker.googlesource.com/shodan/sw/kelvin/+/refs/heads/master/docs/kelvin_isa.md |
| // Load / Store |
| slot kelvin_vector_memory { |
| includes { |
| #include "sim/kelvin_vector_memory_instructions.h" |
| #include "absl/functional/bind_front.h" |
| } |
| default size = 4; |
| default latency = global_latency; |
| resources TwoOp = { next_pc, rs1 : rd[..rd]}; |
| resources ThreeOp = { next_pc, rs1, rs2 : rd[..rd]}; |
| opcodes { |
| getmaxvl_b{: : rd}, |
| resources: { next_pc : rd[0..]}, |
| disasm: "getmaxvl.b", "%rd", |
| semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ false, /*is_rs1*/ false, /*is_rs2*/ false)"; |
| getmaxvl_h{: : rd}, |
| resources: { next_pc : rd[0..]}, |
| disasm: "getmaxvl.h", "%rd", |
| semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ false, /*is_rs1*/ false, /*is_rs2*/ false)"; |
| getmaxvl_w{: : rd}, |
| resources: { next_pc : rd[0..]}, |
| disasm: "getmaxvl.w", "%rd", |
| semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ false, /*is_rs1*/ false, /*is_rs2*/ false)"; |
| getvl_b_x{: rs1 : rd}, |
| resources: TwoOp, |
| disasm: "getvl.b.x", "%rd, %rs1", |
| semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ false)"; |
| getvl_h_x{: rs1 : rd}, |
| resources: TwoOp, |
| disasm: "getvl.h.x", "%rd, %rs1", |
| semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ false)"; |
| getvl_w_x{: rs1 : rd}, |
| resources: TwoOp, |
| disasm: "getvl.w.x", "%rd, %rs1", |
| semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ false)"; |
| getvl_b_xx{: rs1, rs2 : rd}, |
| resources: ThreeOp, |
| disasm: "getvl.b.xx", "%rd, %rs1, %rs2", |
| semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ true)"; |
| getvl_h_xx{: rs1, rs2 : rd}, |
| resources: ThreeOp, |
| disasm: "getvl.h.xx", "%rd, %rs1, %rs2", |
| semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ true)"; |
| getvl_w_xx{: rs1, rs2 : rd}, |
| resources: ThreeOp, |
| disasm: "getvl.w.xx", "%rd, %rs1, %rs2", |
| semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ false, /*is_rs1*/ true, /*is_rs2*/ true)"; |
| getmaxvl_b_m{: : rd}, |
| resources: { next_pc : rd[0..]}, |
| disasm: "getmaxvl.b.m", "%rd", |
| semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ true, /*is_rs1*/ false, /*is_rs2*/ false)"; |
| getmaxvl_h_m{: : rd}, |
| resources: { next_pc : rd[0..]}, |
| disasm: "getmaxvl.h.m", "%rd", |
| semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ true, /*is_rs1*/ false, /*is_rs2*/ false)"; |
| getmaxvl_w_m{: : rd}, |
| resources: { next_pc : rd[0..]}, |
| disasm: "getmaxvl.w.m", "%rd", |
| semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ true, /*is_rs1*/ false, /*is_rs2*/ false)"; |
| getvl_b_x_m{: rs1 : rd}, |
| resources: TwoOp, |
| disasm: "getvl.b.x.m", "%rd, %rs1", |
| semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ false)"; |
| getvl_h_x_m{: rs1 : rd}, |
| resources: TwoOp, |
| disasm: "getvl.h.x.m", "%rd, %rs1", |
| semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ false)"; |
| getvl_w_x_m{: rs1 : rd}, |
| resources: TwoOp, |
| disasm: "getvl.w.x.m", "%rd, %rs1", |
| semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ false)"; |
| getvl_b_xx_m{: rs1, rs2 : rd}, |
| resources: ThreeOp, |
| disasm: "getvl.b.xx.m", "%rd, %rs1, %rs2", |
| semfunc: "absl::bind_front(&KelvinGetVl<int8_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ true)"; |
| getvl_h_xx_m{: rs1, rs2 : rd}, |
| resources: ThreeOp, |
| disasm: "getvl.h.xx.m", "%rd, %rs1, %rs2", |
| semfunc: "absl::bind_front(&KelvinGetVl<int16_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ true)"; |
| getvl_w_xx_m{: rs1, rs2 : rd}, |
| resources: ThreeOp, |
| disasm: "getvl.w.xx.m", "%rd, %rs1, %rs2", |
| semfunc: "absl::bind_front(&KelvinGetVl<int32_t>, /*strip_mine*/ true, /*is_rs1*/ true, /*is_rs2*/ true)"; |
| |
| //vld |
| vld_b_x{(: vs1 :), (: : vd)}, |
| disasm: "vld.b.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>, /*strip_mine*/ false)"; |
| vld_h_x{(: vs1 :), (: : vd)}, |
| disasm: "vld.h.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; |
| vld_w_x{(: vs1 :), (: : vd)}, |
| disasm: "vld.w.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; |
| vld_b_x_m{(: vs1 :), (: : vd)}, |
| disasm: "vld.b.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; |
| vld_h_x_m{(: vs1 :), (: : vd)}, |
| disasm: "vld.h.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; |
| vld_w_x_m{(: vs1 :), (: : vd)}, |
| disasm: "vld.w.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; |
| vld_b_p_x{(: vs1 : vs1), (: : vd)}, |
| disasm: "vld.b.p.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; |
| vld_h_p_x{(: vs1 : vs1), (: : vd)}, |
| disasm: "vld.h.p.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; |
| vld_w_p_x{(: vs1 : vs1), (: : vd)}, |
| disasm: "vld.w.p.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; |
| vld_b_p_x_m{(: vs1 : vs1), (: : vd)}, |
| disasm: "vld.b.p.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; |
| vld_h_p_x_m{(: vs1 : vs1), (: : vd)}, |
| disasm: "vld.h.p.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; |
| vld_w_p_x_m{(: vs1 : vs1), (: : vd)}, |
| disasm: "vld.w.p.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; |
| vld_b_p_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.b.p.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; |
| vld_h_p_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.h.p.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; |
| vld_w_p_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.w.p.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; |
| vld_b_p_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.b.p.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; |
| vld_h_p_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.h.p.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; |
| vld_w_p_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.w.p.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; |
| vld_b_l_xx{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.b.l.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>, /*strip_mine*/ false)"; |
| vld_h_l_xx{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.h.l.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; |
| vld_w_l_xx{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.w.l.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; |
| vld_b_l_xx_m{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.b.l.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; |
| vld_h_l_xx_m{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.h.l.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; |
| vld_w_l_xx_m{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.w.l.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; |
| vld_b_lp_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.b.lp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; |
| vld_h_lp_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.h.lp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; |
| vld_w_lp_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.w.lp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; |
| vld_b_lp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.b.lp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; |
| vld_h_lp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.h.lp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; |
| vld_w_lp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.w.lp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; |
| vld_b_s_xx{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.b.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>, /*strip_mine*/ false)"; |
| vld_h_s_xx{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.h.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; |
| vld_w_s_xx{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.w.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; |
| vld_b_s_xx_m{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.b.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; |
| vld_h_s_xx_m{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.h.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; |
| vld_w_s_xx_m{(: vs1, vs2 :), (: : vd)}, |
| disasm: "vld.w.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; |
| vld_b_sp_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.b.sp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; |
| vld_h_sp_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.h.sp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; |
| vld_w_sp_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.w.sp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; |
| vld_b_sp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.b.sp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; |
| vld_h_sp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.h.sp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; |
| vld_w_sp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.w.sp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; |
| vld_b_tp_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.b.tp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ false)"; |
| vld_h_tp_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.h.tp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ false)"; |
| vld_w_tp_xx{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.w.tp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ false)"; |
| vld_b_tp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.b.tp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int8_t>,/*strip_mine*/ true)"; |
| vld_h_tp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.h.tp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int16_t>,/*strip_mine*/ true)"; |
| vld_w_tp_xx_m{(: vs1, vs2 : vs1), (: : vd)}, |
| disasm: "vld.w.tp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVLd<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)", |
| "absl::bind_front(&KelvinVLdRegWrite<int32_t>,/*strip_mine*/ true)"; |
| |
| //vst, note `vd` is actually the source vector register, and `vs1` is actually the scaler register. |
| vst_b_x{: vd, vs1 :}, |
| disasm: "vst.b.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_h_x{: vd, vs1 :}, |
| disasm: "vst.h.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_w_x{: vd, vs1 :}, |
| disasm: "vst.w.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_b_x_m{: vd, vs1 :}, |
| disasm: "vst.b.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_h_x_m{: vd, vs1 :}, |
| disasm: "vst.h.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_w_x_m{: vd, vs1 :}, |
| disasm: "vst.w.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_b_p_x{: vd, vs1 : vs1}, |
| disasm: "vst.b.p.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_h_p_x{: vd, vs1 : vs1}, |
| disasm: "vst.h.p.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_w_p_x{: vd, vs1 : vs1}, |
| disasm: "vst.w.p.x", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_b_p_x_m{: vd, vs1 : vs1}, |
| disasm: "vst.b.p.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_h_p_x_m{: vd, vs1 : vs1}, |
| disasm: "vst.h.p.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_w_p_x_m{: vd, vs1 : vs1}, |
| disasm: "vst.w.p.x.m", "%vd, %vs1", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_b_p_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.b.p.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_h_p_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.h.p.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_w_p_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.w.p.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_b_p_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.b.p.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_h_p_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.h.p.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_w_p_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vld.w.p.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_b_l_xx{: vd, vs1, vs2 :}, |
| disasm: "vst.b.l.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_h_l_xx{: vd, vs1, vs2 :}, |
| disasm: "vst.h.l.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_w_l_xx{: vd, vs1, vs2 :}, |
| disasm: "vst.w.l.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_b_l_xx_m{: vd, vs1, vs2 :}, |
| disasm: "vst.b.l.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_h_l_xx_m{: vd, vs1, vs2 :}, |
| disasm: "vst.h.l.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_w_l_xx_m{: vd, vs1, vs2 :}, |
| disasm: "vst.w.l.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_b_lp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.b.lp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_h_lp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.h.lp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_w_lp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.w.lp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ false)"; |
| vst_b_lp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.b.lp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_h_lp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.h.lp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_w_lp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.w.lp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ false, /*strip_mine*/ true)"; |
| vst_b_s_xx{: vd, vs1, vs2 :}, |
| disasm: "vst.b.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; |
| vst_h_s_xx{: vd, vs1, vs2 :}, |
| disasm: "vst.h.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; |
| vst_w_s_xx{: vd, vs1, vs2 :}, |
| disasm: "vst.w.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; |
| vst_b_s_xx_m{: vd, vs1, vs2 :}, |
| disasm: "vst.b.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; |
| vst_h_s_xx_m{: vd, vs1, vs2 :}, |
| disasm: "vst.h.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; |
| vst_w_s_xx_m{: vd, vs1, vs2 :}, |
| disasm: "vst.w.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; |
| vst_b_sp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.b.sp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; |
| vst_h_sp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.h.sp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; |
| vst_w_sp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.w.sp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ false)"; |
| vst_b_sp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.b.sp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; |
| vst_h_sp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.h.sp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; |
| vst_w_sp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.w.sp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ false, /*stride*/ true, /*strip_mine*/ true)"; |
| vst_b_tp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.b.tp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)"; |
| vst_h_tp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.h.tp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)"; |
| vst_w_tp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.w.tp.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ false)"; |
| vst_b_tp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.b.tp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int8_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)"; |
| vst_h_tp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.h.tp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int16_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)"; |
| vst_w_tp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vst.w.tp.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVSt<int32_t>, /*len*/ true, /*stride*/ true, /*strip_mine*/ true)"; |
| vstq_b_s_xx{: vd, vs1, vs2 :}, |
| disasm: "vstq.b.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ false)"; |
| vstq_h_s_xx{: vd, vs1, vs2 :}, |
| disasm: "vstq.h.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ false)"; |
| vstq_w_s_xx{: vd, vs1, vs2 :}, |
| disasm: "vstq.w.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ false)"; |
| vstq_b_sp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vstq.b.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ false)"; |
| vstq_h_sp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vstq.h.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ false)"; |
| vstq_w_sp_xx{: vd, vs1, vs2 : vs1}, |
| disasm: "vstq.w.s.xx", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ false)"; |
| vstq_b_s_xx_m{: vd, vs1, vs2 :}, |
| disasm: "vstq.b.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ true)"; |
| vstq_h_s_xx_m{: vd, vs1, vs2 :}, |
| disasm: "vstq.h.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ true)"; |
| vstq_w_s_xx_m{: vd, vs1, vs2 :}, |
| disasm: "vstq.w.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ true)"; |
| vstq_b_sp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vstq.b.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int8_t>, /*strip_mine*/ true)"; |
| vstq_h_sp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vstq.h.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int16_t>, /*strip_mine*/ true)"; |
| vstq_w_sp_xx_m{: vd, vs1, vs2 : vs1}, |
| disasm: "vstq.w.s.xx.m", "%vd, %vs1, %vs2", |
| semfunc: "absl::bind_front(&KelvinVStQ<int32_t>, /*strip_mine*/ true)"; |
| } |
| } |