Skip to content

Commit f282438

Browse files
committed
define exec_function_{f,i} as exec_function_asm arm/32bit (armhf)
1 parent c587680 commit f282438

File tree

1 file changed

+54
-90
lines changed

1 file changed

+54
-90
lines changed

lisp/c/eval.c

Lines changed: 54 additions & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -986,6 +986,58 @@ pointer args[];
986986
extern int exec_function_i(void (*)(), int *, int *, int, int *);
987987
extern int exec_function_f(void (*)(), int *, int *, int, int *);
988988

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+
9891041
__asm__ (".align 4\n"
9901042
".global exec_function_i\n\t"
9911043
".type exec_function_i, %function\n"
@@ -997,51 +1049,7 @@ __asm__ (".align 4\n"
9971049
"str r1, [r7, #8]\n\t" // iargv
9981050
"str r2, [r7, #4]\n\t" // fargv
9991051
"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")
10451053
// retval
10461054
"adds r7, r7, #72\n\t"
10471055
"mov sp, r7\n\t"
@@ -1061,51 +1069,7 @@ __asm__ (".align 4\n"
10611069
"str r1, [r7, #8]\n\t" // iargv
10621070
"str r2, [r7, #4]\n\t" // fargv
10631071
"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")
11091073
// retval
11101074
"vmov r0, s0 @ <retval>\n\t"
11111075
"vmov r1, s1 @ <retval>\n\t"

0 commit comments

Comments
 (0)