1ae2c6ca6SDavid S. Miller/* NG4memcpy.S: Niagara-4 optimized memcpy. 2ae2c6ca6SDavid S. Miller * 3ae2c6ca6SDavid S. Miller * Copyright (C) 2012 David S. Miller (davem@davemloft.net) 4ae2c6ca6SDavid S. Miller */ 5ae2c6ca6SDavid S. Miller 6ae2c6ca6SDavid S. Miller#ifdef __KERNEL__ 7ae2c6ca6SDavid S. Miller#include <asm/visasm.h> 8ae2c6ca6SDavid S. Miller#include <asm/asi.h> 9ae2c6ca6SDavid S. Miller#define GLOBAL_SPARE %g7 10ae2c6ca6SDavid S. Miller#else 11ae2c6ca6SDavid S. Miller#define ASI_BLK_INIT_QUAD_LDD_P 0xe2 12ae2c6ca6SDavid S. Miller#define FPRS_FEF 0x04 13ae2c6ca6SDavid S. Miller 14ae2c6ca6SDavid S. Miller/* On T4 it is very expensive to access ASRs like %fprs and 15ae2c6ca6SDavid S. Miller * %asi, avoiding a read or a write can save ~50 cycles. 16ae2c6ca6SDavid S. Miller */ 17ae2c6ca6SDavid S. Miller#define FPU_ENTER \ 18ae2c6ca6SDavid S. Miller rd %fprs, %o5; \ 19ae2c6ca6SDavid S. Miller andcc %o5, FPRS_FEF, %g0; \ 20ae2c6ca6SDavid S. Miller be,a,pn %icc, 999f; \ 21ae2c6ca6SDavid S. Miller wr %g0, FPRS_FEF, %fprs; \ 22ae2c6ca6SDavid S. Miller 999: 23ae2c6ca6SDavid S. Miller 24ae2c6ca6SDavid S. Miller#ifdef MEMCPY_DEBUG 25ae2c6ca6SDavid S. Miller#define VISEntryHalf FPU_ENTER; \ 26ae2c6ca6SDavid S. Miller clr %g1; clr %g2; clr %g3; clr %g5; subcc %g0, %g0, %g0; 27ae2c6ca6SDavid S. Miller#define VISExitHalf and %o5, FPRS_FEF, %o5; wr %o5, 0x0, %fprs 28ae2c6ca6SDavid S. Miller#else 29ae2c6ca6SDavid S. Miller#define VISEntryHalf FPU_ENTER 30ae2c6ca6SDavid S. Miller#define VISExitHalf and %o5, FPRS_FEF, %o5; wr %o5, 0x0, %fprs 31ae2c6ca6SDavid S. Miller#endif 32ae2c6ca6SDavid S. Miller 33ae2c6ca6SDavid S. Miller#define GLOBAL_SPARE %g5 34ae2c6ca6SDavid S. Miller#endif 35ae2c6ca6SDavid S. Miller 36ae2c6ca6SDavid S. Miller#ifndef STORE_ASI 37ae2c6ca6SDavid S. Miller#ifndef SIMULATE_NIAGARA_ON_NON_NIAGARA 38ae2c6ca6SDavid S. Miller#define STORE_ASI ASI_BLK_INIT_QUAD_LDD_P 39ae2c6ca6SDavid S. Miller#else 40ae2c6ca6SDavid S. Miller#define STORE_ASI 0x80 /* ASI_P */ 41ae2c6ca6SDavid S. Miller#endif 42ae2c6ca6SDavid S. Miller#endif 43ae2c6ca6SDavid S. Miller 44f4da3628SDavid S. Miller#if !defined(EX_LD) && !defined(EX_ST) 45f4da3628SDavid S. Miller#define NON_USER_COPY 46f4da3628SDavid S. Miller#endif 47f4da3628SDavid S. Miller 48ae2c6ca6SDavid S. Miller#ifndef EX_LD 49ae2c6ca6SDavid S. Miller#define EX_LD(x) x 50ae2c6ca6SDavid S. Miller#endif 51*a7c5724bSRob Gardner#ifndef EX_LD_FP 52*a7c5724bSRob Gardner#define EX_LD_FP(x) x 53*a7c5724bSRob Gardner#endif 54ae2c6ca6SDavid S. Miller 55ae2c6ca6SDavid S. Miller#ifndef EX_ST 56ae2c6ca6SDavid S. Miller#define EX_ST(x) x 57ae2c6ca6SDavid S. Miller#endif 58*a7c5724bSRob Gardner#ifndef EX_ST_FP 59*a7c5724bSRob Gardner#define EX_ST_FP(x) x 60*a7c5724bSRob Gardner#endif 61ae2c6ca6SDavid S. Miller 62ae2c6ca6SDavid S. Miller#ifndef EX_RETVAL 63ae2c6ca6SDavid S. Miller#define EX_RETVAL(x) x 64ae2c6ca6SDavid S. Miller#endif 65ae2c6ca6SDavid S. Miller 66ae2c6ca6SDavid S. Miller#ifndef LOAD 67ae2c6ca6SDavid S. Miller#define LOAD(type,addr,dest) type [addr], dest 68ae2c6ca6SDavid S. Miller#endif 69ae2c6ca6SDavid S. Miller 70ae2c6ca6SDavid S. Miller#ifndef STORE 71ae2c6ca6SDavid S. Miller#ifndef MEMCPY_DEBUG 72ae2c6ca6SDavid S. Miller#define STORE(type,src,addr) type src, [addr] 73ae2c6ca6SDavid S. Miller#else 74ae2c6ca6SDavid S. Miller#define STORE(type,src,addr) type##a src, [addr] %asi 75ae2c6ca6SDavid S. Miller#endif 76ae2c6ca6SDavid S. Miller#endif 77ae2c6ca6SDavid S. Miller 78ae2c6ca6SDavid S. Miller#ifndef STORE_INIT 79ae2c6ca6SDavid S. Miller#define STORE_INIT(src,addr) stxa src, [addr] STORE_ASI 80ae2c6ca6SDavid S. Miller#endif 81ae2c6ca6SDavid S. Miller 82ae2c6ca6SDavid S. Miller#ifndef FUNC_NAME 83ae2c6ca6SDavid S. Miller#define FUNC_NAME NG4memcpy 84ae2c6ca6SDavid S. Miller#endif 85ae2c6ca6SDavid S. Miller#ifndef PREAMBLE 86ae2c6ca6SDavid S. Miller#define PREAMBLE 87ae2c6ca6SDavid S. Miller#endif 88ae2c6ca6SDavid S. Miller 89ae2c6ca6SDavid S. Miller#ifndef XCC 90ae2c6ca6SDavid S. Miller#define XCC xcc 91ae2c6ca6SDavid S. Miller#endif 92ae2c6ca6SDavid S. Miller 93ae2c6ca6SDavid S. Miller .register %g2,#scratch 94ae2c6ca6SDavid S. Miller .register %g3,#scratch 95ae2c6ca6SDavid S. Miller 96ae2c6ca6SDavid S. Miller .text 97ae2c6ca6SDavid S. Miller .align 64 98ae2c6ca6SDavid S. Miller 99ae2c6ca6SDavid S. Miller .globl FUNC_NAME 100ae2c6ca6SDavid S. Miller .type FUNC_NAME,#function 101ae2c6ca6SDavid S. MillerFUNC_NAME: /* %o0=dst, %o1=src, %o2=len */ 102ae2c6ca6SDavid S. Miller#ifdef MEMCPY_DEBUG 103ae2c6ca6SDavid S. Miller wr %g0, 0x80, %asi 104ae2c6ca6SDavid S. Miller#endif 105ae2c6ca6SDavid S. Miller srlx %o2, 31, %g2 106ae2c6ca6SDavid S. Miller cmp %g2, 0 107ae2c6ca6SDavid S. Miller tne %XCC, 5 108ae2c6ca6SDavid S. Miller PREAMBLE 109ae2c6ca6SDavid S. Miller mov %o0, %o3 110ae2c6ca6SDavid S. Miller brz,pn %o2, .Lexit 111ae2c6ca6SDavid S. Miller cmp %o2, 3 112ae2c6ca6SDavid S. Miller ble,pn %icc, .Ltiny 113ae2c6ca6SDavid S. Miller cmp %o2, 19 114ae2c6ca6SDavid S. Miller ble,pn %icc, .Lsmall 115ae2c6ca6SDavid S. Miller or %o0, %o1, %g2 116ae2c6ca6SDavid S. Miller cmp %o2, 128 117ae2c6ca6SDavid S. Miller bl,pn %icc, .Lmedium 118ae2c6ca6SDavid S. Miller nop 119ae2c6ca6SDavid S. Miller 120ae2c6ca6SDavid S. Miller.Llarge:/* len >= 0x80 */ 121ae2c6ca6SDavid S. Miller /* First get dest 8 byte aligned. */ 122ae2c6ca6SDavid S. Miller sub %g0, %o0, %g1 123ae2c6ca6SDavid S. Miller and %g1, 0x7, %g1 124ae2c6ca6SDavid S. Miller brz,pt %g1, 51f 125ae2c6ca6SDavid S. Miller sub %o2, %g1, %o2 126ae2c6ca6SDavid S. Miller 127ae2c6ca6SDavid S. Miller1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2)) 128ae2c6ca6SDavid S. Miller add %o1, 1, %o1 129ae2c6ca6SDavid S. Miller subcc %g1, 1, %g1 130ae2c6ca6SDavid S. Miller add %o0, 1, %o0 131ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 132ae2c6ca6SDavid S. Miller EX_ST(STORE(stb, %g2, %o0 - 0x01)) 133ae2c6ca6SDavid S. Miller 134ae2c6ca6SDavid S. Miller51: LOAD(prefetch, %o1 + 0x040, #n_reads_strong) 135ae2c6ca6SDavid S. Miller LOAD(prefetch, %o1 + 0x080, #n_reads_strong) 136ae2c6ca6SDavid S. Miller LOAD(prefetch, %o1 + 0x0c0, #n_reads_strong) 137ae2c6ca6SDavid S. Miller LOAD(prefetch, %o1 + 0x100, #n_reads_strong) 138ae2c6ca6SDavid S. Miller LOAD(prefetch, %o1 + 0x140, #n_reads_strong) 139ae2c6ca6SDavid S. Miller LOAD(prefetch, %o1 + 0x180, #n_reads_strong) 140ae2c6ca6SDavid S. Miller LOAD(prefetch, %o1 + 0x1c0, #n_reads_strong) 141ae2c6ca6SDavid S. Miller LOAD(prefetch, %o1 + 0x200, #n_reads_strong) 142ae2c6ca6SDavid S. Miller 143ae2c6ca6SDavid S. Miller /* Check if we can use the straight fully aligned 144ae2c6ca6SDavid S. Miller * loop, or we require the alignaddr/faligndata variant. 145ae2c6ca6SDavid S. Miller */ 146ae2c6ca6SDavid S. Miller andcc %o1, 0x7, %o5 147ae2c6ca6SDavid S. Miller bne,pn %icc, .Llarge_src_unaligned 148ae2c6ca6SDavid S. Miller sub %g0, %o0, %g1 149ae2c6ca6SDavid S. Miller 150ae2c6ca6SDavid S. Miller /* Legitimize the use of initializing stores by getting dest 151ae2c6ca6SDavid S. Miller * to be 64-byte aligned. 152ae2c6ca6SDavid S. Miller */ 153ae2c6ca6SDavid S. Miller and %g1, 0x3f, %g1 154ae2c6ca6SDavid S. Miller brz,pt %g1, .Llarge_aligned 155ae2c6ca6SDavid S. Miller sub %o2, %g1, %o2 156ae2c6ca6SDavid S. Miller 157ae2c6ca6SDavid S. Miller1: EX_LD(LOAD(ldx, %o1 + 0x00, %g2)) 158ae2c6ca6SDavid S. Miller add %o1, 8, %o1 159ae2c6ca6SDavid S. Miller subcc %g1, 8, %g1 160ae2c6ca6SDavid S. Miller add %o0, 8, %o0 161ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 162ae2c6ca6SDavid S. Miller EX_ST(STORE(stx, %g2, %o0 - 0x08)) 163ae2c6ca6SDavid S. Miller 164ae2c6ca6SDavid S. Miller.Llarge_aligned: 165ae2c6ca6SDavid S. Miller /* len >= 0x80 && src 8-byte aligned && dest 8-byte aligned */ 166ae2c6ca6SDavid S. Miller andn %o2, 0x3f, %o4 167ae2c6ca6SDavid S. Miller sub %o2, %o4, %o2 168ae2c6ca6SDavid S. Miller 169ae2c6ca6SDavid S. Miller1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1)) 170ae2c6ca6SDavid S. Miller add %o1, 0x40, %o1 171ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 - 0x38, %g2)) 172ae2c6ca6SDavid S. Miller subcc %o4, 0x40, %o4 173ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 - 0x30, %g3)) 174ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 - 0x28, GLOBAL_SPARE)) 175ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 - 0x20, %o5)) 176ae2c6ca6SDavid S. Miller EX_ST(STORE_INIT(%g1, %o0)) 177ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 178ae2c6ca6SDavid S. Miller EX_ST(STORE_INIT(%g2, %o0)) 179ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 180ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 - 0x18, %g2)) 181ae2c6ca6SDavid S. Miller EX_ST(STORE_INIT(%g3, %o0)) 182ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 183ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 - 0x10, %g3)) 184ae2c6ca6SDavid S. Miller EX_ST(STORE_INIT(GLOBAL_SPARE, %o0)) 185ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 186ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 - 0x08, GLOBAL_SPARE)) 187ae2c6ca6SDavid S. Miller EX_ST(STORE_INIT(%o5, %o0)) 188ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 189ae2c6ca6SDavid S. Miller EX_ST(STORE_INIT(%g2, %o0)) 190ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 191ae2c6ca6SDavid S. Miller EX_ST(STORE_INIT(%g3, %o0)) 192ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 193ae2c6ca6SDavid S. Miller EX_ST(STORE_INIT(GLOBAL_SPARE, %o0)) 194ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 195ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 196ae2c6ca6SDavid S. Miller LOAD(prefetch, %o1 + 0x200, #n_reads_strong) 197ae2c6ca6SDavid S. Miller 198ae2c6ca6SDavid S. Miller membar #StoreLoad | #StoreStore 199ae2c6ca6SDavid S. Miller 200ae2c6ca6SDavid S. Miller brz,pn %o2, .Lexit 201ae2c6ca6SDavid S. Miller cmp %o2, 19 202ae2c6ca6SDavid S. Miller ble,pn %icc, .Lsmall_unaligned 203ae2c6ca6SDavid S. Miller nop 204ae2c6ca6SDavid S. Miller ba,a,pt %icc, .Lmedium_noprefetch 205ae2c6ca6SDavid S. Miller 206ae2c6ca6SDavid S. Miller.Lexit: retl 207ae2c6ca6SDavid S. Miller mov EX_RETVAL(%o3), %o0 208ae2c6ca6SDavid S. Miller 209ae2c6ca6SDavid S. Miller.Llarge_src_unaligned: 210f4da3628SDavid S. Miller#ifdef NON_USER_COPY 211f4da3628SDavid S. Miller VISEntryHalfFast(.Lmedium_vis_entry_fail) 212f4da3628SDavid S. Miller#else 213f4da3628SDavid S. Miller VISEntryHalf 214f4da3628SDavid S. Miller#endif 215ae2c6ca6SDavid S. Miller andn %o2, 0x3f, %o4 216ae2c6ca6SDavid S. Miller sub %o2, %o4, %o2 217ae2c6ca6SDavid S. Miller alignaddr %o1, %g0, %g1 218ae2c6ca6SDavid S. Miller add %o1, %o4, %o1 219*a7c5724bSRob Gardner EX_LD_FP(LOAD(ldd, %g1 + 0x00, %f0)) 220*a7c5724bSRob Gardner1: EX_LD_FP(LOAD(ldd, %g1 + 0x08, %f2)) 221ae2c6ca6SDavid S. Miller subcc %o4, 0x40, %o4 222*a7c5724bSRob Gardner EX_LD_FP(LOAD(ldd, %g1 + 0x10, %f4)) 223*a7c5724bSRob Gardner EX_LD_FP(LOAD(ldd, %g1 + 0x18, %f6)) 224*a7c5724bSRob Gardner EX_LD_FP(LOAD(ldd, %g1 + 0x20, %f8)) 225*a7c5724bSRob Gardner EX_LD_FP(LOAD(ldd, %g1 + 0x28, %f10)) 226*a7c5724bSRob Gardner EX_LD_FP(LOAD(ldd, %g1 + 0x30, %f12)) 227*a7c5724bSRob Gardner EX_LD_FP(LOAD(ldd, %g1 + 0x38, %f14)) 228ae2c6ca6SDavid S. Miller faligndata %f0, %f2, %f16 229*a7c5724bSRob Gardner EX_LD_FP(LOAD(ldd, %g1 + 0x40, %f0)) 230ae2c6ca6SDavid S. Miller faligndata %f2, %f4, %f18 231ae2c6ca6SDavid S. Miller add %g1, 0x40, %g1 232ae2c6ca6SDavid S. Miller faligndata %f4, %f6, %f20 233ae2c6ca6SDavid S. Miller faligndata %f6, %f8, %f22 234ae2c6ca6SDavid S. Miller faligndata %f8, %f10, %f24 235ae2c6ca6SDavid S. Miller faligndata %f10, %f12, %f26 236ae2c6ca6SDavid S. Miller faligndata %f12, %f14, %f28 237ae2c6ca6SDavid S. Miller faligndata %f14, %f0, %f30 238*a7c5724bSRob Gardner EX_ST_FP(STORE(std, %f16, %o0 + 0x00)) 239*a7c5724bSRob Gardner EX_ST_FP(STORE(std, %f18, %o0 + 0x08)) 240*a7c5724bSRob Gardner EX_ST_FP(STORE(std, %f20, %o0 + 0x10)) 241*a7c5724bSRob Gardner EX_ST_FP(STORE(std, %f22, %o0 + 0x18)) 242*a7c5724bSRob Gardner EX_ST_FP(STORE(std, %f24, %o0 + 0x20)) 243*a7c5724bSRob Gardner EX_ST_FP(STORE(std, %f26, %o0 + 0x28)) 244*a7c5724bSRob Gardner EX_ST_FP(STORE(std, %f28, %o0 + 0x30)) 245*a7c5724bSRob Gardner EX_ST_FP(STORE(std, %f30, %o0 + 0x38)) 246ae2c6ca6SDavid S. Miller add %o0, 0x40, %o0 247ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 248ae2c6ca6SDavid S. Miller LOAD(prefetch, %g1 + 0x200, #n_reads_strong) 24944922150SDavid S. Miller#ifdef NON_USER_COPY 25044922150SDavid S. Miller VISExitHalfFast 25144922150SDavid S. Miller#else 252ae2c6ca6SDavid S. Miller VISExitHalf 25344922150SDavid S. Miller#endif 254ae2c6ca6SDavid S. Miller brz,pn %o2, .Lexit 255ae2c6ca6SDavid S. Miller cmp %o2, 19 256ae2c6ca6SDavid S. Miller ble,pn %icc, .Lsmall_unaligned 257ae2c6ca6SDavid S. Miller nop 258ae2c6ca6SDavid S. Miller ba,a,pt %icc, .Lmedium_unaligned 259ae2c6ca6SDavid S. Miller 260f4da3628SDavid S. Miller#ifdef NON_USER_COPY 261f4da3628SDavid S. Miller.Lmedium_vis_entry_fail: 262f4da3628SDavid S. Miller or %o0, %o1, %g2 263f4da3628SDavid S. Miller#endif 264ae2c6ca6SDavid S. Miller.Lmedium: 265ae2c6ca6SDavid S. Miller LOAD(prefetch, %o1 + 0x40, #n_reads_strong) 266ae2c6ca6SDavid S. Miller andcc %g2, 0x7, %g0 267ae2c6ca6SDavid S. Miller bne,pn %icc, .Lmedium_unaligned 268ae2c6ca6SDavid S. Miller nop 269ae2c6ca6SDavid S. Miller.Lmedium_noprefetch: 270ae2c6ca6SDavid S. Miller andncc %o2, 0x20 - 1, %o5 271ae2c6ca6SDavid S. Miller be,pn %icc, 2f 272ae2c6ca6SDavid S. Miller sub %o2, %o5, %o2 273ae2c6ca6SDavid S. Miller1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1)) 274ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 + 0x08, %g2)) 275ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 + 0x10, GLOBAL_SPARE)) 276ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 + 0x18, %o4)) 277ae2c6ca6SDavid S. Miller add %o1, 0x20, %o1 278ae2c6ca6SDavid S. Miller subcc %o5, 0x20, %o5 279ae2c6ca6SDavid S. Miller EX_ST(STORE(stx, %g1, %o0 + 0x00)) 280ae2c6ca6SDavid S. Miller EX_ST(STORE(stx, %g2, %o0 + 0x08)) 281ae2c6ca6SDavid S. Miller EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x10)) 282ae2c6ca6SDavid S. Miller EX_ST(STORE(stx, %o4, %o0 + 0x18)) 283ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 284ae2c6ca6SDavid S. Miller add %o0, 0x20, %o0 285ae2c6ca6SDavid S. Miller2: andcc %o2, 0x18, %o5 286ae2c6ca6SDavid S. Miller be,pt %icc, 3f 287ae2c6ca6SDavid S. Miller sub %o2, %o5, %o2 288ae2c6ca6SDavid S. Miller1: EX_LD(LOAD(ldx, %o1 + 0x00, %g1)) 289ae2c6ca6SDavid S. Miller add %o1, 0x08, %o1 290ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 291ae2c6ca6SDavid S. Miller subcc %o5, 0x08, %o5 292ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 293ae2c6ca6SDavid S. Miller EX_ST(STORE(stx, %g1, %o0 - 0x08)) 294ae2c6ca6SDavid S. Miller3: brz,pt %o2, .Lexit 295ae2c6ca6SDavid S. Miller cmp %o2, 0x04 296ae2c6ca6SDavid S. Miller bl,pn %icc, .Ltiny 297ae2c6ca6SDavid S. Miller nop 298ae2c6ca6SDavid S. Miller EX_LD(LOAD(lduw, %o1 + 0x00, %g1)) 299ae2c6ca6SDavid S. Miller add %o1, 0x04, %o1 300ae2c6ca6SDavid S. Miller add %o0, 0x04, %o0 301ae2c6ca6SDavid S. Miller subcc %o2, 0x04, %o2 302ae2c6ca6SDavid S. Miller bne,pn %icc, .Ltiny 303ae2c6ca6SDavid S. Miller EX_ST(STORE(stw, %g1, %o0 - 0x04)) 304ae2c6ca6SDavid S. Miller ba,a,pt %icc, .Lexit 305ae2c6ca6SDavid S. Miller.Lmedium_unaligned: 306ae2c6ca6SDavid S. Miller /* First get dest 8 byte aligned. */ 307ae2c6ca6SDavid S. Miller sub %g0, %o0, %g1 308ae2c6ca6SDavid S. Miller and %g1, 0x7, %g1 309ae2c6ca6SDavid S. Miller brz,pt %g1, 2f 310ae2c6ca6SDavid S. Miller sub %o2, %g1, %o2 311ae2c6ca6SDavid S. Miller 312ae2c6ca6SDavid S. Miller1: EX_LD(LOAD(ldub, %o1 + 0x00, %g2)) 313ae2c6ca6SDavid S. Miller add %o1, 1, %o1 314ae2c6ca6SDavid S. Miller subcc %g1, 1, %g1 315ae2c6ca6SDavid S. Miller add %o0, 1, %o0 316ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 317ae2c6ca6SDavid S. Miller EX_ST(STORE(stb, %g2, %o0 - 0x01)) 318ae2c6ca6SDavid S. Miller2: 319ae2c6ca6SDavid S. Miller and %o1, 0x7, %g1 320ae2c6ca6SDavid S. Miller brz,pn %g1, .Lmedium_noprefetch 321ae2c6ca6SDavid S. Miller sll %g1, 3, %g1 322ae2c6ca6SDavid S. Miller mov 64, %g2 323ae2c6ca6SDavid S. Miller sub %g2, %g1, %g2 324ae2c6ca6SDavid S. Miller andn %o1, 0x7, %o1 325ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldx, %o1 + 0x00, %o4)) 326ae2c6ca6SDavid S. Miller sllx %o4, %g1, %o4 327ae2c6ca6SDavid S. Miller andn %o2, 0x08 - 1, %o5 328ae2c6ca6SDavid S. Miller sub %o2, %o5, %o2 329ae2c6ca6SDavid S. Miller1: EX_LD(LOAD(ldx, %o1 + 0x08, %g3)) 330ae2c6ca6SDavid S. Miller add %o1, 0x08, %o1 331ae2c6ca6SDavid S. Miller subcc %o5, 0x08, %o5 332ae2c6ca6SDavid S. Miller srlx %g3, %g2, GLOBAL_SPARE 333ae2c6ca6SDavid S. Miller or GLOBAL_SPARE, %o4, GLOBAL_SPARE 334ae2c6ca6SDavid S. Miller EX_ST(STORE(stx, GLOBAL_SPARE, %o0 + 0x00)) 335ae2c6ca6SDavid S. Miller add %o0, 0x08, %o0 336ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 337ae2c6ca6SDavid S. Miller sllx %g3, %g1, %o4 338ae2c6ca6SDavid S. Miller srl %g1, 3, %g1 339ae2c6ca6SDavid S. Miller add %o1, %g1, %o1 340ae2c6ca6SDavid S. Miller brz,pn %o2, .Lexit 341ae2c6ca6SDavid S. Miller nop 342ae2c6ca6SDavid S. Miller ba,pt %icc, .Lsmall_unaligned 343ae2c6ca6SDavid S. Miller 344ae2c6ca6SDavid S. Miller.Ltiny: 345ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldub, %o1 + 0x00, %g1)) 346ae2c6ca6SDavid S. Miller subcc %o2, 1, %o2 347ae2c6ca6SDavid S. Miller be,pn %icc, .Lexit 348ae2c6ca6SDavid S. Miller EX_ST(STORE(stb, %g1, %o0 + 0x00)) 349ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldub, %o1 + 0x01, %g1)) 350ae2c6ca6SDavid S. Miller subcc %o2, 1, %o2 351ae2c6ca6SDavid S. Miller be,pn %icc, .Lexit 352ae2c6ca6SDavid S. Miller EX_ST(STORE(stb, %g1, %o0 + 0x01)) 353ae2c6ca6SDavid S. Miller EX_LD(LOAD(ldub, %o1 + 0x02, %g1)) 354ae2c6ca6SDavid S. Miller ba,pt %icc, .Lexit 355ae2c6ca6SDavid S. Miller EX_ST(STORE(stb, %g1, %o0 + 0x02)) 356ae2c6ca6SDavid S. Miller 357ae2c6ca6SDavid S. Miller.Lsmall: 358ae2c6ca6SDavid S. Miller andcc %g2, 0x3, %g0 359ae2c6ca6SDavid S. Miller bne,pn %icc, .Lsmall_unaligned 360ae2c6ca6SDavid S. Miller andn %o2, 0x4 - 1, %o5 361ae2c6ca6SDavid S. Miller sub %o2, %o5, %o2 362ae2c6ca6SDavid S. Miller1: 363ae2c6ca6SDavid S. Miller EX_LD(LOAD(lduw, %o1 + 0x00, %g1)) 364ae2c6ca6SDavid S. Miller add %o1, 0x04, %o1 365ae2c6ca6SDavid S. Miller subcc %o5, 0x04, %o5 366ae2c6ca6SDavid S. Miller add %o0, 0x04, %o0 367ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 368ae2c6ca6SDavid S. Miller EX_ST(STORE(stw, %g1, %o0 - 0x04)) 369ae2c6ca6SDavid S. Miller brz,pt %o2, .Lexit 370ae2c6ca6SDavid S. Miller nop 371ae2c6ca6SDavid S. Miller ba,a,pt %icc, .Ltiny 372ae2c6ca6SDavid S. Miller 373ae2c6ca6SDavid S. Miller.Lsmall_unaligned: 374ae2c6ca6SDavid S. Miller1: EX_LD(LOAD(ldub, %o1 + 0x00, %g1)) 375ae2c6ca6SDavid S. Miller add %o1, 1, %o1 376ae2c6ca6SDavid S. Miller add %o0, 1, %o0 377ae2c6ca6SDavid S. Miller subcc %o2, 1, %o2 378ae2c6ca6SDavid S. Miller bne,pt %icc, 1b 379ae2c6ca6SDavid S. Miller EX_ST(STORE(stb, %g1, %o0 - 0x01)) 380ae2c6ca6SDavid S. Miller ba,a,pt %icc, .Lexit 381ae2c6ca6SDavid S. Miller .size FUNC_NAME, .-FUNC_NAME 382