@@ -194,9 +194,11 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
194194 int ofs ;
195195
196196 /* 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.
198200 */
199- arm_reg soft_div_rd = __r8 ;
201+ arm_reg interm ;
200202
201203 switch (ph2_ir -> op ) {
202204 case OP_define :
@@ -236,40 +238,26 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
236238 emit (__mov_r (__AL , rd , rn ));
237239 return ;
238240 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 ;
256241 case OP_global_load :
242+ interm = ph2_ir -> op == OP_load ? __sp : __r12 ;
257243 if (ph2_ir -> src0 > 4095 ) {
258244 emit (__movw (__AL , __r8 , ph2_ir -> src0 ));
259245 emit (__movt (__AL , __r8 , ph2_ir -> src0 ));
260- emit (__add_r (__AL , __r8 , __r12 , __r8 ));
246+ emit (__add_r (__AL , __r8 , interm , __r8 ));
261247 emit (__lw (__AL , rd , __r8 , 0 ));
262248 } else
263- emit (__lw (__AL , rd , __r12 , ph2_ir -> src0 ));
249+ emit (__lw (__AL , rd , interm , ph2_ir -> src0 ));
264250 return ;
251+ case OP_store :
265252 case OP_global_store :
253+ interm = ph2_ir -> op == OP_store ? __sp : __r12 ;
266254 if (ph2_ir -> src1 > 4095 ) {
267255 emit (__movw (__AL , __r8 , ph2_ir -> src1 ));
268256 emit (__movt (__AL , __r8 , ph2_ir -> src1 ));
269- emit (__add_r (__AL , __r8 , __r12 , __r8 ));
257+ emit (__add_r (__AL , __r8 , interm , __r8 ));
270258 emit (__sw (__AL , rn , __r8 , 0 ));
271259 } else
272- emit (__sw (__AL , rn , __r12 , ph2_ir -> src1 ));
260+ emit (__sw (__AL , rn , interm , ph2_ir -> src1 ));
273261 return ;
274262 case OP_read :
275263 if (ph2_ir -> src1 == 1 )
@@ -351,6 +339,7 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
351339 }
352340 return ;
353341 }
342+ interm = __r8 ;
354343 /* div/mod emulation */
355344 /* Preserve the values of the dividend and divisor */
356345 emit (__stmdb (__AL , 1 , __sp , (1 << rn ) | (1 << rm )));
@@ -368,7 +357,7 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
368357 * in __r9. The sign of the divisor is irrelevant for determining
369358 * the result's sign.
370359 */
371- soft_div_rd = __r9 ;
360+ interm = __r9 ;
372361 emit (__mov_r (__AL , __r10 , __r8 ));
373362 }
374363 /* Unsigned integer division */
@@ -399,7 +388,7 @@ void emit_ph2_ir(ph2_ir_t *ph2_ir)
399388 */
400389 emit (__mov_r (__AL , __r9 , rn ));
401390 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 ));
403392 /* Handle the correct sign for the quotient or remainder */
404393 emit (__cmp_i (__AL , __r10 , 0 ));
405394 emit (__rsb_i (__NE , rd , 0 , rd ));
0 commit comments