xor.h
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:10k
- /*
- * include/asm-sparc64/xor.h
- *
- * High speed xor_block operation for RAID4/5 utilizing the
- * UltraSparc Visual Instruction Set.
- *
- * Copyright (C) 1997, 1999 Jakub Jelinek (jj@ultra.linux.cz)
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2, or (at your option)
- * any later version.
- *
- * You should have received a copy of the GNU General Public License
- * (for example /usr/src/linux/COPYING); if not, write to the Free
- * Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
- */
- /*
- * Requirements:
- * !(((long)dest | (long)sourceN) & (64 - 1)) &&
- * !(len & 127) && len >= 256
- *
- * It is done in pure assembly, as otherwise gcc makes it a non-leaf
- * function, which is not what we want.
- */
- #include <asm/pstate.h>
- #include <asm/asi.h>
- extern void xor_vis_2(unsigned long, unsigned long *, unsigned long *);
- extern void xor_vis_3(unsigned long, unsigned long *, unsigned long *,
- unsigned long *);
- extern void xor_vis_4(unsigned long, unsigned long *, unsigned long *,
- unsigned long *, unsigned long *);
- extern void xor_vis_5(unsigned long, unsigned long *, unsigned long *,
- unsigned long *, unsigned long *, unsigned long *);
- #define _S(x) __S(x)
- #define __S(x) #x
- #define DEF(x) __asm__(#x " = " _S(x))
- DEF(FPRS_FEF);
- DEF(FPRS_DU);
- DEF(ASI_BLK_P);
- /* ??? We set and use %asi instead of using ASI_BLK_P directly because gas
- currently does not accept symbolic constants for the ASI specifier. */
- __asm__ ("n
- .textn
- .globl xor_vis_2n
- .type xor_vis_2,@functionn
- xor_vis_2:n
- rd %fprs, %o5n
- andcc %o5, FPRS_FEF|FPRS_DU, %g0n
- be,pt %icc, 0fn
- sethi %hi(VISenter), %g1n
- jmpl %g1 + %lo(VISenter), %g7n
- add %g7, 8, %g7n
- 0: wr %g0, FPRS_FEF, %fprsn
- rd %asi, %g1n
- wr %g0, ASI_BLK_P, %asin
- membar #LoadStore|#StoreLoad|#StoreStoren
- sub %o0, 128, %o0n
- ldda [%o1] %asi, %f0n
- ldda [%o2] %asi, %f16n
- n
- 2: ldda [%o1 + 64] %asi, %f32n
- fxor %f0, %f16, %f16n
- fxor %f2, %f18, %f18n
- fxor %f4, %f20, %f20n
- fxor %f6, %f22, %f22n
- fxor %f8, %f24, %f24n
- fxor %f10, %f26, %f26n
- fxor %f12, %f28, %f28n
- fxor %f14, %f30, %f30n
- stda %f16, [%o1] %asin
- ldda [%o2 + 64] %asi, %f48n
- ldda [%o1 + 128] %asi, %f0n
- fxor %f32, %f48, %f48n
- fxor %f34, %f50, %f50n
- add %o1, 128, %o1n
- fxor %f36, %f52, %f52n
- add %o2, 128, %o2n
- fxor %f38, %f54, %f54n
- subcc %o0, 128, %o0n
- fxor %f40, %f56, %f56n
- fxor %f42, %f58, %f58n
- fxor %f44, %f60, %f60n
- fxor %f46, %f62, %f62n
- stda %f48, [%o1 - 64] %asin
- bne,pt %xcc, 2bn
- ldda [%o2] %asi, %f16n
- n
- ldda [%o1 + 64] %asi, %f32n
- fxor %f0, %f16, %f16n
- fxor %f2, %f18, %f18n
- fxor %f4, %f20, %f20n
- fxor %f6, %f22, %f22n
- fxor %f8, %f24, %f24n
- fxor %f10, %f26, %f26n
- fxor %f12, %f28, %f28n
- fxor %f14, %f30, %f30n
- stda %f16, [%o1] %asin
- ldda [%o2 + 64] %asi, %f48n
- membar #Syncn
- fxor %f32, %f48, %f48n
- fxor %f34, %f50, %f50n
- fxor %f36, %f52, %f52n
- fxor %f38, %f54, %f54n
- fxor %f40, %f56, %f56n
- fxor %f42, %f58, %f58n
- fxor %f44, %f60, %f60n
- fxor %f46, %f62, %f62n
- stda %f48, [%o1 + 64] %asin
- membar #Sync|#StoreStore|#StoreLoadn
- wr %g1, %g0, %asin
- retln
- wr %g0, 0, %fprsn
- .size xor_vis_2, .-xor_vis_2n
- n
- n
- .globl xor_vis_3n
- .type xor_vis_3,@functionn
- xor_vis_3:n
- rd %fprs, %o5n
- andcc %o5, FPRS_FEF|FPRS_DU, %g0n
- be,pt %icc, 0fn
- sethi %hi(VISenter), %g1n
- jmpl %g1 + %lo(VISenter), %g7n
- add %g7, 8, %g7n
- 0: wr %g0, FPRS_FEF, %fprsn
- rd %asi, %g1n
- wr %g0, ASI_BLK_P, %asin
- membar #LoadStore|#StoreLoad|#StoreStoren
- sub %o0, 64, %o0n
- ldda [%o1] %asi, %f0n
- ldda [%o2] %asi, %f16n
- n
- 3: ldda [%o3] %asi, %f32n
- fxor %f0, %f16, %f48n
- fxor %f2, %f18, %f50n
- add %o1, 64, %o1n
- fxor %f4, %f20, %f52n
- fxor %f6, %f22, %f54n
- add %o2, 64, %o2n
- fxor %f8, %f24, %f56n
- fxor %f10, %f26, %f58n
- fxor %f12, %f28, %f60n
- fxor %f14, %f30, %f62n
- ldda [%o1] %asi, %f0n
- fxor %f48, %f32, %f48n
- fxor %f50, %f34, %f50n
- fxor %f52, %f36, %f52n
- fxor %f54, %f38, %f54n
- add %o3, 64, %o3n
- fxor %f56, %f40, %f56n
- fxor %f58, %f42, %f58n
- subcc %o0, 64, %o0n
- fxor %f60, %f44, %f60n
- fxor %f62, %f46, %f62n
- stda %f48, [%o1 - 64] %asin
- bne,pt %xcc, 3bn
- ldda [%o2] %asi, %f16n
- n
- ldda [%o3] %asi, %f32n
- fxor %f0, %f16, %f48n
- fxor %f2, %f18, %f50n
- fxor %f4, %f20, %f52n
- fxor %f6, %f22, %f54n
- fxor %f8, %f24, %f56n
- fxor %f10, %f26, %f58n
- fxor %f12, %f28, %f60n
- fxor %f14, %f30, %f62n
- membar #Syncn
- fxor %f48, %f32, %f48n
- fxor %f50, %f34, %f50n
- fxor %f52, %f36, %f52n
- fxor %f54, %f38, %f54n
- fxor %f56, %f40, %f56n
- fxor %f58, %f42, %f58n
- fxor %f60, %f44, %f60n
- fxor %f62, %f46, %f62n
- stda %f48, [%o1] %asin
- membar #Sync|#StoreStore|#StoreLoadn
- wr %g1, %g0, %asin
- retln
- wr %g0, 0, %fprsn
- .size xor_vis_3, .-xor_vis_3n
- n
- n
- .globl xor_vis_4n
- .type xor_vis_4,@functionn
- xor_vis_4:n
- rd %fprs, %o5n
- andcc %o5, FPRS_FEF|FPRS_DU, %g0n
- be,pt %icc, 0fn
- sethi %hi(VISenter), %g1n
- jmpl %g1 + %lo(VISenter), %g7n
- add %g7, 8, %g7n
- 0: wr %g0, FPRS_FEF, %fprsn
- rd %asi, %g1n
- wr %g0, ASI_BLK_P, %asin
- membar #LoadStore|#StoreLoad|#StoreStoren
- sub %o0, 64, %o0n
- ldda [%o1] %asi, %f0n
- ldda [%o2] %asi, %f16n
- n
- 4: ldda [%o3] %asi, %f32n
- fxor %f0, %f16, %f16n
- fxor %f2, %f18, %f18n
- add %o1, 64, %o1n
- fxor %f4, %f20, %f20n
- fxor %f6, %f22, %f22n
- add %o2, 64, %o2n
- fxor %f8, %f24, %f24n
- fxor %f10, %f26, %f26n
- fxor %f12, %f28, %f28n
- fxor %f14, %f30, %f30n
- ldda [%o4] %asi, %f48n
- fxor %f16, %f32, %f32n
- fxor %f18, %f34, %f34n
- fxor %f20, %f36, %f36n
- fxor %f22, %f38, %f38n
- add %o3, 64, %o3n
- fxor %f24, %f40, %f40n
- fxor %f26, %f42, %f42n
- fxor %f28, %f44, %f44n
- fxor %f30, %f46, %f46n
- ldda [%o1] %asi, %f0n
- fxor %f32, %f48, %f48n
- fxor %f34, %f50, %f50n
- fxor %f36, %f52, %f52n
- add %o4, 64, %o4n
- fxor %f38, %f54, %f54n
- fxor %f40, %f56, %f56n
- fxor %f42, %f58, %f58n
- subcc %o0, 64, %o0n
- fxor %f44, %f60, %f60n
- fxor %f46, %f62, %f62n
- stda %f48, [%o1 - 64] %asin
- bne,pt %xcc, 4bn
- ldda [%o2] %asi, %f16n
- n
- ldda [%o3] %asi, %f32n
- fxor %f0, %f16, %f16n
- fxor %f2, %f18, %f18n
- fxor %f4, %f20, %f20n
- fxor %f6, %f22, %f22n
- fxor %f8, %f24, %f24n
- fxor %f10, %f26, %f26n
- fxor %f12, %f28, %f28n
- fxor %f14, %f30, %f30n
- ldda [%o4] %asi, %f48n
- fxor %f16, %f32, %f32n
- fxor %f18, %f34, %f34n
- fxor %f20, %f36, %f36n
- fxor %f22, %f38, %f38n
- fxor %f24, %f40, %f40n
- fxor %f26, %f42, %f42n
- fxor %f28, %f44, %f44n
- fxor %f30, %f46, %f46n
- membar #Syncn
- fxor %f32, %f48, %f48n
- fxor %f34, %f50, %f50n
- fxor %f36, %f52, %f52n
- fxor %f38, %f54, %f54n
- fxor %f40, %f56, %f56n
- fxor %f42, %f58, %f58n
- fxor %f44, %f60, %f60n
- fxor %f46, %f62, %f62n
- stda %f48, [%o1] %asin
- membar #Sync|#StoreStore|#StoreLoadn
- wr %g1, %g0, %asin
- retln
- wr %g0, 0, %fprsn
- .size xor_vis_4, .-xor_vis_4n
- n
- n
- .globl xor_vis_5n
- .type xor_vis_5,@functionn
- xor_vis_5:n
- mov %o5, %g5n
- rd %fprs, %o5n
- andcc %o5, FPRS_FEF|FPRS_DU, %g0n
- be,pt %icc, 0fn
- sethi %hi(VISenter), %g1n
- jmpl %g1 + %lo(VISenter), %g7n
- add %g7, 8, %g7n
- 0: wr %g0, FPRS_FEF, %fprsn
- mov %g5, %o5n
- rd %asi, %g1n
- wr %g0, ASI_BLK_P, %asin
- membar #LoadStore|#StoreLoad|#StoreStoren
- sub %o0, 64, %o0n
- ldda [%o1] %asi, %f0n
- ldda [%o2] %asi, %f16n
- n
- 5: ldda [%o3] %asi, %f32n
- fxor %f0, %f16, %f48n
- fxor %f2, %f18, %f50n
- add %o1, 64, %o1n
- fxor %f4, %f20, %f52n
- fxor %f6, %f22, %f54n
- add %o2, 64, %o2n
- fxor %f8, %f24, %f56n
- fxor %f10, %f26, %f58n
- fxor %f12, %f28, %f60n
- fxor %f14, %f30, %f62n
- ldda [%o4] %asi, %f16n
- fxor %f48, %f32, %f48n
- fxor %f50, %f34, %f50n
- fxor %f52, %f36, %f52n
- fxor %f54, %f38, %f54n
- add %o3, 64, %o3n
- fxor %f56, %f40, %f56n
- fxor %f58, %f42, %f58n
- fxor %f60, %f44, %f60n
- fxor %f62, %f46, %f62n
- ldda [%o5] %asi, %f32n
- fxor %f48, %f16, %f48n
- fxor %f50, %f18, %f50n
- add %o4, 64, %o4n
- fxor %f52, %f20, %f52n
- fxor %f54, %f22, %f54n
- add %o5, 64, %o5n
- fxor %f56, %f24, %f56n
- fxor %f58, %f26, %f58n
- fxor %f60, %f28, %f60n
- fxor %f62, %f30, %f62n
- ldda [%o1] %asi, %f0n
- fxor %f48, %f32, %f48n
- fxor %f50, %f34, %f50n
- fxor %f52, %f36, %f52n
- fxor %f54, %f38, %f54n
- fxor %f56, %f40, %f56n
- fxor %f58, %f42, %f58n
- subcc %o0, 64, %o0n
- fxor %f60, %f44, %f60n
- fxor %f62, %f46, %f62n
- stda %f48, [%o1 - 64] %asin
- bne,pt %xcc, 5bn
- ldda [%o2] %asi, %f16n
- n
- ldda [%o3] %asi, %f32n
- fxor %f0, %f16, %f48n
- fxor %f2, %f18, %f50n
- fxor %f4, %f20, %f52n
- fxor %f6, %f22, %f54n
- fxor %f8, %f24, %f56n
- fxor %f10, %f26, %f58n
- fxor %f12, %f28, %f60n
- fxor %f14, %f30, %f62n
- ldda [%o4] %asi, %f16n
- fxor %f48, %f32, %f48n
- fxor %f50, %f34, %f50n
- fxor %f52, %f36, %f52n
- fxor %f54, %f38, %f54n
- fxor %f56, %f40, %f56n
- fxor %f58, %f42, %f58n
- fxor %f60, %f44, %f60n
- fxor %f62, %f46, %f62n
- ldda [%o5] %asi, %f32n
- fxor %f48, %f16, %f48n
- fxor %f50, %f18, %f50n
- fxor %f52, %f20, %f52n
- fxor %f54, %f22, %f54n
- fxor %f56, %f24, %f56n
- fxor %f58, %f26, %f58n
- fxor %f60, %f28, %f60n
- fxor %f62, %f30, %f62n
- membar #Syncn
- fxor %f48, %f32, %f48n
- fxor %f50, %f34, %f50n
- fxor %f52, %f36, %f52n
- fxor %f54, %f38, %f54n
- fxor %f56, %f40, %f56n
- fxor %f58, %f42, %f58n
- fxor %f60, %f44, %f60n
- fxor %f62, %f46, %f62n
- stda %f48, [%o1] %asin
- membar #Sync|#StoreStore|#StoreLoadn
- wr %g1, %g0, %asin
- retln
- wr %g0, 0, %fprsn
- .size xor_vis_5, .-xor_vis_5n
- ");
- static struct xor_block_template xor_block_VIS = {
- name: "VIS",
- do_2: xor_vis_2,
- do_3: xor_vis_3,
- do_4: xor_vis_4,
- do_5: xor_vis_5,
- };
- #define XOR_TRY_TEMPLATES xor_speed(&xor_block_VIS)