| 
 | 1 | +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5  | 
 | 2 | +; RUN: llc < %s -verify-machineinstrs -disable-wasm-fallthrough-return-opt -wasm-disable-explicit-locals -wasm-keep-registers -mattr=+simd128 | FileCheck %s  | 
 | 3 | + | 
 | 4 | +target triple = "wasm64"  | 
 | 5 | + | 
 | 6 | +define i32 @all_true_16_i8(<16 x i8> %v) {  | 
 | 7 | +; CHECK-LABEL: all_true_16_i8:  | 
 | 8 | +; CHECK:         .functype all_true_16_i8 (v128) -> (i32)  | 
 | 9 | +; CHECK-NEXT:  # %bb.0:  | 
 | 10 | +; CHECK-NEXT:    i8x16.all_true $push0=, $0  | 
 | 11 | +; CHECK-NEXT:    return $pop0  | 
 | 12 | +  %1 = icmp eq <16 x i8> %v, zeroinitializer  | 
 | 13 | +  %2 = bitcast <16 x i1> %1 to i16  | 
 | 14 | +  %3 = icmp eq i16 %2, 0  | 
 | 15 | +  %conv3 = zext i1 %3 to i32  | 
 | 16 | +  ret i32 %conv3  | 
 | 17 | +}  | 
 | 18 | + | 
 | 19 | + | 
 | 20 | +define i32 @all_true_4_i32(<4 x i32> %v) {  | 
 | 21 | +; CHECK-LABEL: all_true_4_i32:  | 
 | 22 | +; CHECK:         .functype all_true_4_i32 (v128) -> (i32)  | 
 | 23 | +; CHECK-NEXT:  # %bb.0:  | 
 | 24 | +; CHECK-NEXT:    i32x4.all_true $push0=, $0  | 
 | 25 | +; CHECK-NEXT:    return $pop0  | 
 | 26 | +  %1 = icmp eq <4 x i32> %v, zeroinitializer  | 
 | 27 | +  %2 = bitcast <4 x i1> %1 to i4  | 
 | 28 | +  %3 = icmp eq i4 %2, 0  | 
 | 29 | +  %conv3 = zext i1 %3 to i32  | 
 | 30 | +  ret i32 %conv3  | 
 | 31 | +}  | 
 | 32 | + | 
 | 33 | + | 
 | 34 | +define i32 @all_true_8_i16(<8 x i16> %v) {  | 
 | 35 | +; CHECK-LABEL: all_true_8_i16:  | 
 | 36 | +; CHECK:         .functype all_true_8_i16 (v128) -> (i32)  | 
 | 37 | +; CHECK-NEXT:  # %bb.0:  | 
 | 38 | +; CHECK-NEXT:    i16x8.all_true $push0=, $0  | 
 | 39 | +; CHECK-NEXT:    return $pop0  | 
 | 40 | +  %1 = icmp eq <8 x i16> %v, zeroinitializer  | 
 | 41 | +  %2 = bitcast <8 x i1> %1 to i8  | 
 | 42 | +  %3 = icmp eq i8 %2, 0  | 
 | 43 | +  %conv3 = zext i1 %3 to i32  | 
 | 44 | +  ret i32 %conv3  | 
 | 45 | +}  | 
 | 46 | + | 
 | 47 | + | 
 | 48 | +define i32 @all_true_2_i64(<2 x i64> %v) {  | 
 | 49 | +; CHECK-LABEL: all_true_2_i64:  | 
 | 50 | +; CHECK:         .functype all_true_2_i64 (v128) -> (i32)  | 
 | 51 | +; CHECK-NEXT:  # %bb.0:  | 
 | 52 | +; CHECK-NEXT:    i64x2.all_true $push0=, $0  | 
 | 53 | +; CHECK-NEXT:    return $pop0  | 
 | 54 | +  %1 = icmp eq <2 x i64> %v, zeroinitializer  | 
 | 55 | +  %2 = bitcast <2 x i1> %1 to i2  | 
 | 56 | +  %3 = icmp eq i2 %2, 0  | 
 | 57 | +  %conv3 = zext i1 %3 to i32  | 
 | 58 | +  ret i32 %conv3  | 
 | 59 | +}  | 
 | 60 | + | 
 | 61 | + | 
 | 62 | +define i32 @all_true_4_i64(<4 x i64> %v) {  | 
 | 63 | +; CHECK-LABEL: all_true_4_i64:  | 
 | 64 | +; CHECK:         .functype all_true_4_i64 (v128, v128) -> (i32)  | 
 | 65 | +; CHECK-NEXT:  # %bb.0:  | 
 | 66 | +; CHECK-NEXT:    v128.const $push9=, 0, 0  | 
 | 67 | +; CHECK-NEXT:    local.tee $push8=, $2=, $pop9  | 
 | 68 | +; CHECK-NEXT:    i64x2.eq $push1=, $0, $pop8  | 
 | 69 | +; CHECK-NEXT:    i64x2.eq $push0=, $1, $2  | 
 | 70 | +; CHECK-NEXT:    i8x16.shuffle $push2=, $pop1, $pop0, 0, 1, 2, 3, 8, 9, 10, 11, 16, 17, 18, 19, 24, 25, 26, 27  | 
 | 71 | +; CHECK-NEXT:    v128.any_true $push3=, $pop2  | 
 | 72 | +; CHECK-NEXT:    i32.const $push4=, -1  | 
 | 73 | +; CHECK-NEXT:    i32.xor $push5=, $pop3, $pop4  | 
 | 74 | +; CHECK-NEXT:    i32.const $push6=, 1  | 
 | 75 | +; CHECK-NEXT:    i32.and $push7=, $pop5, $pop6  | 
 | 76 | +; CHECK-NEXT:    return $pop7  | 
 | 77 | +  %1 = icmp eq <4 x i64> %v, zeroinitializer  | 
 | 78 | +  %2 = bitcast <4 x i1> %1 to i4  | 
 | 79 | +  %3 = icmp eq i4 %2, 0  | 
 | 80 | +  %conv3 = zext i1 %3 to i32  | 
 | 81 | +  ret i32 %conv3  | 
 | 82 | +}  | 
 | 83 | + | 
 | 84 | + | 
 | 85 | +; setcc (iN (bitcast (set_cc (vNi1 X), 0, ne)), 0, ne  | 
 | 86 | +;   => any_true (set_cc (X), 0, ne)  | 
 | 87 | +;   => any_true (X)  | 
 | 88 | +define i32 @any_true_1_4_i32(<4 x i32> %v) {  | 
 | 89 | +; CHECK-LABEL: any_true_1_4_i32:  | 
 | 90 | +; CHECK:         .functype any_true_1_4_i32 (v128) -> (i32)  | 
 | 91 | +; CHECK-NEXT:  # %bb.0:  | 
 | 92 | +; CHECK-NEXT:    v128.any_true $push0=, $0  | 
 | 93 | +; CHECK-NEXT:    return $pop0  | 
 | 94 | +  %1 = icmp ne <4 x i32> %v, zeroinitializer  | 
 | 95 | +  %2 = bitcast <4 x i1> %1 to i4  | 
 | 96 | +  %3 = icmp ne i4 %2, 0  | 
 | 97 | +  %conv3 = zext i1 %3 to i32  | 
 | 98 | +  ret i32 %conv3  | 
 | 99 | +}  | 
 | 100 | + | 
 | 101 | +; setcc (iN (bitcast (set_cc (vNi1 X), 0, eq)), -1, ne  | 
 | 102 | +;   => not all_true (set_cc (X), 0, eq)  | 
 | 103 | +;   => not not any_true (X)  | 
 | 104 | +;   => any_true (X)  | 
 | 105 | +define i32 @any_true_2_4_i32(<4 x i32> %v) {  | 
 | 106 | +; CHECK-LABEL: any_true_2_4_i32:  | 
 | 107 | +; CHECK:         .functype any_true_2_4_i32 (v128) -> (i32)  | 
 | 108 | +; CHECK-NEXT:  # %bb.0:  | 
 | 109 | +; CHECK-NEXT:    v128.any_true $push0=, $0  | 
 | 110 | +; CHECK-NEXT:    return $pop0  | 
 | 111 | +  %1 = icmp eq <4 x i32> %v, zeroinitializer  | 
 | 112 | +  %2 = bitcast <4 x i1> %1 to i4  | 
 | 113 | +  %3 = icmp ne i4 %2, -1  | 
 | 114 | +  %conv3 = zext i1 %3 to i32  | 
 | 115 | +  ret i32 %conv3  | 
 | 116 | +}  | 
 | 117 | + | 
 | 118 | + | 
 | 119 | +; setcc (iN (bitcast (set_cc (vNi1 X), 0, ne)), -1, eq  | 
 | 120 | +;   => all_true (set_cc (X), 0, ne)  | 
 | 121 | +;   => all_true (X)  | 
 | 122 | +define i32 @all_true_2_4_i32(<4 x i32> %v) {  | 
 | 123 | +; CHECK-LABEL: all_true_2_4_i32:  | 
 | 124 | +; CHECK:         .functype all_true_2_4_i32 (v128) -> (i32)  | 
 | 125 | +; CHECK-NEXT:  # %bb.0:  | 
 | 126 | +; CHECK-NEXT:    i32x4.all_true $push0=, $0  | 
 | 127 | +; CHECK-NEXT:    return $pop0  | 
 | 128 | +  %1 = icmp ne <4 x i32> %v, zeroinitializer  | 
 | 129 | +  %2 = bitcast <4 x i1> %1 to i4  | 
 | 130 | +  %3 = icmp eq i4 %2, -1  | 
 | 131 | +  %conv3 = zext i1 %3 to i32  | 
 | 132 | +  ret i32 %conv3  | 
 | 133 | +}  | 
 | 134 | + | 
 | 135 | + | 
0 commit comments