annotate dyncall/dyncall_call_arm32_thumb_apple.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 3e629dc19168
children
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_apple.s
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: ARM Thumb call kernel implementation for apple assembler.
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
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2007-2011 Daniel Adler <dadler@uni-goettingen.de>,
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 .text
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 .thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 .code 16
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 .globl _dcCall_arm32_thumb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 /* Main dyncall call. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 .thumb_func
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 _dcCall_arm32_thumb:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 /* 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
37 push {r4-r7, r14} /* Frame ptr, permanent registers, link register -> save area on stack. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 mov r7, r13 /* Set frame ptr. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 /* Call. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 mov r4, r0 /* Move 'fptr' to r4 (1st argument is passed in r0). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 /* Disable 'thumb' address forcing... */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 /* mov r0, #1 */ /* Assure that LSB is set to 1 (THUMB call). - Not Required and not useful for interworking calls */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 /* orr r4, r0 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 mov r5, r1 /* Move 'args' to r5 (2nd argument is passed in r1). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 mov r6, r2 /* Move 'size' to r6 (3rd argument is passed in r2). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 cmp r6, #16 /* Jump to call if no more than 4 arguments. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 ble call
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 sub r6, #16 /* Size of remaining arguments. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 mov r0, r13 /* Set stack pointer to top of stack. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 sub r0, r0, r6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 lsr r0, #3 /* Align stack on 8 byte boundaries. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 lsl r0, #3
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 mov r13, r0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 add r1, #16 /* Let r1 point to remaining arguments. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 mov r2, #0 /* Init byte counter to 0. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 .thumb_func
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 pushArgs:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 ldrb r3, [r1, r2] /* Load a byte into r3. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 strb r3, [r0, r2] /* Push byte onto stack. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 add r2, r2, #1 /* Increment byte counter. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 cmp r2, r6
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 bne pushArgs
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 .thumb_func
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 call:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 ldmia r5!, {r0-r3} /* Load first 4 arguments for new call into r0-r3. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73
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: 0
diff changeset
74 /* 'blx r4' workaround for ARMv4t in THUMB: */
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 blx r4 /* Branch and force THUMB-mode return (LR bit 0 set). */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 /* Epilog. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 mov r13, r7 /* Reset stack ptr. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 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. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80