Skip to content

Commit 510e055

Browse files
dpgeorgeagatti
andcommitted
py/asmarm: Allow function state to be larger than 255.
Co-authored-by: Alessandro Gatti <[email protected]> Signed-off-by: Damien George <[email protected]>
1 parent 6a90e51 commit 510e055

File tree

1 file changed

+12
-2
lines changed

1 file changed

+12
-2
lines changed

py/asmarm.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -168,13 +168,23 @@ void asm_arm_entry(asm_arm_t *as, int num_locals) {
168168

169169
emit_al(as, asm_arm_op_push(as->push_reglist | 1 << ASM_ARM_REG_LR));
170170
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+
}
172177
}
173178
}
174179

175180
void asm_arm_exit(asm_arm_t *as) {
176181
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+
}
178188
}
179189

180190
emit_al(as, asm_arm_op_pop(as->push_reglist | (1 << ASM_ARM_REG_PC)));

0 commit comments

Comments
 (0)