comparison dyncallback/dyncall_callback_ppc32.S @ 239:c04be81f4874

- whitespace cleanup in ppc32 asm files
author Tassilo Philipp
date Tue, 02 May 2017 03:49:43 +0200
parents 3e629dc19168
children 891e8ba15862
comparison
equal deleted inserted replaced
238:05181c5a6edd 239:c04be81f4874
23 */ 23 */
24 24
25 25
26 #include "../portasm/portasm-ppc.S" 26 #include "../portasm/portasm-ppc.S"
27 27
28 .machine ppc 28 .machine ppc
29 .text 29 .text
30 .align 2 30 .align 2
31 31
32 /* Struct DCCallback */ 32 /* Struct DCCallback */
33 33
34 DCB_THUNK = 0 34 DCB_THUNK = 0
35 DCB_HANDLER = 24 35 DCB_HANDLER = 24
36 DCB_CLEANUP = 28 36 DCB_CLEANUP = 28
37 DCB_USERDATA = 32 37 DCB_USERDATA = 32
38 38
39 /* Struct DCArgs */ 39 /* Struct DCArgs */
40 40
41 ARGS_IREGS = 0 41 ARGS_IREGS = 0
42 ARGS_FREGS = ARGS_IREGS + 4*8 42 ARGS_FREGS = ARGS_IREGS + 4*8
72 ENTRY_C(dcCallbackThunkEntry) 72 ENTRY_C(dcCallbackThunkEntry)
73 73
74 /* -------------------------------------------------------------------------- 74 /* --------------------------------------------------------------------------
75 75
76 Input: 76 Input:
77 r1 Stack Pointer 77 r1 Stack Pointer
78 r3-r10 Integer Arguments 78 r3-r10 Integer Arguments
79 f1-f8 Floating-point Arguments 79 f1-f8 Floating-point Arguments
80 r11 Thunk Pointer 80 r11 Thunk Pointer
81 81
82 */ 82 */
83 83
84 /* prolog */ 84 /* prolog */
85 85
86 mflr r0 86 mflr r0
87 stw r0, SP_LR(r1) /* store return address */ 87 stw r0, SP_LR(r1) /* store return address */
88 addi r12, r1, SP_PAR /* temporary r12: parameter area on callers stack frame */ 88 addi r12,r1, SP_PAR /* temporary r12: parameter area on callers stack frame */
89 stwu r1, -FRAMESIZE(r1) 89 stwu r1, -FRAMESIZE(r1)
90 90
91 stw r3, SP_IREGS + 0*4(r1) /* spill 8 integer parameter registers */ 91 stw r3, SP_IREGS + 0*4(r1) /* spill 8 integer parameter registers */
92 stw r4, SP_IREGS + 1*4(r1) 92 stw r4, SP_IREGS + 1*4(r1)
93 stw r5, SP_IREGS + 2*4(r1) 93 stw r5, SP_IREGS + 2*4(r1)
94 stw r6, SP_IREGS + 3*4(r1) 94 stw r6, SP_IREGS + 3*4(r1)
95 stw r7, SP_IREGS + 4*4(r1) 95 stw r7, SP_IREGS + 4*4(r1)
96 stw r8, SP_IREGS + 5*4(r1) 96 stw r8, SP_IREGS + 5*4(r1)
97 stw r9, SP_IREGS + 6*4(r1) 97 stw r9, SP_IREGS + 6*4(r1)
98 stw r10,SP_IREGS + 7*4(r1) 98 stw r10,SP_IREGS + 7*4(r1)
99 99
100 stfd f1, SP_FREGS + 0*8(r1) /* spill 8 (of 13) float parameter registers */ 100 stfd f1, SP_FREGS + 0*8(r1) /* spill 8 (of 13) float parameter registers */
101 stfd f2, SP_FREGS + 1*8(r1) 101 stfd f2, SP_FREGS + 1*8(r1)
102 stfd f3, SP_FREGS + 2*8(r1) 102 stfd f3, SP_FREGS + 2*8(r1)
103 stfd f4, SP_FREGS + 3*8(r1) 103 stfd f4, SP_FREGS + 3*8(r1)
104 stfd f5, SP_FREGS + 4*8(r1) 104 stfd f5, SP_FREGS + 4*8(r1)
105 stfd f6, SP_FREGS + 5*8(r1) 105 stfd f6, SP_FREGS + 5*8(r1)
106 stfd f7, SP_FREGS + 6*8(r1) 106 stfd f7, SP_FREGS + 6*8(r1)
107 stfd f8, SP_FREGS + 7*8(r1) 107 stfd f8, SP_FREGS + 7*8(r1)
108 108
109 stw r12, SP_SP(r1) /* init stack pointer */ 109 stw r12,SP_SP(r1) /* init stack pointer */
110 xor r0, r0, r0 /* init register counters */ 110 xor r0, r0, r0 /* init register counters */
111 stw r0, SP_ICNT(r1) 111 stw r0, SP_ICNT(r1)
112 stw r0, SP_FCNT(r1) 112 stw r0, SP_FCNT(r1)
113 stw r0, SP_RESULT(r1) /* init result object */ 113 stw r0, SP_RESULT(r1) /* init result object */
114 stw r0, SP_RESULT + 4(r1) 114 stw r0, SP_RESULT + 4(r1)
115 /* invoke callback handler */ 115 /* invoke callback handler */
116 mr r3, r11 /* arg 1: DCCallback* pcb (r11 is thunk pointer) */ 116 mr r3, r11 /* arg 1: DCCallback* pcb (r11 = thunk ptr) */
117 addi r4, r1, SP_ARGS /* arg 2: DCArgs* args */ 117 addi r4, r1, SP_ARGS /* arg 2: DCArgs* args */
118 addi r5, r1, SP_RESULT /* arg 3: DCValue* result */ 118 addi r5, r1, SP_RESULT /* arg 3: DCValue* result */
119 lwz r6, DCB_USERDATA(r11) /* arg 4: void* userdata */ 119 lwz r6, DCB_USERDATA(r11) /* arg 4: void* userdata */
120 120
121 /* branch-and-link to DCCallback.handler */ 121 /* branch-and-link to DCCallback.handler */
122 lwz r12, DCB_HANDLER(r11) 122 lwz r12, DCB_HANDLER(r11)
123 mtctr r12 123 mtctr r12
124 bctrl 124 bctrl
125 /* check result type */ 125 /* check result type */
126 cmpi cr0, r3, 'f 126 cmpi cr0, r3, 'f
127 beq .f32 127 beq .f32
128 cmpi cr0, r3, 'd 128 cmpi cr0, r3, 'd
129 beq .f64 129 beq .f64
130 .i64: 130 .i64:
131 lwz r3, SP_RESULT (r1) 131 lwz r3, SP_RESULT (r1)
132 lwz r4, SP_RESULT + 4 (r1) 132 lwz r4, SP_RESULT + 4 (r1)
133 .end: 133 .end:
134 lwz r1, SP_PREV(r1) /* restore stack pointer */ 134 lwz r1, SP_PREV(r1) /* restore stack pointer */
135 lwz r0, SP_LR(r1) /* load link register with return address */ 135 lwz r0, SP_LR(r1) /* load link register with return address */
136 mtlr r0 136 mtlr r0
137 blr /* branch back to link register */ 137 blr /* branch back to link register */
138 .f32: 138 .f32:
139 lfs f1, SP_RESULT(r1) 139 lfs f1, SP_RESULT(r1)
140 b .end 140 b .end
141 .f64: 141 .f64:
142 lfd f1, SP_RESULT(r1) 142 lfd f1, SP_RESULT(r1)
143 b .end 143 b .end
144 144