Skip to content

Commit 5965012

Browse files
committed
Implement type conversion in code generation
- Add OP_cast instruction for type conversions - Implement cast support in ARM backend - Implement cast support in RISC-V backend - Add cast handling in SSA and register allocation - Code formatted with clang-format-18
1 parent 3478091 commit 5965012

File tree

4 files changed

+23
-0
lines changed

4 files changed

+23
-0
lines changed

src/arm-codegen.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,9 @@ void update_elf_offset(ph2_ir_t *ph2_ir)
125125
case OP_sign_ext:
126126
elf_offset += 4;
127127
return;
128+
case OP_cast:
129+
elf_offset += 4;
130+
return;
128131
default:
129132
fatal("Unknown opcode");
130133
}
@@ -439,6 +442,10 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
439442
/* TODO: Allow to sign extends to other types */
440443
emit(__sxtb(__AL, rd, rn, 0));
441444
return;
445+
case OP_cast:
446+
/* Generic cast operation - for now, just move the value */
447+
emit(__mov_r(__AL, rd, rn));
448+
return;
442449
default:
443450
fatal("Unknown opcode");
444451
}

src/reg-alloc.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -596,6 +596,7 @@ void reg_alloc(void)
596596
break;
597597
case OP_trunc:
598598
case OP_sign_ext:
599+
case OP_cast:
599600
src0 = prepare_operand(bb, insn->rs1, -1);
600601
dest = prepare_dest(bb, insn->rd, src0, -1);
601602
ir = bb_add_ph2_ir(bb, insn->opcode);
@@ -787,6 +788,9 @@ void dump_ph2_ir(void)
787788
case OP_sign_ext:
788789
printf("\t%%x%c = sign_ext %%x%c, %d", rd, rs1, ph2_ir->src1);
789790
break;
791+
case OP_cast:
792+
printf("\t%%x%c = cast %%x%c", rd, rs1);
793+
break;
790794
default:
791795
break;
792796
}

src/riscv-codegen.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,9 @@ void update_elf_offset(ph2_ir_t *ph2_ir)
9999
case OP_sign_ext:
100100
elf_offset += 12;
101101
return;
102+
case OP_cast:
103+
elf_offset += 4;
104+
return;
102105
default:
103106
fatal("Unknown opcode");
104107
}
@@ -422,6 +425,10 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
422425
/* TODO: Allow user to switch to Zbb extension if needed */
423426
/* emit(__sext_b(rd, rs1)); */
424427
return;
428+
case OP_cast:
429+
/* Generic cast operation - for now, just move the value */
430+
emit(__addi(rd, rs1, 0));
431+
return;
425432
default:
426433
fatal("Unknown opcode");
427434
}

src/ssa.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1119,6 +1119,11 @@ void bb_dump(FILE *fd, func_t *func, basic_block_t *bb)
11191119
insn->rd->var_name, insn->rd->subscript,
11201120
insn->rs1->var_name, insn->rs1->subscript, insn->sz);
11211121
break;
1122+
case OP_cast:
1123+
sprintf(str, "<%s<SUB>%d</SUB> := cast %s<SUB>%d</SUB>>",
1124+
insn->rd->var_name, insn->rd->subscript,
1125+
insn->rs1->var_name, insn->rs1->subscript);
1126+
break;
11221127
default:
11231128
printf("Unknown opcode\n");
11241129
abort();

0 commit comments

Comments
 (0)