cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

xor.S (16228B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2/*
      3 * arch/sparc64/lib/xor.S
      4 *
      5 * High speed xor_block operation for RAID4/5 utilizing the
      6 * UltraSparc Visual Instruction Set and Niagara store-init/twin-load.
      7 *
      8 * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
      9 * Copyright (C) 2006 David S. Miller <davem@davemloft.net>
     10 */
     11
     12#include <linux/linkage.h>
     13#include <asm/visasm.h>
     14#include <asm/asi.h>
     15#include <asm/dcu.h>
     16#include <asm/spitfire.h>
     17#include <asm/export.h>
     18
     19/*
     20 *	Requirements:
     21 *	!(((long)dest | (long)sourceN) & (64 - 1)) &&
     22 *	!(len & 127) && len >= 256
     23 */
     24	.text
     25
     26	/* VIS versions. */
     27ENTRY(xor_vis_2)
     28	rd	%fprs, %o5
     29	andcc	%o5, FPRS_FEF|FPRS_DU, %g0
     30	be,pt	%icc, 0f
     31	 sethi	%hi(VISenter), %g1
     32	jmpl	%g1 + %lo(VISenter), %g7
     33	 add	%g7, 8, %g7
     340:	wr	%g0, FPRS_FEF, %fprs
     35	rd	%asi, %g1
     36	wr	%g0, ASI_BLK_P, %asi
     37	membar	#LoadStore|#StoreLoad|#StoreStore
     38	sub	%o0, 128, %o0
     39	ldda	[%o1] %asi, %f0
     40	ldda	[%o2] %asi, %f16
     41
     422:	ldda	[%o1 + 64] %asi, %f32
     43	fxor	%f0, %f16, %f16
     44	fxor	%f2, %f18, %f18
     45	fxor	%f4, %f20, %f20
     46	fxor	%f6, %f22, %f22
     47	fxor	%f8, %f24, %f24
     48	fxor	%f10, %f26, %f26
     49	fxor	%f12, %f28, %f28
     50	fxor	%f14, %f30, %f30
     51	stda	%f16, [%o1] %asi
     52	ldda	[%o2 + 64] %asi, %f48
     53	ldda	[%o1 + 128] %asi, %f0
     54	fxor	%f32, %f48, %f48
     55	fxor	%f34, %f50, %f50
     56	add	%o1, 128, %o1
     57	fxor	%f36, %f52, %f52
     58	add	%o2, 128, %o2
     59	fxor	%f38, %f54, %f54
     60	subcc	%o0, 128, %o0
     61	fxor	%f40, %f56, %f56
     62	fxor	%f42, %f58, %f58
     63	fxor	%f44, %f60, %f60
     64	fxor	%f46, %f62, %f62
     65	stda	%f48, [%o1 - 64] %asi
     66	bne,pt	%xcc, 2b
     67	 ldda	[%o2] %asi, %f16
     68
     69	ldda	[%o1 + 64] %asi, %f32
     70	fxor	%f0, %f16, %f16
     71	fxor	%f2, %f18, %f18
     72	fxor	%f4, %f20, %f20
     73	fxor	%f6, %f22, %f22
     74	fxor	%f8, %f24, %f24
     75	fxor	%f10, %f26, %f26
     76	fxor	%f12, %f28, %f28
     77	fxor	%f14, %f30, %f30
     78	stda	%f16, [%o1] %asi
     79	ldda	[%o2 + 64] %asi, %f48
     80	membar	#Sync
     81	fxor	%f32, %f48, %f48
     82	fxor	%f34, %f50, %f50
     83	fxor	%f36, %f52, %f52
     84	fxor	%f38, %f54, %f54
     85	fxor	%f40, %f56, %f56
     86	fxor	%f42, %f58, %f58
     87	fxor	%f44, %f60, %f60
     88	fxor	%f46, %f62, %f62
     89	stda	%f48, [%o1 + 64] %asi
     90	membar	#Sync|#StoreStore|#StoreLoad
     91	wr	%g1, %g0, %asi
     92	retl
     93	  wr	%g0, 0, %fprs
     94ENDPROC(xor_vis_2)
     95EXPORT_SYMBOL(xor_vis_2)
     96
     97ENTRY(xor_vis_3)
     98	rd	%fprs, %o5
     99	andcc	%o5, FPRS_FEF|FPRS_DU, %g0
    100	be,pt	%icc, 0f
    101	 sethi	%hi(VISenter), %g1
    102	jmpl	%g1 + %lo(VISenter), %g7
    103	 add	%g7, 8, %g7
    1040:	wr	%g0, FPRS_FEF, %fprs
    105	rd	%asi, %g1
    106	wr	%g0, ASI_BLK_P, %asi
    107	membar	#LoadStore|#StoreLoad|#StoreStore
    108	sub	%o0, 64, %o0
    109	ldda	[%o1] %asi, %f0
    110	ldda	[%o2] %asi, %f16
    111
    1123:	ldda	[%o3] %asi, %f32
    113	fxor	%f0, %f16, %f48
    114	fxor	%f2, %f18, %f50
    115	add	%o1, 64, %o1
    116	fxor	%f4, %f20, %f52
    117	fxor	%f6, %f22, %f54
    118	add	%o2, 64, %o2
    119	fxor	%f8, %f24, %f56
    120	fxor	%f10, %f26, %f58
    121	fxor	%f12, %f28, %f60
    122	fxor	%f14, %f30, %f62
    123	ldda	[%o1] %asi, %f0
    124	fxor	%f48, %f32, %f48
    125	fxor	%f50, %f34, %f50
    126	fxor	%f52, %f36, %f52
    127	fxor	%f54, %f38, %f54
    128	add	%o3, 64, %o3
    129	fxor	%f56, %f40, %f56
    130	fxor	%f58, %f42, %f58
    131	subcc	%o0, 64, %o0
    132	fxor	%f60, %f44, %f60
    133	fxor	%f62, %f46, %f62
    134	stda	%f48, [%o1 - 64] %asi
    135	bne,pt	%xcc, 3b
    136	 ldda	[%o2] %asi, %f16
    137
    138	ldda	[%o3] %asi, %f32
    139	fxor	%f0, %f16, %f48
    140	fxor	%f2, %f18, %f50
    141	fxor	%f4, %f20, %f52
    142	fxor	%f6, %f22, %f54
    143	fxor	%f8, %f24, %f56
    144	fxor	%f10, %f26, %f58
    145	fxor	%f12, %f28, %f60
    146	fxor	%f14, %f30, %f62
    147	membar	#Sync
    148	fxor	%f48, %f32, %f48
    149	fxor	%f50, %f34, %f50
    150	fxor	%f52, %f36, %f52
    151	fxor	%f54, %f38, %f54
    152	fxor	%f56, %f40, %f56
    153	fxor	%f58, %f42, %f58
    154	fxor	%f60, %f44, %f60
    155	fxor	%f62, %f46, %f62
    156	stda	%f48, [%o1] %asi
    157	membar	#Sync|#StoreStore|#StoreLoad
    158	wr	%g1, %g0, %asi
    159	retl
    160	 wr	%g0, 0, %fprs
    161ENDPROC(xor_vis_3)
    162EXPORT_SYMBOL(xor_vis_3)
    163
    164ENTRY(xor_vis_4)
    165	rd	%fprs, %o5
    166	andcc	%o5, FPRS_FEF|FPRS_DU, %g0
    167	be,pt	%icc, 0f
    168	 sethi	%hi(VISenter), %g1
    169	jmpl	%g1 + %lo(VISenter), %g7
    170	 add	%g7, 8, %g7
    1710:	wr	%g0, FPRS_FEF, %fprs
    172	rd	%asi, %g1
    173	wr	%g0, ASI_BLK_P, %asi
    174	membar	#LoadStore|#StoreLoad|#StoreStore
    175	sub	%o0, 64, %o0
    176	ldda	[%o1] %asi, %f0
    177	ldda	[%o2] %asi, %f16
    178
    1794:	ldda	[%o3] %asi, %f32
    180	fxor	%f0, %f16, %f16
    181	fxor	%f2, %f18, %f18
    182	add	%o1, 64, %o1
    183	fxor	%f4, %f20, %f20
    184	fxor	%f6, %f22, %f22
    185	add	%o2, 64, %o2
    186	fxor	%f8, %f24, %f24
    187	fxor	%f10, %f26, %f26
    188	fxor	%f12, %f28, %f28
    189	fxor	%f14, %f30, %f30
    190	ldda	[%o4] %asi, %f48
    191	fxor	%f16, %f32, %f32
    192	fxor	%f18, %f34, %f34
    193	fxor	%f20, %f36, %f36
    194	fxor	%f22, %f38, %f38
    195	add	%o3, 64, %o3
    196	fxor	%f24, %f40, %f40
    197	fxor	%f26, %f42, %f42
    198	fxor	%f28, %f44, %f44
    199	fxor	%f30, %f46, %f46
    200	ldda	[%o1] %asi, %f0
    201	fxor	%f32, %f48, %f48
    202	fxor	%f34, %f50, %f50
    203	fxor	%f36, %f52, %f52
    204	add	%o4, 64, %o4
    205	fxor	%f38, %f54, %f54
    206	fxor	%f40, %f56, %f56
    207	fxor	%f42, %f58, %f58
    208	subcc	%o0, 64, %o0
    209	fxor	%f44, %f60, %f60
    210	fxor	%f46, %f62, %f62
    211	stda	%f48, [%o1 - 64] %asi
    212	bne,pt	%xcc, 4b
    213	 ldda	[%o2] %asi, %f16
    214
    215	ldda	[%o3] %asi, %f32
    216	fxor	%f0, %f16, %f16
    217	fxor	%f2, %f18, %f18
    218	fxor	%f4, %f20, %f20
    219	fxor	%f6, %f22, %f22
    220	fxor	%f8, %f24, %f24
    221	fxor	%f10, %f26, %f26
    222	fxor	%f12, %f28, %f28
    223	fxor	%f14, %f30, %f30
    224	ldda	[%o4] %asi, %f48
    225	fxor	%f16, %f32, %f32
    226	fxor	%f18, %f34, %f34
    227	fxor	%f20, %f36, %f36
    228	fxor	%f22, %f38, %f38
    229	fxor	%f24, %f40, %f40
    230	fxor	%f26, %f42, %f42
    231	fxor	%f28, %f44, %f44
    232	fxor	%f30, %f46, %f46
    233	membar	#Sync
    234	fxor	%f32, %f48, %f48
    235	fxor	%f34, %f50, %f50
    236	fxor	%f36, %f52, %f52
    237	fxor	%f38, %f54, %f54
    238	fxor	%f40, %f56, %f56
    239	fxor	%f42, %f58, %f58
    240	fxor	%f44, %f60, %f60
    241	fxor	%f46, %f62, %f62
    242	stda	%f48, [%o1] %asi
    243	membar	#Sync|#StoreStore|#StoreLoad
    244	wr	%g1, %g0, %asi
    245	retl
    246	 wr	%g0, 0, %fprs
    247ENDPROC(xor_vis_4)
    248EXPORT_SYMBOL(xor_vis_4)
    249
    250ENTRY(xor_vis_5)
    251	save	%sp, -192, %sp
    252	rd	%fprs, %o5
    253	andcc	%o5, FPRS_FEF|FPRS_DU, %g0
    254	be,pt	%icc, 0f
    255	 sethi	%hi(VISenter), %g1
    256	jmpl	%g1 + %lo(VISenter), %g7
    257	 add	%g7, 8, %g7
    2580:	wr	%g0, FPRS_FEF, %fprs
    259	rd	%asi, %g1
    260	wr	%g0, ASI_BLK_P, %asi
    261	membar	#LoadStore|#StoreLoad|#StoreStore
    262	sub	%i0, 64, %i0
    263	ldda	[%i1] %asi, %f0
    264	ldda	[%i2] %asi, %f16
    265
    2665:	ldda	[%i3] %asi, %f32
    267	fxor	%f0, %f16, %f48
    268	fxor	%f2, %f18, %f50
    269	add	%i1, 64, %i1
    270	fxor	%f4, %f20, %f52
    271	fxor	%f6, %f22, %f54
    272	add	%i2, 64, %i2
    273	fxor	%f8, %f24, %f56
    274	fxor	%f10, %f26, %f58
    275	fxor	%f12, %f28, %f60
    276	fxor	%f14, %f30, %f62
    277	ldda	[%i4] %asi, %f16
    278	fxor	%f48, %f32, %f48
    279	fxor	%f50, %f34, %f50
    280	fxor	%f52, %f36, %f52
    281	fxor	%f54, %f38, %f54
    282	add	%i3, 64, %i3
    283	fxor	%f56, %f40, %f56
    284	fxor	%f58, %f42, %f58
    285	fxor	%f60, %f44, %f60
    286	fxor	%f62, %f46, %f62
    287	ldda	[%i5] %asi, %f32
    288	fxor	%f48, %f16, %f48
    289	fxor	%f50, %f18, %f50
    290	add	%i4, 64, %i4
    291	fxor	%f52, %f20, %f52
    292	fxor	%f54, %f22, %f54
    293	add	%i5, 64, %i5
    294	fxor	%f56, %f24, %f56
    295	fxor	%f58, %f26, %f58
    296	fxor	%f60, %f28, %f60
    297	fxor	%f62, %f30, %f62
    298	ldda	[%i1] %asi, %f0
    299	fxor	%f48, %f32, %f48
    300	fxor	%f50, %f34, %f50
    301	fxor	%f52, %f36, %f52
    302	fxor	%f54, %f38, %f54
    303	fxor	%f56, %f40, %f56
    304	fxor	%f58, %f42, %f58
    305	subcc	%i0, 64, %i0
    306	fxor	%f60, %f44, %f60
    307	fxor	%f62, %f46, %f62
    308	stda	%f48, [%i1 - 64] %asi
    309	bne,pt	%xcc, 5b
    310	 ldda	[%i2] %asi, %f16
    311
    312	ldda	[%i3] %asi, %f32
    313	fxor	%f0, %f16, %f48
    314	fxor	%f2, %f18, %f50
    315	fxor	%f4, %f20, %f52
    316	fxor	%f6, %f22, %f54
    317	fxor	%f8, %f24, %f56
    318	fxor	%f10, %f26, %f58
    319	fxor	%f12, %f28, %f60
    320	fxor	%f14, %f30, %f62
    321	ldda	[%i4] %asi, %f16
    322	fxor	%f48, %f32, %f48
    323	fxor	%f50, %f34, %f50
    324	fxor	%f52, %f36, %f52
    325	fxor	%f54, %f38, %f54
    326	fxor	%f56, %f40, %f56
    327	fxor	%f58, %f42, %f58
    328	fxor	%f60, %f44, %f60
    329	fxor	%f62, %f46, %f62
    330	ldda	[%i5] %asi, %f32
    331	fxor	%f48, %f16, %f48
    332	fxor	%f50, %f18, %f50
    333	fxor	%f52, %f20, %f52
    334	fxor	%f54, %f22, %f54
    335	fxor	%f56, %f24, %f56
    336	fxor	%f58, %f26, %f58
    337	fxor	%f60, %f28, %f60
    338	fxor	%f62, %f30, %f62
    339	membar	#Sync
    340	fxor	%f48, %f32, %f48
    341	fxor	%f50, %f34, %f50
    342	fxor	%f52, %f36, %f52
    343	fxor	%f54, %f38, %f54
    344	fxor	%f56, %f40, %f56
    345	fxor	%f58, %f42, %f58
    346	fxor	%f60, %f44, %f60
    347	fxor	%f62, %f46, %f62
    348	stda	%f48, [%i1] %asi
    349	membar	#Sync|#StoreStore|#StoreLoad
    350	wr	%g1, %g0, %asi
    351	wr	%g0, 0, %fprs
    352	ret
    353	 restore
    354ENDPROC(xor_vis_5)
    355EXPORT_SYMBOL(xor_vis_5)
    356
    357	/* Niagara versions. */
    358ENTRY(xor_niagara_2) /* %o0=bytes, %o1=dest, %o2=src */
    359	save		%sp, -192, %sp
    360	prefetch	[%i1], #n_writes
    361	prefetch	[%i2], #one_read
    362	rd		%asi, %g7
    363	wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
    364	srlx		%i0, 6, %g1
    365	mov		%i1, %i0
    366	mov		%i2, %i1
    3671:	ldda		[%i1 + 0x00] %asi, %i2	/* %i2/%i3 = src  + 0x00 */
    368	ldda		[%i1 + 0x10] %asi, %i4	/* %i4/%i5 = src  + 0x10 */
    369	ldda		[%i1 + 0x20] %asi, %g2	/* %g2/%g3 = src  + 0x20 */
    370	ldda		[%i1 + 0x30] %asi, %l0	/* %l0/%l1 = src  + 0x30 */
    371	prefetch	[%i1 + 0x40], #one_read
    372	ldda		[%i0 + 0x00] %asi, %o0  /* %o0/%o1 = dest + 0x00 */
    373	ldda		[%i0 + 0x10] %asi, %o2  /* %o2/%o3 = dest + 0x10 */
    374	ldda		[%i0 + 0x20] %asi, %o4  /* %o4/%o5 = dest + 0x20 */
    375	ldda		[%i0 + 0x30] %asi, %l2  /* %l2/%l3 = dest + 0x30 */
    376	prefetch	[%i0 + 0x40], #n_writes
    377	xor		%o0, %i2, %o0
    378	xor		%o1, %i3, %o1
    379	stxa		%o0, [%i0 + 0x00] %asi
    380	stxa		%o1, [%i0 + 0x08] %asi
    381	xor		%o2, %i4, %o2
    382	xor		%o3, %i5, %o3
    383	stxa		%o2, [%i0 + 0x10] %asi
    384	stxa		%o3, [%i0 + 0x18] %asi
    385	xor		%o4, %g2, %o4
    386	xor		%o5, %g3, %o5
    387	stxa		%o4, [%i0 + 0x20] %asi
    388	stxa		%o5, [%i0 + 0x28] %asi
    389	xor		%l2, %l0, %l2
    390	xor		%l3, %l1, %l3
    391	stxa		%l2, [%i0 + 0x30] %asi
    392	stxa		%l3, [%i0 + 0x38] %asi
    393	add		%i0, 0x40, %i0
    394	subcc		%g1, 1, %g1
    395	bne,pt		%xcc, 1b
    396	 add		%i1, 0x40, %i1
    397	membar		#Sync
    398	wr		%g7, 0x0, %asi
    399	ret
    400	 restore
    401ENDPROC(xor_niagara_2)
    402EXPORT_SYMBOL(xor_niagara_2)
    403
    404ENTRY(xor_niagara_3) /* %o0=bytes, %o1=dest, %o2=src1, %o3=src2 */
    405	save		%sp, -192, %sp
    406	prefetch	[%i1], #n_writes
    407	prefetch	[%i2], #one_read
    408	prefetch	[%i3], #one_read
    409	rd		%asi, %g7
    410	wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
    411	srlx		%i0, 6, %g1
    412	mov		%i1, %i0
    413	mov		%i2, %i1
    414	mov		%i3, %l7
    4151:	ldda		[%i1 + 0x00] %asi, %i2	/* %i2/%i3 = src1 + 0x00 */
    416	ldda		[%i1 + 0x10] %asi, %i4	/* %i4/%i5 = src1 + 0x10 */
    417	ldda		[%l7 + 0x00] %asi, %g2	/* %g2/%g3 = src2 + 0x00 */
    418	ldda		[%l7 + 0x10] %asi, %l0	/* %l0/%l1 = src2 + 0x10 */
    419	ldda		[%i0 + 0x00] %asi, %o0  /* %o0/%o1 = dest + 0x00 */
    420	ldda		[%i0 + 0x10] %asi, %o2  /* %o2/%o3 = dest + 0x10 */
    421	xor		%g2, %i2, %g2
    422	xor		%g3, %i3, %g3
    423	xor		%o0, %g2, %o0
    424	xor		%o1, %g3, %o1
    425	stxa		%o0, [%i0 + 0x00] %asi
    426	stxa		%o1, [%i0 + 0x08] %asi
    427	ldda		[%i1 + 0x20] %asi, %i2	/* %i2/%i3 = src1 + 0x20 */
    428	ldda		[%l7 + 0x20] %asi, %g2	/* %g2/%g3 = src2 + 0x20 */
    429	ldda		[%i0 + 0x20] %asi, %o0	/* %o0/%o1 = dest + 0x20 */
    430	xor		%l0, %i4, %l0
    431	xor		%l1, %i5, %l1
    432	xor		%o2, %l0, %o2
    433	xor		%o3, %l1, %o3
    434	stxa		%o2, [%i0 + 0x10] %asi
    435	stxa		%o3, [%i0 + 0x18] %asi
    436	ldda		[%i1 + 0x30] %asi, %i4	/* %i4/%i5 = src1 + 0x30 */
    437	ldda		[%l7 + 0x30] %asi, %l0	/* %l0/%l1 = src2 + 0x30 */
    438	ldda		[%i0 + 0x30] %asi, %o2	/* %o2/%o3 = dest + 0x30 */
    439	prefetch	[%i1 + 0x40], #one_read
    440	prefetch	[%l7 + 0x40], #one_read
    441	prefetch	[%i0 + 0x40], #n_writes
    442	xor		%g2, %i2, %g2
    443	xor		%g3, %i3, %g3
    444	xor		%o0, %g2, %o0
    445	xor		%o1, %g3, %o1
    446	stxa		%o0, [%i0 + 0x20] %asi
    447	stxa		%o1, [%i0 + 0x28] %asi
    448	xor		%l0, %i4, %l0
    449	xor		%l1, %i5, %l1
    450	xor		%o2, %l0, %o2
    451	xor		%o3, %l1, %o3
    452	stxa		%o2, [%i0 + 0x30] %asi
    453	stxa		%o3, [%i0 + 0x38] %asi
    454	add		%i0, 0x40, %i0
    455	add		%i1, 0x40, %i1
    456	subcc		%g1, 1, %g1
    457	bne,pt		%xcc, 1b
    458	 add		%l7, 0x40, %l7
    459	membar		#Sync
    460	wr		%g7, 0x0, %asi
    461	ret
    462	 restore
    463ENDPROC(xor_niagara_3)
    464EXPORT_SYMBOL(xor_niagara_3)
    465
    466ENTRY(xor_niagara_4) /* %o0=bytes, %o1=dest, %o2=src1, %o3=src2, %o4=src3 */
    467	save		%sp, -192, %sp
    468	prefetch	[%i1], #n_writes
    469	prefetch	[%i2], #one_read
    470	prefetch	[%i3], #one_read
    471	prefetch	[%i4], #one_read
    472	rd		%asi, %g7
    473	wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
    474	srlx		%i0, 6, %g1
    475	mov		%i1, %i0
    476	mov		%i2, %i1
    477	mov		%i3, %l7
    478	mov		%i4, %l6
    4791:	ldda		[%i1 + 0x00] %asi, %i2	/* %i2/%i3 = src1 + 0x00 */
    480	ldda		[%l7 + 0x00] %asi, %i4	/* %i4/%i5 = src2 + 0x00 */
    481	ldda		[%l6 + 0x00] %asi, %g2	/* %g2/%g3 = src3 + 0x00 */
    482	ldda		[%i0 + 0x00] %asi, %l0	/* %l0/%l1 = dest + 0x00 */
    483	xor		%i4, %i2, %i4
    484	xor		%i5, %i3, %i5
    485	ldda		[%i1 + 0x10] %asi, %i2	/* %i2/%i3 = src1 + 0x10 */
    486	xor		%g2, %i4, %g2
    487	xor		%g3, %i5, %g3
    488	ldda		[%l7 + 0x10] %asi, %i4	/* %i4/%i5 = src2 + 0x10 */
    489	xor		%l0, %g2, %l0
    490	xor		%l1, %g3, %l1
    491	stxa		%l0, [%i0 + 0x00] %asi
    492	stxa		%l1, [%i0 + 0x08] %asi
    493	ldda		[%l6 + 0x10] %asi, %g2	/* %g2/%g3 = src3 + 0x10 */
    494	ldda		[%i0 + 0x10] %asi, %l0	/* %l0/%l1 = dest + 0x10 */
    495
    496	xor		%i4, %i2, %i4
    497	xor		%i5, %i3, %i5
    498	ldda		[%i1 + 0x20] %asi, %i2	/* %i2/%i3 = src1 + 0x20 */
    499	xor		%g2, %i4, %g2
    500	xor		%g3, %i5, %g3
    501	ldda		[%l7 + 0x20] %asi, %i4	/* %i4/%i5 = src2 + 0x20 */
    502	xor		%l0, %g2, %l0
    503	xor		%l1, %g3, %l1
    504	stxa		%l0, [%i0 + 0x10] %asi
    505	stxa		%l1, [%i0 + 0x18] %asi
    506	ldda		[%l6 + 0x20] %asi, %g2	/* %g2/%g3 = src3 + 0x20 */
    507	ldda		[%i0 + 0x20] %asi, %l0	/* %l0/%l1 = dest + 0x20 */
    508
    509	xor		%i4, %i2, %i4
    510	xor		%i5, %i3, %i5
    511	ldda		[%i1 + 0x30] %asi, %i2	/* %i2/%i3 = src1 + 0x30 */
    512	xor		%g2, %i4, %g2
    513	xor		%g3, %i5, %g3
    514	ldda		[%l7 + 0x30] %asi, %i4	/* %i4/%i5 = src2 + 0x30 */
    515	xor		%l0, %g2, %l0
    516	xor		%l1, %g3, %l1
    517	stxa		%l0, [%i0 + 0x20] %asi
    518	stxa		%l1, [%i0 + 0x28] %asi
    519	ldda		[%l6 + 0x30] %asi, %g2	/* %g2/%g3 = src3 + 0x30 */
    520	ldda		[%i0 + 0x30] %asi, %l0	/* %l0/%l1 = dest + 0x30 */
    521
    522	prefetch	[%i1 + 0x40], #one_read
    523	prefetch	[%l7 + 0x40], #one_read
    524	prefetch	[%l6 + 0x40], #one_read
    525	prefetch	[%i0 + 0x40], #n_writes
    526
    527	xor		%i4, %i2, %i4
    528	xor		%i5, %i3, %i5
    529	xor		%g2, %i4, %g2
    530	xor		%g3, %i5, %g3
    531	xor		%l0, %g2, %l0
    532	xor		%l1, %g3, %l1
    533	stxa		%l0, [%i0 + 0x30] %asi
    534	stxa		%l1, [%i0 + 0x38] %asi
    535
    536	add		%i0, 0x40, %i0
    537	add		%i1, 0x40, %i1
    538	add		%l7, 0x40, %l7
    539	subcc		%g1, 1, %g1
    540	bne,pt		%xcc, 1b
    541	 add		%l6, 0x40, %l6
    542	membar		#Sync
    543	wr		%g7, 0x0, %asi
    544	ret
    545	 restore
    546ENDPROC(xor_niagara_4)
    547EXPORT_SYMBOL(xor_niagara_4)
    548
    549ENTRY(xor_niagara_5) /* %o0=bytes, %o1=dest, %o2=src1, %o3=src2, %o4=src3, %o5=src4 */
    550	save		%sp, -192, %sp
    551	prefetch	[%i1], #n_writes
    552	prefetch	[%i2], #one_read
    553	prefetch	[%i3], #one_read
    554	prefetch	[%i4], #one_read
    555	prefetch	[%i5], #one_read
    556	rd		%asi, %g7
    557	wr		%g0, ASI_BLK_INIT_QUAD_LDD_P, %asi
    558	srlx		%i0, 6, %g1
    559	mov		%i1, %i0
    560	mov		%i2, %i1
    561	mov		%i3, %l7
    562	mov		%i4, %l6
    563	mov		%i5, %l5
    5641:	ldda		[%i1 + 0x00] %asi, %i2	/* %i2/%i3 = src1 + 0x00 */
    565	ldda		[%l7 + 0x00] %asi, %i4	/* %i4/%i5 = src2 + 0x00 */
    566	ldda		[%l6 + 0x00] %asi, %g2	/* %g2/%g3 = src3 + 0x00 */
    567	ldda		[%l5 + 0x00] %asi, %l0	/* %l0/%l1 = src4 + 0x00 */
    568	ldda		[%i0 + 0x00] %asi, %l2	/* %l2/%l3 = dest + 0x00 */
    569	xor		%i4, %i2, %i4
    570	xor		%i5, %i3, %i5
    571	ldda		[%i1 + 0x10] %asi, %i2	/* %i2/%i3 = src1 + 0x10 */
    572	xor		%g2, %i4, %g2
    573	xor		%g3, %i5, %g3
    574	ldda		[%l7 + 0x10] %asi, %i4	/* %i4/%i5 = src2 + 0x10 */
    575	xor		%l0, %g2, %l0
    576	xor		%l1, %g3, %l1
    577	ldda		[%l6 + 0x10] %asi, %g2	/* %g2/%g3 = src3 + 0x10 */
    578	xor		%l2, %l0, %l2
    579	xor		%l3, %l1, %l3
    580	stxa		%l2, [%i0 + 0x00] %asi
    581	stxa		%l3, [%i0 + 0x08] %asi
    582	ldda		[%l5 + 0x10] %asi, %l0	/* %l0/%l1 = src4 + 0x10 */
    583	ldda		[%i0 + 0x10] %asi, %l2	/* %l2/%l3 = dest + 0x10 */
    584
    585	xor		%i4, %i2, %i4
    586	xor		%i5, %i3, %i5
    587	ldda		[%i1 + 0x20] %asi, %i2	/* %i2/%i3 = src1 + 0x20 */
    588	xor		%g2, %i4, %g2
    589	xor		%g3, %i5, %g3
    590	ldda		[%l7 + 0x20] %asi, %i4	/* %i4/%i5 = src2 + 0x20 */
    591	xor		%l0, %g2, %l0
    592	xor		%l1, %g3, %l1
    593	ldda		[%l6 + 0x20] %asi, %g2	/* %g2/%g3 = src3 + 0x20 */
    594	xor		%l2, %l0, %l2
    595	xor		%l3, %l1, %l3
    596	stxa		%l2, [%i0 + 0x10] %asi
    597	stxa		%l3, [%i0 + 0x18] %asi
    598	ldda		[%l5 + 0x20] %asi, %l0	/* %l0/%l1 = src4 + 0x20 */
    599	ldda		[%i0 + 0x20] %asi, %l2	/* %l2/%l3 = dest + 0x20 */
    600
    601	xor		%i4, %i2, %i4
    602	xor		%i5, %i3, %i5
    603	ldda		[%i1 + 0x30] %asi, %i2	/* %i2/%i3 = src1 + 0x30 */
    604	xor		%g2, %i4, %g2
    605	xor		%g3, %i5, %g3
    606	ldda		[%l7 + 0x30] %asi, %i4	/* %i4/%i5 = src2 + 0x30 */
    607	xor		%l0, %g2, %l0
    608	xor		%l1, %g3, %l1
    609	ldda		[%l6 + 0x30] %asi, %g2	/* %g2/%g3 = src3 + 0x30 */
    610	xor		%l2, %l0, %l2
    611	xor		%l3, %l1, %l3
    612	stxa		%l2, [%i0 + 0x20] %asi
    613	stxa		%l3, [%i0 + 0x28] %asi
    614	ldda		[%l5 + 0x30] %asi, %l0	/* %l0/%l1 = src4 + 0x30 */
    615	ldda		[%i0 + 0x30] %asi, %l2	/* %l2/%l3 = dest + 0x30 */
    616
    617	prefetch	[%i1 + 0x40], #one_read
    618	prefetch	[%l7 + 0x40], #one_read
    619	prefetch	[%l6 + 0x40], #one_read
    620	prefetch	[%l5 + 0x40], #one_read
    621	prefetch	[%i0 + 0x40], #n_writes
    622
    623	xor		%i4, %i2, %i4
    624	xor		%i5, %i3, %i5
    625	xor		%g2, %i4, %g2
    626	xor		%g3, %i5, %g3
    627	xor		%l0, %g2, %l0
    628	xor		%l1, %g3, %l1
    629	xor		%l2, %l0, %l2
    630	xor		%l3, %l1, %l3
    631	stxa		%l2, [%i0 + 0x30] %asi
    632	stxa		%l3, [%i0 + 0x38] %asi
    633
    634	add		%i0, 0x40, %i0
    635	add		%i1, 0x40, %i1
    636	add		%l7, 0x40, %l7
    637	add		%l6, 0x40, %l6
    638	subcc		%g1, 1, %g1
    639	bne,pt		%xcc, 1b
    640	 add		%l5, 0x40, %l5
    641	membar		#Sync
    642	wr		%g7, 0x0, %asi
    643	ret
    644	 restore
    645ENDPROC(xor_niagara_5)
    646EXPORT_SYMBOL(xor_niagara_5)