- addi itmp1,itmp1,sizevmarg /* goto next argument block */
- addi itmp2,itmp2,-1 /* argument count - 1 */
- mr. itmp2,itmp2
- beq L_register_copy_done
-
- addi t3,t3,-1 /* uses a PA slot */
- lwz itmp3,offvmargtype+4(itmp1)
- andi. r0,itmp3,0x0002 /* is this a float/double type? */
- bne L_register_handle_float
-
-L_register_handle_int:
- cmpwi t6,INT_ARG_CNT /* are we out of integer argument */
- beq L_register_copy /* registers? yes, next loop */
-
- cmpwi itmp3,0x0004 /* is it TYPE_ADR? */
- beq L_register_handle_long
-
- andi. r0,itmp3,0x0001 /* is this a 2-word type? */
- bne L_register_handle_long
-
- lis itmp3,L_jumptable_int@highest /* load 64bit address */
- ori itmp3,itmp3,L_jumptable_int@higher
- rldicr itmp3,itmp3,32,31
- oris itmp3,itmp3,L_jumptable_int@h
- ori itmp3,itmp3,L_jumptable_int@l
- b L_register_do_copy_longint
-
-L_register_handle_long:
-
- lis itmp3,L_jumptable_long@highest /* load 64bit address */
- ori itmp3,itmp3,L_jumptable_long@higher
- rldicr itmp3,itmp3,32,31
- oris itmp3,itmp3,L_jumptable_long@h
- ori itmp3,itmp3,L_jumptable_long@l
-
-L_register_do_copy_longint:
- slwi t2,t6,3 /* multiple of 8-bytes */
- add itmp3,itmp3,t2 /* calculate address of jumptable */
- ld itmp3,0(itmp3) /* load function address */
- mtctr itmp3
- addi t0,t0,1 /* integer argument counter */
- addi t6,t6,1 /* integer argument register counter */
- bctr
-
-L_register_handle_float:
- cmpwi t1,FLT_ARG_CNT /* are we out of float argument */
- beq L_register_copy /* registers? yes, next loop */
-
- andi. r0,itmp3,0x0001 /* is this a 2-word type? */
- bne L_register_handle_double
-
- lis itmp3,L_jumptable_float@highest /* load 64bit address */
- ori itmp3,itmp3,L_jumptable_float@higher
- rldicr itmp3,itmp3,32,31
- oris itmp3,itmp3,L_jumptable_float@h
- ori itmp3,itmp3,L_jumptable_float@l
- b L_register_do_copy_floatdouble
-
-L_register_handle_double:
-
- lis itmp3,L_jumptable_double@highest /* load 64bit address */
- ori itmp3,itmp3,L_jumptable_double@higher
- rldicr itmp3,itmp3,32,31
- oris itmp3,itmp3,L_jumptable_double@h
- ori itmp3,itmp3,L_jumptable_double@l
-
-
-L_register_do_copy_floatdouble:
-
- slwi t2,t1,3 /* multiple of 8-bytes */
- add itmp3,itmp3,t2 /* calculate address of jumptable */
- ld itmp3,0(itmp3) /* load function address */
- mtctr itmp3
- addi t1,t1,1 /* float argument counter */
- mr. t3,t3 /* are we still in PA ? */
- blt L_float_not_uses_PA
- addi t6,t6,1 /* if so it uses an interger arg reg */
-L_float_not_uses_PA:
- bctr
-
-
-L_register_copy_done:
- subi sp,sp,PA_SIZE /* PA_SIZE are used by definition */
- /* calculate remaining arguments */
- sub itmp3,t4,t0 /* - integer arguments in registers */
- sub itmp3,itmp3,t1 /* - float arguments in registers */
- mr. itmp3,itmp3
- beq L_stack_copy_done
-
- mr itmp2,t4 /* restore argument count */
- mr itmp1,t5 /* restore argument block pointer */
-
- slwi t4,itmp3,3 /* XXX use 8-bytes slots for now */
- addi t4,t4,LA_SIZE /* add size of linkage area */
- sub sp,sp,t4