@@ -168,13 +168,23 @@ void asm_arm_entry(asm_arm_t *as, int num_locals) {
168
168
169
169
emit_al (as , asm_arm_op_push (as -> push_reglist | 1 << ASM_ARM_REG_LR ));
170
170
if (as -> stack_adjust > 0 ) {
171
- emit_al (as , asm_arm_op_sub_imm (ASM_ARM_REG_SP , ASM_ARM_REG_SP , as -> stack_adjust ));
171
+ if (as -> stack_adjust < 0x100 ) {
172
+ emit_al (as , asm_arm_op_sub_imm (ASM_ARM_REG_SP , ASM_ARM_REG_SP , as -> stack_adjust ));
173
+ } else {
174
+ asm_arm_mov_reg_i32_optimised (as , ASM_ARM_REG_R8 , as -> stack_adjust );
175
+ emit_al (as , asm_arm_op_sub_reg (ASM_ARM_REG_SP , ASM_ARM_REG_SP , ASM_ARM_REG_R8 ));
176
+ }
172
177
}
173
178
}
174
179
175
180
void asm_arm_exit (asm_arm_t * as ) {
176
181
if (as -> stack_adjust > 0 ) {
177
- emit_al (as , asm_arm_op_add_imm (ASM_ARM_REG_SP , ASM_ARM_REG_SP , as -> stack_adjust ));
182
+ if (as -> stack_adjust < 0x100 ) {
183
+ emit_al (as , asm_arm_op_add_imm (ASM_ARM_REG_SP , ASM_ARM_REG_SP , as -> stack_adjust ));
184
+ } else {
185
+ asm_arm_mov_reg_i32_optimised (as , ASM_ARM_REG_R8 , as -> stack_adjust );
186
+ emit_al (as , asm_arm_op_add_reg (ASM_ARM_REG_SP , ASM_ARM_REG_SP , ASM_ARM_REG_R8 ));
187
+ }
178
188
}
179
189
180
190
emit_al (as , asm_arm_op_pop (as -> push_reglist | (1 << ASM_ARM_REG_PC )));
0 commit comments