- movr(_SP_REGNO, _FP_REGNO);
- ldxi(_RA_REGNO, _SP_REGNO, 0);
- ldxi(_FP_REGNO, _SP_REGNO, 8);
- if (jit_regset_tstbit(&_jitc->function->regset, _S1))
- ldxi(9, _SP_REGNO, 16);
- if (jit_regset_tstbit(&_jitc->function->regset, _S2))
- ldxi(18, _SP_REGNO, 24);
- if (jit_regset_tstbit(&_jitc->function->regset, _S3))
- ldxi(19, _SP_REGNO, 32);
- if (jit_regset_tstbit(&_jitc->function->regset, _S4))
- ldxi(20, _SP_REGNO, 40);
- if (jit_regset_tstbit(&_jitc->function->regset, _S5))
- ldxi(21, _SP_REGNO, 48);
- if (jit_regset_tstbit(&_jitc->function->regset, _S6))
- ldxi(22, _SP_REGNO, 56);
- if (jit_regset_tstbit(&_jitc->function->regset, _S7))
- ldxi(23, _SP_REGNO, 64);
- if (jit_regset_tstbit(&_jitc->function->regset, _S8))
- ldxi(24, _SP_REGNO, 72);
- if (jit_regset_tstbit(&_jitc->function->regset, _S9))
- ldxi(25, _SP_REGNO, 80);
- if (jit_regset_tstbit(&_jitc->function->regset, _S10))
- ldxi(26, _SP_REGNO, 88);
- if (jit_regset_tstbit(&_jitc->function->regset, _S11))
- ldxi(27, _SP_REGNO, 96);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS0))
- ldxi_d(8, _SP_REGNO, 104);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS1))
- ldxi_d(9, _SP_REGNO, 112);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS2))
- ldxi_d(18, _SP_REGNO, 120);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS3))
- ldxi_d(19, _SP_REGNO, 128);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS4))
- ldxi_d(20, _SP_REGNO, 136);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS5))
- ldxi_d(21, _SP_REGNO, 144);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS6))
- ldxi_d(22, _SP_REGNO, 152);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS7))
- ldxi_d(23, _SP_REGNO, 160);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS8))
- ldxi_d(24, _SP_REGNO, 168);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS9))
- ldxi_d(25, _SP_REGNO, 176);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS10))
- ldxi_d(26, _SP_REGNO, 184);
- if (jit_regset_tstbit(&_jitc->function->regset, _FS11))
- ldxi_d(27, _SP_REGNO, 192);
- addi(_SP_REGNO, _SP_REGNO, stack_framesize);
+ if (_jitc->function->need_frame) {
+ movr(_SP_REGNO, _FP_REGNO);
+ ldxi(_RA_REGNO, _SP_REGNO, 0);
+ ldxi(_FP_REGNO, _SP_REGNO, 8);
+ }
+
+ /* callee save registers */
+ for (reg = 0, offs = 16; reg < jit_size(iregs); reg++) {
+ if (jit_regset_tstbit(&_jitc->function->regset, iregs[reg])) {
+ ldxi(rn(iregs[reg]), _SP_REGNO, offs);
+ offs += sizeof(jit_word_t);
+ }
+ }
+ for (reg = 0; reg < jit_size(fregs); reg++) {
+ if (jit_regset_tstbit(&_jitc->function->regset, fregs[reg])) {
+ ldxi_d(rn(fregs[reg]), _SP_REGNO, offs);
+ offs += sizeof(jit_float64_t);
+ }
+ }
+
+ if (_jitc->function->need_frame || _jitc->function->need_stack)
+ addi(_SP_REGNO, _SP_REGNO, jit_framesize());