1*b2441318SGreg Kroah-Hartman/* SPDX-License-Identifier: GPL-2.0 */ 2478b8fecSSam Ravnborg/* GENmemcpy.S: Generic sparc64 memcpy. 3478b8fecSSam Ravnborg * 4478b8fecSSam Ravnborg * Copyright (C) 2007 David S. Miller (davem@davemloft.net) 5478b8fecSSam Ravnborg */ 6478b8fecSSam Ravnborg 7478b8fecSSam Ravnborg#ifdef __KERNEL__ 8d0796b55SDavid S. Miller#include <linux/linkage.h> 9478b8fecSSam Ravnborg#define GLOBAL_SPARE %g7 10478b8fecSSam Ravnborg#else 11478b8fecSSam Ravnborg#define GLOBAL_SPARE %g5 12478b8fecSSam Ravnborg#endif 13478b8fecSSam Ravnborg 14478b8fecSSam Ravnborg#ifndef EX_LD 15d0796b55SDavid S. Miller#define EX_LD(x,y) x 16478b8fecSSam Ravnborg#endif 17478b8fecSSam Ravnborg 18478b8fecSSam Ravnborg#ifndef EX_ST 19d0796b55SDavid S. Miller#define EX_ST(x,y) x 20478b8fecSSam Ravnborg#endif 21478b8fecSSam Ravnborg 22478b8fecSSam Ravnborg#ifndef LOAD 23478b8fecSSam Ravnborg#define LOAD(type,addr,dest) type [addr], dest 24478b8fecSSam Ravnborg#endif 25478b8fecSSam Ravnborg 26478b8fecSSam Ravnborg#ifndef STORE 27478b8fecSSam Ravnborg#define STORE(type,src,addr) type src, [addr] 28478b8fecSSam Ravnborg#endif 29478b8fecSSam Ravnborg 30478b8fecSSam Ravnborg#ifndef FUNC_NAME 31478b8fecSSam Ravnborg#define FUNC_NAME GENmemcpy 32478b8fecSSam Ravnborg#endif 33478b8fecSSam Ravnborg 34478b8fecSSam Ravnborg#ifndef PREAMBLE 35478b8fecSSam Ravnborg#define PREAMBLE 36478b8fecSSam Ravnborg#endif 37478b8fecSSam Ravnborg 38478b8fecSSam Ravnborg#ifndef XCC 39478b8fecSSam Ravnborg#define XCC xcc 40478b8fecSSam Ravnborg#endif 41478b8fecSSam Ravnborg 42478b8fecSSam Ravnborg .register %g2,#scratch 43478b8fecSSam Ravnborg .register %g3,#scratch 44478b8fecSSam Ravnborg 45478b8fecSSam Ravnborg .text 46d0796b55SDavid S. Miller 47d0796b55SDavid S. Miller#ifndef EX_RETVAL 48d0796b55SDavid S. Miller#define EX_RETVAL(x) x 49d0796b55SDavid S. MillerENTRY(GEN_retl_o4_1) 50d0796b55SDavid S. Miller add %o4, %o2, %o4 51d0796b55SDavid S. Miller retl 52d0796b55SDavid S. Miller add %o4, 1, %o0 53d0796b55SDavid S. MillerENDPROC(GEN_retl_o4_1) 54d0796b55SDavid S. MillerENTRY(GEN_retl_g1_8) 55d0796b55SDavid S. Miller add %g1, %o2, %g1 56d0796b55SDavid S. Miller retl 57d0796b55SDavid S. Miller add %g1, 8, %o0 58d0796b55SDavid S. MillerENDPROC(GEN_retl_g1_8) 59d0796b55SDavid S. MillerENTRY(GEN_retl_o2_4) 60d0796b55SDavid S. Miller retl 61d0796b55SDavid S. Miller add %o2, 4, %o0 62d0796b55SDavid S. MillerENDPROC(GEN_retl_o2_4) 63d0796b55SDavid S. MillerENTRY(GEN_retl_o2_1) 64d0796b55SDavid S. Miller retl 65d0796b55SDavid S. Miller add %o2, 1, %o0 66d0796b55SDavid S. MillerENDPROC(GEN_retl_o2_1) 67d0796b55SDavid S. Miller#endif 68d0796b55SDavid S. Miller 69478b8fecSSam Ravnborg .align 64 70478b8fecSSam Ravnborg 71478b8fecSSam Ravnborg .globl FUNC_NAME 72478b8fecSSam Ravnborg .type FUNC_NAME,#function 73478b8fecSSam RavnborgFUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ 74478b8fecSSam Ravnborg srlx %o2, 31, %g2 75478b8fecSSam Ravnborg cmp %g2, 0 76478b8fecSSam Ravnborg tne %XCC, 5 77478b8fecSSam Ravnborg PREAMBLE 78478b8fecSSam Ravnborg mov %o0, GLOBAL_SPARE 79478b8fecSSam Ravnborg 80478b8fecSSam Ravnborg cmp %o2, 0 81478b8fecSSam Ravnborg be,pn %XCC, 85f 82478b8fecSSam Ravnborg or %o0, %o1, %o3 83478b8fecSSam Ravnborg cmp %o2, 16 84478b8fecSSam Ravnborg blu,a,pn %XCC, 80f 85478b8fecSSam Ravnborg or %o3, %o2, %o3 86478b8fecSSam Ravnborg 87478b8fecSSam Ravnborg xor %o0, %o1, %o4 88478b8fecSSam Ravnborg andcc %o4, 0x7, %g0 89478b8fecSSam Ravnborg bne,a,pn %XCC, 90f 90478b8fecSSam Ravnborg sub %o0, %o1, %o3 91478b8fecSSam Ravnborg 92478b8fecSSam Ravnborg and %o0, 0x7, %o4 93478b8fecSSam Ravnborg sub %o4, 0x8, %o4 94478b8fecSSam Ravnborg sub %g0, %o4, %o4 95478b8fecSSam Ravnborg sub %o2, %o4, %o2 96478b8fecSSam Ravnborg1: subcc %o4, 1, %o4 97d0796b55SDavid S. Miller EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o4_1) 98d0796b55SDavid S. Miller EX_ST(STORE(stb, %g1, %o0),GEN_retl_o4_1) 99478b8fecSSam Ravnborg add %o1, 1, %o1 100478b8fecSSam Ravnborg bne,pt %XCC, 1b 101478b8fecSSam Ravnborg add %o0, 1, %o0 102478b8fecSSam Ravnborg 103478b8fecSSam Ravnborg andn %o2, 0x7, %g1 104478b8fecSSam Ravnborg sub %o2, %g1, %o2 105478b8fecSSam Ravnborg1: subcc %g1, 0x8, %g1 106d0796b55SDavid S. Miller EX_LD(LOAD(ldx, %o1, %g2),GEN_retl_g1_8) 107d0796b55SDavid S. Miller EX_ST(STORE(stx, %g2, %o0),GEN_retl_g1_8) 108478b8fecSSam Ravnborg add %o1, 0x8, %o1 109478b8fecSSam Ravnborg bne,pt %XCC, 1b 110478b8fecSSam Ravnborg add %o0, 0x8, %o0 111478b8fecSSam Ravnborg 112478b8fecSSam Ravnborg brz,pt %o2, 85f 113478b8fecSSam Ravnborg sub %o0, %o1, %o3 114478b8fecSSam Ravnborg ba,a,pt %XCC, 90f 115478b8fecSSam Ravnborg 116478b8fecSSam Ravnborg .align 64 117478b8fecSSam Ravnborg80: /* 0 < len <= 16 */ 118478b8fecSSam Ravnborg andcc %o3, 0x3, %g0 119478b8fecSSam Ravnborg bne,pn %XCC, 90f 120478b8fecSSam Ravnborg sub %o0, %o1, %o3 121478b8fecSSam Ravnborg 122478b8fecSSam Ravnborg1: 123478b8fecSSam Ravnborg subcc %o2, 4, %o2 124d0796b55SDavid S. Miller EX_LD(LOAD(lduw, %o1, %g1),GEN_retl_o2_4) 125d0796b55SDavid S. Miller EX_ST(STORE(stw, %g1, %o1 + %o3),GEN_retl_o2_4) 126478b8fecSSam Ravnborg bgu,pt %XCC, 1b 127478b8fecSSam Ravnborg add %o1, 4, %o1 128478b8fecSSam Ravnborg 129478b8fecSSam Ravnborg85: retl 130478b8fecSSam Ravnborg mov EX_RETVAL(GLOBAL_SPARE), %o0 131478b8fecSSam Ravnborg 132478b8fecSSam Ravnborg .align 32 133478b8fecSSam Ravnborg90: 134478b8fecSSam Ravnborg subcc %o2, 1, %o2 135d0796b55SDavid S. Miller EX_LD(LOAD(ldub, %o1, %g1),GEN_retl_o2_1) 136d0796b55SDavid S. Miller EX_ST(STORE(stb, %g1, %o1 + %o3),GEN_retl_o2_1) 137478b8fecSSam Ravnborg bgu,pt %XCC, 90b 138478b8fecSSam Ravnborg add %o1, 1, %o1 139478b8fecSSam Ravnborg retl 140478b8fecSSam Ravnborg mov EX_RETVAL(GLOBAL_SPARE), %o0 141478b8fecSSam Ravnborg 142478b8fecSSam Ravnborg .size FUNC_NAME, .-FUNC_NAME 143