📄 cachelib.s
字号:
/*****************************************************************************;; Project : ADM5120; Creator : Dan Everett; File : cachelib.S; Abstract: ;;*****************************************************************************/#include <asm.h>#include <mips.h>#include <mips4kc.h>#include <adm5120.h>.set noreorderLEAF(icahce_invalidate_line) cache ICACHE_HIT_INVALIDATE, 0(a0) jr ra nopEND(icahce_invalidate_line)LEAF(icache_invalidate_block) /* * a0 : start address * a1 : length */ addu a1, a0, a1 // a1 holds the end address li v0, 0xf addu a1, a1, v0 not v0, v0 and a0, a0, v0 // align a0 to the start of cache line and a1, a1, v0 subu v0, a1, a0 // v0 holds the length of the block slt v1, v0, 4*16 bnez v1, 2f // Jump, if less than 4 cache lines nop1: cache ICACHE_HIT_INVALIDATE, 0x00(a0) cache ICACHE_HIT_INVALIDATE, 0x10(a0) cache ICACHE_HIT_INVALIDATE, 0x20(a0) cache ICACHE_HIT_INVALIDATE, 0x30(a0) addu a0, a0, 4*16 subu v0, a1, a0 slt v1, 4*16 beqz v1, 1b nop2: beq a1, a0, 4f nop3: cache ICACHE_HIT_INVALIDATE, 0x00(a0) addu a0, a0, 16 bne a1, a0, 3b nop4: jr ra nopEND(icache_invalidate_block)LEAF(dcahce_invalidate_line) cache DCACHE_HIT_INVALIDATE, 0(a0) jr ra nopEND(dcahce_invalidate_line)LEAF(dcache_invalidate_block) /* * a0 : start address * a1 : length */ addu a1, a0, a1 // a1 holds the end address li v0, 0xf addu a1, a1, v0 not v0, v0 and a0, a0, v0 // align a0 to the start of cache line and a1, a1, v0 subu v0, a1, a0 // v0 holds the length of the block slt v1, v0, 4*16 bnez v1, 2f // Jump, if less than 4 cache lines nop1: cache DCACHE_HIT_INVALIDATE, 0x00(a0) cache DCACHE_HIT_INVALIDATE, 0x10(a0) cache DCACHE_HIT_INVALIDATE, 0x20(a0) cache DCACHE_HIT_INVALIDATE, 0x30(a0) addu a0, a0, 4*16 subu v0, a1, a0 slt v1, 4*16 beqz v1, 1b nop2: beq a1, a0, 4f nop3: cache DCACHE_HIT_INVALIDATE, 0x00(a0) addu a0, a0, 16 bne a1, a0, 3b nop4: jr ra nopEND(dcache_invalidate_block).set reorder
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -