44//! is implemented as a separate module, making the codebase more maintainable
55//! and easier to extend with new instructions.
66
7- use super :: extensions:: { InstructionExtension , create_extensions , extension_masks } ;
7+ use super :: extensions:: { Extensions , InstructionExtension , create_extensions } ;
88use super :: types:: * ;
99use crate :: error:: DisasmError ;
1010
@@ -19,13 +19,13 @@ pub enum Xlen {
1919/// Refactored RISC-V instruction decoder using extension modules.
2020pub struct RiscVDecoder {
2121 xlen : Xlen ,
22- extensions : u32 ,
22+ extensions : Extensions ,
2323 extension_handlers : Vec < Box < dyn InstructionExtension > > ,
2424}
2525
2626impl RiscVDecoder {
2727 /// Construct a decoder with the provided XLEN and extension bitmask.
28- pub fn new ( xlen : Xlen , extensions : u32 ) -> Self {
28+ pub fn new ( xlen : Xlen , extensions : Extensions ) -> Self {
2929 let extension_handlers = create_extensions ( ) ;
3030 Self {
3131 xlen,
@@ -38,25 +38,25 @@ impl RiscVDecoder {
3838 pub fn rv32gc ( ) -> Self {
3939 Self :: new (
4040 Xlen :: X32 ,
41- extension_masks :: I
42- | extension_masks :: M
43- | extension_masks :: A
44- | extension_masks :: F
45- | extension_masks :: C
46- | extension_masks :: XTHEADCONDMOV ,
41+ Extensions :: I
42+ | Extensions :: M
43+ | Extensions :: A
44+ | Extensions :: F
45+ | Extensions :: C
46+ | Extensions :: XTHEADCONDMOV ,
4747 )
4848 }
4949
5050 /// Create a decoder with full RV64GC support.
5151 pub fn rv64gc ( ) -> Self {
5252 Self :: new (
5353 Xlen :: X64 ,
54- extension_masks :: I
55- | extension_masks :: M
56- | extension_masks :: A
57- | extension_masks :: F
58- | extension_masks :: D
59- | extension_masks :: C ,
54+ Extensions :: I
55+ | Extensions :: M
56+ | Extensions :: A
57+ | Extensions :: F
58+ | Extensions :: D
59+ | Extensions :: C ,
6060 )
6161 }
6262
@@ -229,7 +229,7 @@ impl RiscVDecoder {
229229 | ( ( instruction >> 6 ) & 0x1 ) << 6 // imm[6] from instruction[6]
230230 | ( ( instruction >> 9 ) & 0x3 ) << 7 ; // imm[8:7] from instruction[9:8]
231231
232- if self . extensions & extension_masks :: C == 0 {
232+ if ! self . extensions . contains ( Extensions :: C ) {
233233 eprintln ! ( "Warning: Decoding compressed instruction while C extension is disabled" ) ;
234234 }
235235
@@ -334,20 +334,20 @@ mod tests {
334334 fn test_refactored_decoder_creation ( ) {
335335 let decoder = RiscVDecoder :: rv32gc ( ) ;
336336 assert_eq ! ( decoder. xlen, Xlen :: X32 ) ;
337- assert ! ( decoder. extensions & extension_masks :: I != 0 ) ;
337+ assert ! ( decoder. extensions. contains ( Extensions :: I ) ) ;
338338
339339 let decoder = RiscVDecoder :: rv64gc ( ) ;
340340 assert_eq ! ( decoder. xlen, Xlen :: X64 ) ;
341- assert ! ( decoder. extensions & extension_masks :: I != 0 ) ;
341+ assert ! ( decoder. extensions. contains ( Extensions :: I ) ) ;
342342
343343 let decoder = RiscVDecoder :: rv64gc ( ) ;
344344 assert_eq ! ( decoder. xlen, Xlen :: X64 ) ;
345- assert ! ( decoder. extensions & extension_masks :: I != 0 ) ;
346- assert ! ( decoder. extensions & extension_masks :: M != 0 ) ;
347- assert ! ( decoder. extensions & extension_masks :: A != 0 ) ;
348- assert ! ( decoder. extensions & extension_masks :: F != 0 ) ;
349- assert ! ( decoder. extensions & extension_masks :: D != 0 ) ;
350- assert ! ( decoder. extensions & extension_masks :: C != 0 ) ;
345+ assert ! ( decoder. extensions. contains ( Extensions :: I ) ) ;
346+ assert ! ( decoder. extensions. contains ( Extensions :: M ) ) ;
347+ assert ! ( decoder. extensions. contains ( Extensions :: A ) ) ;
348+ assert ! ( decoder. extensions. contains ( Extensions :: F ) ) ;
349+ assert ! ( decoder. extensions. contains ( Extensions :: D ) ) ;
350+ assert ! ( decoder. extensions. contains ( Extensions :: C ) ) ;
351351 }
352352
353353 #[ test]
0 commit comments