diff --git a/compiler/arm/cgcpu.pas b/compiler/arm/cgcpu.pas index f421e1eb15..1e4b6ec744 100644 --- a/compiler/arm/cgcpu.pas +++ b/compiler/arm/cgcpu.pas @@ -3405,6 +3405,10 @@ unit cgcpu; if (regs<>[]) or (pi_do_call in current_procinfo.flags) then include(regs,RS_R14); + { safely estimate stack size } + if localsize+current_settings.alignment.localalignmax>508 then + include(regs,RS_R4); + if regs<>[] then begin for r:=RS_R0 to RS_R15 do @@ -3428,19 +3432,15 @@ unit cgcpu; (po_assembler in current_procinfo.procdef.procoptions))) then begin localsize:=align(localsize+stackmisalignment,current_settings.alignment.localalignmax)-stackmisalignment; - if is_shifter_const(localsize,shift) then + if localsize<508 then begin - a_reg_dealloc(list,NR_R12); list.concat(taicpu.op_reg_reg_const(A_SUB,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,LocalSize)); end - else if split_into_shifter_const(localsize, imm1, imm2) then - begin - a_reg_dealloc(list,NR_R12); - list.concat(taicpu.op_reg_reg_const(A_SUB,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,imm1)); - list.concat(taicpu.op_reg_reg_const(A_SUB,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,imm2)); - end else begin + a_load_const_reg(list,OS_ADDR,-localsize,NR_R4); + list.concat(taicpu.op_reg_reg_reg(A_ADD,NR_STACK_POINTER_REG,NR_STACK_POINTER_REG,NR_R4)); + //!!!! if current_procinfo.framepointer=NR_STACK_POINTER_REG then //!!!! a_reg_alloc(list,NR_R12); //!!!! a_load_const_reg(list,OS_ADDR,LocalSize,NR_R12);