annotate dyncall/dyncall_call_arm32_thumb_armhf.S @ 406:351bb41d3bb1

- removed %-prefixes for register names from arm assembly files (was wrong to begin with, gas accepted them but the clang integrated assembler does not)
author Tassilo Philipp
date Sun, 03 Oct 2021 10:34:56 +0200
parents f5577f6bf97a
children 7364f285cac8
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: dyncall/dyncall_call_arm32_thumb_armhf.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Call Kernel for ARM 32-bit ARM Architecture - Hard Float in Thumb code
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
281
f5577f6bf97a - file header cleanups for release
Tassilo Philipp
parents: 36
diff changeset
9 Copyright (c) 2007-2018 Daniel Adler <dadler@uni-goettingen.de>,
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10 Tassilo Philipp <tphilipp@potion-studios.com>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #include "../portasm/portasm-arm.S"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 /* ============================================================================
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 DynCall Call Kernel for ARM 32-bit ARM Architecture Hard-Float
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 ----------------------------------------------------------------------------
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 C Interface:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 dcCall_arm32_armhf (DCpointer target, DCpointer argv, DCsize size, DCfloat* regdata);
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 This Call Kernel was tested on Raspberry Pi/Raspbian (Debian)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 .text
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 .thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 #ifndef __thumb2__
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 .code 16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 // .arch armv6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 // .fpu vfp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46
36
93f315f02a32 - armhf dyncall optimization/cleanup
cslag
parents: 0
diff changeset
47 /*
93f315f02a32 - armhf dyncall optimization/cleanup
cslag
parents: 0
diff changeset
48 1st arg / r0 = funptr
93f315f02a32 - armhf dyncall optimization/cleanup
cslag
parents: 0
diff changeset
49 2st arg / r1 = ptr to int args
93f315f02a32 - armhf dyncall optimization/cleanup
cslag
parents: 0
diff changeset
50 3st arg / r2 = size
93f315f02a32 - armhf dyncall optimization/cleanup
cslag
parents: 0
diff changeset
51 4st arg / r3 = ptr to float args
93f315f02a32 - armhf dyncall optimization/cleanup
cslag
parents: 0
diff changeset
52 */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 GLOBAL_C(dcCall_arm32_armhf)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 .thumb_func
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 ENTRY_C(dcCall_arm32_armhf)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 /* Prolog. This function never needs to spill inside its prolog, so just store the permanent registers. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 // mov r12 , r13 /* Stack ptr (r13) -> temporary (r12). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 // stmdb r13!, {r4-r5, r11, r12, r14} /* Permanent registers and stack pointer (now in r12), etc... -> save area on stack (except counter). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 //mov r11 , r12 /* Set frame ptr. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 push {r4-r7, r14}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 mov r7 , r13
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 mov r4 , r0 /* r4 = 'fptr' (1st argument is passed in r0). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 mov r5 , r1 /* r5 = 'args' (2nd argument is passed in r1). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 /* Load 16 single-precision registers (= 8 double-precision registers). */
36
93f315f02a32 - armhf dyncall optimization/cleanup
cslag
parents: 0
diff changeset
71 fldmiad r3, {d0-d7}
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 sub r2 , #16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 cmp r2, #0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 ble armhf_call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 // sub r13, r13, r2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 // and r13, #-8 /* align 8-byte. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 mov r6, r13
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 sub r6 , r2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 // mov r3 , #8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 // neg r3 , r3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 // and r6 , r3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 lsr r6 , #3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 lsl r6 , #3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 mov r13, r6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 mov r3, #0 /* Init byte counter. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 add r1 , #16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 armhf_pushArgs:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 ldr r0, [r1, +r3] /* Load word into r0. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 // str r0, [r13, +r3] /* Push word onto stack. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 str r0, [r6, +r3] /* Push word onto stack. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 add r3, #4 /* Increment byte counter. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 cmp r2, r3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 bne armhf_pushArgs
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 armhf_call:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 ldmia r5!, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */
406
351bb41d3bb1 - removed %-prefixes for register names from arm assembly files (was wrong to begin with, gas accepted them but the clang integrated assembler does not)
Tassilo Philipp
parents: 281
diff changeset
102 /* 'blx r4' workaround for ARMv4t: */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 // mov r14, r15 /* Branch return address(r15) -> link register (r14) -- r15 always points to address of current + 2 instructions (= Epilog code). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 mov r6, r15
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 add r6, #5
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 mov r14, r6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 bx r4 /* Call (ARM/THUMB), available for ARMv4t. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 /* Epilog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 // ldmdb r11, {r4-r5, r11, r13, r15} /* Restore permanent registers (ignore temporary (r12), restore stack ptr and program counter).@@@db not needed since we rewrite r13? */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 mov r13, r7
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 pop {r4-r7, r15}
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113