Skip to content

Commit 9bda64e

Browse files
authored
Merge pull request #168 from DrXiao/refine-codegen
Refine code generation for address-of operations
2 parents a8bc7cf + 418d20e commit 9bda64e

File tree

2 files changed

+9
-19
lines changed

2 files changed

+9
-19
lines changed

src/arm-codegen.c

+4-9
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
197197
* the instruction sequence of
198198
* 1. division and modulo.
199199
* 2. load and store operations.
200+
* 3. address-of operations.
200201
*/
201202
arm_reg interm;
202203

@@ -219,20 +220,14 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
219220
emit(__mov_i(__AL, rd, ph2_ir->src0));
220221
return;
221222
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;
229223
case OP_global_address_of:
224+
interm = ph2_ir->op == OP_address_of ? __sp : __r12;
230225
if (ph2_ir->src0 > 255) {
231226
emit(__movw(__AL, __r8, ph2_ir->src0));
232227
emit(__movt(__AL, __r8, ph2_ir->src0));
233-
emit(__add_r(__AL, rd, __r12, __r8));
228+
emit(__add_r(__AL, rd, interm, __r8));
234229
} else
235-
emit(__add_i(__AL, rd, __r12, ph2_ir->src0));
230+
emit(__add_i(__AL, rd, interm, ph2_ir->src0));
236231
return;
237232
case OP_assign:
238233
emit(__mov_r(__AL, rd, rn));

src/riscv-codegen.c

+5-10
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
161161
* the instruction sequence of
162162
* 1. division and modulo.
163163
* 2. load and store operations.
164+
* 3. address-of operations.
164165
*/
165166
rv_reg interm, divisor_mask = __t1;
166167

@@ -179,21 +180,15 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
179180
} else
180181
emit(__addi(rd, __zero, ph2_ir->src0));
181182
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;
190183
case OP_address_of:
184+
case OP_global_address_of:
185+
interm = ph2_ir->op == OP_address_of ? __sp : __gp;
191186
if (ph2_ir->src0 < -2048 || ph2_ir->src0 > 2047) {
192187
emit(__lui(__t0, rv_hi(ph2_ir->src0)));
193188
emit(__addi(__t0, __t0, rv_lo(ph2_ir->src0)));
194-
emit(__add(rd, __sp, __t0));
189+
emit(__add(rd, interm, __t0));
195190
} else
196-
emit(__addi(rd, __sp, ph2_ir->src0));
191+
emit(__addi(rd, interm, ph2_ir->src0));
197192
return;
198193
case OP_assign:
199194
emit(__addi(rd, rs1, 0));

0 commit comments

Comments
 (0)