@@ -106,6 +106,69 @@ define void @ctlz_v4i64(ptr %src, ptr %dst) nounwind {
106106 ret void
107107}
108108
109+ define void @not_ctlz_v32i8 (ptr %src , ptr %dst ) nounwind {
110+ ; CHECK-LABEL: not_ctlz_v32i8:
111+ ; CHECK: # %bb.0:
112+ ; CHECK-NEXT: xvld $xr0, $a0, 0
113+ ; CHECK-NEXT: xvxori.b $xr0, $xr0, 255
114+ ; CHECK-NEXT: xvclz.b $xr0, $xr0
115+ ; CHECK-NEXT: xvst $xr0, $a1, 0
116+ ; CHECK-NEXT: ret
117+ %v = load <32 x i8 >, ptr %src
118+ %neg = xor <32 x i8 > %v , <i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 , i8 -1 >
119+ %res = call <32 x i8 > @llvm.ctlz.v32i8 (<32 x i8 > %neg , i1 false )
120+ store <32 x i8 > %res , ptr %dst
121+ ret void
122+ }
123+
124+ define void @not_ctlz_v16i16 (ptr %src , ptr %dst ) nounwind {
125+ ; CHECK-LABEL: not_ctlz_v16i16:
126+ ; CHECK: # %bb.0:
127+ ; CHECK-NEXT: xvld $xr0, $a0, 0
128+ ; CHECK-NEXT: xvrepli.b $xr1, -1
129+ ; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
130+ ; CHECK-NEXT: xvclz.h $xr0, $xr0
131+ ; CHECK-NEXT: xvst $xr0, $a1, 0
132+ ; CHECK-NEXT: ret
133+ %v = load <16 x i16 >, ptr %src
134+ %neg = xor <16 x i16 > %v , <i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 , i16 -1 >
135+ %res = call <16 x i16 > @llvm.ctlz.v16i16 (<16 x i16 > %neg , i1 false )
136+ store <16 x i16 > %res , ptr %dst
137+ ret void
138+ }
139+
140+ define void @not_ctlz_v8i32 (ptr %src , ptr %dst ) nounwind {
141+ ; CHECK-LABEL: not_ctlz_v8i32:
142+ ; CHECK: # %bb.0:
143+ ; CHECK-NEXT: xvld $xr0, $a0, 0
144+ ; CHECK-NEXT: xvrepli.b $xr1, -1
145+ ; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
146+ ; CHECK-NEXT: xvclz.w $xr0, $xr0
147+ ; CHECK-NEXT: xvst $xr0, $a1, 0
148+ ; CHECK-NEXT: ret
149+ %v = load <8 x i32 >, ptr %src
150+ %neg = xor <8 x i32 > %v , <i32 -1 , i32 -1 , i32 -1 , i32 -1 , i32 -1 , i32 -1 , i32 -1 , i32 -1 >
151+ %res = call <8 x i32 > @llvm.ctlz.v8i32 (<8 x i32 > %neg , i1 false )
152+ store <8 x i32 > %res , ptr %dst
153+ ret void
154+ }
155+
156+ define void @not_ctlz_v4i64 (ptr %src , ptr %dst ) nounwind {
157+ ; CHECK-LABEL: not_ctlz_v4i64:
158+ ; CHECK: # %bb.0:
159+ ; CHECK-NEXT: xvld $xr0, $a0, 0
160+ ; CHECK-NEXT: xvrepli.b $xr1, -1
161+ ; CHECK-NEXT: xvxor.v $xr0, $xr0, $xr1
162+ ; CHECK-NEXT: xvclz.d $xr0, $xr0
163+ ; CHECK-NEXT: xvst $xr0, $a1, 0
164+ ; CHECK-NEXT: ret
165+ %v = load <4 x i64 >, ptr %src
166+ %neg = xor <4 x i64 > %v , <i64 -1 , i64 -1 , i64 -1 , i64 -1 >
167+ %res = call <4 x i64 > @llvm.ctlz.v4i64 (<4 x i64 > %neg , i1 false )
168+ store <4 x i64 > %res , ptr %dst
169+ ret void
170+ }
171+
109172declare <32 x i8 > @llvm.ctpop.v32i8 (<32 x i8 >)
110173declare <16 x i16 > @llvm.ctpop.v16i16 (<16 x i16 >)
111174declare <8 x i32 > @llvm.ctpop.v8i32 (<8 x i32 >)
0 commit comments