0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <asm/export.h>
0010
0011 #define HI_MAGIC 0x8080808080808080
0012 #define LO_MAGIC 0x0101010101010101
0013 #define ASI_PL 0x88
0014
0015 .text
0016 .align 32
0017 .globl __memscan_zero, __memscan_generic
0018 .type __memscan_zero,#function
0019 .type __memscan_generic,#function
0020 .globl memscan
0021 EXPORT_SYMBOL(__memscan_zero)
0022 EXPORT_SYMBOL(__memscan_generic)
0023
0024 __memscan_zero:
0025
0026 brlez,pn %o1, szzero
0027 andcc %o0, 7, %g0
0028 be,pt %icc, we_are_aligned
0029 sethi %hi(HI_MAGIC), %o4
0030 ldub [%o0], %o5
0031 1: subcc %o1, 1, %o1
0032 brz,pn %o5, 10f
0033 add %o0, 1, %o0
0034
0035 be,pn %xcc, szzero
0036 andcc %o0, 7, %g0
0037 bne,a,pn %icc, 1b
0038 ldub [%o0], %o5
0039 we_are_aligned:
0040 ldxa [%o0] ASI_PL, %o5
0041 or %o4, %lo(HI_MAGIC), %o3
0042 sllx %o3, 32, %o4
0043 or %o4, %o3, %o3
0044
0045 srlx %o3, 7, %o2
0046 msloop:
0047 sub %o1, 8, %o1
0048 add %o0, 8, %o0
0049 sub %o5, %o2, %o4
0050 xor %o4, %o5, %o4
0051 andcc %o4, %o3, %g3
0052 bne,pn %xcc, check_bytes
0053 srlx %o4, 32, %g3
0054
0055 brgz,a,pt %o1, msloop
0056 ldxa [%o0] ASI_PL, %o5
0057 check_bytes:
0058 bne,a,pn %icc, 2f
0059 andcc %o5, 0xff, %g0
0060 add %o0, -5, %g2
0061 ba,pt %xcc, 3f
0062 srlx %o5, 32, %g7
0063
0064 2: srlx %o5, 8, %g7
0065 be,pn %icc, 1f
0066 add %o0, -8, %g2
0067 andcc %g7, 0xff, %g0
0068 srlx %g7, 8, %g7
0069 be,pn %icc, 1f
0070 inc %g2
0071 andcc %g7, 0xff, %g0
0072
0073 srlx %g7, 8, %g7
0074 be,pn %icc, 1f
0075 inc %g2
0076 andcc %g7, 0xff, %g0
0077 srlx %g7, 8, %g7
0078 be,pn %icc, 1f
0079 inc %g2
0080 andcc %g3, %o3, %g0
0081
0082 be,a,pn %icc, 2f
0083 mov %o0, %g2
0084 3: andcc %g7, 0xff, %g0
0085 srlx %g7, 8, %g7
0086 be,pn %icc, 1f
0087 inc %g2
0088 andcc %g7, 0xff, %g0
0089 srlx %g7, 8, %g7
0090
0091 be,pn %icc, 1f
0092 inc %g2
0093 andcc %g7, 0xff, %g0
0094 srlx %g7, 8, %g7
0095 be,pn %icc, 1f
0096 inc %g2
0097 andcc %g7, 0xff, %g0
0098 srlx %g7, 8, %g7
0099
0100 be,pn %icc, 1f
0101 inc %g2
0102 2: brgz,a,pt %o1, msloop
0103 ldxa [%o0] ASI_PL, %o5
0104 inc %g2
0105 1: add %o0, %o1, %o0
0106 cmp %g2, %o0
0107 retl
0108
0109 movle %xcc, %g2, %o0
0110 10: retl
0111 sub %o0, 1, %o0
0112 szzero: retl
0113 nop
0114
0115 memscan:
0116 __memscan_generic:
0117
0118 brz,pn %o2, 3f
0119 add %o0, %o2, %o3
0120 ldub [%o0], %o5
0121 sub %g0, %o2, %o4
0122 1:
0123 cmp %o5, %o1
0124 be,pn %icc, 2f
0125 addcc %o4, 1, %o4
0126 bne,a,pt %xcc, 1b
0127 ldub [%o3 + %o4], %o5
0128 retl
0129
0130 2:
0131 add %o3, %o4, %o0
0132 retl
0133 sub %o0, 1, %o0
0134 3:
0135 retl
0136 nop