| ... | ... | @@ -124,115 +124,119 @@ pub const Mnemonic = enum { |
| 124 | 124 | fsd, |
| 125 | 125 | fsw, |
| 126 | 126 | |
| 127 | fsgnjns, |
| 128 | |
| 127 | 129 | pub fn encoding(mnem: Mnemonic) Enc { |
| 128 | 130 | return switch (mnem) { |
| 129 | 131 | // zig fmt: off |
| 130 | 132 | |
| 131 | 133 | // OP |
| 132 | 134 | |
| 133 | | .add => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0000000 } } }, |
| 134 | | .sub => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0100000 } } }, |
| 135 | .add => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0000000 } } }, |
| 136 | .sub => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0100000 } } }, |
| 135 | 137 | |
| 136 | | .@"and" => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b111, .funct7 = 0b0000000 } } }, |
| 137 | | .@"or" => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b110, .funct7 = 0b0000000 } } }, |
| 138 | | .xor => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b100, .funct7 = 0b0000000 } } }, |
| 138 | .@"and" => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b111, .funct7 = 0b0000000 } } }, |
| 139 | .@"or" => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b110, .funct7 = 0b0000000 } } }, |
| 140 | .xor => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b100, .funct7 = 0b0000000 } } }, |
| 139 | 141 | |
| 140 | | .sltu => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b011, .funct7 = 0b0000000 } } }, |
| 141 | | .slt => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b010, .funct7 = 0b0000000 } } }, |
| 142 | .sltu => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b011, .funct7 = 0b0000000 } } }, |
| 143 | .slt => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b010, .funct7 = 0b0000000 } } }, |
| 142 | 144 | |
| 143 | | .mul => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0000001 } } }, |
| 145 | .mul => .{ .opcode = .OP, .data = .{ .ff = .{ .funct3 = 0b000, .funct7 = 0b0000001 } } }, |
| 144 | 146 | |
| 145 | 147 | |
| 146 | 148 | // OP_IMM |
| 147 | 149 | |
| 148 | | .addi => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 149 | | .andi => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b111 } } }, |
| 150 | | .xori => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b100 } } }, |
| 150 | .addi => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 151 | .andi => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b111 } } }, |
| 152 | .xori => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b100 } } }, |
| 151 | 153 | |
| 152 | | .sltiu => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 154 | .sltiu => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 153 | 155 | |
| 154 | | .slli => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b001 } } }, |
| 155 | | .srli => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b101 } } }, |
| 156 | | .srai => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b101, .offset = 1 << 10 } } }, |
| 156 | .slli => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b001 } } }, |
| 157 | .srli => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b101 } } }, |
| 158 | .srai => .{ .opcode = .OP_IMM, .data = .{ .fo = .{ .funct3 = 0b101, .offset = 1 << 10 } } }, |
| 157 | 159 | |
| 158 | 160 | |
| 159 | 161 | // OP_FP |
| 160 | 162 | |
| 161 | | .fadds => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00000, .fmt = .S, .rm = 0b111 } } }, |
| 162 | | .faddd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00000, .fmt = .D, .rm = 0b111 } } }, |
| 163 | .fadds => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00000, .fmt = .S, .rm = 0b111 } } }, |
| 164 | .faddd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00000, .fmt = .D, .rm = 0b111 } } }, |
| 165 | |
| 166 | .feqs => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .S, .rm = 0b010 } } }, |
| 167 | .feqd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .D, .rm = 0b010 } } }, |
| 163 | 168 | |
| 164 | | .feqs => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .S, .rm = 0b010 } } }, |
| 165 | | .feqd => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b10100, .fmt = .D, .rm = 0b010 } } }, |
| 169 | .fsgnjns => .{ .opcode = .OP_FP, .data = .{ .fmt = .{ .funct5 = 0b00100, .fmt = .S, .rm = 0b000 } } }, |
| 166 | 170 | |
| 167 | 171 | // LOAD |
| 168 | 172 | |
| 169 | | .ld => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 170 | | .lw => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b010 } } }, |
| 171 | | .lwu => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b110 } } }, |
| 172 | | .lh => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b001 } } }, |
| 173 | | .lhu => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b101 } } }, |
| 174 | | .lb => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 175 | | .lbu => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b100 } } }, |
| 173 | .ld => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 174 | .lw => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b010 } } }, |
| 175 | .lwu => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b110 } } }, |
| 176 | .lh => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b001 } } }, |
| 177 | .lhu => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b101 } } }, |
| 178 | .lb => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 179 | .lbu => .{ .opcode = .LOAD, .data = .{ .fo = .{ .funct3 = 0b100 } } }, |
| 176 | 180 | |
| 177 | 181 | |
| 178 | 182 | // STORE |
| 179 | 183 | |
| 180 | | .sd => .{ .opcode = .STORE, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 181 | | .sw => .{ .opcode = .STORE, .data = .{ .fo = .{ .funct3 = 0b010 } } }, |
| 182 | | .sh => .{ .opcode = .STORE, .data = .{ .fo = .{ .funct3 = 0b001 } } }, |
| 183 | | .sb => .{ .opcode = .STORE, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 184 | .sd => .{ .opcode = .STORE, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 185 | .sw => .{ .opcode = .STORE, .data = .{ .fo = .{ .funct3 = 0b010 } } }, |
| 186 | .sh => .{ .opcode = .STORE, .data = .{ .fo = .{ .funct3 = 0b001 } } }, |
| 187 | .sb => .{ .opcode = .STORE, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 184 | 188 | |
| 185 | 189 | |
| 186 | 190 | // LOAD_FP |
| 187 | 191 | |
| 188 | | .fld => .{ .opcode = .LOAD_FP, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 189 | | .flw => .{ .opcode = .LOAD_FP, .data = .{ .fo = .{ .funct3 = 0b010 } } }, |
| 192 | .fld => .{ .opcode = .LOAD_FP, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 193 | .flw => .{ .opcode = .LOAD_FP, .data = .{ .fo = .{ .funct3 = 0b010 } } }, |
| 190 | 194 | |
| 191 | 195 | // STORE_FP |
| 192 | 196 | |
| 193 | | .fsd => .{ .opcode = .STORE_FP, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 194 | | .fsw => .{ .opcode = .STORE_FP, .data = .{ .fo = .{ .funct3 = 0b010 } } }, |
| 197 | .fsd => .{ .opcode = .STORE_FP, .data = .{ .fo = .{ .funct3 = 0b011 } } }, |
| 198 | .fsw => .{ .opcode = .STORE_FP, .data = .{ .fo = .{ .funct3 = 0b010 } } }, |
| 195 | 199 | |
| 196 | 200 | |
| 197 | 201 | // JALR |
| 198 | 202 | |
| 199 | | .jalr => .{ .opcode = .JALR, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 203 | .jalr => .{ .opcode = .JALR, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 200 | 204 | |
| 201 | 205 | |
| 202 | 206 | // OP_32 |
| 203 | 207 | |
| 204 | | .sllw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b001, .funct7 = 0b0000000 } } }, |
| 208 | .sllw => .{ .opcode = .OP_32, .data = .{ .ff = .{ .funct3 = 0b001, .funct7 = 0b0000000 } } }, |
| 205 | 209 | |
| 206 | 210 | |
| 207 | 211 | // LUI |
| 208 | 212 | |
| 209 | | .lui => .{ .opcode = .LUI, .data = .{ .none = {} } }, |
| 213 | .lui => .{ .opcode = .LUI, .data = .{ .none = {} } }, |
| 210 | 214 | |
| 211 | 215 | |
| 212 | 216 | // AUIPC |
| 213 | 217 | |
| 214 | | .auipc => .{ .opcode = .AUIPC, .data = .{ .none = {} } }, |
| 218 | .auipc => .{ .opcode = .AUIPC, .data = .{ .none = {} } }, |
| 215 | 219 | |
| 216 | 220 | |
| 217 | 221 | // JAL |
| 218 | 222 | |
| 219 | | .jal => .{ .opcode = .JAL, .data = .{ .none = {} } }, |
| 223 | .jal => .{ .opcode = .JAL, .data = .{ .none = {} } }, |
| 220 | 224 | |
| 221 | 225 | |
| 222 | 226 | // BRANCH |
| 223 | 227 | |
| 224 | | .beq => .{ .opcode = .BRANCH, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 228 | .beq => .{ .opcode = .BRANCH, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 225 | 229 | |
| 226 | 230 | |
| 227 | 231 | // SYSTEM |
| 228 | 232 | |
| 229 | | .ecall => .{ .opcode = .SYSTEM, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 230 | | .ebreak => .{ .opcode = .SYSTEM, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 233 | .ecall => .{ .opcode = .SYSTEM, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 234 | .ebreak => .{ .opcode = .SYSTEM, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 231 | 235 | |
| 232 | 236 | |
| 233 | 237 | // NONE |
| 234 | 238 | |
| 235 | | .unimp => .{ .opcode = .NONE, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 239 | .unimp => .{ .opcode = .NONE, .data = .{ .fo = .{ .funct3 = 0b000 } } }, |
| 236 | 240 | |
| 237 | 241 | |
| 238 | 242 | // zig fmt: on |
| ... | ... | @@ -308,6 +312,7 @@ pub const InstEnc = enum { |
| 308 | 312 | .faddd, |
| 309 | 313 | .feqs, |
| 310 | 314 | .feqd, |
| 315 | .fsgnjns, |
| 311 | 316 | => .R, |
| 312 | 317 | |
| 313 | 318 | .ecall, |