1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le-unknown-unknown | FileCheck %s 3 4; First, check the generic pattern for any 2 vector constants. Then, check special cases where 5; the constants are all off-by-one. Finally, check the extra special cases where the constants 6; include 0 or -1. 7; Each minimal select test is repeated with a more typical pattern that includes a compare to 8; generate the condition value. 9 10define <4 x i32> @sel_C1_or_C2_vec(<4 x i1> %cond) { 11; CHECK-LABEL: sel_C1_or_C2_vec: 12; CHECK: # %bb.0: 13; CHECK-NEXT: addis 3, 2, .LCPI0_0@toc@ha 14; CHECK-NEXT: vspltisw 3, -16 15; CHECK-NEXT: vspltisw 4, 15 16; CHECK-NEXT: addi 3, 3, .LCPI0_0@toc@l 17; CHECK-NEXT: vsubuwm 3, 4, 3 18; CHECK-NEXT: lxvd2x 0, 0, 3 19; CHECK-NEXT: addis 3, 2, .LCPI0_1@toc@ha 20; CHECK-NEXT: vslw 2, 2, 3 21; CHECK-NEXT: addi 3, 3, .LCPI0_1@toc@l 22; CHECK-NEXT: vsraw 2, 2, 3 23; CHECK-NEXT: xxswapd 37, 0 24; CHECK-NEXT: lxvd2x 0, 0, 3 25; CHECK-NEXT: xxswapd 32, 0 26; CHECK-NEXT: xxsel 34, 32, 37, 34 27; CHECK-NEXT: blr 28 %add = select <4 x i1> %cond, <4 x i32> <i32 3000, i32 1, i32 -1, i32 0>, <4 x i32> <i32 42, i32 0, i32 -2, i32 -1> 29 ret <4 x i32> %add 30} 31 32define <4 x i32> @cmp_sel_C1_or_C2_vec(<4 x i32> %x, <4 x i32> %y) { 33; CHECK-LABEL: cmp_sel_C1_or_C2_vec: 34; CHECK: # %bb.0: 35; CHECK-NEXT: addis 3, 2, .LCPI1_0@toc@ha 36; CHECK-NEXT: vcmpequw 2, 2, 3 37; CHECK-NEXT: addi 3, 3, .LCPI1_0@toc@l 38; CHECK-NEXT: lxvd2x 0, 0, 3 39; CHECK-NEXT: addis 3, 2, .LCPI1_1@toc@ha 40; CHECK-NEXT: addi 3, 3, .LCPI1_1@toc@l 41; CHECK-NEXT: xxswapd 36, 0 42; CHECK-NEXT: lxvd2x 0, 0, 3 43; CHECK-NEXT: xxswapd 37, 0 44; CHECK-NEXT: xxsel 34, 37, 36, 34 45; CHECK-NEXT: blr 46 %cond = icmp eq <4 x i32> %x, %y 47 %add = select <4 x i1> %cond, <4 x i32> <i32 3000, i32 1, i32 -1, i32 0>, <4 x i32> <i32 42, i32 0, i32 -2, i32 -1> 48 ret <4 x i32> %add 49} 50 51define <4 x i32> @sel_Cplus1_or_C_vec(<4 x i1> %cond) { 52; CHECK-LABEL: sel_Cplus1_or_C_vec: 53; CHECK: # %bb.0: 54; CHECK-NEXT: addis 3, 2, .LCPI2_0@toc@ha 55; CHECK-NEXT: vspltisw 3, 1 56; CHECK-NEXT: addi 3, 3, .LCPI2_0@toc@l 57; CHECK-NEXT: xxland 34, 34, 35 58; CHECK-NEXT: lxvd2x 0, 0, 3 59; CHECK-NEXT: xxswapd 36, 0 60; CHECK-NEXT: vadduwm 2, 2, 4 61; CHECK-NEXT: blr 62 %add = select <4 x i1> %cond, <4 x i32> <i32 43, i32 1, i32 -1, i32 0>, <4 x i32> <i32 42, i32 0, i32 -2, i32 -1> 63 ret <4 x i32> %add 64} 65 66define <4 x i32> @cmp_sel_Cplus1_or_C_vec(<4 x i32> %x, <4 x i32> %y) { 67; CHECK-LABEL: cmp_sel_Cplus1_or_C_vec: 68; CHECK: # %bb.0: 69; CHECK-NEXT: addis 3, 2, .LCPI3_0@toc@ha 70; CHECK-NEXT: vcmpequw 2, 2, 3 71; CHECK-NEXT: addi 3, 3, .LCPI3_0@toc@l 72; CHECK-NEXT: lxvd2x 0, 0, 3 73; CHECK-NEXT: xxswapd 36, 0 74; CHECK-NEXT: vsubuwm 2, 4, 2 75; CHECK-NEXT: blr 76 %cond = icmp eq <4 x i32> %x, %y 77 %add = select <4 x i1> %cond, <4 x i32> <i32 43, i32 1, i32 -1, i32 0>, <4 x i32> <i32 42, i32 0, i32 -2, i32 -1> 78 ret <4 x i32> %add 79} 80 81define <4 x i32> @sel_Cminus1_or_C_vec(<4 x i1> %cond) { 82; CHECK-LABEL: sel_Cminus1_or_C_vec: 83; CHECK: # %bb.0: 84; CHECK-NEXT: addis 3, 2, .LCPI4_0@toc@ha 85; CHECK-NEXT: vspltisw 3, -16 86; CHECK-NEXT: vspltisw 4, 15 87; CHECK-NEXT: addi 3, 3, .LCPI4_0@toc@l 88; CHECK-NEXT: vsubuwm 3, 4, 3 89; CHECK-NEXT: lxvd2x 0, 0, 3 90; CHECK-NEXT: vslw 2, 2, 3 91; CHECK-NEXT: vsraw 2, 2, 3 92; CHECK-NEXT: xxswapd 37, 0 93; CHECK-NEXT: vadduwm 2, 2, 5 94; CHECK-NEXT: blr 95 %add = select <4 x i1> %cond, <4 x i32> <i32 43, i32 1, i32 -1, i32 0>, <4 x i32> <i32 44, i32 2, i32 0, i32 1> 96 ret <4 x i32> %add 97} 98 99define <4 x i32> @cmp_sel_Cminus1_or_C_vec(<4 x i32> %x, <4 x i32> %y) { 100; CHECK-LABEL: cmp_sel_Cminus1_or_C_vec: 101; CHECK: # %bb.0: 102; CHECK-NEXT: addis 3, 2, .LCPI5_0@toc@ha 103; CHECK-NEXT: vcmpequw 2, 2, 3 104; CHECK-NEXT: addi 3, 3, .LCPI5_0@toc@l 105; CHECK-NEXT: lxvd2x 0, 0, 3 106; CHECK-NEXT: xxswapd 36, 0 107; CHECK-NEXT: vadduwm 2, 2, 4 108; CHECK-NEXT: blr 109 %cond = icmp eq <4 x i32> %x, %y 110 %add = select <4 x i1> %cond, <4 x i32> <i32 43, i32 1, i32 -1, i32 0>, <4 x i32> <i32 44, i32 2, i32 0, i32 1> 111 ret <4 x i32> %add 112} 113 114define <4 x i32> @sel_minus1_or_0_vec(<4 x i1> %cond) { 115; CHECK-LABEL: sel_minus1_or_0_vec: 116; CHECK: # %bb.0: 117; CHECK-NEXT: vspltisw 3, -16 118; CHECK-NEXT: vspltisw 4, 15 119; CHECK-NEXT: vsubuwm 3, 4, 3 120; CHECK-NEXT: vslw 2, 2, 3 121; CHECK-NEXT: vsraw 2, 2, 3 122; CHECK-NEXT: blr 123 %add = select <4 x i1> %cond, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> <i32 0, i32 0, i32 0, i32 0> 124 ret <4 x i32> %add 125} 126 127define <4 x i32> @cmp_sel_minus1_or_0_vec(<4 x i32> %x, <4 x i32> %y) { 128; CHECK-LABEL: cmp_sel_minus1_or_0_vec: 129; CHECK: # %bb.0: 130; CHECK-NEXT: vcmpequw 2, 2, 3 131; CHECK-NEXT: blr 132 %cond = icmp eq <4 x i32> %x, %y 133 %add = select <4 x i1> %cond, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1>, <4 x i32> <i32 0, i32 0, i32 0, i32 0> 134 ret <4 x i32> %add 135} 136 137define <4 x i32> @sel_0_or_minus1_vec(<4 x i1> %cond) { 138; CHECK-LABEL: sel_0_or_minus1_vec: 139; CHECK: # %bb.0: 140; CHECK-NEXT: vspltisw 3, 1 141; CHECK-NEXT: xxland 34, 34, 35 142; CHECK-NEXT: xxleqv 35, 35, 35 143; CHECK-NEXT: vadduwm 2, 2, 3 144; CHECK-NEXT: blr 145 %add = select <4 x i1> %cond, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1> 146 ret <4 x i32> %add 147} 148 149define <4 x i32> @cmp_sel_0_or_minus1_vec(<4 x i32> %x, <4 x i32> %y) { 150; CHECK-LABEL: cmp_sel_0_or_minus1_vec: 151; CHECK: # %bb.0: 152; CHECK-NEXT: vcmpequw 2, 2, 3 153; CHECK-NEXT: xxlnor 34, 34, 34 154; CHECK-NEXT: blr 155 %cond = icmp eq <4 x i32> %x, %y 156 %add = select <4 x i1> %cond, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 -1, i32 -1, i32 -1, i32 -1> 157 ret <4 x i32> %add 158} 159 160define <4 x i32> @sel_1_or_0_vec(<4 x i1> %cond) { 161; CHECK-LABEL: sel_1_or_0_vec: 162; CHECK: # %bb.0: 163; CHECK-NEXT: vspltisw 3, 1 164; CHECK-NEXT: xxland 34, 34, 35 165; CHECK-NEXT: blr 166 %add = select <4 x i1> %cond, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> <i32 0, i32 0, i32 0, i32 0> 167 ret <4 x i32> %add 168} 169 170define <4 x i32> @cmp_sel_1_or_0_vec(<4 x i32> %x, <4 x i32> %y) { 171; CHECK-LABEL: cmp_sel_1_or_0_vec: 172; CHECK: # %bb.0: 173; CHECK-NEXT: vspltisw 4, 1 174; CHECK-NEXT: vcmpequw 2, 2, 3 175; CHECK-NEXT: xxland 34, 34, 36 176; CHECK-NEXT: blr 177 %cond = icmp eq <4 x i32> %x, %y 178 %add = select <4 x i1> %cond, <4 x i32> <i32 1, i32 1, i32 1, i32 1>, <4 x i32> <i32 0, i32 0, i32 0, i32 0> 179 ret <4 x i32> %add 180} 181 182define <4 x i32> @sel_0_or_1_vec(<4 x i1> %cond) { 183; CHECK-LABEL: sel_0_or_1_vec: 184; CHECK: # %bb.0: 185; CHECK-NEXT: vspltisw 3, 1 186; CHECK-NEXT: xxlandc 34, 35, 34 187; CHECK-NEXT: blr 188 %add = select <4 x i1> %cond, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 189 ret <4 x i32> %add 190} 191 192define <4 x i32> @cmp_sel_0_or_1_vec(<4 x i32> %x, <4 x i32> %y) { 193; CHECK-LABEL: cmp_sel_0_or_1_vec: 194; CHECK: # %bb.0: 195; CHECK-NEXT: vcmpequw 2, 2, 3 196; CHECK-NEXT: vspltisw 4, 1 197; CHECK-NEXT: xxlnor 0, 34, 34 198; CHECK-NEXT: xxland 34, 0, 36 199; CHECK-NEXT: blr 200 %cond = icmp eq <4 x i32> %x, %y 201 %add = select <4 x i1> %cond, <4 x i32> <i32 0, i32 0, i32 0, i32 0>, <4 x i32> <i32 1, i32 1, i32 1, i32 1> 202 ret <4 x i32> %add 203} 204 205