-rw-r--r-- | lib/jit_arm-swf.c | 29 |
diff --git a/lib/jit_arm-swf.c b/lib/jit_arm-swf.c index 8ba2b79..6e041fc 100644 --- a/lib/jit_arm-swf.c +++ b/lib/jit_arm-swf.c @@ -322,6 +322,8 @@ static void _swf_stxr_d(jit_state_t*,jit_int32_t,jit_int32_t,jit_int32_t); static void _swf_stxi_f(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t); # define swf_stxi_d(r0,r1,i0) _swf_stxi_d(_jit,r0,r1,i0) static void _swf_stxi_d(jit_state_t*,jit_word_t,jit_int32_t,jit_int32_t); +# define swf_vaarg_d(r0, r1) _swf_vaarg_d(_jit, r0, r1) +static void _swf_vaarg_d(jit_state_t*, jit_int32_t, jit_int32_t); #endif #if CODE @@ -2614,4 +2616,31 @@ _swf_stxi_d(jit_state_t *_jit, jit_word_t i0, jit_int32_t r0, jit_int32_t r1) } } } + +static void +_swf_vaarg_d(jit_state_t *_jit, jit_int32_t r0, jit_int32_t r1) +{ + jit_int32_t rg0, rg1; + + assert(_jitc->function->self.call & jit_call_varargs); + + rg0 = jit_get_reg(jit_class_gpr); + + /* Load stack pointer. */ + ldxi(rn(rg0), r1, offsetof(jit_va_list_t, stack)); + rg1 = jit_get_reg(jit_class_gpr); + andi(rn(rg1), rn(rg0), 7); + addr(rn(rg0), rn(rg0), rn(rg1)); + jit_unget_reg(rg1); + + /* Load argument. */ + swf_ldr_d(r0, rn(rg0)); + + /* Update stack pointer. */ + addi(rn(rg0), rn(rg0), sizeof(jit_float64_t)); + stxi(offsetof(jit_va_list_t, stack), r1, rn(rg0)); + + jit_unget_reg(rg0); +} + #endif |