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,
@@ -36,28 +36,12 @@ impl RiscVDecoder {
3636
3737 /// Create a decoder with full RV32GC support.
3838 pub fn rv32gc ( ) -> Self {
39- Self :: new (
40- 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 ,
47- )
39+ Self :: new ( Xlen :: X32 , Extensions :: G | Extensions :: C )
4840 }
4941
5042 /// Create a decoder with full RV64GC support.
5143 pub fn rv64gc ( ) -> Self {
52- Self :: new (
53- 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 ,
60- )
44+ Self :: new ( Xlen :: X64 , Extensions :: G | Extensions :: C )
6145 }
6246
6347 /// Decode a single instruction located at `address`.
@@ -229,7 +213,7 @@ impl RiscVDecoder {
229213 | ( ( instruction >> 6 ) & 0x1 ) << 6 // imm[6] from instruction[6]
230214 | ( ( instruction >> 9 ) & 0x3 ) << 7 ; // imm[8:7] from instruction[9:8]
231215
232- if self . extensions & extension_masks :: C == 0 {
216+ if ! self . extensions . contains ( Extensions :: C ) {
233217 eprintln ! ( "Warning: Decoding compressed instruction while C extension is disabled" ) ;
234218 }
235219
@@ -334,20 +318,16 @@ mod tests {
334318 fn test_refactored_decoder_creation ( ) {
335319 let decoder = RiscVDecoder :: rv32gc ( ) ;
336320 assert_eq ! ( decoder. xlen, Xlen :: X32 ) ;
337- assert ! ( decoder. extensions & extension_masks :: I != 0 ) ;
321+ assert ! ( decoder. extensions. contains ( Extensions :: I ) ) ;
338322
339323 let decoder = RiscVDecoder :: rv64gc ( ) ;
340324 assert_eq ! ( decoder. xlen, Xlen :: X64 ) ;
341- assert ! ( decoder. extensions & extension_masks :: I != 0 ) ;
325+ assert ! ( decoder. extensions. contains ( Extensions :: I ) ) ;
342326
343327 let decoder = RiscVDecoder :: rv64gc ( ) ;
344328 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 ) ;
329+ assert ! ( decoder. extensions. contains( Extensions :: G ) ) ;
330+ assert ! ( decoder. extensions. contains( Extensions :: C ) ) ;
351331 }
352332
353333 #[ test]
0 commit comments