comparison dyncallback/dyncall_callback_ppc32_apple.s @ 239:c04be81f4874

- whitespace cleanup in ppc32 asm files
author Tassilo Philipp
date Tue, 02 May 2017 03:49:43 +0200
parents df556fd8ea37
children 891e8ba15862
comparison
equal deleted inserted replaced
238:05181c5a6edd 239:c04be81f4874
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 23
24 */ 24 */
25 25
26 .machine ppc 26 .machine ppc
27 .text 27 .text
28 .align 2 28 .align 2
29 29
30 /* Callback Thunk Entry code for PowerPC 32-bit Darwin/Apple Mac OS X. */ 30 /* Callback Thunk Entry code for PowerPC 32-bit Darwin/Apple Mac OS X. */
31 31
32 32
33 /* Stack Frame Layout: 33 /* Stack Frame Layout:
34
35 204 DCValue ( )
36 56 DCArgs (32+104+4+8 = 148)
37 24 Parameter area ( 4*8 = 32 )
38 0 Linkage area ( 24 )
39 34
35 204 DCValue ()
36 56 DCArgs (32+104+4+8 = 148)
37 24 Parameter area (4*8 = 32)
38 0 Linkage area (24)
40 39
41 */ 40 */
42 41
43 /* Constants. */ 42 /* Constants. */
44 INT_REGS = 8 43 INT_REGS = 8
45 FLOAT_REGS = 13 44 FLOAT_REGS = 13
46 SIZEOF_INT = 4 45 SIZEOF_INT = 4
47 SIZEOF_DOUBLE = 8 46 SIZEOF_DOUBLE = 8
48 47
49 48
50 /* Linkage area. */ 49 /* Linkage area. */
51 LINK_SP = 0 50 LINK_SP = 0
52 LINK_CR = 4 51 LINK_CR = 4
53 LINK_LR = 8 52 LINK_LR = 8
54 LINK_OFFSET = 0 53 LINK_OFFSET = 0
55 LINK_SIZE = 24 54 LINK_SIZE = 24
56 /* Parameter area. */ 55 /* Parameter area. */
57 PAR_OFFSET = LINK_SIZE 56 PAR_OFFSET = LINK_SIZE
58 PAR_SIZE = 32 57 PAR_SIZE = 32
59 /* local struct DCArgs */ 58 /* local struct DCArgs */
60 ARGS_OFFSET = (PAR_OFFSET+PAR_SIZE) 59 ARGS_OFFSET = (PAR_OFFSET+PAR_SIZE)
61 ARGS_SIZE = (SIZEOF_INT*INT_REGS)+(SIZEOF_DOUBLE*FLOAT_REGS) /* = 136 */ 60 ARGS_SIZE = (SIZEOF_INT*INT_REGS)+(SIZEOF_DOUBLE*FLOAT_REGS) /* = 136 */
62 /* local struct DCValue */ 61 /* local struct DCValue */
63 RESULT_OFFSET = (ARGS_OFFSET+ARGS_SIZE) 62 RESULT_OFFSET = (ARGS_OFFSET+ARGS_SIZE)
64 RESULT_SIZE = 16 63 RESULT_SIZE = 16
65 /* additional locals (reg 30/31) */ 64 /* additional locals (reg 30/31) */
66 LOCALS_OFFSET = (RESULT_OFFSET+RESULT_SIZE) 65 LOCALS_OFFSET = (RESULT_OFFSET+RESULT_SIZE)
67 LOCALS_SIZE = 2*SIZEOF_INT 66 LOCALS_SIZE = 2*SIZEOF_INT
68 /* total */ 67 /* total */
69 FRAME_SIZE = ( (LOCALS_OFFSET+LOCALS_SIZE)+15 & (-16) ) 68 FRAME_SIZE = ((LOCALS_OFFSET+LOCALS_SIZE)+15 & (-16))
70 69
71 /* struct DCCallback */ 70 /* struct DCCallback */
72 DCB_THUNK = 0 71 DCB_THUNK = 0
73 DCB_HANDLER = 24 72 DCB_HANDLER = 24
74 DCB_STACKCLEAN = 28 73 DCB_STACKCLEAN = 28
75 DCB_USERDATA = 32 74 DCB_USERDATA = 32
76 75
77 /* struct DCArgs */ 76 /* struct DCArgs */
78 DCA_IARRAY = 0 77 DCA_IARRAY = 0
79 DCA_FARRAY = SIZEOF_INT*INT_REGS 78 DCA_FARRAY = SIZEOF_INT*INT_REGS
80 DCA_SP = DCA_FARRAY + SIZEOF_DOUBLE*FLOAT_REGS 79 DCA_SP = DCA_FARRAY + SIZEOF_DOUBLE*FLOAT_REGS
81 DCA_ICOUNT = DCA_SP + 4 80 DCA_ICOUNT = DCA_SP + 4
82 DCA_FCOUNT = DCA_ICOUNT + 4 81 DCA_FCOUNT = DCA_ICOUNT + 4
83 82
84 iregfile = ARGS_OFFSET+DCA_IARRAY 83 iregfile = ARGS_OFFSET+DCA_IARRAY
85 fregfile = ARGS_OFFSET+DCA_FARRAY 84 fregfile = ARGS_OFFSET+DCA_FARRAY
86 save_sp = ARGS_OFFSET+DCA_SP 85 save_sp = ARGS_OFFSET+DCA_SP
87 icount = ARGS_OFFSET+DCA_ICOUNT 86 icount = ARGS_OFFSET+DCA_ICOUNT
88 fcount = ARGS_OFFSET+DCA_FCOUNT 87 fcount = ARGS_OFFSET+DCA_FCOUNT
89 .globl _dcCallbackThunkEntry
90 88
91 /* 89 .globl _dcCallbackThunkEntry
92 Thunk entry: 90
93 r2 = DCCallback* 91 /*
94 */ 92 Thunk entry:
93 r2 = DCCallback*
94 */
95 _dcCallbackThunkEntry: 95 _dcCallbackThunkEntry:
96 96
97 mflr r0 97 mflr r0
98 stw r0, 8(r1) /* store return address */ 98 stw r0, 8(r1) /* store return address */
99 addi r12, r1, PAR_OFFSET /* temporary r12 = parameter area on callers stack frame */ 99 addi r12,r1, PAR_OFFSET /* temporary r12 = parameter area on callers stack frame */
100 stwu r1, -FRAME_SIZE(r1) /* save callers stack pointer and make new stack frame. */ 100 stwu r1, -FRAME_SIZE(r1) /* save callers stack pointer and make new stack frame. */
101 stw r3, iregfile+0*4(r1) /* spill 8 integer parameter registers */ 101 stw r3, iregfile+ 0*4(r1) /* spill 8 integer parameter registers */
102 stw r4, iregfile+1*4(r1) 102 stw r4, iregfile+ 1*4(r1)
103 stw r5, iregfile+2*4(r1) 103 stw r5, iregfile+ 2*4(r1)
104 stw r6, iregfile+3*4(r1) 104 stw r6, iregfile+ 3*4(r1)
105 stw r7, iregfile+4*4(r1) 105 stw r7, iregfile+ 4*4(r1)
106 stw r8, iregfile+5*4(r1) 106 stw r8, iregfile+ 5*4(r1)
107 stw r9, iregfile+6*4(r1) 107 stw r9, iregfile+ 6*4(r1)
108 stw r10,iregfile+7*4(r1) 108 stw r10,iregfile+ 7*4(r1)
109 stfd f1, fregfile+ 0*8(r1) /* spill 13 float parameter registers */ 109 stfd f1, fregfile+ 0*8(r1) /* spill 13 float parameter registers */
110 stfd f2, fregfile+ 1*8(r1) 110 stfd f2, fregfile+ 1*8(r1)
111 stfd f3, fregfile+ 2*8(r1) 111 stfd f3, fregfile+ 2*8(r1)
112 stfd f4, fregfile+ 3*8(r1) 112 stfd f4, fregfile+ 3*8(r1)
113 stfd f5, fregfile+ 4*8(r1) 113 stfd f5, fregfile+ 4*8(r1)
114 stfd f6, fregfile+ 5*8(r1) 114 stfd f6, fregfile+ 5*8(r1)
117 stfd f9, fregfile+ 8*8(r1) 117 stfd f9, fregfile+ 8*8(r1)
118 stfd f10,fregfile+ 9*8(r1) 118 stfd f10,fregfile+ 9*8(r1)
119 stfd f11,fregfile+10*8(r1) 119 stfd f11,fregfile+10*8(r1)
120 stfd f12,fregfile+11*8(r1) 120 stfd f12,fregfile+11*8(r1)
121 stfd f13,fregfile+12*8(r1) 121 stfd f13,fregfile+12*8(r1)
122 /* initialize struct DCCallback */ 122 /* initialize struct DCCallback */
123 stw r12,save_sp(r1) /* init stack pointer */ 123 stw r12,save_sp(r1) /* init stack pointer */
124 xor r0, r0, r0 /* init register counters */ 124 xor r0, r0, r0 /* init register counters */
125 stw r0, icount(r1) 125 stw r0, icount(r1)
126 stw r0, fcount(r1) 126 stw r0, fcount(r1)
127 /* invoke callback handler */ 127 /* invoke callback handler */
128 mr r3, r2 /* arg 1: DCCallback* pcb */ 128 mr r3, r2 /* arg 1: DCCallback* pcb */
129 addi r4, r1, ARGS_OFFSET /* arg 2: DCArgs* args */ 129 addi r4, r1, ARGS_OFFSET /* arg 2: DCArgs* args */
130 addi r5, r1, RESULT_OFFSET /* arg 3: DCValue* result */ 130 addi r5, r1, RESULT_OFFSET /* arg 3: DCValue* result */
131 lwz r6, DCB_USERDATA(r2) /* arg 4: void* userdata */ 131 lwz r6, DCB_USERDATA(r2) /* arg 4: void* userdata */
132 132
133 /* branch-and-link to DCCallback.handler */ 133 /* branch-and-link to DCCallback.handler */
134 lwz r12, DCB_HANDLER(r2) 134 lwz r12,DCB_HANDLER(r2)
135 mtctr r12 135 mtctr r12
136 bctrl 136 bctrl
137 /* switch on base result type */ 137 /* switch on base result type */
138 cmpi cr0, r3, 'f 138 cmpi cr0, r3, 'f
139 beq .f32 139 beq .f32
140 cmpi cr0, r3, 'd 140 cmpi cr0, r3, 'd
141 beq .f64 141 beq .f64
142 .i64: /* result is C double result */ 142 .i64:
143 lwz r3, RESULT_OFFSET (r1) 143 lwz r3, RESULT_OFFSET (r1)
144 lwz r4, RESULT_OFFSET + 4 (r1) 144 lwz r4, RESULT_OFFSET + 4 (r1)
145 .end: 145 .end:
146 lwz r1, 0(r1) /* restore stack pointer */ 146 lwz r1, 0(r1) /* restore stack pointer */
147 lwz r0, 8(r1) /* load link register with return address */ 147 lwz r0, 8(r1) /* load link register with return address */
148 mtlr r0 148 mtlr r0
149 blr /* branch back to link register */ 149 blr /* branch back to link register */
150 .f32: /* result is C float result */ 150 .f32:
151 lfs f1, RESULT_OFFSET(r1) 151 lfs f1, RESULT_OFFSET(r1)
152 b .end 152 b .end
153 .f64: 153 .f64:
154 lfd f1, RESULT_OFFSET(r1) 154 lfd f1, RESULT_OFFSET(r1)
155 b .end 155 b .end
156 156