1 /* Parts of this file were snarfed from SBCL src/runtime/ppc-assem.S, which is
2 in the public domain. */
7 DEF(void,primitive_fixnum_add,(void *vm)):
8 mr r5,r3 /* save vm ptr for overflow */
19 b MANGLE(overflow_fixnum_add)
21 DEF(void,primitive_fixnum_subtract,(void *vm)):
22 mr r5,r3 /* save vm ptr for overflow */
33 b MANGLE(overflow_fixnum_subtract)
35 DEF(void,primitive_fixnum_multiply,(void *vm)):
36 mr r5,r3 /* save vm ptr for overflow */
47 b MANGLE(overflow_fixnum_multiply)
49 /* Note that the XT is passed to the quotation in r11 */
50 #define CALL_OR_JUMP_QUOT \
51 lwz r11,12(r3) /* load quotation-xt slot */ XX \
54 CALL_OR_JUMP_QUOT XX \
55 mtlr r11 /* prepare to call XT with quotation in r3 */ XX \
59 CALL_OR_JUMP_QUOT XX \
60 mtctr r11 /* prepare to call XT with quotation in r3 */ XX \
65 #define SAVED_INT_REGS_SIZE 96
67 #define SAVED_FP_REGS_SIZE 144
69 #define SAVED_V_REGS_SIZE 208
71 #define FRAME (RESERVED_SIZE + PARAM_SIZE + SAVED_INT_REGS_SIZE + SAVED_FP_REGS_SIZE + SAVED_V_REGS_SIZE + 8)
73 #if defined( __APPLE__)
75 #define RESERVED_SIZE 24
78 #define RESERVED_SIZE 8
81 #define SAVE_LR(reg) stw reg,(LR_SAVE + FRAME)(r1)
83 #define LOAD_LR(reg) lwz reg,(LR_SAVE + FRAME)(r1)
85 #define SAVE_AT(offset) (RESERVED_SIZE + PARAM_SIZE + 4 * offset)
87 #define SAVE_INT(register,offset) stw register,SAVE_AT(offset)(r1)
88 #define RESTORE_INT(register,offset) lwz register,SAVE_AT(offset)(r1)
90 #define SAVE_FP(register,offset) stfd register,SAVE_AT(offset)(r1)
91 #define RESTORE_FP(register,offset) lfd register,SAVE_AT(offset)(r1)
93 #define SAVE_V(register,offset) \
94 li r2,SAVE_AT(offset) XX \
97 #define RESTORE_V(register,offset) \
98 li r2,SAVE_AT(offset) XX \
102 mflr r0 XX /* get caller's return address */ \
103 stwu r1,-FRAME(r1) XX /* create a stack frame to hold non-volatile registers */ \
108 lwz r1,0(r1) XX /* destroy the stack frame */ \
109 mtlr r0 /* get ready to return */
111 /* We have to save and restore nonvolatile registers because
112 the Factor compiler treats the entire register file as volatile. */
113 DEF(void,c_to_factor,(CELL quot)):
116 SAVE_INT(r15,0) /* save GPRs */
134 SAVE_FP(f14,20) /* save FPRs */
178 SAVE_INT(r3,19) /* save quotation since we're about to mangle it */
180 mr r3,r1 /* pass call stack pointer as an argument */
181 bl MANGLE(save_callstack_bottom)
183 RESTORE_INT(r3,19) /* restore quotation */
219 RESTORE_FP(f14,20) /* save FPRs */
221 RESTORE_INT(r31,16) /* restore GPRs */
242 /* We pass a function pointer to memcpy in r6 to work around a Mac OS X ABI
243 limitation which would otherwise require us to do a bizzaro PC-relative
244 trampoline to retrieve the function address */
245 DEF(void,set_callstack,(F_STACK_FRAME *to, F_STACK_FRAME *from, CELL length, void *memcpy)):
246 sub r1,r3,r5 /* compute new stack pointer */
247 mr r3,r1 /* start of destination of memcpy() */
248 stwu r1,-64(r1) /* setup fake stack frame for memcpy() */
249 mtlr r6 /* prepare to call memcpy() */
251 lwz r1,0(r1) /* tear down fake stack frame */
252 lwz r0,LR_SAVE(r1) /* we have restored the stack; load return address */
253 mtlr r0 /* prepare to return to restored callstack */
256 DEF(void,throw_impl,(CELL quot, F_STACK_FRAME *rewind_to, void *vm)):
257 mr r1,r4 /* compute new stack pointer */
258 mr r4,r5 /* make vm ptr 2nd arg in case quot_xt = lazy_jit_compile */
259 lwz r0,LR_SAVE(r1) /* we have rewound the stack; load return address */
261 JUMP_QUOT /* call the quotation */
263 DEF(void,lazy_jit_compile,(CELL quot, void *vm)):
264 mr r5,r4 /* vm ptr is 3rd arg */
265 mr r4,r1 /* save stack pointer */
267 bl MANGLE(lazy_jit_compile_impl)
269 JUMP_QUOT /* call the quotation */
271 /* Thanks to Joshua Grams for this code.
273 On PowerPC processors, we must flush the instruction cache manually
274 after writing to the code heap. */
276 DEF(void,flush_icache,(void *start, int len)):
277 /* compute number of cache lines to flush */
279 clrrwi r3,r3,5 /* align addr to next lower cache line boundary */
280 sub r4,r4,r3 /* then n_lines = (len + 0x1f) / 0x20 */
282 srwi. r4,r4,5 /* note '.' suffix */
283 beqlr /* if n_lines == 0, just return. */
284 mtctr r4 /* flush cache lines */
285 0: dcbf 0,r3 /* for each line... */
294 DEF(void,primitive_inline_cache_miss,(void)):
296 DEF(void,primitive_inline_cache_miss_tail,(void)):
299 bl MANGLE(inline_cache_miss)
304 DEF(void,get_ppc_fpu_env,(void*)):
309 DEF(void,set_ppc_fpu_env,(const void*)):
314 DEF(void,get_ppc_vmx_env,(void*)):
325 DEF(void,set_ppc_vmx_env,(const void*)):