Added
Link Here
|
1 |
fix arm32 builds when using clang's integrated assembler (syntax-only fix for v1.2 until v1.3 is released) |
2 |
|
3 |
--- dyncall/dyncall_call_arm32_arm_armhf.S.orig 2021-01-22 15:43:00 UTC |
4 |
+++ dyncall/dyncall_call_arm32_arm_armhf.S |
5 |
@@ -59,7 +59,7 @@ ENTRY_C(dcCall_arm32_armhf) |
6 |
add r5, r1, #16 /* r5 = stack args (after intreg ones) */ |
7 |
|
8 |
/* Load 16 single-precision registers (= 8 double-precision registers). */ |
9 |
- fldmiad r3, {d0-d7} |
10 |
+ vldmia r3, {d0-d7} |
11 |
|
12 |
/* prep stack parameter area (includes room for spill area, callee spills if needed) */ |
13 |
sub r13, r13, r2 |
14 |
@@ -77,7 +77,7 @@ armhf_pushArgs: |
15 |
|
16 |
armhf_call: |
17 |
ldmia r1, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */ |
18 |
- /* 'blx %r4' workaround for ARMv4t: */ |
19 |
+ /* 'blx r4' workaround for ARMv4t: */ |
20 |
mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ |
21 |
bx r4 /* Call (ARM/THUMB), available for ARMv4t. */ |
22 |
|
23 |
--- dyncall/dyncall_call_arm32_thumb_armhf.S.orig 2021-01-22 15:43:00 UTC |
24 |
+++ dyncall/dyncall_call_arm32_thumb_armhf.S |
25 |
@@ -68,7 +68,7 @@ ENTRY_C(dcCall_arm32_armhf) |
26 |
mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */ |
27 |
|
28 |
/* Load 16 single-precision registers (= 8 double-precision registers). */ |
29 |
- fldmiad r3, {d0-d7} |
30 |
+ vldmia r3, {d0-d7} |
31 |
|
32 |
sub r2 , #16 |
33 |
cmp r2, #0 |
34 |
@@ -99,7 +99,7 @@ armhf_pushArgs: |
35 |
|
36 |
armhf_call: |
37 |
ldmia r5!, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */ |
38 |
- /* 'blx %r4' workaround for ARMv4t: */ |
39 |
+ /* 'blx r4' workaround for ARMv4t: */ |
40 |
// mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ |
41 |
mov r6, r15 |
42 |
add r6, #5 |
43 |
--- dyncall/dyncall_call_arm32_thumb_gas.s.orig 2021-01-22 15:43:00 UTC |
44 |
+++ dyncall/dyncall_call_arm32_thumb_gas.s |
45 |
@@ -37,45 +37,45 @@ dcCall_arm32_thumb: |
46 |
|
47 |
/* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ |
48 |
/* Code below is not using high registers, so not storing them in prolog, which is more involved with thumb, anyways. */ |
49 |
- push {%r4-%r7, %r14} /* Frame ptr, permanent registers, link register -> save area on stack. */ |
50 |
- mov %r7, %r13 /* Set frame ptr. */ |
51 |
- sub %r13, #4 /* Realign stack to 8 bytes (b/c we stored 5 regs = 20b). */ |
52 |
+ push {r4-r7, r14} /* Frame ptr, permanent registers, link register -> save area on stack. */ |
53 |
+ mov r7, r13 /* Set frame ptr. */ |
54 |
+ sub r13, #4 /* Realign stack to 8 bytes (b/c we stored 5 regs = 20b). */ |
55 |
|
56 |
/* Call. */ |
57 |
- mov %r4, %r0 /* Move 'fptr' to r4 (1st argument is passed in r0). */ |
58 |
- mov %r5, %r1 /* Move 'args' to r5 (2nd argument is passed in r1). */ |
59 |
- mov %r6, %r2 /* Move 'size' to r6 (3rd argument is passed in r2). */ |
60 |
+ mov r4, r0 /* Move 'fptr' to r4 (1st argument is passed in r0). */ |
61 |
+ mov r5, r1 /* Move 'args' to r5 (2nd argument is passed in r1). */ |
62 |
+ mov r6, r2 /* Move 'size' to r6 (3rd argument is passed in r2). */ |
63 |
|
64 |
- cmp %r6, #16 /* Jump to call if no more than 4 arguments. */ |
65 |
+ cmp r6, #16 /* Jump to call if no more than 4 arguments. */ |
66 |
ble call |
67 |
|
68 |
- sub %r6, #16 /* Size of remaining arguments. */ |
69 |
- mov %r0, %r13 /* Set stack pointer to top of stack. */ |
70 |
- sub %r0, %r0, %r6 |
71 |
- lsr %r0, #3 /* Align stack on 8 byte boundaries. */ |
72 |
- lsl %r0, #3 |
73 |
- mov %r13, %r0 |
74 |
+ sub r6, #16 /* Size of remaining arguments. */ |
75 |
+ mov r0, r13 /* Set stack pointer to top of stack. */ |
76 |
+ sub r0, r0, r6 |
77 |
+ lsr r0, #3 /* Align stack on 8 byte boundaries. */ |
78 |
+ lsl r0, #3 |
79 |
+ mov r13, r0 |
80 |
|
81 |
- add %r1, #16 /* Let r1 point to remaining arguments. */ |
82 |
- mov %r2, #0 /* Init byte counter to 0. */ |
83 |
+ add r1, #16 /* Let r1 point to remaining arguments. */ |
84 |
+ mov r2, #0 /* Init byte counter to 0. */ |
85 |
.thumb_func |
86 |
pushArgs: |
87 |
- ldrb %r3, [%r1, %r2] /* Load a byte into r3. */ |
88 |
- strb %r3, [%r0, %r2] /* Push byte onto stack. */ |
89 |
- add %r2, %r2, #1 /* Increment byte counter. */ |
90 |
- cmp %r2, %r6 |
91 |
+ ldrb r3, [r1, r2] /* Load a byte into r3. */ |
92 |
+ strb r3, [r0, r2] /* Push byte onto stack. */ |
93 |
+ add r2, r2, #1 /* Increment byte counter. */ |
94 |
+ cmp r2, r6 |
95 |
bne pushArgs |
96 |
.thumb_func |
97 |
call: |
98 |
- ldmia %r5!, {%r0-%r3} /* Load first 4 arguments for new call into r0-r3. */ |
99 |
+ ldmia r5!, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */ |
100 |
|
101 |
- /* 'blx %r4' workaround for ARMv4t in THUMB: */ |
102 |
- mov %r6, %r15 /* Load PC+2 instructions from here */ |
103 |
- add %r6, #5 /* Increment by 2 instructions (Address of 'Epilog') and set bit 0 (THUMB) */ |
104 |
- mov %r14, %r6 /* Store in link register. */ |
105 |
- bx %r4 /* Branch and force THUMB-mode return (LR bit 0 set). */ |
106 |
+ /* 'blx r4' workaround for ARMv4t in THUMB: */ |
107 |
+ mov r6, r15 /* Load PC+2 instructions from here */ |
108 |
+ add r6, #5 /* Increment by 2 instructions (Address of 'Epilog') and set bit 0 (THUMB) */ |
109 |
+ mov r14, r6 /* Store in link register. */ |
110 |
+ bx r4 /* Branch and force THUMB-mode return (LR bit 0 set). */ |
111 |
|
112 |
/* Epilog. */ |
113 |
- mov %r13, %r7 /* Reset stack ptr. */ |
114 |
- pop {%r4-%r7, %r15} /* Restore permanent registers and program counter. (Force a stay in THUMB in ARMv4, whether ARMv5 can return in ARM or THUMB depending on the bit 0. */ |
115 |
+ mov r13, r7 /* Reset stack ptr. */ |
116 |
+ pop {r4-r7, r15} /* Restore permanent registers and program counter. (Force a stay in THUMB in ARMv4, whether ARMv5 can return in ARM or THUMB depending on the bit 0. */ |
117 |
|
118 |
--- dyncallback/dyncall_callback_arm32_arm_gas.S.orig 2021-01-22 15:43:00 UTC |
119 |
+++ dyncallback/dyncall_callback_arm32_arm_gas.S |
120 |
@@ -47,37 +47,37 @@ CTX_userdata = 16 |
121 |
dcCallbackThunkEntry: |
122 |
|
123 |
/* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */ |
124 |
- stmdb %r13, {%r4-%r11, %r13, %r14} /* Permanent registers and stack pointer, etc... -> save area on stack (except counter). */ |
125 |
- mov %r11, %r13 /* Set frame pointer. */ |
126 |
- sub %r13, %r13, #40 /* Adjust stack pointer. */ |
127 |
+ stmdb r13, {r4-r11, r13, r14} /* Permanent registers and stack pointer, etc... -> save area on stack (except counter). */ |
128 |
+ mov r11, r13 /* Set frame pointer. */ |
129 |
+ sub r13, r13, #40 /* Adjust stack pointer. */ |
130 |
|
131 |
/* Grab arguments. */ |
132 |
- mov %r4, #0 |
133 |
+ mov r4, #0 |
134 |
#if defined(DC__ABI_ARM_HF) |
135 |
- stmdb %r13!, {%r4} /* Init freg_count and dreg_count to 0 */ |
136 |
- stmdb %r13!, {%r4} |
137 |
- fstmdbd %r13!, {d0-d7} /* Store all fp-registers in DCArgs' f[16] */ |
138 |
+ stmdb r13!, {r4} /* Init freg_count and dreg_count to 0 */ |
139 |
+ stmdb r13!, {r4} |
140 |
+ vstmdb r13!, {d0-d7} /* Store all fp-registers in DCArgs' f[16] */ |
141 |
#endif |
142 |
- stmdb %r13!, {%r0-%r4, %r11} /* Spill first 4 args to DCArgs, along with reg_count (init to 0) and (stack) pointer to remaining args. */ |
143 |
+ stmdb r13!, {r0-r4, r11} /* Spill first 4 args to DCArgs, along with reg_count (init to 0) and (stack) pointer to remaining args. */ |
144 |
|
145 |
/* Prepare callback handler call. */ |
146 |
- mov %r0, %r12 /* Parameter 0 (r0) = DCCallback pointer (r12, pointer to thunk). */ |
147 |
- mov %r1, %r13 /* Parameter 1 (r1) = DCArgs pointer (r13, stack pointer). */ |
148 |
- sub %r13, %r13, #DCValue_size /* Make room for return value. */ |
149 |
- mov %r2, %r13 /* Parameter 2 (r2) = results pointer. */ |
150 |
- ldr %r3, [%r12, #CTX_userdata] /* Parameter 3 (r3) = userdata pointer. */ |
151 |
+ mov r0, r12 /* Parameter 0 (r0) = DCCallback pointer (r12, pointer to thunk). */ |
152 |
+ mov r1, r13 /* Parameter 1 (r1) = DCArgs pointer (r13, stack pointer). */ |
153 |
+ sub r13, r13, #DCValue_size /* Make room for return value. */ |
154 |
+ mov r2, r13 /* Parameter 2 (r2) = results pointer. */ |
155 |
+ ldr r3, [r12, #CTX_userdata] /* Parameter 3 (r3) = userdata pointer. */ |
156 |
|
157 |
/* Call. */ |
158 |
- ldr %r4, [%r12, #CTX_handler] /* Load callback handler pointer into r4. */ |
159 |
- mov %r14, %r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ |
160 |
- bx %r4 /* Call. */ |
161 |
+ ldr r4, [r12, #CTX_handler] /* Load callback handler pointer into r4. */ |
162 |
+ mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */ |
163 |
+ bx r4 /* Call. */ |
164 |
|
165 |
/* Return value. */ |
166 |
- ldmia %r13, {%r0, %r1} /* Load return value in r0 and r1. */ |
167 |
+ ldmia r13, {r0, r1} /* Load return value in r0 and r1. */ |
168 |
#if defined(DC__ABI_ARM_HF) |
169 |
- fldmiad %r13, {%d0} /* Same for floating point return value (if any). */ |
170 |
+ vldmia r13, {d0} /* Same for floating point return value (if any). */ |
171 |
#endif |
172 |
|
173 |
/* Epilog. */ |
174 |
- ldmdb %r11, {%r4-%r11, %r13, %r15} /* Restore permanent registers (restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ |
175 |
+ ldmdb r11, {r4-r11, r13, r15} /* Restore permanent registers (restore stack ptr and program counter).@@@db not needed since we rewrite r13? */ |
176 |
|