18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * 48c2ecf20Sopenharmony_ci * Optimized version of the standard copy_page() function 58c2ecf20Sopenharmony_ci * 68c2ecf20Sopenharmony_ci * Inputs: 78c2ecf20Sopenharmony_ci * in0: address of target page 88c2ecf20Sopenharmony_ci * in1: address of source page 98c2ecf20Sopenharmony_ci * Output: 108c2ecf20Sopenharmony_ci * no return value 118c2ecf20Sopenharmony_ci * 128c2ecf20Sopenharmony_ci * Copyright (C) 1999, 2001 Hewlett-Packard Co 138c2ecf20Sopenharmony_ci * Stephane Eranian <eranian@hpl.hp.com> 148c2ecf20Sopenharmony_ci * David Mosberger <davidm@hpl.hp.com> 158c2ecf20Sopenharmony_ci * 168c2ecf20Sopenharmony_ci * 4/06/01 davidm Tuned to make it perform well both for cached and uncached copies. 178c2ecf20Sopenharmony_ci */ 188c2ecf20Sopenharmony_ci#include <asm/asmmacro.h> 198c2ecf20Sopenharmony_ci#include <asm/page.h> 208c2ecf20Sopenharmony_ci#include <asm/export.h> 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci#define PIPE_DEPTH 3 238c2ecf20Sopenharmony_ci#define EPI p[PIPE_DEPTH-1] 248c2ecf20Sopenharmony_ci 258c2ecf20Sopenharmony_ci#define lcount r16 268c2ecf20Sopenharmony_ci#define saved_pr r17 278c2ecf20Sopenharmony_ci#define saved_lc r18 288c2ecf20Sopenharmony_ci#define saved_pfs r19 298c2ecf20Sopenharmony_ci#define src1 r20 308c2ecf20Sopenharmony_ci#define src2 r21 318c2ecf20Sopenharmony_ci#define tgt1 r22 328c2ecf20Sopenharmony_ci#define tgt2 r23 338c2ecf20Sopenharmony_ci#define srcf r24 348c2ecf20Sopenharmony_ci#define tgtf r25 358c2ecf20Sopenharmony_ci#define tgt_last r26 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci#define Nrot ((8*PIPE_DEPTH+7)&~7) 388c2ecf20Sopenharmony_ci 398c2ecf20Sopenharmony_ciGLOBAL_ENTRY(copy_page) 408c2ecf20Sopenharmony_ci .prologue 418c2ecf20Sopenharmony_ci .save ar.pfs, saved_pfs 428c2ecf20Sopenharmony_ci alloc saved_pfs=ar.pfs,3,Nrot-3,0,Nrot 438c2ecf20Sopenharmony_ci 448c2ecf20Sopenharmony_ci .rotr t1[PIPE_DEPTH], t2[PIPE_DEPTH], t3[PIPE_DEPTH], t4[PIPE_DEPTH], \ 458c2ecf20Sopenharmony_ci t5[PIPE_DEPTH], t6[PIPE_DEPTH], t7[PIPE_DEPTH], t8[PIPE_DEPTH] 468c2ecf20Sopenharmony_ci .rotp p[PIPE_DEPTH] 478c2ecf20Sopenharmony_ci 488c2ecf20Sopenharmony_ci .save ar.lc, saved_lc 498c2ecf20Sopenharmony_ci mov saved_lc=ar.lc 508c2ecf20Sopenharmony_ci mov ar.ec=PIPE_DEPTH 518c2ecf20Sopenharmony_ci 528c2ecf20Sopenharmony_ci mov lcount=PAGE_SIZE/64-1 538c2ecf20Sopenharmony_ci .save pr, saved_pr 548c2ecf20Sopenharmony_ci mov saved_pr=pr 558c2ecf20Sopenharmony_ci mov pr.rot=1<<16 568c2ecf20Sopenharmony_ci 578c2ecf20Sopenharmony_ci .body 588c2ecf20Sopenharmony_ci 598c2ecf20Sopenharmony_ci mov src1=in1 608c2ecf20Sopenharmony_ci adds src2=8,in1 618c2ecf20Sopenharmony_ci mov tgt_last = PAGE_SIZE 628c2ecf20Sopenharmony_ci ;; 638c2ecf20Sopenharmony_ci adds tgt2=8,in0 648c2ecf20Sopenharmony_ci add srcf=512,in1 658c2ecf20Sopenharmony_ci mov ar.lc=lcount 668c2ecf20Sopenharmony_ci mov tgt1=in0 678c2ecf20Sopenharmony_ci add tgtf=512,in0 688c2ecf20Sopenharmony_ci add tgt_last = tgt_last, in0 698c2ecf20Sopenharmony_ci ;; 708c2ecf20Sopenharmony_ci1: 718c2ecf20Sopenharmony_ci(p[0]) ld8 t1[0]=[src1],16 728c2ecf20Sopenharmony_ci(EPI) st8 [tgt1]=t1[PIPE_DEPTH-1],16 738c2ecf20Sopenharmony_ci(p[0]) ld8 t2[0]=[src2],16 748c2ecf20Sopenharmony_ci(EPI) st8 [tgt2]=t2[PIPE_DEPTH-1],16 758c2ecf20Sopenharmony_ci cmp.ltu p6,p0 = tgtf, tgt_last 768c2ecf20Sopenharmony_ci ;; 778c2ecf20Sopenharmony_ci(p[0]) ld8 t3[0]=[src1],16 788c2ecf20Sopenharmony_ci(EPI) st8 [tgt1]=t3[PIPE_DEPTH-1],16 798c2ecf20Sopenharmony_ci(p[0]) ld8 t4[0]=[src2],16 808c2ecf20Sopenharmony_ci(EPI) st8 [tgt2]=t4[PIPE_DEPTH-1],16 818c2ecf20Sopenharmony_ci ;; 828c2ecf20Sopenharmony_ci(p[0]) ld8 t5[0]=[src1],16 838c2ecf20Sopenharmony_ci(EPI) st8 [tgt1]=t5[PIPE_DEPTH-1],16 848c2ecf20Sopenharmony_ci(p[0]) ld8 t6[0]=[src2],16 858c2ecf20Sopenharmony_ci(EPI) st8 [tgt2]=t6[PIPE_DEPTH-1],16 868c2ecf20Sopenharmony_ci ;; 878c2ecf20Sopenharmony_ci(p[0]) ld8 t7[0]=[src1],16 888c2ecf20Sopenharmony_ci(EPI) st8 [tgt1]=t7[PIPE_DEPTH-1],16 898c2ecf20Sopenharmony_ci(p[0]) ld8 t8[0]=[src2],16 908c2ecf20Sopenharmony_ci(EPI) st8 [tgt2]=t8[PIPE_DEPTH-1],16 918c2ecf20Sopenharmony_ci 928c2ecf20Sopenharmony_ci(p6) lfetch [srcf], 64 938c2ecf20Sopenharmony_ci(p6) lfetch [tgtf], 64 948c2ecf20Sopenharmony_ci br.ctop.sptk.few 1b 958c2ecf20Sopenharmony_ci ;; 968c2ecf20Sopenharmony_ci mov pr=saved_pr,0xffffffffffff0000 // restore predicates 978c2ecf20Sopenharmony_ci mov ar.pfs=saved_pfs 988c2ecf20Sopenharmony_ci mov ar.lc=saved_lc 998c2ecf20Sopenharmony_ci br.ret.sptk.many rp 1008c2ecf20Sopenharmony_ciEND(copy_page) 1018c2ecf20Sopenharmony_ciEXPORT_SYMBOL(copy_page) 102