^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0-or-later */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * arch/ia64/lib/xor.S
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Optimized RAID-5 checksumming functions for IA-64.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <asm/asmmacro.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) GLOBAL_ENTRY(xor_ia64_2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) .prologue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) .fframe 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) .save ar.pfs, r31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) alloc r31 = ar.pfs, 3, 0, 13, 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) .save ar.lc, r30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) mov r30 = ar.lc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) .save pr, r29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) mov r29 = pr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) .body
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) mov r8 = in1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) mov ar.ec = 6 + 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) shr in0 = in0, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) adds in0 = -1, in0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) mov r16 = in1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) mov r17 = in2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) mov ar.lc = in0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) mov pr.rot = 1 << 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) .rotr s1[6+1], s2[6+1], d[2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) .rotp p[6+2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) (p[0]) ld8.nta s1[0] = [r16], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) (p[0]) ld8.nta s2[0] = [r17], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) (p[6]) xor d[0] = s1[6], s2[6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) (p[6+1])st8.nta [r8] = d[1], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) nop.f 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) br.ctop.dptk.few 0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) mov ar.lc = r30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) mov pr = r29, -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) br.ret.sptk.few rp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) END(xor_ia64_2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) EXPORT_SYMBOL(xor_ia64_2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) GLOBAL_ENTRY(xor_ia64_3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) .prologue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) .fframe 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) .save ar.pfs, r31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) alloc r31 = ar.pfs, 4, 0, 20, 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) .save ar.lc, r30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) mov r30 = ar.lc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) .save pr, r29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) mov r29 = pr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) .body
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) mov r8 = in1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) mov ar.ec = 6 + 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) shr in0 = in0, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) adds in0 = -1, in0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) mov r16 = in1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) mov r17 = in2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) mov r18 = in3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) mov ar.lc = in0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) mov pr.rot = 1 << 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) .rotr s1[6+1], s2[6+1], s3[6+1], d[2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) .rotp p[6+2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) (p[0]) ld8.nta s1[0] = [r16], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) (p[0]) ld8.nta s2[0] = [r17], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) (p[6]) xor d[0] = s1[6], s2[6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) (p[0]) ld8.nta s3[0] = [r18], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) (p[6+1])st8.nta [r8] = d[1], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) (p[6]) xor d[0] = d[0], s3[6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) br.ctop.dptk.few 0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) mov ar.lc = r30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) mov pr = r29, -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) br.ret.sptk.few rp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) END(xor_ia64_3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) EXPORT_SYMBOL(xor_ia64_3)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) GLOBAL_ENTRY(xor_ia64_4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .prologue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) .fframe 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .save ar.pfs, r31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) alloc r31 = ar.pfs, 5, 0, 27, 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .save ar.lc, r30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) mov r30 = ar.lc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .save pr, r29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) mov r29 = pr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .body
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) mov r8 = in1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) mov ar.ec = 6 + 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) shr in0 = in0, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) adds in0 = -1, in0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) mov r16 = in1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) mov r17 = in2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) mov r18 = in3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) mov ar.lc = in0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) mov pr.rot = 1 << 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) mov r19 = in4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) .rotr s1[6+1], s2[6+1], s3[6+1], s4[6+1], d[2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) .rotp p[6+2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) (p[0]) ld8.nta s1[0] = [r16], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) (p[0]) ld8.nta s2[0] = [r17], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) (p[6]) xor d[0] = s1[6], s2[6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) (p[0]) ld8.nta s3[0] = [r18], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) (p[0]) ld8.nta s4[0] = [r19], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) (p[6]) xor r20 = s3[6], s4[6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) (p[6+1])st8.nta [r8] = d[1], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) (p[6]) xor d[0] = d[0], r20
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) br.ctop.dptk.few 0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) mov ar.lc = r30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) mov pr = r29, -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) br.ret.sptk.few rp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) END(xor_ia64_4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) EXPORT_SYMBOL(xor_ia64_4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) GLOBAL_ENTRY(xor_ia64_5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) .prologue
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) .fframe 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) .save ar.pfs, r31
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) alloc r31 = ar.pfs, 6, 0, 34, 40
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) .save ar.lc, r30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) mov r30 = ar.lc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) .save pr, r29
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) mov r29 = pr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) .body
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) mov r8 = in1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) mov ar.ec = 6 + 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) shr in0 = in0, 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) adds in0 = -1, in0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) mov r16 = in1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) mov r17 = in2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) mov r18 = in3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) mov ar.lc = in0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) mov pr.rot = 1 << 16
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) mov r19 = in4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) mov r20 = in5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) .rotr s1[6+1], s2[6+1], s3[6+1], s4[6+1], s5[6+1], d[2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) .rotp p[6+2]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) 0:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) (p[0]) ld8.nta s1[0] = [r16], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) (p[0]) ld8.nta s2[0] = [r17], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) (p[6]) xor d[0] = s1[6], s2[6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) (p[0]) ld8.nta s3[0] = [r18], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) (p[0]) ld8.nta s4[0] = [r19], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) (p[6]) xor r21 = s3[6], s4[6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) (p[0]) ld8.nta s5[0] = [r20], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) (p[6+1])st8.nta [r8] = d[1], 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) (p[6]) xor d[0] = d[0], r21
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) (p[6]) xor d[0] = d[0], s5[6]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) nop.f 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) br.ctop.dptk.few 0b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) ;;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) mov ar.lc = r30
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) mov pr = r29, -1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) br.ret.sptk.few rp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) END(xor_ia64_5)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) EXPORT_SYMBOL(xor_ia64_5)