@@ -1982,7 +1982,8 @@ static inline bool op_cfsw(rv_insn_t *ir, const uint32_t insn)
1982
1982
#define op_cflwsp OP_UNIMP
1983
1983
#endif /* RV32_HAS(EXT_C) && RV32_HAS(EXT_F) */
1984
1984
1985
- static inline bool op_ivv (rv_insn_t * ir , const uint32_t insn ) {
1985
+ static inline bool op_ivv (rv_insn_t * ir , const uint32_t insn )
1986
+ {
1986
1987
#define MASK 0xfc00707f
1987
1988
#define MATCH_VADD_VI 0x3057
1988
1989
#define MATCH_VAND_VI 0x24003057
@@ -2011,74 +2012,74 @@ static inline bool op_ivv(rv_insn_t *ir, const uint32_t insn) {
2011
2012
ir -> rs2 = decode_rs2 (insn );
2012
2013
ir -> vm = decode_rvv_vm (insn );
2013
2014
switch (insn & MASK ) {
2014
- case MATCH_VADD_VI :
2015
+ case MATCH_VADD_VI :
2015
2016
ir -> opcode = rv_insn_vadd_vi ;
2016
- break ;
2017
- case MATCH_VAND_VI :
2017
+ break ;
2018
+ case MATCH_VAND_VI :
2018
2019
ir -> opcode = rv_insn_vand_vi ;
2019
- break ;
2020
- case MATCH_VMADC_VI :
2020
+ break ;
2021
+ case MATCH_VMADC_VI :
2021
2022
ir -> opcode = rv_insn_vmadc_vi ;
2022
- break ;
2023
- case MATCH_VMSEQ_VI :
2023
+ break ;
2024
+ case MATCH_VMSEQ_VI :
2024
2025
ir -> opcode = rv_insn_vmseq_vi ;
2025
- break ;
2026
- case MATCH_VMSGT_VI :
2026
+ break ;
2027
+ case MATCH_VMSGT_VI :
2027
2028
ir -> opcode = rv_insn_vmsgt_vi ;
2028
- break ;
2029
- case MATCH_VMSGTU_VI :
2029
+ break ;
2030
+ case MATCH_VMSGTU_VI :
2030
2031
ir -> opcode = rv_insn_vmsgtu_vi ;
2031
- break ;
2032
- case MATCH_VMSLE_VI :
2032
+ break ;
2033
+ case MATCH_VMSLE_VI :
2033
2034
ir -> opcode = rv_insn_vmsle_vi ;
2034
- break ;
2035
- case MATCH_VMSLEU_VI :
2035
+ break ;
2036
+ case MATCH_VMSLEU_VI :
2036
2037
ir -> opcode = rv_insn_vmsleu_vi ;
2037
- break ;
2038
- case MATCH_VMSNE_VI :
2038
+ break ;
2039
+ case MATCH_VMSNE_VI :
2039
2040
ir -> opcode = rv_insn_vmsne_vi ;
2040
- break ;
2041
- case MATCH_VOR_VI :
2041
+ break ;
2042
+ case MATCH_VOR_VI :
2042
2043
ir -> opcode = rv_insn_vor_vi ;
2043
- break ;
2044
- case MATCH_VRGATHER_VI :
2044
+ break ;
2045
+ case MATCH_VRGATHER_VI :
2045
2046
ir -> opcode = rv_insn_vrgather_vi ;
2046
- break ;
2047
- case MATCH_VRSUB_VI :
2047
+ break ;
2048
+ case MATCH_VRSUB_VI :
2048
2049
ir -> opcode = rv_insn_vrsub_vi ;
2049
- break ;
2050
- case MATCH_VSADD_VI :
2050
+ break ;
2051
+ case MATCH_VSADD_VI :
2051
2052
ir -> opcode = rv_insn_vsadd_vi ;
2052
- break ;
2053
- case MATCH_VSADDU_VI :
2053
+ break ;
2054
+ case MATCH_VSADDU_VI :
2054
2055
ir -> opcode = rv_insn_vsaddu_vi ;
2055
- break ;
2056
- case MATCH_VSLIDEDOWN_VI :
2056
+ break ;
2057
+ case MATCH_VSLIDEDOWN_VI :
2057
2058
ir -> opcode = rv_insn_vslidedown_vi ;
2058
- break ;
2059
- case MATCH_VSLIDEUP_VI :
2059
+ break ;
2060
+ case MATCH_VSLIDEUP_VI :
2060
2061
ir -> opcode = rv_insn_vslideup_vi ;
2061
- break ;
2062
- case MATCH_VSLL_VI :
2062
+ break ;
2063
+ case MATCH_VSLL_VI :
2063
2064
ir -> opcode = rv_insn_vsll_vi ;
2064
- break ;
2065
- case MATCH_VSRA_VI :
2065
+ break ;
2066
+ case MATCH_VSRA_VI :
2066
2067
ir -> opcode = rv_insn_vsra_vi ;
2067
- break ;
2068
- case MATCH_VSRL_VI :
2068
+ break ;
2069
+ case MATCH_VSRL_VI :
2069
2070
ir -> opcode = rv_insn_vsrl_vi ;
2070
- break ;
2071
- case MATCH_VSSRA_VI :
2071
+ break ;
2072
+ case MATCH_VSSRA_VI :
2072
2073
ir -> opcode = rv_insn_vssra_vi ;
2073
- break ;
2074
- case MATCH_VSSRL_VI :
2074
+ break ;
2075
+ case MATCH_VSSRL_VI :
2075
2076
ir -> opcode = rv_insn_vssrl_vi ;
2076
- break ;
2077
- case MATCH_VXOR_VI :
2077
+ break ;
2078
+ case MATCH_VXOR_VI :
2078
2079
ir -> opcode = rv_insn_vxor_vi ;
2079
- break ;
2080
- default :
2081
- return false;
2080
+ break ;
2081
+ default :
2082
+ return false;
2082
2083
}
2083
2084
}
2084
2085
@@ -2090,43 +2091,45 @@ static inline bool op_fvf(rv_insn_t *ir, const uint32_t insn) {}
2090
2091
static inline bool op_mvx (rv_insn_t * ir , const uint32_t insn ) {}
2091
2092
2092
2093
/* OP: RVV
2093
- * opcode is 0x57 for VALU and VCFG
2094
+ * opcode is 0x57 for VALU and VCFG
2094
2095
*
2095
2096
* VALU format:
2096
2097
* 31 26 25 24 20 19 15 14 12 11 7 6 0
2097
- * funct6 | vm | vs2 | vs1 | 0 0 0 (funct3) | vd |1010111| OP-V (OPIVV)
2098
- * funct6 | vm | vs2 | vs1 | 0 0 1 (funct3) | vd/rd |1010111| OP-V (OPFVV)
2099
- * funct6 | vm | vs2 | vs1 | 0 1 0 (funct3) | vd/rd |1010111| OP-V (OPMVV)
2100
- * funct6 | vm | vs2 | imm[4:0] | 0 1 1 (funct3) | vd |1010111| OP-V (OPIVI)
2101
- * funct6 | vm | vs2 | rs1 | 1 0 0 (funct3) | vd |1010111| OP-V (OPIVX)
2102
- * funct6 | vm | vs2 | rs1 | 1 0 1 (funct3) | vd |1010111| OP-V (OPFVF)
2103
- * funct6 | vm | vs2 | rs1 | 1 1 0 (funct3) | vd/rd |1010111| OP-V (OPMVX)
2104
- * 6 1 5 5 3 5 7
2105
- *
2098
+ * funct6 | vm | vs2 | vs1 | 0 0 0 (funct3) | vd |1010111|
2099
+ * OP-V (OPIVV) funct6 | vm | vs2 | vs1 | 0 0 1 (funct3) | vd/rd
2100
+ * |1010111| OP-V (OPFVV) funct6 | vm | vs2 | vs1 | 0 1 0 (funct3)
2101
+ * | vd/rd |1010111| OP-V (OPMVV) funct6 | vm | vs2 | imm[4:0] | 0 1 1
2102
+ * (funct3) | vd |1010111| OP-V (OPIVI) funct6 | vm | vs2 | rs1
2103
+ * | 1 0 0 (funct3) | vd |1010111| OP-V (OPIVX) funct6 | vm | vs2 |
2104
+ * rs1 | 1 0 1 (funct3) | vd |1010111| OP-V (OPFVF) funct6 | vm | vs2
2105
+ * | rs1 | 1 1 0 (funct3) | vd/rd |1010111| OP-V (OPMVX) 6 1 5 5
2106
+ * 3 5 7
2107
+ *
2106
2108
* Where 'vm' is the bit indicates whether masking is enabled
2107
- * see https://github.com/riscv/riscv-v-spec/blob/master/v-spec.adoc#531-mask-encoding
2108
- *
2109
+ * see
2110
+ * https://github.com/riscv/riscv-v-spec/blob/master/v-spec.adoc#531-mask-encoding
2111
+ *
2109
2112
* VMEM format:
2110
- *
2113
+ *
2111
2114
* 31 29 28 27 26 25 24 20 19 15 14 12 11 7 6 0
2112
- * nf | mew| mop | vm | lumop | rs1 | width | vd |0000111| VL* unit-stride
2113
- * nf | mew| mop | vm | rs2 | rs1 | width | vd |0000111| VLS* strided
2114
- * nf | mew| mop | vm | vs2 | rs1 | width | vd |0000111| VLX* indexed
2115
- * 3 1 2 1 5 5 3 5 7
2116
- *
2115
+ * nf | mew| mop | vm | lumop | rs1 | width | vd |0000111| VL*
2116
+ * unit-stride nf | mew| mop | vm | rs2 | rs1 | width | vd
2117
+ * |0000111| VLS* strided nf | mew| mop | vm | vs2 | rs1 | width | vd
2118
+ * |0000111| VLX* indexed 3 1 2 1 5 5 3 5 7
2119
+ *
2117
2120
* VCFG format:
2118
- *
2121
+ *
2119
2122
* 31 30 25 24 20 19 15 14 12 11 7 6 0
2120
2123
* 0 | zimm[10:0] | rs1 | 1 1 1 | rd |1010111| vsetvli
2121
2124
* 1 | 1| zimm[ 9:0] | uimm[4:0]| 1 1 1 | rd |1010111| vsetivli
2122
2125
* 1 | 000000 | rs2 | rs1 | 1 1 1 | rd |1010111| vsetvl
2123
2126
* 1 6 5 5 3 5 7
2124
- *
2127
+ *
2125
2128
* reference:
2126
2129
* https://github.com/riscv/riscv-isa-manual/blob/main/src/images/wavedrom/valu-format.edn
2127
2130
* https://github.com/riscv/riscv-isa-manual/blob/main/src/images/wavedrom/v-inst-table.edn
2128
2131
* https://observablehq.com/@drom/risc-v-v
2129
- *
2132
+ *
2130
2133
* funct3
2131
2134
* | 0 | 0 | 0 | OPIVV | vector-vector | N/A
2132
2135
* | 0 | 0 | 1 | OPFVV | vector-vector | N/A
@@ -2140,22 +2143,22 @@ static inline bool op_v(rv_insn_t *ir, const uint32_t insn)
2140
2143
{
2141
2144
uint32_t funct3_mask = 0x7000 ;
2142
2145
switch ((insn & funct3_mask ) >> 7 ) {
2143
- case 0 :
2144
- return op_ivv (ir , insn );
2145
- case 1 :
2146
- return op_fvv (ir , insn );
2147
- case 2 :
2148
- return op_mvv (ir , insn );
2149
- case 3 :
2150
- return op_ivi (ir , insn );
2151
- case 4 :
2152
- return op_ivx (ir , insn );
2153
- case 5 :
2154
- return op_fvf (ir , insn );
2155
- case 6 :
2156
- return op_mvx (ir , insn );
2157
- default :
2158
- return false;
2146
+ case 0 :
2147
+ return op_ivv (ir , insn );
2148
+ case 1 :
2149
+ return op_fvv (ir , insn );
2150
+ case 2 :
2151
+ return op_mvv (ir , insn );
2152
+ case 3 :
2153
+ return op_ivi (ir , insn );
2154
+ case 4 :
2155
+ return op_ivx (ir , insn );
2156
+ case 5 :
2157
+ return op_fvf (ir , insn );
2158
+ case 6 :
2159
+ return op_mvx (ir , insn );
2160
+ default :
2161
+ return false;
2159
2162
}
2160
2163
2161
2164
if ((insn & MASK_VSETVLI ) == MATCH_VSETVLI ) {
@@ -2167,7 +2170,7 @@ static inline bool op_v(rv_insn_t *ir, const uint32_t insn)
2167
2170
// vsetivli
2168
2171
ir -> rd = (insn >> 7 ) & 0x1f ;
2169
2172
ir -> uimm = (insn >> 15 ) & 0x1f ;
2170
- ir -> zimm = (insn >> 20 ) & 0x3ff ; // zimm[9:0]
2173
+ ir -> zimm = (insn >> 20 ) & 0x3ff ; // zimm[9:0]
2171
2174
2172
2175
} else if ((insn & MASK_VSETVL ) == MATCH_VSETVL ) {
2173
2176
// vsetvl
0 commit comments