decode.h (5241B)
1 #ifndef DECODE 2 #define DECODE 3 4 /* 5 I-TYPE INSTRUCTION FORMAT 6 31 20 19 15 14 12 11 7 6 0 7 +---------------------+--------+--------+---------+--------+ 8 | imm[11:0] | rs1 | funct3 | rd | opcode | 9 +---------------------+--------+--------+---------+--------+ 10 opcode 0x13 0010011 immediates 11 opcode 0x33 0000011 loads 12 */ 13 14 typedef struct { 15 uint8_t opcode; 16 uint8_t rd, rs1; 17 //uint16_t imm; 18 int32_t imm; 19 uint8_t funct3; 20 uint8_t funct7, inimm; 21 } itype_t; 22 23 /*static inline void 24 decode_itype(itype_t *i, uint32_t inst) 25 { 26 i->rd = (uint8_t)((inst >> 7) & 31); 27 i->funct3 = (uint8_t)((inst >> 12) & 7); 28 i->rs1 = (uint8_t)((inst >> 15) & 31); 29 //i->imm = (uint16_t)((inst >> 20) & 2047); 30 i->imm = (uint32_t)((inst >> 20) & 0xfff); 31 32 i->inimm = (uint8_t)(i->imm & 31); 33 i->funct7 = (uint8_t)((i->imm >> 5) & 127); 34 }*/ 35 static inline void 36 decode_itype(itype_t *i, uint32_t inst) 37 { 38 uint32_t raw_imm = (inst >> 20) & UINT32_C(0xfff); 39 40 i->rd = (uint8_t)((inst >> 7) & UINT32_C(31)); 41 i->funct3 = (uint8_t)((inst >> 12) & UINT32_C(7)); 42 i->rs1 = (uint8_t)((inst >> 15) & UINT32_C(31)); 43 44 i->inimm = (uint8_t)(raw_imm & UINT32_C(31)); 45 i->funct7 = (uint8_t)((inst >> 25) & UINT32_C(127)); 46 47 i->imm = (int32_t)raw_imm; 48 49 if ((raw_imm & UINT32_C(0x800)) != 0u) 50 i->imm -= INT32_C(0x1000); 51 } 52 53 54 /* 55 R-TYPE INSTRUCTION FORMAT 56 31 25 24 20 19 15 14 12 11 7 6 0 57 +------------+--------+--------+--------+---------+--------+ 58 | funct7 | rs2 | rs1 | funct3 | rd | opcode | 59 +------------+--------+--------+--------+---------+--------+ 60 opcode 0x33 0110011 61 */ 62 63 typedef struct { 64 uint8_t opcode; 65 uint8_t rd, rs1, rs2; 66 uint8_t funct3, funct7; 67 } rtype_t; 68 69 static inline void 70 decode_rtype(rtype_t *r, uint32_t inst) 71 { 72 r->rd = (uint8_t)((inst >> 7) & 31); 73 r->funct3 = (uint8_t)((inst >> 12) & 7); 74 r->rs1 = (uint8_t)((inst >> 15) & 31); 75 r->rs2 = (uint8_t)((inst >> 20) & 31); 76 r->funct7 = (uint8_t)((inst >> 25) & 127); 77 } 78 79 /* 80 S-TYPE INSTRUCTION FORMAT 81 31 25 24 20 19 15 14 12 11 7 6 0 82 +------------+--------+--------+--------+---------+--------+ 83 | imm[11:0] | rs2 | rs1 | funct3 |imm[4:0] | opcode | 84 +------------+--------+--------+--------+---------+--------+ 85 opcode 0x33 0100011 86 */ 87 88 typedef struct { 89 uint8_t opcode; 90 uint8_t rs1, rs2; 91 int32_t imm; 92 uint8_t funct3; 93 } stype_t; 94 95 static inline void 96 decode_stype(stype_t *s, uint32_t inst) 97 { 98 uint32_t imm_11_5 = (inst >> 25) & 127; 99 uint32_t imm_4_0 = (inst >> 7) & 31; 100 uint32_t raw = (uint16_t)((imm_4_0) | (imm_11_5 << 5)); 101 102 s->imm = (int32_t)raw; 103 104 if ((raw & UINT32_C(0x800)) != 0u) 105 s->imm -= INT32_C(0x1000); 106 107 s->funct3 = (inst >> 12) & 7; 108 s->rs1 = (inst >> 15) & 31; 109 s->rs2 = (inst >> 20) & 31; 110 } 111 112 /* 113 B-TYPE INSTRUCTION FORMAT 114 31 25 24 20 19 15 14 12 11 7 6 0 115 +---------------+--------+--------+--------+------------+--------+ 116 | imm[12|10:5] | rs2 | rs1 | funct3 |imm[4:1|11] | opcode | 117 +---------------+--------+--------+--------+------------+--------+ 118 opcode 0x63 1100011 119 */ 120 typedef struct { 121 uint8_t opcode; 122 uint8_t rs1, rs2; 123 int16_t imm; 124 uint8_t funct3; 125 } btype_t; 126 127 static inline void 128 decode_btype(btype_t *b, uint32_t inst) 129 { 130 uint32_t imm_10_5 = (inst >> 25) & 63; 131 uint32_t imm_11 = (inst >> 7) & 1; 132 uint32_t imm_4_1 = (inst >> 8) & 15; 133 uint32_t imm_12 = (inst >> 31) & 1; 134 135 uint32_t raw_imm = (imm_12 << 12) | (imm_11 << 11) | 136 (imm_10_5 << 5) | (imm_4_1 << 1); 137 if (raw_imm & (1U << 12)) 138 raw_imm |= 0xffffe000U; 139 b->imm = (int16_t)raw_imm; 140 141 b->funct3 = (inst >> 12) & 7; 142 b->rs1 = (inst >> 15) & 31; 143 b->rs2 = (inst >> 20) & 31; 144 } 145 146 /* 147 J-TYPE INSTRUCTION FORMAT 148 31 12 11 7 6 0 149 +---------------------------------------+---------+--------+ 150 | imm[20|10:1|11|19:12] | rd | opcode | 151 +---------------------------------------+---------+--------+ 152 opcode 0x6f 1101111 jal 153 */ 154 155 typedef struct { 156 uint8_t opcode; 157 uint8_t rd; 158 int32_t imm; 159 } jtype_t; 160 161 static inline void 162 decode_jtype(jtype_t *j, uint32_t inst) 163 { 164 j->rd = (uint8_t)((inst >> 7) & 0x1f); 165 166 uint8_t imm_19_12 = (uint8_t)((inst >> 12) & 0xff); 167 uint8_t imm_11 = (uint8_t)((inst >> 20) & 1); 168 uint16_t imm_10_1 = (uint16_t)((inst >> 21) & 0x3ff); 169 uint8_t imm_20 = (uint8_t)((inst >> 31) & 1); 170 171 uint32_t raw = (int32_t)(uint32_t)(imm_19_12 << 12 | 172 imm_11 << 11 | 173 imm_10_1 << 1| 174 imm_20 << 20); 175 j->imm = (int32_t)raw; 176 177 /* extend sign */ 178 if ((raw & UINT32_C(0x100000)) != 0u) 179 j->imm -= INT32_C(0x200000); 180 181 } 182 183 /* 184 U-TYPE INSTRUCTION FORMAT 185 31 11 7 6 0 186 +---------------------------------------+---------+--------+ 187 | imm[31:12] | rd | opcode | 188 +---------------------------------------+---------+--------+ 189 opcode 0x37 0110111 lui 190 opcode 0x17 0010111 auipc 191 */ 192 193 typedef struct { 194 uint8_t opcode; 195 uint8_t rd; 196 uint32_t imm; 197 } utype_t; 198 199 static inline void 200 decode_utype(utype_t *u, uint32_t inst) 201 { 202 u->rd = (uint8_t)((inst >> 7) & 31); 203 u->imm = (uint32_t)((inst >> 12) & 0xfffff); 204 } 205 206 #endif