📄 bcmp.s
字号:
/* @(#)bcmp.s 4.1 (ULTRIX) 7/3/90 *//* ------------------------------------------------------------------ *//* | Copyright Unpublished, MIPS Computer Systems, Inc. All Rights | *//* | Reserved. This software contains proprietary and confidential | *//* | information of MIPS and its suppliers. Use, disclosure or | *//* | reproduction is prohibited without the prior express written | *//* | consent of MIPS. | *//* ------------------------------------------------------------------ *//* $Header: bcmp.s,v 1.2 87/04/09 18:05:29 dce Exp $ *//* * Copyright 1985 by MIPS Computer Systems, Inc. *//* bcmp(s1, s2, n) */#include <mips/regdef.h>#include <mips/asm.h>/* * bcmp(src, dst, bcount) * * MINCMP is minimum number of byte that its worthwhile to try and * align cmp into word transactions * * Calculating MINCMP * Overhead =~ 15 instructions => 90 cycles * Byte cmp =~ 38 cycles/word * Word cmp =~ 17 cycles/word * Breakeven =~ 16 bytes */#define MINCMP 16#define NBPW 4LEAF(bcmp) xor v0,a0,a1 blt a2,MINCMP,bytecmp # too short, just byte cmp and v0,NBPW-1 subu t8,zero,a0 # number of bytes til aligned bne v0,zero,unalgncmp # src and dst not alignable/* * src and dst can be simultaneously word aligned */ and t8,NBPW-1 subu a2,t8 beq t8,zero,wordcmp # already aligned move v0,v1#ifdef MIPSEB lwl v0,0(a0) # cmp unaligned portion lwl v1,0(a1)#endif#ifdef MIPSEL lwr v0,0(a0) lwr v1,0(a1)#endif addu a0,t8 addu a1,t8 bne v0,v1,cmpne/* * word cmp loop */wordcmp: and a3,a2,~(NBPW-1) subu a2,a3 beq a3,zero,bytecmp addu a3,a0 # src1 endpoint1: lw v0,0(a0) lw v1,0(a1) addu a0,NBPW # 1st BDSLOT addu a1,NBPW # 2nd BDSLOT (asm doesn't move) bne v0,v1,cmpne bne a0,a3,1b # at least one more word b bytecmp/* * deal with simultaneously unalignable cmp by aligning one src */unalgncmp: subu a3,zero,a1 # calc byte cnt to get src2 aligned and a3,NBPW-1 subu a2,a3 beq a3,zero,partaligncmp # already aligned addu a3,a0 # src1 endpoint1: lbu v0,0(a0) lbu v1,0(a1) addu a0,1 addu a1,1 bne v0,v1,cmpne bne a0,a3,1b/* * src unaligned, dst aligned loop */partaligncmp: and a3,a2,~(NBPW-1) subu a2,a3 beq a3,zero,bytecmp addu a3,a01:#ifdef MIPSEB lwl v0,0(a0) lwr v0,3(a0)#endif#ifdef MIPSEL lwr v0,0(a0) lwl v0,3(a0)#endif lw v1,0(a1) addu a0,NBPW addu a1,NBPW bne v0,v1,cmpne bne a0,a3,1b/* * brute force byte cmp loop */bytecmp: addu a3,a2,a0 # src1 endpoint; BDSLOT ble a2,zero,cmpdone1: lbu v0,0(a0) lbu v1,0(a1) addu a0,1 addu a1,1 bne v0,v1,cmpne bne a0,a3,1bcmpdone: move v0,zero j racmpne: li v0,1 j ra.end bcmp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -