@@ -1003,7 +1003,7 @@ extern int exec_function_f(void (*)(), int *, int *, int, int *);
10031003 "ldr r3, [r7, #60]\n\t" /* i */ \
10041004 /* https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/function-parameters-on-32-bit-arm */ \
10051005 "lsl r4, r3, #2\n\t" /* r4 = i * 2 */ \
1006- "ldr r1, [r7, #80 ]\n\t" /* vargv[0] */ \
1006+ "ldr r1, [r7, #16 ]\n\t" /* vargv[0] */ \
10071007 "add r1, r1, r4\n\t" /* vargv[i] */ \
10081008 "add r2, sp, r4\n\t" /* stack[i] */ \
10091009 "ldr r0, [r1]\n\t" \
@@ -1050,41 +1050,45 @@ __asm__ (".align 4\n"
10501050 ".global exec_function_i\n\t"
10511051 ".type exec_function_i, %function\n"
10521052 "exec_function_i:\n\t"
1053- "push {r7, lr}\n\t"
1053+ "push {r3, r4, r5, r6, r7, lr}\n\t"
10541054 "sub sp, sp, #136\n\t"
10551055 "add r7, sp, #64\n\t"
10561056 "str r0, [r7, #12]\n\t" // fc
10571057 "str r1, [r7, #8]\n\t" // iargv
10581058 "str r2, [r7, #4]\n\t" // fargv
10591059 "str r3, [r7]\n\t" // vcntr
1060+ "ldr r0, [r7, #96]\n\t" // get 5th argument (vargv)
1061+ "str r0, [r7, #16]\n\t" // store vargv to #16
10601062 exec_function_asm ("FUNCI" )
10611063 // retval
10621064 "adds r7, r7, #72\n\t"
10631065 "mov sp, r7\n\t"
10641066 "@ sp needed @\n\t"
1065- "pop {r7, pc}\n\t"
1067+ "pop {r3, r4, r5, r6, r7, pc}\n\t"
10661068 ".size exec_function_i, .-exec_function_i\n\t"
10671069 );
10681070
10691071__asm__ (".align 4\n"
10701072 ".global exec_function_f\n\t"
10711073 ".type exec_function_f, %function\n"
10721074 "exec_function_f:\n\t"
1073- "push {r7, lr}\n\t"
1075+ "push {r3, r4, r5, r6, r7, lr}\n\t"
10741076 "sub sp, sp, #136\n\t"
10751077 "add r7, sp, #64\n\t"
10761078 "str r0, [r7, #12]\n\t" // fc
10771079 "str r1, [r7, #8]\n\t" // iargv
10781080 "str r2, [r7, #4]\n\t" // fargv
10791081 "str r3, [r7]\n\t" // vcntr
1082+ "ldr r0, [r7, #96]\n\t" // get 5th argument (vargv)
1083+ "str r0, [r7, #16]\n\t" // store vargv to #16
10801084 exec_function_asm ("FUNCF" )
10811085 // retval
10821086 "vmov r0, s0 @ <retval>\n\t"
10831087 "vmov r1, s1 @ <retval>\n\t"
10841088 "adds r7, r7, #72\n\t"
10851089 "mov sp, r7\n\t"
10861090 "@ sp needed @\n\t"
1087- "pop {r7, pc}\n\t"
1091+ "pop {r3, r4, r5, r6, r7, pc}\n\t"
10881092 ".size exec_function_f, .-exec_function_f\n\t"
10891093 );
10901094
@@ -1119,8 +1123,13 @@ pointer args[];
11191123 double f ;
11201124
11211125 if (code -> c .fcode .entry2 != NIL ) {
1126+ #if (WORD_SIZE == 64 )
11221127 ifunc = (eusinteger_t (* )())((((eusinteger_t )ifunc )& 0xffffffff00000000 )
11231128 | (intval (code -> c .fcode .entry2 )& 0x00000000ffffffff ));
1129+ #else
1130+ ifunc = (eusinteger_t (* )())((((eusinteger_t )ifunc )& 0xffff0000 )
1131+ | (intval (code -> c .fcode .entry2 )& 0x0000ffff ));
1132+ #endif
11241133 /* R.Hanai 090726 */
11251134 }
11261135 while (iscons (paramtypes )) {
@@ -1306,13 +1315,13 @@ pointer args[];
13061315 if (resulttype == K_FLOAT || resulttype == K_FLOAT32 ) {
13071316 union {
13081317 eusfloat_t f ;
1309- #if __ARM_ARCH == 4
1318+ #if __ARM_ARCH == 4 || __ARM_ARCH == 5
13101319 eusinteger_t i ; // ARM 32bit armel
13111320#else
13121321 eusfloat_t i ; // Intel 32bit x86
13131322#endif
13141323 } n ;
1315- #if __ARM_ARCH == 4
1324+ #if __ARM_ARCH == 4 || __ARM_ARCH == 5
13161325 typedef eusinteger_t ifunc_ret_type ;
13171326#else
13181327 typedef double ifunc_ret_type ;
0 commit comments