1 ; RUN: llc -mtriple=arm64-none-linux-gnu < %s | FileCheck %s 2 3 define <8 x i8> @cmeq8xi8(<8 x i8> %A, <8 x i8> %B) { 4 ;CHECK: cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 5 %tmp3 = icmp eq <8 x i8> %A, %B; 6 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 7 ret <8 x i8> %tmp4 8 } 9 10 define <16 x i8> @cmeq16xi8(<16 x i8> %A, <16 x i8> %B) { 11 ;CHECK: cmeq {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 12 %tmp3 = icmp eq <16 x i8> %A, %B; 13 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 14 ret <16 x i8> %tmp4 15 } 16 17 define <4 x i16> @cmeq4xi16(<4 x i16> %A, <4 x i16> %B) { 18 ;CHECK: cmeq {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h 19 %tmp3 = icmp eq <4 x i16> %A, %B; 20 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 21 ret <4 x i16> %tmp4 22 } 23 24 define <8 x i16> @cmeq8xi16(<8 x i16> %A, <8 x i16> %B) { 25 ;CHECK: cmeq {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h 26 %tmp3 = icmp eq <8 x i16> %A, %B; 27 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 28 ret <8 x i16> %tmp4 29 } 30 31 define <2 x i32> @cmeq2xi32(<2 x i32> %A, <2 x i32> %B) { 32 ;CHECK: cmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s 33 %tmp3 = icmp eq <2 x i32> %A, %B; 34 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 35 ret <2 x i32> %tmp4 36 } 37 38 define <4 x i32> @cmeq4xi32(<4 x i32> %A, <4 x i32> %B) { 39 ;CHECK: cmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s 40 %tmp3 = icmp eq <4 x i32> %A, %B; 41 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 42 ret <4 x i32> %tmp4 43 } 44 45 define <2 x i64> @cmeq2xi64(<2 x i64> %A, <2 x i64> %B) { 46 ;CHECK: cmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d 47 %tmp3 = icmp eq <2 x i64> %A, %B; 48 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 49 ret <2 x i64> %tmp4 50 } 51 52 define <8 x i8> @cmne8xi8(<8 x i8> %A, <8 x i8> %B) { 53 ;CHECK: cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 54 ;CHECK-NEXT: mvn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 55 %tmp3 = icmp ne <8 x i8> %A, %B; 56 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 57 ret <8 x i8> %tmp4 58 } 59 60 define <16 x i8> @cmne16xi8(<16 x i8> %A, <16 x i8> %B) { 61 ;CHECK: cmeq {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 62 ;CHECK-NEXT: mvn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 63 %tmp3 = icmp ne <16 x i8> %A, %B; 64 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 65 ret <16 x i8> %tmp4 66 } 67 68 define <4 x i16> @cmne4xi16(<4 x i16> %A, <4 x i16> %B) { 69 ;CHECK: cmeq {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h 70 ;CHECK-NEXT: mvn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 71 %tmp3 = icmp ne <4 x i16> %A, %B; 72 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 73 ret <4 x i16> %tmp4 74 } 75 76 define <8 x i16> @cmne8xi16(<8 x i16> %A, <8 x i16> %B) { 77 ;CHECK: cmeq {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h 78 ;CHECK-NEXT: mvn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 79 %tmp3 = icmp ne <8 x i16> %A, %B; 80 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 81 ret <8 x i16> %tmp4 82 } 83 84 define <2 x i32> @cmne2xi32(<2 x i32> %A, <2 x i32> %B) { 85 ;CHECK: cmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s 86 ;CHECK-NEXT: mvn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 87 %tmp3 = icmp ne <2 x i32> %A, %B; 88 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 89 ret <2 x i32> %tmp4 90 } 91 92 define <4 x i32> @cmne4xi32(<4 x i32> %A, <4 x i32> %B) { 93 ;CHECK: cmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s 94 ;CHECK-NEXT: mvn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 95 %tmp3 = icmp ne <4 x i32> %A, %B; 96 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 97 ret <4 x i32> %tmp4 98 } 99 100 define <2 x i64> @cmne2xi64(<2 x i64> %A, <2 x i64> %B) { 101 ;CHECK: cmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d 102 ;CHECK-NEXT: mvn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 103 %tmp3 = icmp ne <2 x i64> %A, %B; 104 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 105 ret <2 x i64> %tmp4 106 } 107 108 define <8 x i8> @cmgt8xi8(<8 x i8> %A, <8 x i8> %B) { 109 ;CHECK: cmgt {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 110 %tmp3 = icmp sgt <8 x i8> %A, %B; 111 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 112 ret <8 x i8> %tmp4 113 } 114 115 define <16 x i8> @cmgt16xi8(<16 x i8> %A, <16 x i8> %B) { 116 ;CHECK: cmgt {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 117 %tmp3 = icmp sgt <16 x i8> %A, %B; 118 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 119 ret <16 x i8> %tmp4 120 } 121 122 define <4 x i16> @cmgt4xi16(<4 x i16> %A, <4 x i16> %B) { 123 ;CHECK: cmgt {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h 124 %tmp3 = icmp sgt <4 x i16> %A, %B; 125 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 126 ret <4 x i16> %tmp4 127 } 128 129 define <8 x i16> @cmgt8xi16(<8 x i16> %A, <8 x i16> %B) { 130 ;CHECK: cmgt {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h 131 %tmp3 = icmp sgt <8 x i16> %A, %B; 132 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 133 ret <8 x i16> %tmp4 134 } 135 136 define <2 x i32> @cmgt2xi32(<2 x i32> %A, <2 x i32> %B) { 137 ;CHECK: cmgt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s 138 %tmp3 = icmp sgt <2 x i32> %A, %B; 139 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 140 ret <2 x i32> %tmp4 141 } 142 143 define <4 x i32> @cmgt4xi32(<4 x i32> %A, <4 x i32> %B) { 144 ;CHECK: cmgt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s 145 %tmp3 = icmp sgt <4 x i32> %A, %B; 146 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 147 ret <4 x i32> %tmp4 148 } 149 150 define <2 x i64> @cmgt2xi64(<2 x i64> %A, <2 x i64> %B) { 151 ;CHECK: cmgt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d 152 %tmp3 = icmp sgt <2 x i64> %A, %B; 153 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 154 ret <2 x i64> %tmp4 155 } 156 157 define <8 x i8> @cmlt8xi8(<8 x i8> %A, <8 x i8> %B) { 158 ; Using registers other than v0, v1 are possible, but would be odd. 159 ; LT implemented as GT, so check reversed operands. 160 ;CHECK: cmgt {{v[0-9]+}}.8b, v1.8b, v0.8b 161 %tmp3 = icmp slt <8 x i8> %A, %B; 162 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 163 ret <8 x i8> %tmp4 164 } 165 166 define <16 x i8> @cmlt16xi8(<16 x i8> %A, <16 x i8> %B) { 167 ; Using registers other than v0, v1 are possible, but would be odd. 168 ; LT implemented as GT, so check reversed operands. 169 ;CHECK: cmgt {{v[0-9]+}}.16b, v1.16b, v0.16b 170 %tmp3 = icmp slt <16 x i8> %A, %B; 171 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 172 ret <16 x i8> %tmp4 173 } 174 175 define <4 x i16> @cmlt4xi16(<4 x i16> %A, <4 x i16> %B) { 176 ; Using registers other than v0, v1 are possible, but would be odd. 177 ; LT implemented as GT, so check reversed operands. 178 ;CHECK: cmgt {{v[0-9]+}}.4h, v1.4h, v0.4h 179 %tmp3 = icmp slt <4 x i16> %A, %B; 180 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 181 ret <4 x i16> %tmp4 182 } 183 184 define <8 x i16> @cmlt8xi16(<8 x i16> %A, <8 x i16> %B) { 185 ; Using registers other than v0, v1 are possible, but would be odd. 186 ; LT implemented as GT, so check reversed operands. 187 ;CHECK: cmgt {{v[0-9]+}}.8h, v1.8h, v0.8h 188 %tmp3 = icmp slt <8 x i16> %A, %B; 189 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 190 ret <8 x i16> %tmp4 191 } 192 193 define <2 x i32> @cmlt2xi32(<2 x i32> %A, <2 x i32> %B) { 194 ; Using registers other than v0, v1 are possible, but would be odd. 195 ; LT implemented as GT, so check reversed operands. 196 ;CHECK: cmgt {{v[0-9]+}}.2s, v1.2s, v0.2s 197 %tmp3 = icmp slt <2 x i32> %A, %B; 198 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 199 ret <2 x i32> %tmp4 200 } 201 202 define <4 x i32> @cmlt4xi32(<4 x i32> %A, <4 x i32> %B) { 203 ; Using registers other than v0, v1 are possible, but would be odd. 204 ; LT implemented as GT, so check reversed operands. 205 ;CHECK: cmgt {{v[0-9]+}}.4s, v1.4s, v0.4s 206 %tmp3 = icmp slt <4 x i32> %A, %B; 207 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 208 ret <4 x i32> %tmp4 209 } 210 211 define <2 x i64> @cmlt2xi64(<2 x i64> %A, <2 x i64> %B) { 212 ; Using registers other than v0, v1 are possible, but would be odd. 213 ; LT implemented as GT, so check reversed operands. 214 ;CHECK: cmgt {{v[0-9]+}}.2d, v1.2d, v0.2d 215 %tmp3 = icmp slt <2 x i64> %A, %B; 216 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 217 ret <2 x i64> %tmp4 218 } 219 220 define <8 x i8> @cmge8xi8(<8 x i8> %A, <8 x i8> %B) { 221 ;CHECK: cmge {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 222 %tmp3 = icmp sge <8 x i8> %A, %B; 223 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 224 ret <8 x i8> %tmp4 225 } 226 227 define <16 x i8> @cmge16xi8(<16 x i8> %A, <16 x i8> %B) { 228 ;CHECK: cmge {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 229 %tmp3 = icmp sge <16 x i8> %A, %B; 230 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 231 ret <16 x i8> %tmp4 232 } 233 234 define <4 x i16> @cmge4xi16(<4 x i16> %A, <4 x i16> %B) { 235 ;CHECK: cmge {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h 236 %tmp3 = icmp sge <4 x i16> %A, %B; 237 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 238 ret <4 x i16> %tmp4 239 } 240 241 define <8 x i16> @cmge8xi16(<8 x i16> %A, <8 x i16> %B) { 242 ;CHECK: cmge {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h 243 %tmp3 = icmp sge <8 x i16> %A, %B; 244 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 245 ret <8 x i16> %tmp4 246 } 247 248 define <2 x i32> @cmge2xi32(<2 x i32> %A, <2 x i32> %B) { 249 ;CHECK: cmge {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s 250 %tmp3 = icmp sge <2 x i32> %A, %B; 251 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 252 ret <2 x i32> %tmp4 253 } 254 255 define <4 x i32> @cmge4xi32(<4 x i32> %A, <4 x i32> %B) { 256 ;CHECK: cmge {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s 257 %tmp3 = icmp sge <4 x i32> %A, %B; 258 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 259 ret <4 x i32> %tmp4 260 } 261 262 define <2 x i64> @cmge2xi64(<2 x i64> %A, <2 x i64> %B) { 263 ;CHECK: cmge {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d 264 %tmp3 = icmp sge <2 x i64> %A, %B; 265 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 266 ret <2 x i64> %tmp4 267 } 268 269 define <8 x i8> @cmle8xi8(<8 x i8> %A, <8 x i8> %B) { 270 ; Using registers other than v0, v1 are possible, but would be odd. 271 ; LE implemented as GE, so check reversed operands. 272 ;CHECK: cmge {{v[0-9]+}}.8b, v1.8b, v0.8b 273 %tmp3 = icmp sle <8 x i8> %A, %B; 274 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 275 ret <8 x i8> %tmp4 276 } 277 278 define <16 x i8> @cmle16xi8(<16 x i8> %A, <16 x i8> %B) { 279 ; Using registers other than v0, v1 are possible, but would be odd. 280 ; LE implemented as GE, so check reversed operands. 281 ;CHECK: cmge {{v[0-9]+}}.16b, v1.16b, v0.16b 282 %tmp3 = icmp sle <16 x i8> %A, %B; 283 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 284 ret <16 x i8> %tmp4 285 } 286 287 define <4 x i16> @cmle4xi16(<4 x i16> %A, <4 x i16> %B) { 288 ; Using registers other than v0, v1 are possible, but would be odd. 289 ; LE implemented as GE, so check reversed operands. 290 ;CHECK: cmge {{v[0-9]+}}.4h, v1.4h, v0.4h 291 %tmp3 = icmp sle <4 x i16> %A, %B; 292 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 293 ret <4 x i16> %tmp4 294 } 295 296 define <8 x i16> @cmle8xi16(<8 x i16> %A, <8 x i16> %B) { 297 ; Using registers other than v0, v1 are possible, but would be odd. 298 ; LE implemented as GE, so check reversed operands. 299 ;CHECK: cmge {{v[0-9]+}}.8h, v1.8h, v0.8h 300 %tmp3 = icmp sle <8 x i16> %A, %B; 301 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 302 ret <8 x i16> %tmp4 303 } 304 305 define <2 x i32> @cmle2xi32(<2 x i32> %A, <2 x i32> %B) { 306 ; Using registers other than v0, v1 are possible, but would be odd. 307 ; LE implemented as GE, so check reversed operands. 308 ;CHECK: cmge {{v[0-9]+}}.2s, v1.2s, v0.2s 309 %tmp3 = icmp sle <2 x i32> %A, %B; 310 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 311 ret <2 x i32> %tmp4 312 } 313 314 define <4 x i32> @cmle4xi32(<4 x i32> %A, <4 x i32> %B) { 315 ; Using registers other than v0, v1 are possible, but would be odd. 316 ; LE implemented as GE, so check reversed operands. 317 ;CHECK: cmge {{v[0-9]+}}.4s, v1.4s, v0.4s 318 %tmp3 = icmp sle <4 x i32> %A, %B; 319 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 320 ret <4 x i32> %tmp4 321 } 322 323 define <2 x i64> @cmle2xi64(<2 x i64> %A, <2 x i64> %B) { 324 ; Using registers other than v0, v1 are possible, but would be odd. 325 ; LE implemented as GE, so check reversed operands. 326 ;CHECK: cmge {{v[0-9]+}}.2d, v1.2d, v0.2d 327 %tmp3 = icmp sle <2 x i64> %A, %B; 328 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 329 ret <2 x i64> %tmp4 330 } 331 332 define <8 x i8> @cmhi8xi8(<8 x i8> %A, <8 x i8> %B) { 333 ;CHECK: cmhi {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 334 %tmp3 = icmp ugt <8 x i8> %A, %B; 335 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 336 ret <8 x i8> %tmp4 337 } 338 339 define <16 x i8> @cmhi16xi8(<16 x i8> %A, <16 x i8> %B) { 340 ;CHECK: cmhi {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 341 %tmp3 = icmp ugt <16 x i8> %A, %B; 342 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 343 ret <16 x i8> %tmp4 344 } 345 346 define <4 x i16> @cmhi4xi16(<4 x i16> %A, <4 x i16> %B) { 347 ;CHECK: cmhi {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h 348 %tmp3 = icmp ugt <4 x i16> %A, %B; 349 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 350 ret <4 x i16> %tmp4 351 } 352 353 define <8 x i16> @cmhi8xi16(<8 x i16> %A, <8 x i16> %B) { 354 ;CHECK: cmhi {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h 355 %tmp3 = icmp ugt <8 x i16> %A, %B; 356 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 357 ret <8 x i16> %tmp4 358 } 359 360 define <2 x i32> @cmhi2xi32(<2 x i32> %A, <2 x i32> %B) { 361 ;CHECK: cmhi {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s 362 %tmp3 = icmp ugt <2 x i32> %A, %B; 363 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 364 ret <2 x i32> %tmp4 365 } 366 367 define <4 x i32> @cmhi4xi32(<4 x i32> %A, <4 x i32> %B) { 368 ;CHECK: cmhi {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s 369 %tmp3 = icmp ugt <4 x i32> %A, %B; 370 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 371 ret <4 x i32> %tmp4 372 } 373 374 define <2 x i64> @cmhi2xi64(<2 x i64> %A, <2 x i64> %B) { 375 ;CHECK: cmhi {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d 376 %tmp3 = icmp ugt <2 x i64> %A, %B; 377 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 378 ret <2 x i64> %tmp4 379 } 380 381 define <8 x i8> @cmlo8xi8(<8 x i8> %A, <8 x i8> %B) { 382 ; Using registers other than v0, v1 are possible, but would be odd. 383 ; LO implemented as HI, so check reversed operands. 384 ;CHECK: cmhi {{v[0-9]+}}.8b, v1.8b, v0.8b 385 %tmp3 = icmp ult <8 x i8> %A, %B; 386 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 387 ret <8 x i8> %tmp4 388 } 389 390 define <16 x i8> @cmlo16xi8(<16 x i8> %A, <16 x i8> %B) { 391 ; Using registers other than v0, v1 are possible, but would be odd. 392 ; LO implemented as HI, so check reversed operands. 393 ;CHECK: cmhi {{v[0-9]+}}.16b, v1.16b, v0.16b 394 %tmp3 = icmp ult <16 x i8> %A, %B; 395 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 396 ret <16 x i8> %tmp4 397 } 398 399 define <4 x i16> @cmlo4xi16(<4 x i16> %A, <4 x i16> %B) { 400 ; Using registers other than v0, v1 are possible, but would be odd. 401 ; LO implemented as HI, so check reversed operands. 402 ;CHECK: cmhi {{v[0-9]+}}.4h, v1.4h, v0.4h 403 %tmp3 = icmp ult <4 x i16> %A, %B; 404 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 405 ret <4 x i16> %tmp4 406 } 407 408 define <8 x i16> @cmlo8xi16(<8 x i16> %A, <8 x i16> %B) { 409 ; Using registers other than v0, v1 are possible, but would be odd. 410 ; LO implemented as HI, so check reversed operands. 411 ;CHECK: cmhi {{v[0-9]+}}.8h, v1.8h, v0.8h 412 %tmp3 = icmp ult <8 x i16> %A, %B; 413 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 414 ret <8 x i16> %tmp4 415 } 416 417 define <2 x i32> @cmlo2xi32(<2 x i32> %A, <2 x i32> %B) { 418 ; Using registers other than v0, v1 are possible, but would be odd. 419 ; LO implemented as HI, so check reversed operands. 420 ;CHECK: cmhi {{v[0-9]+}}.2s, v1.2s, v0.2s 421 %tmp3 = icmp ult <2 x i32> %A, %B; 422 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 423 ret <2 x i32> %tmp4 424 } 425 426 define <4 x i32> @cmlo4xi32(<4 x i32> %A, <4 x i32> %B) { 427 ; Using registers other than v0, v1 are possible, but would be odd. 428 ; LO implemented as HI, so check reversed operands. 429 ;CHECK: cmhi {{v[0-9]+}}.4s, v1.4s, v0.4s 430 %tmp3 = icmp ult <4 x i32> %A, %B; 431 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 432 ret <4 x i32> %tmp4 433 } 434 435 define <2 x i64> @cmlo2xi64(<2 x i64> %A, <2 x i64> %B) { 436 ; Using registers other than v0, v1 are possible, but would be odd. 437 ; LO implemented as HI, so check reversed operands. 438 ;CHECK: cmhi {{v[0-9]+}}.2d, v1.2d, v0.2d 439 %tmp3 = icmp ult <2 x i64> %A, %B; 440 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 441 ret <2 x i64> %tmp4 442 } 443 444 define <8 x i8> @cmhs8xi8(<8 x i8> %A, <8 x i8> %B) { 445 ;CHECK: cmhs {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 446 %tmp3 = icmp uge <8 x i8> %A, %B; 447 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 448 ret <8 x i8> %tmp4 449 } 450 451 define <16 x i8> @cmhs16xi8(<16 x i8> %A, <16 x i8> %B) { 452 ;CHECK: cmhs {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 453 %tmp3 = icmp uge <16 x i8> %A, %B; 454 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 455 ret <16 x i8> %tmp4 456 } 457 458 define <4 x i16> @cmhs4xi16(<4 x i16> %A, <4 x i16> %B) { 459 ;CHECK: cmhs {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, {{v[0-9]+}}.4h 460 %tmp3 = icmp uge <4 x i16> %A, %B; 461 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 462 ret <4 x i16> %tmp4 463 } 464 465 define <8 x i16> @cmhs8xi16(<8 x i16> %A, <8 x i16> %B) { 466 ;CHECK: cmhs {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, {{v[0-9]+}}.8h 467 %tmp3 = icmp uge <8 x i16> %A, %B; 468 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 469 ret <8 x i16> %tmp4 470 } 471 472 define <2 x i32> @cmhs2xi32(<2 x i32> %A, <2 x i32> %B) { 473 ;CHECK: cmhs {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, {{v[0-9]+}}.2s 474 %tmp3 = icmp uge <2 x i32> %A, %B; 475 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 476 ret <2 x i32> %tmp4 477 } 478 479 define <4 x i32> @cmhs4xi32(<4 x i32> %A, <4 x i32> %B) { 480 ;CHECK: cmhs {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, {{v[0-9]+}}.4s 481 %tmp3 = icmp uge <4 x i32> %A, %B; 482 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 483 ret <4 x i32> %tmp4 484 } 485 486 define <2 x i64> @cmhs2xi64(<2 x i64> %A, <2 x i64> %B) { 487 ;CHECK: cmhs {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, {{v[0-9]+}}.2d 488 %tmp3 = icmp uge <2 x i64> %A, %B; 489 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 490 ret <2 x i64> %tmp4 491 } 492 493 define <8 x i8> @cmls8xi8(<8 x i8> %A, <8 x i8> %B) { 494 ; Using registers other than v0, v1 are possible, but would be odd. 495 ; LS implemented as HS, so check reversed operands. 496 ;CHECK: cmhs {{v[0-9]+}}.8b, v1.8b, v0.8b 497 %tmp3 = icmp ule <8 x i8> %A, %B; 498 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 499 ret <8 x i8> %tmp4 500 } 501 502 define <16 x i8> @cmls16xi8(<16 x i8> %A, <16 x i8> %B) { 503 ; Using registers other than v0, v1 are possible, but would be odd. 504 ; LS implemented as HS, so check reversed operands. 505 ;CHECK: cmhs {{v[0-9]+}}.16b, v1.16b, v0.16b 506 %tmp3 = icmp ule <16 x i8> %A, %B; 507 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 508 ret <16 x i8> %tmp4 509 } 510 511 define <4 x i16> @cmls4xi16(<4 x i16> %A, <4 x i16> %B) { 512 ; Using registers other than v0, v1 are possible, but would be odd. 513 ; LS implemented as HS, so check reversed operands. 514 ;CHECK: cmhs {{v[0-9]+}}.4h, v1.4h, v0.4h 515 %tmp3 = icmp ule <4 x i16> %A, %B; 516 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 517 ret <4 x i16> %tmp4 518 } 519 520 define <8 x i16> @cmls8xi16(<8 x i16> %A, <8 x i16> %B) { 521 ; Using registers other than v0, v1 are possible, but would be odd. 522 ; LS implemented as HS, so check reversed operands. 523 ;CHECK: cmhs {{v[0-9]+}}.8h, v1.8h, v0.8h 524 %tmp3 = icmp ule <8 x i16> %A, %B; 525 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 526 ret <8 x i16> %tmp4 527 } 528 529 define <2 x i32> @cmls2xi32(<2 x i32> %A, <2 x i32> %B) { 530 ; Using registers other than v0, v1 are possible, but would be odd. 531 ; LS implemented as HS, so check reversed operands. 532 ;CHECK: cmhs {{v[0-9]+}}.2s, v1.2s, v0.2s 533 %tmp3 = icmp ule <2 x i32> %A, %B; 534 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 535 ret <2 x i32> %tmp4 536 } 537 538 define <4 x i32> @cmls4xi32(<4 x i32> %A, <4 x i32> %B) { 539 ; Using registers other than v0, v1 are possible, but would be odd. 540 ; LS implemented as HS, so check reversed operands. 541 ;CHECK: cmhs {{v[0-9]+}}.4s, v1.4s, v0.4s 542 %tmp3 = icmp ule <4 x i32> %A, %B; 543 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 544 ret <4 x i32> %tmp4 545 } 546 547 define <2 x i64> @cmls2xi64(<2 x i64> %A, <2 x i64> %B) { 548 ; Using registers other than v0, v1 are possible, but would be odd. 549 ; LS implemented as HS, so check reversed operands. 550 ;CHECK: cmhs {{v[0-9]+}}.2d, v1.2d, v0.2d 551 %tmp3 = icmp ule <2 x i64> %A, %B; 552 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 553 ret <2 x i64> %tmp4 554 } 555 556 557 define <8 x i8> @cmeqz8xi8(<8 x i8> %A) { 558 ;CHECK: cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0 559 %tmp3 = icmp eq <8 x i8> %A, zeroinitializer; 560 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 561 ret <8 x i8> %tmp4 562 } 563 564 define <16 x i8> @cmeqz16xi8(<16 x i8> %A) { 565 ;CHECK: cmeq {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #0 566 %tmp3 = icmp eq <16 x i8> %A, zeroinitializer; 567 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 568 ret <16 x i8> %tmp4 569 } 570 571 define <4 x i16> @cmeqz4xi16(<4 x i16> %A) { 572 ;CHECK: cmeq {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #0 573 %tmp3 = icmp eq <4 x i16> %A, zeroinitializer; 574 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 575 ret <4 x i16> %tmp4 576 } 577 578 define <8 x i16> @cmeqz8xi16(<8 x i16> %A) { 579 ;CHECK: cmeq {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #0 580 %tmp3 = icmp eq <8 x i16> %A, zeroinitializer; 581 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 582 ret <8 x i16> %tmp4 583 } 584 585 define <2 x i32> @cmeqz2xi32(<2 x i32> %A) { 586 ;CHECK: cmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #0 587 %tmp3 = icmp eq <2 x i32> %A, zeroinitializer; 588 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 589 ret <2 x i32> %tmp4 590 } 591 592 define <4 x i32> @cmeqz4xi32(<4 x i32> %A) { 593 ;CHECK: cmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #0 594 %tmp3 = icmp eq <4 x i32> %A, zeroinitializer; 595 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 596 ret <4 x i32> %tmp4 597 } 598 599 define <2 x i64> @cmeqz2xi64(<2 x i64> %A) { 600 ;CHECK: cmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #0 601 %tmp3 = icmp eq <2 x i64> %A, zeroinitializer; 602 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 603 ret <2 x i64> %tmp4 604 } 605 606 607 define <8 x i8> @cmgez8xi8(<8 x i8> %A) { 608 ;CHECK: cmge {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0 609 %tmp3 = icmp sge <8 x i8> %A, zeroinitializer; 610 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 611 ret <8 x i8> %tmp4 612 } 613 614 define <16 x i8> @cmgez16xi8(<16 x i8> %A) { 615 ;CHECK: cmge {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #0 616 %tmp3 = icmp sge <16 x i8> %A, zeroinitializer; 617 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 618 ret <16 x i8> %tmp4 619 } 620 621 define <4 x i16> @cmgez4xi16(<4 x i16> %A) { 622 ;CHECK: cmge {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #0 623 %tmp3 = icmp sge <4 x i16> %A, zeroinitializer; 624 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 625 ret <4 x i16> %tmp4 626 } 627 628 define <8 x i16> @cmgez8xi16(<8 x i16> %A) { 629 ;CHECK: cmge {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #0 630 %tmp3 = icmp sge <8 x i16> %A, zeroinitializer; 631 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 632 ret <8 x i16> %tmp4 633 } 634 635 define <2 x i32> @cmgez2xi32(<2 x i32> %A) { 636 ;CHECK: cmge {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #0 637 %tmp3 = icmp sge <2 x i32> %A, zeroinitializer; 638 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 639 ret <2 x i32> %tmp4 640 } 641 642 define <4 x i32> @cmgez4xi32(<4 x i32> %A) { 643 ;CHECK: cmge {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #0 644 %tmp3 = icmp sge <4 x i32> %A, zeroinitializer; 645 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 646 ret <4 x i32> %tmp4 647 } 648 649 define <2 x i64> @cmgez2xi64(<2 x i64> %A) { 650 ;CHECK: cmge {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #0 651 %tmp3 = icmp sge <2 x i64> %A, zeroinitializer; 652 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 653 ret <2 x i64> %tmp4 654 } 655 656 657 define <8 x i8> @cmgtz8xi8(<8 x i8> %A) { 658 ;CHECK: cmgt {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0 659 %tmp3 = icmp sgt <8 x i8> %A, zeroinitializer; 660 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 661 ret <8 x i8> %tmp4 662 } 663 664 define <16 x i8> @cmgtz16xi8(<16 x i8> %A) { 665 ;CHECK: cmgt {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #0 666 %tmp3 = icmp sgt <16 x i8> %A, zeroinitializer; 667 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 668 ret <16 x i8> %tmp4 669 } 670 671 define <4 x i16> @cmgtz4xi16(<4 x i16> %A) { 672 ;CHECK: cmgt {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #0 673 %tmp3 = icmp sgt <4 x i16> %A, zeroinitializer; 674 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 675 ret <4 x i16> %tmp4 676 } 677 678 define <8 x i16> @cmgtz8xi16(<8 x i16> %A) { 679 ;CHECK: cmgt {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #0 680 %tmp3 = icmp sgt <8 x i16> %A, zeroinitializer; 681 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 682 ret <8 x i16> %tmp4 683 } 684 685 define <2 x i32> @cmgtz2xi32(<2 x i32> %A) { 686 ;CHECK: cmgt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #0 687 %tmp3 = icmp sgt <2 x i32> %A, zeroinitializer; 688 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 689 ret <2 x i32> %tmp4 690 } 691 692 define <4 x i32> @cmgtz4xi32(<4 x i32> %A) { 693 ;CHECK: cmgt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #0 694 %tmp3 = icmp sgt <4 x i32> %A, zeroinitializer; 695 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 696 ret <4 x i32> %tmp4 697 } 698 699 define <2 x i64> @cmgtz2xi64(<2 x i64> %A) { 700 ;CHECK: cmgt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #0 701 %tmp3 = icmp sgt <2 x i64> %A, zeroinitializer; 702 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 703 ret <2 x i64> %tmp4 704 } 705 706 define <8 x i8> @cmlez8xi8(<8 x i8> %A) { 707 ;CHECK: cmle {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0 708 %tmp3 = icmp sle <8 x i8> %A, zeroinitializer; 709 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 710 ret <8 x i8> %tmp4 711 } 712 713 define <16 x i8> @cmlez16xi8(<16 x i8> %A) { 714 ;CHECK: cmle {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #0 715 %tmp3 = icmp sle <16 x i8> %A, zeroinitializer; 716 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 717 ret <16 x i8> %tmp4 718 } 719 720 define <4 x i16> @cmlez4xi16(<4 x i16> %A) { 721 ;CHECK: cmle {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #0 722 %tmp3 = icmp sle <4 x i16> %A, zeroinitializer; 723 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 724 ret <4 x i16> %tmp4 725 } 726 727 define <8 x i16> @cmlez8xi16(<8 x i16> %A) { 728 ;CHECK: cmle {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #0 729 %tmp3 = icmp sle <8 x i16> %A, zeroinitializer; 730 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 731 ret <8 x i16> %tmp4 732 } 733 734 define <2 x i32> @cmlez2xi32(<2 x i32> %A) { 735 ;CHECK: cmle {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #0 736 %tmp3 = icmp sle <2 x i32> %A, zeroinitializer; 737 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 738 ret <2 x i32> %tmp4 739 } 740 741 define <4 x i32> @cmlez4xi32(<4 x i32> %A) { 742 ;CHECK: cmle {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #0 743 %tmp3 = icmp sle <4 x i32> %A, zeroinitializer; 744 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 745 ret <4 x i32> %tmp4 746 } 747 748 define <2 x i64> @cmlez2xi64(<2 x i64> %A) { 749 ;CHECK: cmle {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #0 750 %tmp3 = icmp sle <2 x i64> %A, zeroinitializer; 751 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 752 ret <2 x i64> %tmp4 753 } 754 755 define <8 x i8> @cmltz8xi8(<8 x i8> %A) { 756 ;CHECK: cmlt {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0 757 %tmp3 = icmp slt <8 x i8> %A, zeroinitializer; 758 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 759 ret <8 x i8> %tmp4 760 } 761 762 define <16 x i8> @cmltz16xi8(<16 x i8> %A) { 763 ;CHECK: cmlt {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #0 764 %tmp3 = icmp slt <16 x i8> %A, zeroinitializer; 765 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 766 ret <16 x i8> %tmp4 767 } 768 769 define <4 x i16> @cmltz4xi16(<4 x i16> %A) { 770 ;CHECK: cmlt {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #0 771 %tmp3 = icmp slt <4 x i16> %A, zeroinitializer; 772 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 773 ret <4 x i16> %tmp4 774 } 775 776 define <8 x i16> @cmltz8xi16(<8 x i16> %A) { 777 ;CHECK: cmlt {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #0 778 %tmp3 = icmp slt <8 x i16> %A, zeroinitializer; 779 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 780 ret <8 x i16> %tmp4 781 } 782 783 define <2 x i32> @cmltz2xi32(<2 x i32> %A) { 784 ;CHECK: cmlt {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #0 785 %tmp3 = icmp slt <2 x i32> %A, zeroinitializer; 786 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 787 ret <2 x i32> %tmp4 788 } 789 790 define <4 x i32> @cmltz4xi32(<4 x i32> %A) { 791 ;CHECK: cmlt {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #0 792 %tmp3 = icmp slt <4 x i32> %A, zeroinitializer; 793 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 794 ret <4 x i32> %tmp4 795 } 796 797 define <2 x i64> @cmltz2xi64(<2 x i64> %A) { 798 ;CHECK: cmlt {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #0 799 %tmp3 = icmp slt <2 x i64> %A, zeroinitializer; 800 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 801 ret <2 x i64> %tmp4 802 } 803 804 define <8 x i8> @cmneqz8xi8(<8 x i8> %A) { 805 ;CHECK: cmeq {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, #0 806 ;CHECK-NEXT: mvn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 807 %tmp3 = icmp ne <8 x i8> %A, zeroinitializer; 808 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 809 ret <8 x i8> %tmp4 810 } 811 812 define <16 x i8> @cmneqz16xi8(<16 x i8> %A) { 813 ;CHECK: cmeq {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, #0 814 ;CHECK-NEXT: mvn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 815 %tmp3 = icmp ne <16 x i8> %A, zeroinitializer; 816 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 817 ret <16 x i8> %tmp4 818 } 819 820 define <4 x i16> @cmneqz4xi16(<4 x i16> %A) { 821 ;CHECK: cmeq {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, #0 822 ;CHECK-NEXT: mvn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 823 %tmp3 = icmp ne <4 x i16> %A, zeroinitializer; 824 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 825 ret <4 x i16> %tmp4 826 } 827 828 define <8 x i16> @cmneqz8xi16(<8 x i16> %A) { 829 ;CHECK: cmeq {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, #0 830 ;CHECK-NEXT: mvn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 831 %tmp3 = icmp ne <8 x i16> %A, zeroinitializer; 832 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 833 ret <8 x i16> %tmp4 834 } 835 836 define <2 x i32> @cmneqz2xi32(<2 x i32> %A) { 837 ;CHECK: cmeq {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, #0 838 ;CHECK-NEXT: mvn {{v[0-9]+}}.8b, {{v[0-9]+}}.8b 839 %tmp3 = icmp ne <2 x i32> %A, zeroinitializer; 840 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 841 ret <2 x i32> %tmp4 842 } 843 844 define <4 x i32> @cmneqz4xi32(<4 x i32> %A) { 845 ;CHECK: cmeq {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, #0 846 ;CHECK-NEXT: mvn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 847 %tmp3 = icmp ne <4 x i32> %A, zeroinitializer; 848 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 849 ret <4 x i32> %tmp4 850 } 851 852 define <2 x i64> @cmneqz2xi64(<2 x i64> %A) { 853 ;CHECK: cmeq {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, #0 854 ;CHECK-NEXT: mvn {{v[0-9]+}}.16b, {{v[0-9]+}}.16b 855 %tmp3 = icmp ne <2 x i64> %A, zeroinitializer; 856 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 857 ret <2 x i64> %tmp4 858 } 859 860 define <8 x i8> @cmhsz8xi8(<8 x i8> %A) { 861 ;CHECK: movi d[[ZERO:[0-9]+]], #0 862 ;CHECK-NEXT: cmhs {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, v[[ZERO]].8b 863 %tmp3 = icmp uge <8 x i8> %A, zeroinitializer; 864 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 865 ret <8 x i8> %tmp4 866 } 867 868 define <16 x i8> @cmhsz16xi8(<16 x i8> %A) { 869 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 870 ;CHECK-NEXT: cmhs {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, v[[ZERO]].16b 871 %tmp3 = icmp uge <16 x i8> %A, zeroinitializer; 872 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 873 ret <16 x i8> %tmp4 874 } 875 876 define <4 x i16> @cmhsz4xi16(<4 x i16> %A) { 877 ;CHECK: movi d[[ZERO:[0-9]+]], #0 878 ;CHECK-NEXT: cmhs {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, v[[ZERO]].4h 879 %tmp3 = icmp uge <4 x i16> %A, zeroinitializer; 880 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 881 ret <4 x i16> %tmp4 882 } 883 884 define <8 x i16> @cmhsz8xi16(<8 x i16> %A) { 885 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 886 ;CHECK-NEXT: cmhs {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, v[[ZERO]].8h 887 %tmp3 = icmp uge <8 x i16> %A, zeroinitializer; 888 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 889 ret <8 x i16> %tmp4 890 } 891 892 define <2 x i32> @cmhsz2xi32(<2 x i32> %A) { 893 ;CHECK: movi d[[ZERO:[0-9]+]], #0 894 ;CHECK-NEXT: cmhs {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, v[[ZERO]].2s 895 %tmp3 = icmp uge <2 x i32> %A, zeroinitializer; 896 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 897 ret <2 x i32> %tmp4 898 } 899 900 define <4 x i32> @cmhsz4xi32(<4 x i32> %A) { 901 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 902 ;CHECK-NEXT: cmhs {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, v[[ZERO]].4s 903 %tmp3 = icmp uge <4 x i32> %A, zeroinitializer; 904 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 905 ret <4 x i32> %tmp4 906 } 907 908 define <2 x i64> @cmhsz2xi64(<2 x i64> %A) { 909 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 910 ;CHECK-NEXT: cmhs {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, v[[ZERO]].2d 911 %tmp3 = icmp uge <2 x i64> %A, zeroinitializer; 912 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 913 ret <2 x i64> %tmp4 914 } 915 916 917 define <8 x i8> @cmhiz8xi8(<8 x i8> %A) { 918 ;CHECK: movi d[[ZERO:[0-9]+]], #0 919 ;CHECK-NEXT: cmhi {{v[0-9]+}}.8b, {{v[0-9]+}}.8b, v[[ZERO]].8b 920 %tmp3 = icmp ugt <8 x i8> %A, zeroinitializer; 921 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 922 ret <8 x i8> %tmp4 923 } 924 925 define <16 x i8> @cmhiz16xi8(<16 x i8> %A) { 926 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 927 ;CHECK-NEXT: cmhi {{v[0-9]+}}.16b, {{v[0-9]+}}.16b, v[[ZERO]].16b 928 %tmp3 = icmp ugt <16 x i8> %A, zeroinitializer; 929 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 930 ret <16 x i8> %tmp4 931 } 932 933 define <4 x i16> @cmhiz4xi16(<4 x i16> %A) { 934 ;CHECK: movi d[[ZERO:[0-9]+]], #0 935 ;CHECK-NEXT: cmhi {{v[0-9]+}}.4h, {{v[0-9]+}}.4h, v[[ZERO]].4h 936 %tmp3 = icmp ugt <4 x i16> %A, zeroinitializer; 937 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 938 ret <4 x i16> %tmp4 939 } 940 941 define <8 x i16> @cmhiz8xi16(<8 x i16> %A) { 942 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 943 ;CHECK-NEXT: cmhi {{v[0-9]+}}.8h, {{v[0-9]+}}.8h, v[[ZERO]].8h 944 %tmp3 = icmp ugt <8 x i16> %A, zeroinitializer; 945 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 946 ret <8 x i16> %tmp4 947 } 948 949 define <2 x i32> @cmhiz2xi32(<2 x i32> %A) { 950 ;CHECK: movi d[[ZERO:[0-9]+]], #0 951 ;CHECK-NEXT: cmhi {{v[0-9]+}}.2s, {{v[0-9]+}}.2s, v[[ZERO]].2s 952 %tmp3 = icmp ugt <2 x i32> %A, zeroinitializer; 953 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 954 ret <2 x i32> %tmp4 955 } 956 957 define <4 x i32> @cmhiz4xi32(<4 x i32> %A) { 958 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 959 ;CHECK-NEXT: cmhi {{v[0-9]+}}.4s, {{v[0-9]+}}.4s, v[[ZERO]].4s 960 %tmp3 = icmp ugt <4 x i32> %A, zeroinitializer; 961 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 962 ret <4 x i32> %tmp4 963 } 964 965 define <2 x i64> @cmhiz2xi64(<2 x i64> %A) { 966 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 967 ;CHECK-NEXT: cmhi {{v[0-9]+}}.2d, {{v[0-9]+}}.2d, v[[ZERO]].2d 968 %tmp3 = icmp ugt <2 x i64> %A, zeroinitializer; 969 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 970 ret <2 x i64> %tmp4 971 } 972 973 define <8 x i8> @cmlsz8xi8(<8 x i8> %A) { 974 ; Using registers other than v0, v1 are possible, but would be odd. 975 ; LS implemented as HS, so check reversed operands. 976 ;CHECK: movi d[[ZERO:[0-9]+]], #0 977 ;CHECK-NEXT: cmhs {{v[0-9]+}}.8b, v[[ZERO]].8b, v0.8b 978 %tmp3 = icmp ule <8 x i8> %A, zeroinitializer; 979 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 980 ret <8 x i8> %tmp4 981 } 982 983 define <16 x i8> @cmlsz16xi8(<16 x i8> %A) { 984 ; Using registers other than v0, v1 are possible, but would be odd. 985 ; LS implemented as HS, so check reversed operands. 986 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 987 ;CHECK-NEXT: cmhs {{v[0-9]+}}.16b, v[[ZERO]].16b, v0.16b 988 %tmp3 = icmp ule <16 x i8> %A, zeroinitializer; 989 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 990 ret <16 x i8> %tmp4 991 } 992 993 define <4 x i16> @cmlsz4xi16(<4 x i16> %A) { 994 ; Using registers other than v0, v1 are possible, but would be odd. 995 ; LS implemented as HS, so check reversed operands. 996 ;CHECK: movi d[[ZERO:[0-9]+]], #0 997 ;CHECK-NEXT: cmhs {{v[0-9]+}}.4h, v[[ZERO]].4h, v0.4h 998 %tmp3 = icmp ule <4 x i16> %A, zeroinitializer; 999 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 1000 ret <4 x i16> %tmp4 1001 } 1002 1003 define <8 x i16> @cmlsz8xi16(<8 x i16> %A) { 1004 ; Using registers other than v0, v1 are possible, but would be odd. 1005 ; LS implemented as HS, so check reversed operands. 1006 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 1007 ;CHECK-NEXT: cmhs {{v[0-9]+}}.8h, v[[ZERO]].8h, v0.8h 1008 %tmp3 = icmp ule <8 x i16> %A, zeroinitializer; 1009 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 1010 ret <8 x i16> %tmp4 1011 } 1012 1013 define <2 x i32> @cmlsz2xi32(<2 x i32> %A) { 1014 ; Using registers other than v0, v1 are possible, but would be odd. 1015 ; LS implemented as HS, so check reversed operands. 1016 ;CHECK: movi d[[ZERO:[0-9]+]], #0 1017 ;CHECK-NEXT: cmhs {{v[0-9]+}}.2s, v[[ZERO]].2s, v0.2s 1018 %tmp3 = icmp ule <2 x i32> %A, zeroinitializer; 1019 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 1020 ret <2 x i32> %tmp4 1021 } 1022 1023 define <4 x i32> @cmlsz4xi32(<4 x i32> %A) { 1024 ; Using registers other than v0, v1 are possible, but would be odd. 1025 ; LS implemented as HS, so check reversed operands. 1026 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 1027 ;CHECK-NEXT: cmhs {{v[0-9]+}}.4s, v[[ZERO]].4s, v0.4s 1028 %tmp3 = icmp ule <4 x i32> %A, zeroinitializer; 1029 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 1030 ret <4 x i32> %tmp4 1031 } 1032 1033 define <2 x i64> @cmlsz2xi64(<2 x i64> %A) { 1034 ; Using registers other than v0, v1 are possible, but would be odd. 1035 ; LS implemented as HS, so check reversed operands. 1036 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 1037 ;CHECK-NEXT: cmhs {{v[0-9]+}}.2d, v[[ZERO]].2d, v0.2d 1038 %tmp3 = icmp ule <2 x i64> %A, zeroinitializer; 1039 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 1040 ret <2 x i64> %tmp4 1041 } 1042 1043 define <8 x i8> @cmloz8xi8(<8 x i8> %A) { 1044 ; Using registers other than v0, v1 are possible, but would be odd. 1045 ; LO implemented as HI, so check reversed operands. 1046 ;CHECK: movi d[[ZERO:[0-9]+]], #0 1047 ;CHECK-NEXT: cmhi {{v[0-9]+}}.8b, v[[ZERO]].8b, {{v[0-9]+}}.8b 1048 %tmp3 = icmp ult <8 x i8> %A, zeroinitializer; 1049 %tmp4 = sext <8 x i1> %tmp3 to <8 x i8> 1050 ret <8 x i8> %tmp4 1051 } 1052 1053 define <16 x i8> @cmloz16xi8(<16 x i8> %A) { 1054 ; Using registers other than v0, v1 are possible, but would be odd. 1055 ; LO implemented as HI, so check reversed operands. 1056 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 1057 ;CHECK-NEXT: cmhi {{v[0-9]+}}.16b, v[[ZERO]].16b, v0.16b 1058 %tmp3 = icmp ult <16 x i8> %A, zeroinitializer; 1059 %tmp4 = sext <16 x i1> %tmp3 to <16 x i8> 1060 ret <16 x i8> %tmp4 1061 } 1062 1063 define <4 x i16> @cmloz4xi16(<4 x i16> %A) { 1064 ; Using registers other than v0, v1 are possible, but would be odd. 1065 ; LO implemented as HI, so check reversed operands. 1066 ;CHECK: movi d[[ZERO:[0-9]+]], #0 1067 ;CHECK-NEXT: cmhi {{v[0-9]+}}.4h, v[[ZERO]].4h, v0.4h 1068 %tmp3 = icmp ult <4 x i16> %A, zeroinitializer; 1069 %tmp4 = sext <4 x i1> %tmp3 to <4 x i16> 1070 ret <4 x i16> %tmp4 1071 } 1072 1073 define <8 x i16> @cmloz8xi16(<8 x i16> %A) { 1074 ; Using registers other than v0, v1 are possible, but would be odd. 1075 ; LO implemented as HI, so check reversed operands. 1076 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 1077 ;CHECK-NEXT: cmhi {{v[0-9]+}}.8h, v[[ZERO]].8h, v0.8h 1078 %tmp3 = icmp ult <8 x i16> %A, zeroinitializer; 1079 %tmp4 = sext <8 x i1> %tmp3 to <8 x i16> 1080 ret <8 x i16> %tmp4 1081 } 1082 1083 define <2 x i32> @cmloz2xi32(<2 x i32> %A) { 1084 ; Using registers other than v0, v1 are possible, but would be odd. 1085 ; LO implemented as HI, so check reversed operands. 1086 ;CHECK: movi d[[ZERO:[0-9]+]], #0 1087 ;CHECK-NEXT: cmhi {{v[0-9]+}}.2s, v[[ZERO]].2s, v0.2s 1088 %tmp3 = icmp ult <2 x i32> %A, zeroinitializer; 1089 %tmp4 = sext <2 x i1> %tmp3 to <2 x i32> 1090 ret <2 x i32> %tmp4 1091 } 1092 1093 define <4 x i32> @cmloz4xi32(<4 x i32> %A) { 1094 ; Using registers other than v0, v1 are possible, but would be odd. 1095 ; LO implemented as HI, so check reversed operands. 1096 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 1097 ;CHECK-NEXT: cmhi {{v[0-9]+}}.4s, v[[ZERO]].4s, v0.4s 1098 %tmp3 = icmp ult <4 x i32> %A, zeroinitializer; 1099 %tmp4 = sext <4 x i1> %tmp3 to <4 x i32> 1100 ret <4 x i32> %tmp4 1101 } 1102 1103 define <2 x i64> @cmloz2xi64(<2 x i64> %A) { 1104 ; Using registers other than v0, v1 are possible, but would be odd. 1105 ; LO implemented as HI, so check reversed operands. 1106 ;CHECK: movi v[[ZERO:[0-9]+]].2d, #0 1107 ;CHECK-NEXT: cmhi {{v[0-9]+}}.2d, v[[ZERO]].2d, v0.2d 1108 %tmp3 = icmp ult <2 x i64> %A, zeroinitializer; 1109 %tmp4 = sext <2 x i1> %tmp3 to <2 x i64> 1110 ret <2 x i64> %tmp4 1111 } 1112 1113 define <1 x i64> @cmeqz_v1i64(<1 x i64> %A) { 1114 ; CHECK-LABEL: cmeqz_v1i64: 1115 ; CHECK: cmeq d0, d0, #0 1116 %tst = icmp eq <1 x i64> %A, <i64 0> 1117 %mask = sext <1 x i1> %tst to <1 x i64> 1118 ret <1 x i64> %mask 1119 } 1120 1121 define <1 x i64> @cmgez_v1i64(<1 x i64> %A) { 1122 ; CHECK-LABEL: cmgez_v1i64: 1123 ; CHECK: cmge d0, d0, #0 1124 %tst = icmp sge <1 x i64> %A, <i64 0> 1125 %mask = sext <1 x i1> %tst to <1 x i64> 1126 ret <1 x i64> %mask 1127 } 1128 1129 define <1 x i64> @cmgtz_v1i64(<1 x i64> %A) { 1130 ; CHECK-LABEL: cmgtz_v1i64: 1131 ; CHECK: cmgt d0, d0, #0 1132 %tst = icmp sgt <1 x i64> %A, <i64 0> 1133 %mask = sext <1 x i1> %tst to <1 x i64> 1134 ret <1 x i64> %mask 1135 } 1136 1137 define <1 x i64> @cmlez_v1i64(<1 x i64> %A) { 1138 ; CHECK-LABEL: cmlez_v1i64: 1139 ; CHECK: cmle d0, d0, #0 1140 %tst = icmp sle <1 x i64> %A, <i64 0> 1141 %mask = sext <1 x i1> %tst to <1 x i64> 1142 ret <1 x i64> %mask 1143 } 1144 1145 define <1 x i64> @cmltz_v1i64(<1 x i64> %A) { 1146 ; CHECK-LABEL: cmltz_v1i64: 1147 ; CHECK: cmlt d0, d0, #0 1148 %tst = icmp slt <1 x i64> %A, <i64 0> 1149 %mask = sext <1 x i1> %tst to <1 x i64> 1150 ret <1 x i64> %mask 1151 } 1152 1153 define <1 x i64> @fcmeqz_v1f64(<1 x double> %A) { 1154 ; CHECK-LABEL: fcmeqz_v1f64: 1155 ; CHECK: fcmeq d0, d0, #0 1156 %tst = fcmp oeq <1 x double> %A, <double 0.0> 1157 %mask = sext <1 x i1> %tst to <1 x i64> 1158 ret <1 x i64> %mask 1159 } 1160 1161 define <1 x i64> @fcmgez_v1f64(<1 x double> %A) { 1162 ; CHECK-LABEL: fcmgez_v1f64: 1163 ; CHECK: fcmge d0, d0, #0 1164 %tst = fcmp oge <1 x double> %A, <double 0.0> 1165 %mask = sext <1 x i1> %tst to <1 x i64> 1166 ret <1 x i64> %mask 1167 } 1168 1169 define <1 x i64> @fcmgtz_v1f64(<1 x double> %A) { 1170 ; CHECK-LABEL: fcmgtz_v1f64: 1171 ; CHECK: fcmgt d0, d0, #0 1172 %tst = fcmp ogt <1 x double> %A, <double 0.0> 1173 %mask = sext <1 x i1> %tst to <1 x i64> 1174 ret <1 x i64> %mask 1175 } 1176 1177 define <1 x i64> @fcmlez_v1f64(<1 x double> %A) { 1178 ; CHECK-LABEL: fcmlez_v1f64: 1179 ; CHECK: fcmle d0, d0, #0 1180 %tst = fcmp ole <1 x double> %A, <double 0.0> 1181 %mask = sext <1 x i1> %tst to <1 x i64> 1182 ret <1 x i64> %mask 1183 } 1184 1185 define <1 x i64> @fcmltz_v1f64(<1 x double> %A) { 1186 ; CHECK-LABEL: fcmltz_v1f64: 1187 ; CHECK: fcmlt d0, d0, #0 1188 %tst = fcmp olt <1 x double> %A, <double 0.0> 1189 %mask = sext <1 x i1> %tst to <1 x i64> 1190 ret <1 x i64> %mask 1191 } 1192