?? ovbcopy.s
字號(hào):
/* $Id: ovbcopy.S,v 1.1.1.1 2003/11/08 08:41:41 wlin Exp $ */#define ABICALLS # NO ABICALLS#include <asm.h>/* * memcpy(to, from, len) * {ov}bcopy(from, to, len) */LEAF(memcpy) .set noreorder move v0, a0 # swap from and to move a0, a1 move a1, v0ALEAF(bcopy)ALEAF(ovbcopy)#ifdef GODSONEV1 .set noreorder move v0,a1 bltu a0,a1,2f nop addu a0,a2 addu a1,a21: bgez a2,3f addiu a2,-1 lb t0,-1(a0) sb t0,-1(a1) addiu a0,-1 b 1b addiu a1,-12: bgez a2,3f addiu a2,-1 lb t0,0(a0) sb t0,0(a1) addiu a0,1 b 2b addiu a1,13: j ra nop #else .set noreorder addu t0, a0, a2 # t0 = end of s1 region sltu t1, a1, t0 sltu t2, a0, a1 and t1, t1, t2 # t1 = true if from < to < (from+len) beq t1, zero, forward # non overlapping, do forward copy slt t2, a2, 12 # check for small copy ble a2, zero, 2f addu t1, a1, a2 # t1 = end of to region1: lb v1, -1(t0) # copy bytes backwards, subu t0, t0, 1 # doesnt happen often so do slow way subu t1, t1, 1 bne t0, a0, 1b sb v1, 0(t1)2: j ra nopforward: bne t2, zero, smallcpy # do a small bcopy xor v1, a0, a1 # compare low two bits of addresses and v1, v1, 3 subu a3, zero, a1 # compute # bytes to word align address beq v1, zero, aligned # addresses can be word aligned and a3, a3, 3 beq a3, zero, 1f subu a2, a2, a3 # subtract from remaining count LWHI v1, 0(a0) # get next 4 bytes (unaligned) LWLO v1, 3(a0) addu a0, a0, a3 SWHI v1, 0(a1) # store 1, 2, or 3 bytes to align a1 addu a1, a1, a31: and v1, a2, 3 # compute number of words left subu a3, a2, v1 move a2, v1 addu a3, a3, a0 # compute ending address2: LWHI v1, 0(a0) # copy words a0 unaligned, a1 aligned LWLO v1, 3(a0) addu a0, a0, 4 sw v1, 0(a1) addu a1, a1, 4 bne a0, a3, 2b nop # We have to do this mmu-bug. b smallcpy nopaligned: beq a3, zero, 1f subu a2, a2, a3 # subtract from remaining count LWHI v1, 0(a0) # copy 1, 2, or 3 bytes to align addu a0, a0, a3 SWHI v1, 0(a1) addu a1, a1, a31: and v1, a2, 3 # compute number of whole words left subu a3, a2, v1 move a2, v1 addu a3, a3, a0 # compute ending address2: lw v1, 0(a0) # copy words addu a0, a0, 4 sw v1, 0(a1) bne a0, a3, 2b addu a1, a1, 4smallcpy: ble a2, zero, 2f addu a3, a2, a0 # compute ending address1: lbu v1, 0(a0) # copy bytes addu a0, a0, 1 sb v1, 0(a1) bne a0, a3, 1b addu a1, a1, 1 # MMU BUG ? can not do -1(a1) at 0x80000000!!2: j ra nop#endifEND(memcpy)
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -