^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /* csum_copy.S: Checksum+copy code for sparc64
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Copyright (C) 2005 David S. Miller <davem@davemloft.net>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <asm/export.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #ifdef __KERNEL__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #define GLOBAL_SPARE %g7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define GLOBAL_SPARE %g5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #ifndef EX_LD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #define EX_LD(x) x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #ifndef EX_ST
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define EX_ST(x) x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #ifndef EX_RETVAL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define EX_RETVAL(x) x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #ifndef LOAD
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define LOAD(type,addr,dest) type [addr], dest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #ifndef STORE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define STORE(type,src,addr) type src, [addr]
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #ifndef FUNC_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define FUNC_NAME csum_partial_copy_nocheck
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) .register %g2, #scratch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) .register %g3, #scratch
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) .text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) 90:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* We checked for zero length already, so there must be
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) * at least one byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) be,pt %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) EX_LD(LOAD(ldub, %o0 + 0x00, %o4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) sub %o2, 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) EX_ST(STORE(stb, %o4, %o1 + 0x00))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) add %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) 1: andcc %o0, 0x2, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) be,pn %icc, 80f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) cmp %o2, 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) blu,pn %icc, 60f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) EX_LD(LOAD(lduh, %o0 + 0x00, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) add %o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) sub %o2, 2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) EX_ST(STORE(sth, %o5, %o1 + 0x00))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) add %o1, 2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) ba,pt %xcc, 80f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) add %o5, %o4, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) .globl FUNC_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) .type FUNC_NAME,#function
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) EXPORT_SYMBOL(FUNC_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) FUNC_NAME: /* %o0=src, %o1=dst, %o2=len */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) LOAD(prefetch, %o0 + 0x000, #n_reads)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) xor %o0, %o1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) mov -1, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) clr %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) andcc %g1, 0x3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) bne,pn %icc, 95f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) LOAD(prefetch, %o0 + 0x040, #n_reads)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) brz,pn %o2, 70f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) andcc %o0, 0x3, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /* We "remember" whether the lowest bit in the address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * was set in GLOBAL_SPARE. Because if it is, we have to swap
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) * upper and lower 8 bit fields of the sum we calculate.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) bne,pn %icc, 90b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) andcc %o0, 0x1, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) 80:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) LOAD(prefetch, %o0 + 0x080, #n_reads)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) andncc %o2, 0x3f, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) LOAD(prefetch, %o0 + 0x0c0, #n_reads)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) sub %o2, %g3, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) brz,pn %g3, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) LOAD(prefetch, %o0 + 0x100, #n_reads)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) /* So that we don't need to use the non-pairing
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * add-with-carry instructions we accumulate 32-bit
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * values into a 64-bit register. At the end of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * loop we fold it down to 32-bits and so on.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) ba,pt %xcc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) LOAD(prefetch, %o0 + 0x140, #n_reads)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) .align 32
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) 1: EX_LD(LOAD(lduw, %o0 + 0x00, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) EX_LD(LOAD(lduw, %o0 + 0x04, %g1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) EX_LD(LOAD(lduw, %o0 + 0x08, %g2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) EX_ST(STORE(stw, %o5, %o1 + 0x00))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) EX_LD(LOAD(lduw, %o0 + 0x0c, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) add %o4, %g1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) EX_ST(STORE(stw, %g1, %o1 + 0x04))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) EX_LD(LOAD(lduw, %o0 + 0x10, %g1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) add %o4, %g2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) EX_ST(STORE(stw, %g2, %o1 + 0x08))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) EX_LD(LOAD(lduw, %o0 + 0x14, %g2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) EX_ST(STORE(stw, %o5, %o1 + 0x0c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) EX_LD(LOAD(lduw, %o0 + 0x18, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) add %o4, %g1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) EX_ST(STORE(stw, %g1, %o1 + 0x10))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) EX_LD(LOAD(lduw, %o0 + 0x1c, %g1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) add %o4, %g2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) EX_ST(STORE(stw, %g2, %o1 + 0x14))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) EX_LD(LOAD(lduw, %o0 + 0x20, %g2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) EX_ST(STORE(stw, %o5, %o1 + 0x18))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) EX_LD(LOAD(lduw, %o0 + 0x24, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) add %o4, %g1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) EX_ST(STORE(stw, %g1, %o1 + 0x1c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) EX_LD(LOAD(lduw, %o0 + 0x28, %g1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) add %o4, %g2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) EX_ST(STORE(stw, %g2, %o1 + 0x20))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) EX_LD(LOAD(lduw, %o0 + 0x2c, %g2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) EX_ST(STORE(stw, %o5, %o1 + 0x24))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) EX_LD(LOAD(lduw, %o0 + 0x30, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) add %o4, %g1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) EX_ST(STORE(stw, %g1, %o1 + 0x28))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) EX_LD(LOAD(lduw, %o0 + 0x34, %g1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) add %o4, %g2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) EX_ST(STORE(stw, %g2, %o1 + 0x2c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) EX_LD(LOAD(lduw, %o0 + 0x38, %g2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) EX_ST(STORE(stw, %o5, %o1 + 0x30))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) EX_LD(LOAD(lduw, %o0 + 0x3c, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) add %o4, %g1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) EX_ST(STORE(stw, %g1, %o1 + 0x34))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) LOAD(prefetch, %o0 + 0x180, #n_reads)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) add %o4, %g2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) EX_ST(STORE(stw, %g2, %o1 + 0x38))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) subcc %g3, 0x40, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) add %o0, 0x40, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) EX_ST(STORE(stw, %o5, %o1 + 0x3c))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) bne,pt %icc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) add %o1, 0x40, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) 2: and %o2, 0x3c, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) brz,pn %g3, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) sub %o2, %g3, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) 1: EX_LD(LOAD(lduw, %o0 + 0x00, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) subcc %g3, 0x4, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) add %o0, 0x4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) EX_ST(STORE(stw, %o5, %o1 + 0x00))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) bne,pt %icc, 1b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) add %o1, 0x4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) 2:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) /* fold 64-->32 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) srlx %o4, 32, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) srl %o4, 0, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) srlx %o4, 32, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) srl %o4, 0, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) /* fold 32-->16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) sethi %hi(0xffff0000), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) srl %o4, 16, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) andn %o4, %g1, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) add %o5, %g2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) srl %o4, 16, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) andn %o4, %g1, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) add %o5, %g2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) 60:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) /* %o4 has the 16-bit sum we have calculated so-far. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) cmp %o2, 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) blu,pt %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) EX_LD(LOAD(lduh, %o0 + 0x00, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) sub %o2, 2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) add %o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) EX_ST(STORE(sth, %o5, %o1 + 0x00))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) add %o1, 0x2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) 1: brz,pt %o2, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) EX_LD(LOAD(ldub, %o0 + 0x00, %o5))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) sub %o2, 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) EX_ST(STORE(stb, %o5, %o1 + 0x00))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) sllx %o5, 8, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) add %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) add %o4, %o5, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) 1:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) /* fold 32-->16 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) sethi %hi(0xffff0000), %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) srl %o4, 16, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) andn %o4, %g1, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) add %o5, %g2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) srl %o4, 16, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) andn %o4, %g1, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) add %o5, %g2, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) 1: brz,pt GLOBAL_SPARE, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) nop
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) /* We started with an odd byte, byte-swap the result. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) srl %o4, 8, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) and %o4, 0xff, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) sll %g1, 8, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) or %o5, %g1, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) 1: addcc %o3, %o4, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) addc %g0, %o3, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) 70:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) srl %o3, 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) 95: mov 0, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) brlez,pn %o2, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) andcc %o0, 1, %o5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) be,a,pt %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) srl %o2, 1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) sub %o2, 1, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) EX_LD(LOAD(ldub, %o0, GLOBAL_SPARE))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) add %o0, 1, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) EX_ST(STORE(stb, GLOBAL_SPARE, %o1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) srl %o2, 1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) add %o1, 1, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) 1: brz,a,pn %g1, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) andcc %o2, 1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) andcc %o0, 2, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) be,a,pt %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) srl %g1, 1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) EX_LD(LOAD(lduh, %o0, %o4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) sub %o2, 2, %o2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) srl %o4, 8, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) sub %g1, 1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) EX_ST(STORE(stb, %g2, %o1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) add %o4, GLOBAL_SPARE, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) EX_ST(STORE(stb, %o4, %o1 + 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) add %o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) srl %g1, 1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) add %o1, 2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) 1: brz,a,pn %g1, 2f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) andcc %o2, 2, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) EX_LD(LOAD(lduw, %o0, %o4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) 5: srl %o4, 24, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) srl %o4, 16, %g3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) EX_ST(STORE(stb, %g2, %o1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) srl %o4, 8, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) EX_ST(STORE(stb, %g3, %o1 + 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) add %o0, 4, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) EX_ST(STORE(stb, %g2, %o1 + 2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) addcc %o4, GLOBAL_SPARE, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) EX_ST(STORE(stb, %o4, %o1 + 3))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) addc GLOBAL_SPARE, %g0, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) add %o1, 4, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) subcc %g1, 1, %g1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) bne,a,pt %icc, 5b
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279) EX_LD(LOAD(lduw, %o0, %o4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) sll GLOBAL_SPARE, 16, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) srl GLOBAL_SPARE, 16, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) srl %g2, 16, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) andcc %o2, 2, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) add %g2, GLOBAL_SPARE, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) 2: be,a,pt %icc, 3f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) andcc %o2, 1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) EX_LD(LOAD(lduh, %o0, %o4))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) andcc %o2, 1, %g0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) srl %o4, 8, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) add %o0, 2, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) EX_ST(STORE(stb, %g2, %o1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) add GLOBAL_SPARE, %o4, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) EX_ST(STORE(stb, %o4, %o1 + 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) add %o1, 2, %o1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) 3: be,a,pt %icc, 1f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) sll GLOBAL_SPARE, 16, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) EX_LD(LOAD(ldub, %o0, %g2))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) sll %g2, 8, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) EX_ST(STORE(stb, %g2, %o1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) add GLOBAL_SPARE, %o4, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) sll GLOBAL_SPARE, 16, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) 1: addcc %o4, GLOBAL_SPARE, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) srl GLOBAL_SPARE, 16, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) addc %g0, %o4, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) brz,pt %o5, 4f
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) srl GLOBAL_SPARE, 8, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) and GLOBAL_SPARE, 0xff, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) and %o4, 0xff, %o4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) sll %g2, 8, %g2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) or %g2, %o4, GLOBAL_SPARE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) 4: addcc %o3, GLOBAL_SPARE, %o3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) addc %g0, %o3, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) retl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) srl %o0, 0, %o0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) .size FUNC_NAME, .-FUNC_NAME