1; RUN: llc < %s -mtriple=ve-unknown-unknown -mattr=+vpu | FileCheck %s 2 3; ISA-compatible vector broadcasts 4define fastcc <256 x i64> @brd_v256i64(i64 %s) { 5; CHECK-LABEL: brd_v256i64: 6; CHECK: # %bb.0: 7; CHECK-NEXT: lea %s1, 256 8; CHECK-NEXT: lvl %s1 9; CHECK-NEXT: vbrd %v0, %s0 10; CHECK-NEXT: b.l.t (, %s10) 11 %val = insertelement <256 x i64> undef, i64 %s, i32 0 12 %ret = shufflevector <256 x i64> %val, <256 x i64> undef, <256 x i32> zeroinitializer 13 ret <256 x i64> %ret 14} 15 16define fastcc <256 x i64> @brdi_v256i64() { 17; CHECK-LABEL: brdi_v256i64: 18; CHECK: # %bb.0: 19; CHECK-NEXT: lea %s0, 256 20; CHECK-NEXT: lvl %s0 21; CHECK-NEXT: vbrd %v0, 1 22; CHECK-NEXT: b.l.t (, %s10) 23 %val = insertelement <256 x i64> undef, i64 1, i32 0 24 %ret = shufflevector <256 x i64> %val, <256 x i64> undef, <256 x i32> zeroinitializer 25 ret <256 x i64> %ret 26} 27 28define fastcc <256 x double> @brd_v256f64(double %s) { 29; CHECK-LABEL: brd_v256f64: 30; CHECK: # %bb.0: 31; CHECK-NEXT: lea %s1, 256 32; CHECK-NEXT: lvl %s1 33; CHECK-NEXT: vbrd %v0, %s0 34; CHECK-NEXT: b.l.t (, %s10) 35 %val = insertelement <256 x double> undef, double %s, i32 0 36 %ret = shufflevector <256 x double> %val, <256 x double> undef, <256 x i32> zeroinitializer 37 ret <256 x double> %ret 38} 39 40define fastcc <256 x double> @brdi_v256f64() { 41; CHECK-LABEL: brdi_v256f64: 42; CHECK: # %bb.0: 43; CHECK-NEXT: lea %s0, 256 44; CHECK-NEXT: lvl %s0 45; CHECK-NEXT: vbrd %v0, 0 46; CHECK-NEXT: b.l.t (, %s10) 47 %val = insertelement <256 x double> undef, double 0.e+00, i32 0 48 %ret = shufflevector <256 x double> %val, <256 x double> undef, <256 x i32> zeroinitializer 49 ret <256 x double> %ret 50} 51 52define fastcc <256 x i32> @brd_v256i32(i32 %s) { 53; CHECK-LABEL: brd_v256i32: 54; CHECK: # %bb.0: 55; CHECK-NEXT: and %s0, %s0, (32)0 56; CHECK-NEXT: lea %s1, 256 57; CHECK-NEXT: lvl %s1 58; CHECK-NEXT: vbrd %v0, %s0 59; CHECK-NEXT: b.l.t (, %s10) 60 %val = insertelement <256 x i32> undef, i32 %s, i32 0 61 %ret = shufflevector <256 x i32> %val, <256 x i32> undef, <256 x i32> zeroinitializer 62 ret <256 x i32> %ret 63} 64 65define fastcc <256 x i32> @brdi_v256i32(i32 %s) { 66; CHECK-LABEL: brdi_v256i32: 67; CHECK: # %bb.0: 68; CHECK-NEXT: lea %s0, 256 69; CHECK-NEXT: lvl %s0 70; CHECK-NEXT: vbrd %v0, 13 71; CHECK-NEXT: b.l.t (, %s10) 72 %val = insertelement <256 x i32> undef, i32 13, i32 0 73 %ret = shufflevector <256 x i32> %val, <256 x i32> undef, <256 x i32> zeroinitializer 74 ret <256 x i32> %ret 75} 76 77define fastcc <256 x float> @brd_v256f32(float %s) { 78; CHECK-LABEL: brd_v256f32: 79; CHECK: # %bb.0: 80; CHECK-NEXT: lea %s1, 256 81; CHECK-NEXT: lvl %s1 82; CHECK-NEXT: vbrd %v0, %s0 83; CHECK-NEXT: b.l.t (, %s10) 84 %val = insertelement <256 x float> undef, float %s, i32 0 85 %ret = shufflevector <256 x float> %val, <256 x float> undef, <256 x i32> zeroinitializer 86 ret <256 x float> %ret 87} 88 89define fastcc <256 x float> @brdi_v256f32(float %s) { 90; CHECK-LABEL: brdi_v256f32: 91; CHECK: # %bb.0: 92; CHECK-NEXT: lea %s0, 256 93; CHECK-NEXT: lvl %s0 94; CHECK-NEXT: vbrd %v0, 0 95; CHECK-NEXT: b.l.t (, %s10) 96 %val = insertelement <256 x float> undef, float 0.e+00, i32 0 97 %ret = shufflevector <256 x float> %val, <256 x float> undef, <256 x i32> zeroinitializer 98 ret <256 x float> %ret 99} 100 101 102; Shorter vectors, we expect these to be widened (for now). 103define fastcc <128 x i64> @brd_v128i64(i64 %s) { 104; CHECK-LABEL: brd_v128i64: 105; CHECK: # %bb.0: 106; CHECK-NEXT: lea %s1, 256 107; CHECK-NEXT: lvl %s1 108; CHECK-NEXT: vbrd %v0, %s0 109; CHECK-NEXT: b.l.t (, %s10) 110 %val = insertelement <128 x i64> undef, i64 %s, i32 0 111 %ret = shufflevector <128 x i64> %val, <128 x i64> undef, <128 x i32> zeroinitializer 112 ret <128 x i64> %ret 113} 114 115define fastcc <128 x double> @brd_v128f64(double %s) { 116; CHECK-LABEL: brd_v128f64: 117; CHECK: # %bb.0: 118; CHECK-NEXT: lea %s1, 256 119; CHECK-NEXT: lvl %s1 120; CHECK-NEXT: vbrd %v0, %s0 121; CHECK-NEXT: b.l.t (, %s10) 122 %val = insertelement <128 x double> undef, double %s, i32 0 123 %ret = shufflevector <128 x double> %val, <128 x double> undef, <128 x i32> zeroinitializer 124 ret <128 x double> %ret 125} 126 127define fastcc <128 x i32> @brd_v128i32(i32 %s) { 128; CHECK-LABEL: brd_v128i32: 129; CHECK: # %bb.0: 130; CHECK-NEXT: and %s0, %s0, (32)0 131; CHECK-NEXT: lea %s1, 256 132; CHECK-NEXT: lvl %s1 133; CHECK-NEXT: vbrd %v0, %s0 134; CHECK-NEXT: b.l.t (, %s10) 135 %val = insertelement <128 x i32> undef, i32 %s, i32 0 136 %ret = shufflevector <128 x i32> %val, <128 x i32> undef, <128 x i32> zeroinitializer 137 ret <128 x i32> %ret 138} 139 140define fastcc <128 x i32> @brdi_v128i32(i32 %s) { 141; CHECK-LABEL: brdi_v128i32: 142; CHECK: # %bb.0: 143; CHECK-NEXT: lea %s0, 256 144; CHECK-NEXT: lvl %s0 145; CHECK-NEXT: vbrd %v0, 13 146; CHECK-NEXT: b.l.t (, %s10) 147 %val = insertelement <128 x i32> undef, i32 13, i32 0 148 %ret = shufflevector <128 x i32> %val, <128 x i32> undef, <128 x i32> zeroinitializer 149 ret <128 x i32> %ret 150} 151 152define fastcc <128 x float> @brd_v128f32(float %s) { 153; CHECK-LABEL: brd_v128f32: 154; CHECK: # %bb.0: 155; CHECK-NEXT: lea %s1, 256 156; CHECK-NEXT: lvl %s1 157; CHECK-NEXT: vbrd %v0, %s0 158; CHECK-NEXT: b.l.t (, %s10) 159 %val = insertelement <128 x float> undef, float %s, i32 0 160 %ret = shufflevector <128 x float> %val, <128 x float> undef, <128 x i32> zeroinitializer 161 ret <128 x float> %ret 162} 163 164define fastcc <128 x float> @brdi_v128f32(float %s) { 165; CHECK-LABEL: brdi_v128f32: 166; CHECK: # %bb.0: 167; CHECK-NEXT: lea %s0, 256 168; CHECK-NEXT: lvl %s0 169; CHECK-NEXT: vbrd %v0, 0 170; CHECK-NEXT: b.l.t (, %s10) 171 %val = insertelement <128 x float> undef, float 0.e+00, i32 0 172 %ret = shufflevector <128 x float> %val, <128 x float> undef, <128 x i32> zeroinitializer 173 ret <128 x float> %ret 174} 175 176; Vectors with small element types and valid element count, we expect those to be promoted. 177define fastcc <256 x i16> @brd_v256i16(i16 %s) { 178; CHECK-LABEL: brd_v256i16: 179; CHECK: # %bb.0: 180; CHECK-NEXT: and %s0, %s0, (32)0 181; CHECK-NEXT: lea %s1, 256 182; CHECK-NEXT: lvl %s1 183; CHECK-NEXT: vbrd %v0, %s0 184; CHECK-NEXT: b.l.t (, %s10) 185 %val = insertelement <256 x i16> undef, i16 %s, i32 0 186 %ret = shufflevector <256 x i16> %val, <256 x i16> undef, <256 x i32> zeroinitializer 187 ret <256 x i16> %ret 188} 189 190; Vectors with small element types and low element count, these are scalarized for now. 191; FIXME Promote + Widen 192define fastcc <128 x i16> @brd_v128i16(i16 %s) { 193; CHECK-LABEL: brd_v128i16: 194; CHECK: # %bb.0: 195; CHECK-NEXT: and %s1, %s1, (32)0 196; CHECK-NEXT: st2b %s1, 254(, %s0) 197; CHECK-NEXT: st2b %s1, 252(, %s0) 198; CHECK-NEXT: st2b %s1, 250(, %s0) 199; CHECK-NEXT: st2b %s1, 248(, %s0) 200; CHECK-NEXT: st2b %s1, 246(, %s0) 201; CHECK-NEXT: st2b %s1, 244(, %s0) 202; CHECK-NEXT: st2b %s1, 242(, %s0) 203; CHECK-NEXT: st2b %s1, 240(, %s0) 204; CHECK-NEXT: st2b %s1, 238(, %s0) 205; CHECK-NEXT: st2b %s1, 236(, %s0) 206; CHECK-NEXT: st2b %s1, 234(, %s0) 207; CHECK-NEXT: st2b %s1, 232(, %s0) 208; CHECK-NEXT: st2b %s1, 230(, %s0) 209; CHECK-NEXT: st2b %s1, 228(, %s0) 210; CHECK-NEXT: st2b %s1, 226(, %s0) 211; CHECK-NEXT: st2b %s1, 224(, %s0) 212; CHECK-NEXT: st2b %s1, 222(, %s0) 213; CHECK-NEXT: st2b %s1, 220(, %s0) 214; CHECK-NEXT: st2b %s1, 218(, %s0) 215; CHECK-NEXT: st2b %s1, 216(, %s0) 216; CHECK-NEXT: st2b %s1, 214(, %s0) 217; CHECK-NEXT: st2b %s1, 212(, %s0) 218; CHECK-NEXT: st2b %s1, 210(, %s0) 219; CHECK-NEXT: st2b %s1, 208(, %s0) 220; CHECK-NEXT: st2b %s1, 206(, %s0) 221; CHECK-NEXT: st2b %s1, 204(, %s0) 222; CHECK-NEXT: st2b %s1, 202(, %s0) 223; CHECK-NEXT: st2b %s1, 200(, %s0) 224; CHECK-NEXT: st2b %s1, 198(, %s0) 225; CHECK-NEXT: st2b %s1, 196(, %s0) 226; CHECK-NEXT: st2b %s1, 194(, %s0) 227; CHECK-NEXT: st2b %s1, 192(, %s0) 228; CHECK-NEXT: st2b %s1, 190(, %s0) 229; CHECK-NEXT: st2b %s1, 188(, %s0) 230; CHECK-NEXT: st2b %s1, 186(, %s0) 231; CHECK-NEXT: st2b %s1, 184(, %s0) 232; CHECK-NEXT: st2b %s1, 182(, %s0) 233; CHECK-NEXT: st2b %s1, 180(, %s0) 234; CHECK-NEXT: st2b %s1, 178(, %s0) 235; CHECK-NEXT: st2b %s1, 176(, %s0) 236; CHECK-NEXT: st2b %s1, 174(, %s0) 237; CHECK-NEXT: st2b %s1, 172(, %s0) 238; CHECK-NEXT: st2b %s1, 170(, %s0) 239; CHECK-NEXT: st2b %s1, 168(, %s0) 240; CHECK-NEXT: st2b %s1, 166(, %s0) 241; CHECK-NEXT: st2b %s1, 164(, %s0) 242; CHECK-NEXT: st2b %s1, 162(, %s0) 243; CHECK-NEXT: st2b %s1, 160(, %s0) 244; CHECK-NEXT: st2b %s1, 158(, %s0) 245; CHECK-NEXT: st2b %s1, 156(, %s0) 246; CHECK-NEXT: st2b %s1, 154(, %s0) 247; CHECK-NEXT: st2b %s1, 152(, %s0) 248; CHECK-NEXT: st2b %s1, 150(, %s0) 249; CHECK-NEXT: st2b %s1, 148(, %s0) 250; CHECK-NEXT: st2b %s1, 146(, %s0) 251; CHECK-NEXT: st2b %s1, 144(, %s0) 252; CHECK-NEXT: st2b %s1, 142(, %s0) 253; CHECK-NEXT: st2b %s1, 140(, %s0) 254; CHECK-NEXT: st2b %s1, 138(, %s0) 255; CHECK-NEXT: st2b %s1, 136(, %s0) 256; CHECK-NEXT: st2b %s1, 134(, %s0) 257; CHECK-NEXT: st2b %s1, 132(, %s0) 258; CHECK-NEXT: st2b %s1, 130(, %s0) 259; CHECK-NEXT: st2b %s1, 128(, %s0) 260; CHECK-NEXT: st2b %s1, 126(, %s0) 261; CHECK-NEXT: st2b %s1, 124(, %s0) 262; CHECK-NEXT: st2b %s1, 122(, %s0) 263; CHECK-NEXT: st2b %s1, 120(, %s0) 264; CHECK-NEXT: st2b %s1, 118(, %s0) 265; CHECK-NEXT: st2b %s1, 116(, %s0) 266; CHECK-NEXT: st2b %s1, 114(, %s0) 267; CHECK-NEXT: st2b %s1, 112(, %s0) 268; CHECK-NEXT: st2b %s1, 110(, %s0) 269; CHECK-NEXT: st2b %s1, 108(, %s0) 270; CHECK-NEXT: st2b %s1, 106(, %s0) 271; CHECK-NEXT: st2b %s1, 104(, %s0) 272; CHECK-NEXT: st2b %s1, 102(, %s0) 273; CHECK-NEXT: st2b %s1, 100(, %s0) 274; CHECK-NEXT: st2b %s1, 98(, %s0) 275; CHECK-NEXT: st2b %s1, 96(, %s0) 276; CHECK-NEXT: st2b %s1, 94(, %s0) 277; CHECK-NEXT: st2b %s1, 92(, %s0) 278; CHECK-NEXT: st2b %s1, 90(, %s0) 279; CHECK-NEXT: st2b %s1, 88(, %s0) 280; CHECK-NEXT: st2b %s1, 86(, %s0) 281; CHECK-NEXT: st2b %s1, 84(, %s0) 282; CHECK-NEXT: st2b %s1, 82(, %s0) 283; CHECK-NEXT: st2b %s1, 80(, %s0) 284; CHECK-NEXT: st2b %s1, 78(, %s0) 285; CHECK-NEXT: st2b %s1, 76(, %s0) 286; CHECK-NEXT: st2b %s1, 74(, %s0) 287; CHECK-NEXT: st2b %s1, 72(, %s0) 288; CHECK-NEXT: st2b %s1, 70(, %s0) 289; CHECK-NEXT: st2b %s1, 68(, %s0) 290; CHECK-NEXT: st2b %s1, 66(, %s0) 291; CHECK-NEXT: st2b %s1, 64(, %s0) 292; CHECK-NEXT: st2b %s1, 62(, %s0) 293; CHECK-NEXT: st2b %s1, 60(, %s0) 294; CHECK-NEXT: st2b %s1, 58(, %s0) 295; CHECK-NEXT: st2b %s1, 56(, %s0) 296; CHECK-NEXT: st2b %s1, 54(, %s0) 297; CHECK-NEXT: st2b %s1, 52(, %s0) 298; CHECK-NEXT: st2b %s1, 50(, %s0) 299; CHECK-NEXT: st2b %s1, 48(, %s0) 300; CHECK-NEXT: st2b %s1, 46(, %s0) 301; CHECK-NEXT: st2b %s1, 44(, %s0) 302; CHECK-NEXT: st2b %s1, 42(, %s0) 303; CHECK-NEXT: st2b %s1, 40(, %s0) 304; CHECK-NEXT: st2b %s1, 38(, %s0) 305; CHECK-NEXT: st2b %s1, 36(, %s0) 306; CHECK-NEXT: st2b %s1, 34(, %s0) 307; CHECK-NEXT: st2b %s1, 32(, %s0) 308; CHECK-NEXT: st2b %s1, 30(, %s0) 309; CHECK-NEXT: st2b %s1, 28(, %s0) 310; CHECK-NEXT: st2b %s1, 26(, %s0) 311; CHECK-NEXT: st2b %s1, 24(, %s0) 312; CHECK-NEXT: st2b %s1, 22(, %s0) 313; CHECK-NEXT: st2b %s1, 20(, %s0) 314; CHECK-NEXT: st2b %s1, 18(, %s0) 315; CHECK-NEXT: st2b %s1, 16(, %s0) 316; CHECK-NEXT: st2b %s1, 14(, %s0) 317; CHECK-NEXT: st2b %s1, 12(, %s0) 318; CHECK-NEXT: st2b %s1, 10(, %s0) 319; CHECK-NEXT: st2b %s1, 8(, %s0) 320; CHECK-NEXT: st2b %s1, 6(, %s0) 321; CHECK-NEXT: st2b %s1, 4(, %s0) 322; CHECK-NEXT: st2b %s1, 2(, %s0) 323; CHECK-NEXT: st2b %s1, (, %s0) 324; CHECK-NEXT: b.l.t (, %s10) 325 %val = insertelement <128 x i16> undef, i16 %s, i32 0 326 %ret = shufflevector <128 x i16> %val, <128 x i16> undef, <128 x i32> zeroinitializer 327 ret <128 x i16> %ret 328} 329