factor/vm/cpu-ppc.S

74 lines
1.4 KiB
ArmAsm

#if defined(__APPLE__)
#define MANGLE(sym) _##sym
#define XX @
#else
#define MANGLE(sym) sym
#define XX ;
#endif
/* The returns and args are just for documentation */
#define DEF(returns,symbol,args) .globl MANGLE(symbol) XX \
MANGLE(symbol)
/* Thanks to Joshua Grams for this code.
On PowerPC processors, we must flush the instruction cache manually
after writing to the code heap. */
DEF(void,flush_icache,(void*, int)):
/* compute number of cache lines to flush */
add r4,r4,r3
/* align addr to next lower cache line boundary */
clrrwi r3,r3,5
/* then n_lines = (len + 0x1f) / 0x20 */
sub r4,r4,r3
addi r4,r4,0x1f
/* note '.' suffix */
srwi. r4,r4,5
/* if n_lines == 0, just return. */
beqlr
/* flush cache lines */
mtctr r4
/* for each line... */
0: dcbf 0,r3
sync
icbi 0,r3
addi r3,r3,0x20
bdnz 0b
/* finish up */
sync
isync
blr
DEF(void,get_ppc_fpu_env,(void*)):
mffs f0
stfd f0,0(r3)
blr
DEF(void,set_ppc_fpu_env,(const void*)):
lfd f0,0(r3)
mtfsf 0xff,f0
blr
DEF(void,get_ppc_vmx_env,(void*)):
mfvscr v0
subi r4,r1,16
li r5,0xf
andc r4,r4,r5
stvxl v0,0,r4
li r5,0xc
lwzx r6,r5,r4
stw r6,0(r3)
blr
DEF(void,set_ppc_vmx_env,(const void*)):
subi r4,r1,16
li r5,0xf
andc r4,r4,r5
li r5,0xc
lwz r6,0(r3)
stwx r6,r5,r4
lvxl v0,0,r4
mtvscr v0
blr