|
21 | 21 | U_TYPE = {'auipc', 'lli', 'lmi', 'lui'} |
22 | 22 | C_TYPE = {'csrr'} |
23 | 23 | J_TYPE = {'jal'} |
24 | | -P_TYPE = {'jpnz', 'prr', 'prw'} |
| 24 | +P_TYPE = {'jpnz', 'prsw', 'prlw'} |
25 | 25 | H_TYPE = {'halt'} |
26 | 26 |
|
27 | 27 | # Instructions without predication |
28 | | -NO_PREDICATE = {'halt', 'prw', 'prr', 'jpnz', 'jal', 'jalr'} |
| 28 | +NO_PREDICATE = {'halt', 'jal', 'jalr'} |
29 | 29 |
|
30 | 30 |
|
31 | 31 | def load_opcodes(opcode_file: str) -> Dict[str, str]: |
@@ -272,7 +272,7 @@ def encode_instruction(self, addr: int, opcode: str, operands: List[str]) -> str |
272 | 272 | elif opcode in J_TYPE: |
273 | 273 | required_ops = 2 # rd, imm/label |
274 | 274 | elif opcode in P_TYPE: |
275 | | - required_ops = 2 # rs1, rs2 |
| 275 | + required_ops = 3 # prd, rs2, imm |
276 | 276 | elif opcode in H_TYPE: |
277 | 277 | required_ops = 0 # no operands |
278 | 278 | else: |
@@ -402,13 +402,33 @@ def encode_instruction(self, addr: int, opcode: str, operands: List[str]) -> str |
402 | 402 | self.to_binary(imm, 17) + self.to_binary(rd, 6) + op_bits) |
403 | 403 |
|
404 | 404 | elif opcode in P_TYPE: |
405 | | - # P-type: [end, start, pred, rs2[24:19], rs1[18:13], x[12:7], opcode[6:0]] |
406 | | - # Note: No predication for these instructions |
407 | | - rs1 = self.parse_register(operands[0]) |
408 | | - rs2 = self.parse_register(operands[1]) |
| 405 | + # P-type: {end[31], start[30], p[29:25], rs2[24:19], imm[18:13], rd[12:7], opcode[6:0]} |
| 406 | + # prd, rs2, imm |
| 407 | + if(opcode == 'prsw'): # prsw prs, rs2, imm |
| 408 | + predicate = self.parse_predicate(operands[0]) |
| 409 | + rs2 = self.parse_register(operands[1]) |
| 410 | + imm = self.parse_immediate(operands[2]) |
| 411 | + rd = 0 |
| 412 | + elif(opcode == 'prlw'): |
| 413 | + rd = self.parse_predicate(operands[0]) |
| 414 | + rs2 = self.parse_register(operands[1]) |
| 415 | + imm = self.parse_immediate(operands[2]) |
| 416 | + predicate = 0 |
| 417 | + elif(opcode == 'jpnz'): |
| 418 | + predicate = self.parse_predicate(operands[0]) |
| 419 | + if operands[1] in self.labels: |
| 420 | + target = self.labels[operands[1]] |
| 421 | + imm = target - addr # PC-relative offset |
| 422 | + else: |
| 423 | + imm = self.parse_immediate(operands[1]) |
| 424 | + rs2 = 0 |
| 425 | + rd = 0 |
| 426 | + else: |
| 427 | + raise ValueError(f"P-type opcode {opcode} found but implemented") |
| 428 | + |
409 | 429 | return (self.to_binary(end, 1) + self.to_binary(start, 1) + |
410 | | - '00000' + self.to_binary(rs2, 6) + |
411 | | - self.to_binary(rs1, 6) + '000000' + op_bits) |
| 430 | + self.to_binary(predicate, 5) + self.to_binary(rs2, 6) + |
| 431 | + self.to_binary(imm, 6) + self.to_binary(rd, 6) + op_bits) |
412 | 432 |
|
413 | 433 | elif opcode in H_TYPE: |
414 | 434 | # H-type (HALT): [end=1, start=0, 1s[29:7], opcode[6:0]] |
|
0 commit comments