Skip to content

Commit 3ba2bf5

Browse files
committed
Refine code generation for 'address of' operations
The instruction sequences of 'address of' and 'global address of' operations are similar but differ only in the register used for certain instructions. The situation occurs for ARM and RISC-V backends. Thus, this commit adjusts the backend implementation to reuse a unified code path when generating instructions for 'address of' operations.
1 parent a8bc7cf commit 3ba2bf5

File tree

2 files changed

+7
-19
lines changed

2 files changed

+7
-19
lines changed

src/arm-codegen.c

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -219,20 +219,14 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
219219
emit(__mov_i(__AL, rd, ph2_ir->src0));
220220
return;
221221
case OP_address_of:
222-
if (ph2_ir->src0 > 255) {
223-
emit(__movw(__AL, __r8, ph2_ir->src0));
224-
emit(__movt(__AL, __r8, ph2_ir->src0));
225-
emit(__add_r(__AL, rd, __sp, __r8));
226-
} else
227-
emit(__add_i(__AL, rd, __sp, ph2_ir->src0));
228-
return;
229222
case OP_global_address_of:
223+
interm = ph2_ir->op == OP_address_of ? __sp : __r12;
230224
if (ph2_ir->src0 > 255) {
231225
emit(__movw(__AL, __r8, ph2_ir->src0));
232226
emit(__movt(__AL, __r8, ph2_ir->src0));
233-
emit(__add_r(__AL, rd, __r12, __r8));
227+
emit(__add_r(__AL, rd, interm, __r8));
234228
} else
235-
emit(__add_i(__AL, rd, __r12, ph2_ir->src0));
229+
emit(__add_i(__AL, rd, interm, ph2_ir->src0));
236230
return;
237231
case OP_assign:
238232
emit(__mov_r(__AL, rd, rn));

src/riscv-codegen.c

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -179,21 +179,15 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
179179
} else
180180
emit(__addi(rd, __zero, ph2_ir->src0));
181181
return;
182-
case OP_global_address_of:
183-
if (ph2_ir->src0 < -2048 || ph2_ir->src0 > 2047) {
184-
emit(__lui(__t0, rv_hi(ph2_ir->src0)));
185-
emit(__addi(__t0, __t0, rv_lo(ph2_ir->src0)));
186-
emit(__add(rd, __gp, __t0));
187-
} else
188-
emit(__addi(rd, __gp, ph2_ir->src0));
189-
return;
190182
case OP_address_of:
183+
case OP_global_address_of:
184+
interm = ph2_ir->op == OP_address_of ? __sp : __gp;
191185
if (ph2_ir->src0 < -2048 || ph2_ir->src0 > 2047) {
192186
emit(__lui(__t0, rv_hi(ph2_ir->src0)));
193187
emit(__addi(__t0, __t0, rv_lo(ph2_ir->src0)));
194-
emit(__add(rd, __sp, __t0));
188+
emit(__add(rd, interm, __t0));
195189
} else
196-
emit(__addi(rd, __sp, ph2_ir->src0));
190+
emit(__addi(rd, interm, ph2_ir->src0));
197191
return;
198192
case OP_assign:
199193
emit(__addi(rd, rs1, 0));

0 commit comments

Comments
 (0)