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