@@ -986,6 +986,58 @@ pointer args[];
986
986
extern int exec_function_i (void (* )(), int * , int * , int , int * );
987
987
extern int exec_function_f (void (* )(), int * , int * , int , int * );
988
988
989
+ #define exec_function_asm (FUNC ) \
990
+ /* vargv -> stack */ \
991
+ "movs r3, #0\n\t" \
992
+ "str r3, [r7, #60]\n\t" \
993
+ "b ."FUNC"_LPCK\n\t" \
994
+ "."FUNC"_LP:\n\t" \
995
+ "ldr r3, [r7, #60]\n\t" /* i */ \
996
+ /* https://community.arm.com/developer/ip-products/processors/b/processors-ip-blog/posts/function-parameters-on-32-bit-arm */ \
997
+ "lsl r4, r3, #2\n\t" /* r4 = i * 2 */ \
998
+ "ldr r1, [r7, #80]\n\t" /* vargv[0] */ \
999
+ "add r1, r1, r4\n\t" /* vargv[i] */ \
1000
+ "add r2, sp, r4\n\t" /* stack[i] */ \
1001
+ "ldr r0, [r1]\n\t" \
1002
+ "str r0, [r2]\n\t" /* push stack */ \
1003
+ "adds r3, r3, #1\n\t" /* i++ */ \
1004
+ "str r3, [r7, #60]\n\t" \
1005
+ "." FUNC "_LPCK:\n\t" \
1006
+ "ldr r2, [r7, #60]\n\t" \
1007
+ "ldr r3, [r7]\n\t" \
1008
+ "cmp r2, r3\n\t" \
1009
+ "blt ." FUNC "_LP\n\t" \
1010
+ /* fargv -> register */ \
1011
+ "ldr r0, [r7,#4]\n\t" \
1012
+ "vldr.32 s0, [r0]\n\t" \
1013
+ "vldr.32 s1, [r0,#4]\n\t" \
1014
+ "vldr.32 s2, [r0,#8]\n\t" \
1015
+ "vldr.32 s3, [r0,#12]\n\t" \
1016
+ "vldr.32 s4, [r0,#16]\n\t" \
1017
+ "vldr.32 s5, [r0,#20]\n\t" \
1018
+ "vldr.32 s6, [r0,#24]\n\t" \
1019
+ "vldr.32 s7, [r0,#28]\n\t" \
1020
+ "vldr.32 s8, [r0,#32]\n\t" \
1021
+ "vldr.32 s9, [r0,#36]\n\t" \
1022
+ "vldr.32 s10, [r0,#40]\n\t" \
1023
+ "vldr.32 s11, [r0,#44]\n\t" \
1024
+ "vldr.32 s12, [r0,#48]\n\t" \
1025
+ "vldr.32 s13, [r0,#52]\n\t" \
1026
+ "vldr.32 s14, [r0,#56]\n\t" \
1027
+ "vldr.32 s15, [r0,#60]\n\t" \
1028
+ /* iargv -> register */ \
1029
+ "ldr r0, [r7,#8]\n\t" \
1030
+ "ldr r0, [r0]\n\t" \
1031
+ "ldr r1, [r7,#8]\n\t" \
1032
+ "ldr r1, [r1,#4]\n\t" \
1033
+ "ldr r2, [r7,#8]\n\t" \
1034
+ "ldr r2, [r2,#8]\n\t" \
1035
+ "ldr r3, [r7,#8]\n\t" \
1036
+ "ldr r3, [r3,#12]\n\t" \
1037
+ /* funcall */ \
1038
+ "ldr r6, [r7, #12]\n\t" \
1039
+ "blx r6\n\t"
1040
+
989
1041
__asm__ (".align 4\n"
990
1042
".global exec_function_i\n\t"
991
1043
".type exec_function_i, %function\n"
@@ -997,51 +1049,7 @@ __asm__ (".align 4\n"
997
1049
"str r1, [r7, #8]\n\t" // iargv
998
1050
"str r2, [r7, #4]\n\t" // fargv
999
1051
"str r3, [r7]\n\t" // vcntr
1000
- // vargv -> stack
1001
- "movs r1, #0\n\t"
1002
- "ldr r2, [r7, #80]\n\t" // vargv
1003
- "b .FUNCII_LPCK\n\t"
1004
- ".FUNCII_LP:\n\t"
1005
- "lsl r0, r1, #2\n\t"
1006
- "add r3, r2, r0\n\t" // vargv[i]
1007
- "add r5, sp, r0\n\t" // stack[i] // using v4 cause segfault.
1008
- "ldr r0, [r3]\n\t"
1009
- "str r0, [r5]\n\t" // push stack
1010
- "adds r1, r1, #1\n\t"
1011
- ".FUNCII_LPCK:\n\t"
1012
- "ldr r5, [r7]\n\t"
1013
- "cmp r1, r5\n\t"
1014
- "blt .FUNCII_LP\n\t"
1015
- // fargv -> register
1016
- "ldr r0, [r7,#4]\n\t"
1017
- "vldr.32 s0, [r0]\n\t"
1018
- "vldr.32 s1, [r0,#4]\n\t"
1019
- "vldr.32 s2, [r0,#8]\n\t"
1020
- "vldr.32 s3, [r0,#12]\n\t"
1021
- "vldr.32 s4, [r0,#16]\n\t"
1022
- "vldr.32 s5, [r0,#20]\n\t"
1023
- "vldr.32 s6, [r0,#24]\n\t"
1024
- "vldr.32 s7, [r0,#28]\n\t"
1025
- "vldr.32 s8, [r0,#32]\n\t"
1026
- "vldr.32 s9, [r0,#36]\n\t"
1027
- "vldr.32 s10, [r0,#40]\n\t"
1028
- "vldr.32 s11, [r0,#44]\n\t"
1029
- "vldr.32 s12, [r0,#48]\n\t"
1030
- "vldr.32 s13, [r0,#52]\n\t"
1031
- "vldr.32 s14, [r0,#56]\n\t"
1032
- "vldr.32 s15, [r0,#60]\n\t"
1033
- // iargv -> register
1034
- "ldr r0, [r7,#8]\n\t"
1035
- "ldr r0, [r0]\n\t"
1036
- "ldr r1, [r7,#8]\n\t"
1037
- "ldr r1, [r1,#4]\n\t"
1038
- "ldr r2, [r7,#8]\n\t"
1039
- "ldr r2, [r2,#8]\n\t"
1040
- "ldr r3, [r7,#8]\n\t"
1041
- "ldr r3, [r3,#12]\n\t"
1042
- // funcall
1043
- "ldr r6, [r7, #12]\n\t"
1044
- "blx r6\n\t"
1052
+ exec_function_asm ("FUNCI" )
1045
1053
// retval
1046
1054
"adds r7, r7, #72\n\t"
1047
1055
"mov sp, r7\n\t"
@@ -1061,51 +1069,7 @@ __asm__ (".align 4\n"
1061
1069
"str r1, [r7, #8]\n\t" // iargv
1062
1070
"str r2, [r7, #4]\n\t" // fargv
1063
1071
"str r3, [r7]\n\t" // vcntr
1064
- // vargv -> stack
1065
- "movs r1, #0\n\t"
1066
- "ldr r2, [r7, #80]\n\t" // vargv
1067
- "b .FUNCFF_LPCK\n\t"
1068
- ".FUNCFF_LP:\n\t"
1069
- "lsl r0, r1, #2\n\t"
1070
- "add r3, r2, r0\n\t" // vargv[i]
1071
- "add r4, sp, r0\n\t" // stack[i]
1072
- "ldr r0, [r3]\n\t"
1073
- "str r0, [r4]\n\t" // push stack
1074
- "adds r1, r1, #1\n\t"
1075
- ".FUNCFF_LPCK:\n\t"
1076
- "ldr r5, [r7]\n\t"
1077
- "cmp r1, r5\n\t"
1078
- "blt .FUNCFF_LP\n\t"
1079
- // fargv -> register
1080
- "ldr r0, [r7,#4]\n\t"
1081
- "vldr.32 s0, [r0]\n\t"
1082
- "vldr.32 s1, [r0,#4]\n\t"
1083
- "vldr.32 s2, [r0,#8]\n\t"
1084
- "vldr.32 s3, [r0,#12]\n\t"
1085
- "vldr.32 s4, [r0,#16]\n\t"
1086
- "vldr.32 s5, [r0,#20]\n\t"
1087
- "vldr.32 s6, [r0,#24]\n\t"
1088
- "vldr.32 s7, [r0,#28]\n\t"
1089
- "vldr.32 s8, [r0,#32]\n\t"
1090
- "vldr.32 s9, [r0,#36]\n\t"
1091
- "vldr.32 s10, [r0,#40]\n\t"
1092
- "vldr.32 s11, [r0,#44]\n\t"
1093
- "vldr.32 s12, [r0,#48]\n\t"
1094
- "vldr.32 s13, [r0,#52]\n\t"
1095
- "vldr.32 s14, [r0,#56]\n\t"
1096
- "vldr.32 s15, [r0,#60]\n\t"
1097
- // iargv -> register
1098
- "ldr r0, [r7,#8]\n\t"
1099
- "ldr r0, [r0]\n\t"
1100
- "ldr r1, [r7,#8]\n\t"
1101
- "ldr r1, [r1,#4]\n\t"
1102
- "ldr r2, [r7,#8]\n\t"
1103
- "ldr r2, [r2,#8]\n\t"
1104
- "ldr r3, [r7,#8]\n\t"
1105
- "ldr r3, [r3,#12]\n\t"
1106
- // funcall
1107
- "ldr r6, [r7, #12]\n\t"
1108
- "blx r6\n\t"
1072
+ exec_function_asm ("FUNCF" )
1109
1073
// retval
1110
1074
"vmov r0, s0 @ <retval>\n\t"
1111
1075
"vmov r1, s1 @ <retval>\n\t"
0 commit comments