@@ -194,9 +194,11 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
194
194
int ofs ;
195
195
196
196
/* Prepare this variable to reuse the same code for
197
- * the instruction sequence of division and modulo.
197
+ * the instruction sequence of
198
+ * 1. division and modulo.
199
+ * 2. load and store operations.
198
200
*/
199
- arm_reg soft_div_rd = __r8 ;
201
+ arm_reg interm ;
200
202
201
203
switch (ph2_ir -> op ) {
202
204
case OP_define :
@@ -236,40 +238,26 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
236
238
emit (__mov_r (__AL , rd , rn ));
237
239
return ;
238
240
case OP_load :
239
- if (ph2_ir -> src0 > 4095 ) {
240
- emit (__movw (__AL , __r8 , ph2_ir -> src0 ));
241
- emit (__movt (__AL , __r8 , ph2_ir -> src0 ));
242
- emit (__add_r (__AL , __r8 , __sp , __r8 ));
243
- emit (__lw (__AL , rd , __r8 , 0 ));
244
- } else
245
- emit (__lw (__AL , rd , __sp , ph2_ir -> src0 ));
246
- return ;
247
- case OP_store :
248
- if (ph2_ir -> src1 > 4095 ) {
249
- emit (__movw (__AL , __r8 , ph2_ir -> src1 ));
250
- emit (__movt (__AL , __r8 , ph2_ir -> src1 ));
251
- emit (__add_r (__AL , __r8 , __sp , __r8 ));
252
- emit (__sw (__AL , rn , __r8 , 0 ));
253
- } else
254
- emit (__sw (__AL , rn , __sp , ph2_ir -> src1 ));
255
- return ;
256
241
case OP_global_load :
242
+ interm = ph2_ir -> op == OP_load ? __sp : __r12 ;
257
243
if (ph2_ir -> src0 > 4095 ) {
258
244
emit (__movw (__AL , __r8 , ph2_ir -> src0 ));
259
245
emit (__movt (__AL , __r8 , ph2_ir -> src0 ));
260
- emit (__add_r (__AL , __r8 , __r12 , __r8 ));
246
+ emit (__add_r (__AL , __r8 , interm , __r8 ));
261
247
emit (__lw (__AL , rd , __r8 , 0 ));
262
248
} else
263
- emit (__lw (__AL , rd , __r12 , ph2_ir -> src0 ));
249
+ emit (__lw (__AL , rd , interm , ph2_ir -> src0 ));
264
250
return ;
251
+ case OP_store :
265
252
case OP_global_store :
253
+ interm = ph2_ir -> op == OP_store ? __sp : __r12 ;
266
254
if (ph2_ir -> src1 > 4095 ) {
267
255
emit (__movw (__AL , __r8 , ph2_ir -> src1 ));
268
256
emit (__movt (__AL , __r8 , ph2_ir -> src1 ));
269
- emit (__add_r (__AL , __r8 , __r12 , __r8 ));
257
+ emit (__add_r (__AL , __r8 , interm , __r8 ));
270
258
emit (__sw (__AL , rn , __r8 , 0 ));
271
259
} else
272
- emit (__sw (__AL , rn , __r12 , ph2_ir -> src1 ));
260
+ emit (__sw (__AL , rn , interm , ph2_ir -> src1 ));
273
261
return ;
274
262
case OP_read :
275
263
if (ph2_ir -> src1 == 1 )
@@ -351,6 +339,7 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
351
339
}
352
340
return ;
353
341
}
342
+ interm = __r8 ;
354
343
/* div/mod emulation */
355
344
/* Preserve the values of the dividend and divisor */
356
345
emit (__stmdb (__AL , 1 , __sp , (1 << rn ) | (1 << rm )));
@@ -368,7 +357,7 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
368
357
* in __r9. The sign of the divisor is irrelevant for determining
369
358
* the result's sign.
370
359
*/
371
- soft_div_rd = __r9 ;
360
+ interm = __r9 ;
372
361
emit (__mov_r (__AL , __r10 , __r8 ));
373
362
}
374
363
/* Unsigned integer division */
@@ -399,7 +388,7 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
399
388
*/
400
389
emit (__mov_r (__AL , __r9 , rn ));
401
390
emit (__ldm (__AL , 1 , __sp , (1 << rn ) | (1 << rm )));
402
- emit (__mov_r (__AL , rd , soft_div_rd ));
391
+ emit (__mov_r (__AL , rd , interm ));
403
392
/* Handle the correct sign for the quotient or remainder */
404
393
emit (__cmp_i (__AL , __r10 , 0 ));
405
394
emit (__rsb_i (__NE , rd , 0 , rd ));
0 commit comments