| 696 | // --- Public decode entry point --- |
| 697 | |
| 698 | pub fn decode(word: u32) -> Result<DecodedInsn, VmError> { |
| 699 | let opcode = word & 0x7F; |
| 700 | match opcode { |
| 701 | 0x37 => Ok(DecodedInsn::Lui { |
| 702 | rd: rd(word), |
| 703 | imm: u_imm(word), |
| 704 | }), |
| 705 | 0x17 => Ok(DecodedInsn::Auipc { |
| 706 | rd: rd(word), |
| 707 | imm: u_imm(word), |
| 708 | }), |
| 709 | 0x6F => Ok(DecodedInsn::Jal { |
| 710 | rd: rd(word), |
| 711 | imm: j_imm(word), |
| 712 | }), |
| 713 | 0x67 => Ok(DecodedInsn::Jalr { |
| 714 | rd: rd(word), |
| 715 | rs1: rs1(word), |
| 716 | imm: i_imm(word), |
| 717 | }), |
| 718 | 0x63 => Ok(DecodedInsn::Branch { |
| 719 | funct3: funct3(word), |
| 720 | rs1: rs1(word), |
| 721 | rs2: rs2(word), |
| 722 | imm: b_imm(word), |
| 723 | }), |
| 724 | 0x03 => Ok(DecodedInsn::Load { |
| 725 | funct3: funct3(word), |
| 726 | rd: rd(word), |
| 727 | rs1: rs1(word), |
| 728 | imm: i_imm(word), |
| 729 | }), |
| 730 | 0x23 => Ok(DecodedInsn::Store { |
| 731 | funct3: funct3(word), |
| 732 | rs1: rs1(word), |
| 733 | rs2: rs2(word), |
| 734 | imm: s_imm(word), |
| 735 | }), |
| 736 | // OP-IMM: pass the full bits[31:25] as funct7 so the execute stage can |
| 737 | // disambiguate SRLI vs SRAI using bit 30 (and check for illegal encodings). |
| 738 | 0x13 => Ok(DecodedInsn::AluImm { |
| 739 | funct3: funct3(word), |
| 740 | funct7: field(word, 31, 25) as u8, |
| 741 | rd: rd(word), |
| 742 | rs1: rs1(word), |
| 743 | imm: i_imm(word), |
| 744 | }), |
| 745 | 0x1B => Ok(DecodedInsn::AluImm32 { |
| 746 | funct3: funct3(word), |
| 747 | funct7: field(word, 31, 25) as u8, |
| 748 | rd: rd(word), |
| 749 | rs1: rs1(word), |
| 750 | imm: i_imm(word), |
| 751 | }), |
| 752 | 0x33 => Ok(DecodedInsn::Alu { |
| 753 | funct3: funct3(word), |
| 754 | funct7: funct7(word), |
| 755 | rd: rd(word), |