1*9880d681SAndroid Build Coastguard Worker; RUN: llc -mtriple=aarch64-apple-darwin -fast-isel -verify-machineinstrs \ 2*9880d681SAndroid Build Coastguard Worker; RUN: -aarch64-atomic-cfg-tidy=0 -disable-cgp -disable-branch-fold \ 3*9880d681SAndroid Build Coastguard Worker; RUN: < %s | FileCheck %s 4*9880d681SAndroid Build Coastguard Worker 5*9880d681SAndroid Build Coastguard Worker; 6*9880d681SAndroid Build Coastguard Worker; Verify that we don't mess up vector comparisons in fast-isel. 7*9880d681SAndroid Build Coastguard Worker; 8*9880d681SAndroid Build Coastguard Worker 9*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @icmp_v2i32(<2 x i32> %a) { 10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_v2i32: 11*9880d681SAndroid Build Coastguard Worker; CHECK: ; BB#0: 12*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmeq.2s [[CMP:v[0-9]+]], v0, #0 13*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 14*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2s [[MASK:v[0-9]+]], #1 15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and.8b v0, [[CMP]], [[MASK]] 16*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 17*9880d681SAndroid Build Coastguard Worker %c = icmp eq <2 x i32> %a, zeroinitializer 18*9880d681SAndroid Build Coastguard Worker br label %bb2 19*9880d681SAndroid Build Coastguard Workerbb2: 20*9880d681SAndroid Build Coastguard Worker %z = zext <2 x i1> %c to <2 x i32> 21*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %z 22*9880d681SAndroid Build Coastguard Worker} 23*9880d681SAndroid Build Coastguard Worker 24*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @icmp_constfold_v2i32(<2 x i32> %a) { 25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_constfold_v2i32: 26*9880d681SAndroid Build Coastguard Worker; CHECK: ; BB#0: 27*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi d[[CMP:[0-9]+]], #0xffffffffffffffff 28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 29*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2s [[MASK:v[0-9]+]], #1 30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and.8b v0, v[[CMP]], [[MASK]] 31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 32*9880d681SAndroid Build Coastguard Worker %1 = icmp eq <2 x i32> %a, %a 33*9880d681SAndroid Build Coastguard Worker br label %bb2 34*9880d681SAndroid Build Coastguard Workerbb2: 35*9880d681SAndroid Build Coastguard Worker %2 = zext <2 x i1> %1 to <2 x i32> 36*9880d681SAndroid Build Coastguard Worker ret <2 x i32> %2 37*9880d681SAndroid Build Coastguard Worker} 38*9880d681SAndroid Build Coastguard Worker 39*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @icmp_v4i32(<4 x i32> %a) { 40*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_v4i32: 41*9880d681SAndroid Build Coastguard Worker; CHECK: ; BB#0: 42*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmeq.4s [[CMP:v[0-9]+]], v0, #0 43*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xtn.4h [[CMPV4I16:v[0-9]+]], [[CMP]] 44*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 45*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.4h [[MASK:v[0-9]+]], #1 46*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and.8b [[ZEXT:v[0-9]+]], [[CMPV4I16]], [[MASK]] 47*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s v0, [[ZEXT]], #0 48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 49*9880d681SAndroid Build Coastguard Worker %c = icmp eq <4 x i32> %a, zeroinitializer 50*9880d681SAndroid Build Coastguard Worker br label %bb2 51*9880d681SAndroid Build Coastguard Workerbb2: 52*9880d681SAndroid Build Coastguard Worker %z = zext <4 x i1> %c to <4 x i32> 53*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %z 54*9880d681SAndroid Build Coastguard Worker} 55*9880d681SAndroid Build Coastguard Worker 56*9880d681SAndroid Build Coastguard Workerdefine <4 x i32> @icmp_constfold_v4i32(<4 x i32> %a) { 57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_constfold_v4i32: 58*9880d681SAndroid Build Coastguard Worker; CHECK: ; BB#0: 59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi d[[CMP:[0-9]+]], #0xffffffffffffffff 60*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 61*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.4h [[MASK:v[0-9]+]], #1 62*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and.8b [[ZEXT:v[0-9]+]], v[[CMP]], [[MASK]] 63*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ushll.4s v0, [[ZEXT]], #0 64*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 65*9880d681SAndroid Build Coastguard Worker %1 = icmp eq <4 x i32> %a, %a 66*9880d681SAndroid Build Coastguard Worker br label %bb2 67*9880d681SAndroid Build Coastguard Workerbb2: 68*9880d681SAndroid Build Coastguard Worker %2 = zext <4 x i1> %1 to <4 x i32> 69*9880d681SAndroid Build Coastguard Worker ret <4 x i32> %2 70*9880d681SAndroid Build Coastguard Worker} 71*9880d681SAndroid Build Coastguard Worker 72*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @icmp_v16i8(<16 x i8> %a) { 73*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_v16i8: 74*9880d681SAndroid Build Coastguard Worker; CHECK: ; BB#0: 75*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: cmeq.16b [[CMP:v[0-9]+]], v0, #0 76*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 77*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.16b [[MASK:v[0-9]+]], #1 78*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and.16b v0, [[CMP]], [[MASK]] 79*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 80*9880d681SAndroid Build Coastguard Worker %c = icmp eq <16 x i8> %a, zeroinitializer 81*9880d681SAndroid Build Coastguard Worker br label %bb2 82*9880d681SAndroid Build Coastguard Workerbb2: 83*9880d681SAndroid Build Coastguard Worker %z = zext <16 x i1> %c to <16 x i8> 84*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %z 85*9880d681SAndroid Build Coastguard Worker} 86*9880d681SAndroid Build Coastguard Worker 87*9880d681SAndroid Build Coastguard Workerdefine <16 x i8> @icmp_constfold_v16i8(<16 x i8> %a) { 88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: icmp_constfold_v16i8: 89*9880d681SAndroid Build Coastguard Worker; CHECK: ; BB#0: 90*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.2d [[CMP:v[0-9]+]], #0xffffffffffffffff 91*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ; BB#1: 92*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: movi.16b [[MASK:v[0-9]+]], #1 93*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: and.16b v0, [[CMP]], [[MASK]] 94*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret 95*9880d681SAndroid Build Coastguard Worker %1 = icmp eq <16 x i8> %a, %a 96*9880d681SAndroid Build Coastguard Worker br label %bb2 97*9880d681SAndroid Build Coastguard Workerbb2: 98*9880d681SAndroid Build Coastguard Worker %2 = zext <16 x i1> %1 to <16 x i8> 99*9880d681SAndroid Build Coastguard Worker ret <16 x i8> %2 100*9880d681SAndroid Build Coastguard Worker} 101