📄 misc.s
字号:
bdnz 11b#else /* MAX_COPY_PREFETCH == 1 */ dcbt r5,r4 li r11,CACHE_LINE_SIZE+4#endif /* MAX_COPY_PREFETCH */#endif /* CONFIG_8xx */ li r0,4096/CACHE_LINE_SIZE mtctr r01:#ifndef CONFIG_8xx dcbt r11,r4 dcbz r5,r3#endif COPY_16_BYTES#if CACHE_LINE_SIZE >= 32 COPY_16_BYTES#if CACHE_LINE_SIZE >= 64 COPY_16_BYTES COPY_16_BYTES#if CACHE_LINE_SIZE >= 128 COPY_16_BYTES COPY_16_BYTES COPY_16_BYTES COPY_16_BYTES#endif#endif#endif bdnz 1b blr/* * Atomic [test&set] exchange * * unsigned long xchg_u32(void *ptr, unsigned long val) * Changes the memory location '*ptr' to be val and returns * the previous value stored there. */_GLOBAL(xchg_u32) mr r5,r3 /* Save pointer */10: lwarx r3,0,r5 /* Fetch old value & reserve */ stwcx. r4,0,r5 /* Update with new value */ bne- 10b /* Retry if "reservation" (i.e. lock) lost */ blr/* * Try to acquire a spinlock. * Only does the stwcx. if the load returned 0 - the Programming * Environments Manual suggests not doing unnecessary stcwx.'s * since they may inhibit forward progress by other CPUs in getting * a lock. */_GLOBAL(__spin_trylock) mr r4,r3 eieio /* prevent reordering of stores */ li r5,-1 lwarx r3,0,r4 /* fetch old value, establish reservation */ cmpwi 0,r3,0 /* is it 0? */ bnelr- /* return failure if not */ stwcx. r5,0,r4 /* try to update with new value */ bne- 1f /* if we failed */ eieio /* prevent reordering of stores */ blr1: li r3,1 /* return non-zero for failure */ blr/* * Atomic add/sub/inc/dec operations * * void atomic_add(int c, int *v) * void atomic_sub(int c, int *v) * void atomic_inc(int *v) * void atomic_dec(int *v) * int atomic_dec_and_test(int *v) * int atomic_inc_return(int *v) * int atomic_dec_return(int *v) * void atomic_clear_mask(atomic_t mask, atomic_t *addr) * void atomic_set_mask(atomic_t mask, atomic_t *addr); */#if 0 /* now inline - paulus */_GLOBAL(atomic_add)10: lwarx r5,0,r4 /* Fetch old value & reserve */ add r5,r5,r3 /* Perform 'add' operation */ stwcx. r5,0,r4 /* Update with new value */ bne- 10b /* Retry if "reservation" (i.e. lock) lost */ blr_GLOBAL(atomic_add_return)10: lwarx r5,0,r4 /* Fetch old value & reserve */ add r5,r5,r3 /* Perform 'add' operation */ stwcx. r5,0,r4 /* Update with new value */ bne- 10b /* Retry if "reservation" (i.e. lock) lost */ mr r3,r5 blr_GLOBAL(atomic_sub)10: lwarx r5,0,r4 /* Fetch old value & reserve */ sub r5,r5,r3 /* Perform 'add' operation */ stwcx. r5,0,r4 /* Update with new value */ bne- 10b /* Retry if "reservation" (i.e. lock) lost */ blr_GLOBAL(atomic_inc)10: lwarx r5,0,r3 /* Fetch old value & reserve */ addi r5,r5,1 /* Perform 'add' operation */ stwcx. r5,0,r3 /* Update with new value */ bne- 10b /* Retry if "reservation" (i.e. lock) lost */ blr_GLOBAL(atomic_inc_return)10: lwarx r5,0,r3 /* Fetch old value & reserve */ addi r5,r5,1 /* Perform 'add' operation */ stwcx. r5,0,r3 /* Update with new value */ bne- 10b /* Retry if "reservation" (i.e. lock) lost */ mr r3,r5 /* Return new value */ blr_GLOBAL(atomic_dec)10: lwarx r5,0,r3 /* Fetch old value & reserve */ subi r5,r5,1 /* Perform 'add' operation */ stwcx. r5,0,r3 /* Update with new value */ bne- 10b /* Retry if "reservation" (i.e. lock) lost */ blr_GLOBAL(atomic_dec_return)10: lwarx r5,0,r3 /* Fetch old value & reserve */ subi r5,r5,1 /* Perform 'add' operation */ stwcx. r5,0,r3 /* Update with new value */ bne- 10b /* Retry if "reservation" (i.e. lock) lost */ mr r3,r5 /* Return new value */ blr_GLOBAL(atomic_dec_and_test)10: lwarx r5,0,r3 /* Fetch old value & reserve */ subi r5,r5,1 /* Perform 'add' operation */ stwcx. r5,0,r3 /* Update with new value */ bne- 10b /* Retry if "reservation" (i.e. lock) lost */ cntlzw r3,r5 srwi r3,r3,5 blr#endif /* 0 */_GLOBAL(atomic_clear_mask)10: lwarx r5,0,r4 andc r5,r5,r3 stwcx. r5,0,r4 bne- 10b blr_GLOBAL(atomic_set_mask)10: lwarx r5,0,r4 or r5,r5,r3 stwcx. r5,0,r4 bne- 10b blr/* * I/O string operations * * insb(port, buf, len) * outsb(port, buf, len) * insw(port, buf, len) * outsw(port, buf, len) * insl(port, buf, len) * outsl(port, buf, len) * insw_ns(port, buf, len) * outsw_ns(port, buf, len) * insl_ns(port, buf, len) * outsl_ns(port, buf, len) * * The *_ns versions don't do byte-swapping. */_GLOBAL(_insb) cmpwi 0,r5,0 mtctr r5 subi r4,r4,1 blelr-00: lbz r5,0(r3) eieio stbu r5,1(r4) bdnz 00b blr_GLOBAL(_outsb) cmpwi 0,r5,0 mtctr r5 subi r4,r4,1 blelr-00: lbzu r5,1(r4) stb r5,0(r3) eieio bdnz 00b blr _GLOBAL(_insw) cmpwi 0,r5,0 mtctr r5 subi r4,r4,2 blelr-00: lhbrx r5,0,r3 eieio sthu r5,2(r4) bdnz 00b blr_GLOBAL(_outsw) cmpwi 0,r5,0 mtctr r5 subi r4,r4,2 blelr-00: lhzu r5,2(r4) eieio sthbrx r5,0,r3 bdnz 00b blr _GLOBAL(_insl) cmpwi 0,r5,0 mtctr r5 subi r4,r4,4 blelr-00: lwbrx r5,0,r3 eieio stwu r5,4(r4) bdnz 00b blr_GLOBAL(_outsl) cmpwi 0,r5,0 mtctr r5 subi r4,r4,4 blelr-00: lwzu r5,4(r4) stwbrx r5,0,r3 eieio bdnz 00b blr _GLOBAL(ide_insw)_GLOBAL(_insw_ns) cmpwi 0,r5,0 mtctr r5 subi r4,r4,2 blelr-00: lhz r5,0(r3) eieio sthu r5,2(r4) bdnz 00b blr_GLOBAL(ide_outsw)_GLOBAL(_outsw_ns) cmpwi 0,r5,0 mtctr r5 subi r4,r4,2 blelr-00: lhzu r5,2(r4) sth r5,0(r3) eieio bdnz 00b blr _GLOBAL(_insl_ns) cmpwi 0,r5,0 mtctr r5 subi r4,r4,4 blelr-00: lwz r5,0(r3) eieio stwu r5,4(r4) bdnz 00b blr_GLOBAL(_outsl_ns) cmpwi 0,r5,0 mtctr r5 subi r4,r4,4 blelr-00: lwzu r5,4(r4) stw r5,0(r3) eieio bdnz 00b blr /* * Extended precision shifts. * * Updated to be valid for shift counts from 0 to 63 inclusive. * -- Gabriel * * R3/R4 has 64 bit value * R5 has shift count * result in R3/R4 * * ashrdi3: arithmetic right shift (sign propagation) * lshrdi3: logical right shift * ashldi3: left shift */_GLOBAL(__ashrdi3) subfic r6,r5,32 srw r4,r4,r5 # LSW = count > 31 ? 0 : LSW >> count addi r7,r5,32 # could be xori, or addi with -32 slw r6,r3,r6 # t1 = count > 31 ? 0 : MSW << (32-count) rlwinm r8,r7,0,32 # t3 = (count < 32) ? 32 : 0 sraw r7,r3,r7 # t2 = MSW >> (count-32) or r4,r4,r6 # LSW |= t1 slw r7,r7,r8 # t2 = (count < 32) ? 0 : t2 sraw r3,r3,r5 # MSW = MSW >> count or r4,r4,r7 # LSW |= t2 blr_GLOBAL(__ashldi3) subfic r6,r5,32 slw r3,r3,r5 # MSW = count > 31 ? 0 : MSW << count addi r7,r5,32 # could be xori, or addi with -32 srw r6,r4,r6 # t1 = count > 31 ? 0 : LSW >> (32-count) slw r7,r4,r7 # t2 = count < 32 ? 0 : LSW << (count-32) or r3,r3,r6 # MSW |= t1 slw r4,r4,r5 # LSW = LSW << count or r3,r3,r7 # MSW |= t2 blr_GLOBAL(__lshrdi3) subfic r6,r5,32 srw r4,r4,r5 # LSW = count > 31 ? 0 : LSW >> count addi r7,r5,32 # could be xori, or addi with -32 slw r6,r3,r6 # t1 = count > 31 ? 0 : MSW << (32-count) srw r7,r3,r7 # t2 = count < 32 ? 0 : MSW >> (count-32) or r4,r4,r6 # LSW |= t1 srw r3,r3,r5 # MSW = MSW >> count or r4,r4,r7 # LSW |= t2 blr_GLOBAL(abs) srawi r4,r3,31 xor r3,r3,r4 sub r3,r3,r4 blr_GLOBAL(_get_SP) mr r3,r1 /* Close enough */ blr_GLOBAL(_get_THRM1) mfspr r3,THRM1 blr_GLOBAL(_get_THRM2) mfspr r3,THRM2 blr_GLOBAL(_get_THRM3) mfspr r3,THRM3 blr _GLOBAL(_set_THRM1) mtspr THRM1,r3 blr_GLOBAL(_set_THRM2) mtspr THRM2,r3 blr_GLOBAL(_set_THRM3) mtspr THRM3,r3 blr _GLOBAL(_get_PVR) mfspr r3,PVR blr#ifdef CONFIG_8xx_GLOBAL(_get_IMMR) mfspr r3, 638 blr#endif _GLOBAL(_get_HID0) mfspr r3,HID0 blr_GLOBAL(_get_ICTC) mfspr r3,ICTC blr_GLOBAL(_set_ICTC) mtspr ICTC,r3 blr /* L2CR functions Copyright
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -