12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- #include <asm/asmmacro.h>
- #include <asm/page.h>
- #include <asm/export.h>
- #ifdef CONFIG_ITANIUM
- # define L3_LINE_SIZE 64
- # define PREFETCH_LINES 9
- #else
- # define L3_LINE_SIZE 128
- # define PREFETCH_LINES 12
- #endif
- #define saved_lc r2
- #define dst_fetch r3
- #define dst1 r8
- #define dst2 r9
- #define dst3 r10
- #define dst4 r11
- #define dst_last r31
- GLOBAL_ENTRY(clear_page)
- .prologue
- .regstk 1,0,0,0
- mov r16 = PAGE_SIZE/L3_LINE_SIZE-1
- .save ar.lc, saved_lc
- mov saved_lc = ar.lc
- .body
- mov ar.lc = (PREFETCH_LINES - 1)
- mov dst_fetch = in0
- adds dst1 = 16, in0
- adds dst2 = 32, in0
- ;;
- .fetch: stf.spill.nta [dst_fetch] = f0, L3_LINE_SIZE
- adds dst3 = 48, in0
- br.cloop.sptk.few .fetch
- ;;
- addl dst_last = (PAGE_SIZE - PREFETCH_LINES*L3_LINE_SIZE), dst_fetch
- mov ar.lc = r16
- adds dst4 = 64, in0
- ;;
- #ifdef CONFIG_ITANIUM
-
- 1: stf.spill.nta [dst1] = f0, 64
- stf.spill.nta [dst2] = f0, 64
- cmp.lt p8,p0=dst_fetch, dst_last
- ;;
- #else
-
- 1: stf.spill.nta [dst1] = f0, 64
- stf.spill.nta [dst2] = f0, 64
- stf.spill.nta [dst3] = f0, 64
- stf.spill.nta [dst4] = f0, 128
- cmp.lt p8,p0=dst_fetch, dst_last
- ;;
- stf.spill.nta [dst1] = f0, 64
- stf.spill.nta [dst2] = f0, 64
- #endif
- stf.spill.nta [dst3] = f0, 64
- (p8) stf.spill.nta [dst_fetch] = f0, L3_LINE_SIZE
- br.cloop.sptk.few 1b
- ;;
- mov ar.lc = saved_lc
- br.ret.sptk.many rp
- END(clear_page)
- EXPORT_SYMBOL(clear_page)
|