1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ 3; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \ 4; RUN: FileCheck %s --check-prefixes=CHECK,CHECK-LE 5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 6; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \ 7; RUN: FileCheck %s --check-prefixes=CHECK,CHECK-LINUXBE 8; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu -O0 \ 9; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \ 10; RUN: FileCheck %s --check-prefixes=CHECK,CHECK-O0 11; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix-xcoff \ 12; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr < %s | \ 13; RUN: FileCheck %s --check-prefixes=CHECK,CHECK-AIXBE 14 15; These test cases aims to test the builtins for the Power10 VSX vector 16; instructions introduced in ISA 3.1. 17 18declare i32 @llvm.ppc.vsx.xvtlsbb(<16 x i8>, i32) 19 20define signext i32 @test_vec_test_lsbb_all_ones(<16 x i8> %vuca) { 21; CHECK-LABEL: test_vec_test_lsbb_all_ones: 22; CHECK: # %bb.0: # %entry 23; CHECK-NEXT: xvtlsbb cr0, v2 24; CHECK-NEXT: mfocrf r3, 128 25; CHECK-NEXT: srwi r3, r3, 31 26; CHECK-NEXT: extsw r3, r3 27; CHECK-NEXT: blr 28entry: 29 %0 = tail call i32 @llvm.ppc.vsx.xvtlsbb(<16 x i8> %vuca, i32 1) 30 ret i32 %0 31} 32 33define signext i32 @test_vec_test_lsbb_all_zeros(<16 x i8> %vuca) { 34; CHECK-LABEL: test_vec_test_lsbb_all_zeros: 35; CHECK: # %bb.0: # %entry 36; CHECK-NEXT: xvtlsbb cr0, v2 37; CHECK-NEXT: mfocrf r3, 128 38; CHECK-NEXT: rlwinm r3, r3, 3, 31, 31 39; CHECK-NEXT: extsw r3, r3 40; CHECK-NEXT: blr 41entry: 42 %0 = tail call i32 @llvm.ppc.vsx.xvtlsbb(<16 x i8> %vuca, i32 0) 43 ret i32 %0 44} 45 46define void @vec_xst_trunc_sc(<1 x i128> %__vec, i64 %__offset, ptr nocapture %__ptr) { 47; CHECK-LE-LABEL: vec_xst_trunc_sc: 48; CHECK-LE: # %bb.0: # %entry 49; CHECK-LE-NEXT: stxvrbx v2, r6, r5 50; CHECK-LE-NEXT: blr 51; 52; CHECK-LINUXBE-LABEL: vec_xst_trunc_sc: 53; CHECK-LINUXBE: # %bb.0: # %entry 54; CHECK-LINUXBE-NEXT: vsldoi v2, v2, v2, 9 55; CHECK-LINUXBE-NEXT: stxsibx v2, r6, r5 56; CHECK-LINUXBE-NEXT: blr 57; 58; CHECK-O0-LABEL: vec_xst_trunc_sc: 59; CHECK-O0: # %bb.0: # %entry 60; CHECK-O0-NEXT: li r3, 0 61; CHECK-O0-NEXT: vextubrx r3, r3, v2 62; CHECK-O0-NEXT: # kill: def $r3 killed $r3 killed $x3 63; CHECK-O0-NEXT: add r4, r6, r5 64; CHECK-O0-NEXT: stb r3, 0(r4) 65; CHECK-O0-NEXT: blr 66; 67; CHECK-AIXBE-LABEL: vec_xst_trunc_sc: 68; CHECK-AIXBE: # %bb.0: # %entry 69; CHECK-AIXBE-NEXT: vsldoi v2, v2, v2, 9 70; CHECK-AIXBE-NEXT: stxsibx v2, r4, r3 71; CHECK-AIXBE-NEXT: blr 72entry: 73 %0 = bitcast <1 x i128> %__vec to <16 x i8> 74 %conv = extractelement <16 x i8> %0, i32 0 75 %add.ptr = getelementptr inbounds i8, ptr %__ptr, i64 %__offset 76 store i8 %conv, ptr %add.ptr, align 1 77 ret void 78} 79 80define void @vec_xst_trunc_uc(<1 x i128> %__vec, i64 %__offset, ptr nocapture %__ptr) { 81; CHECK-LE-LABEL: vec_xst_trunc_uc: 82; CHECK-LE: # %bb.0: # %entry 83; CHECK-LE-NEXT: stxvrbx v2, r6, r5 84; CHECK-LE-NEXT: blr 85; 86; CHECK-LINUXBE-LABEL: vec_xst_trunc_uc: 87; CHECK-LINUXBE: # %bb.0: # %entry 88; CHECK-LINUXBE-NEXT: vsldoi v2, v2, v2, 9 89; CHECK-LINUXBE-NEXT: stxsibx v2, r6, r5 90; CHECK-LINUXBE-NEXT: blr 91; 92; CHECK-O0-LABEL: vec_xst_trunc_uc: 93; CHECK-O0: # %bb.0: # %entry 94; CHECK-O0-NEXT: li r3, 0 95; CHECK-O0-NEXT: vextubrx r3, r3, v2 96; CHECK-O0-NEXT: # kill: def $r3 killed $r3 killed $x3 97; CHECK-O0-NEXT: add r4, r6, r5 98; CHECK-O0-NEXT: stb r3, 0(r4) 99; CHECK-O0-NEXT: blr 100; 101; CHECK-AIXBE-LABEL: vec_xst_trunc_uc: 102; CHECK-AIXBE: # %bb.0: # %entry 103; CHECK-AIXBE-NEXT: vsldoi v2, v2, v2, 9 104; CHECK-AIXBE-NEXT: stxsibx v2, r4, r3 105; CHECK-AIXBE-NEXT: blr 106entry: 107 %0 = bitcast <1 x i128> %__vec to <16 x i8> 108 %conv = extractelement <16 x i8> %0, i32 0 109 %add.ptr = getelementptr inbounds i8, ptr %__ptr, i64 %__offset 110 store i8 %conv, ptr %add.ptr, align 1 111 ret void 112} 113 114define void @vec_xst_trunc_ss(<1 x i128> %__vec, i64 %__offset, ptr nocapture %__ptr) { 115; CHECK-LE-LABEL: vec_xst_trunc_ss: 116; CHECK-LE: # %bb.0: # %entry 117; CHECK-LE-NEXT: sldi r3, r5, 1 118; CHECK-LE-NEXT: stxvrhx v2, r6, r3 119; CHECK-LE-NEXT: blr 120; 121; CHECK-LINUXBE-LABEL: vec_xst_trunc_ss: 122; CHECK-LINUXBE: # %bb.0: # %entry 123; CHECK-LINUXBE-NEXT: vsldoi v2, v2, v2, 10 124; CHECK-LINUXBE-NEXT: sldi r3, r5, 1 125; CHECK-LINUXBE-NEXT: stxsihx v2, r6, r3 126; CHECK-LINUXBE-NEXT: blr 127; 128; CHECK-O0-LABEL: vec_xst_trunc_ss: 129; CHECK-O0: # %bb.0: # %entry 130; CHECK-O0-NEXT: li r3, 0 131; CHECK-O0-NEXT: vextuhrx r3, r3, v2 132; CHECK-O0-NEXT: # kill: def $r3 killed $r3 killed $x3 133; CHECK-O0-NEXT: sldi r4, r5, 1 134; CHECK-O0-NEXT: add r4, r6, r4 135; CHECK-O0-NEXT: sth r3, 0(r4) 136; CHECK-O0-NEXT: blr 137; 138; CHECK-AIXBE-LABEL: vec_xst_trunc_ss: 139; CHECK-AIXBE: # %bb.0: # %entry 140; CHECK-AIXBE-NEXT: vsldoi v2, v2, v2, 10 141; CHECK-AIXBE-NEXT: sldi r3, r3, 1 142; CHECK-AIXBE-NEXT: stxsihx v2, r4, r3 143; CHECK-AIXBE-NEXT: blr 144entry: 145 %0 = bitcast <1 x i128> %__vec to <8 x i16> 146 %conv = extractelement <8 x i16> %0, i32 0 147 %add.ptr = getelementptr inbounds i16, ptr %__ptr, i64 %__offset 148 store i16 %conv, ptr %add.ptr, align 2 149 ret void 150} 151 152define void @vec_xst_trunc_us(<1 x i128> %__vec, i64 %__offset, ptr nocapture %__ptr) { 153; CHECK-LE-LABEL: vec_xst_trunc_us: 154; CHECK-LE: # %bb.0: # %entry 155; CHECK-LE-NEXT: sldi r3, r5, 1 156; CHECK-LE-NEXT: stxvrhx v2, r6, r3 157; CHECK-LE-NEXT: blr 158; 159; CHECK-LINUXBE-LABEL: vec_xst_trunc_us: 160; CHECK-LINUXBE: # %bb.0: # %entry 161; CHECK-LINUXBE-NEXT: vsldoi v2, v2, v2, 10 162; CHECK-LINUXBE-NEXT: sldi r3, r5, 1 163; CHECK-LINUXBE-NEXT: stxsihx v2, r6, r3 164; CHECK-LINUXBE-NEXT: blr 165; 166; CHECK-O0-LABEL: vec_xst_trunc_us: 167; CHECK-O0: # %bb.0: # %entry 168; CHECK-O0-NEXT: li r3, 0 169; CHECK-O0-NEXT: vextuhrx r3, r3, v2 170; CHECK-O0-NEXT: # kill: def $r3 killed $r3 killed $x3 171; CHECK-O0-NEXT: sldi r4, r5, 1 172; CHECK-O0-NEXT: add r4, r6, r4 173; CHECK-O0-NEXT: sth r3, 0(r4) 174; CHECK-O0-NEXT: blr 175; 176; CHECK-AIXBE-LABEL: vec_xst_trunc_us: 177; CHECK-AIXBE: # %bb.0: # %entry 178; CHECK-AIXBE-NEXT: vsldoi v2, v2, v2, 10 179; CHECK-AIXBE-NEXT: sldi r3, r3, 1 180; CHECK-AIXBE-NEXT: stxsihx v2, r4, r3 181; CHECK-AIXBE-NEXT: blr 182entry: 183 %0 = bitcast <1 x i128> %__vec to <8 x i16> 184 %conv = extractelement <8 x i16> %0, i32 0 185 %add.ptr = getelementptr inbounds i16, ptr %__ptr, i64 %__offset 186 store i16 %conv, ptr %add.ptr, align 2 187 ret void 188} 189 190define void @vec_xst_trunc_si(<1 x i128> %__vec, i64 %__offset, ptr nocapture %__ptr) { 191; CHECK-LE-LABEL: vec_xst_trunc_si: 192; CHECK-LE: # %bb.0: # %entry 193; CHECK-LE-NEXT: sldi r3, r5, 2 194; CHECK-LE-NEXT: stxvrwx v2, r6, r3 195; CHECK-LE-NEXT: blr 196; 197; CHECK-LINUXBE-LABEL: vec_xst_trunc_si: 198; CHECK-LINUXBE: # %bb.0: # %entry 199; CHECK-LINUXBE-NEXT: xxsldwi vs0, v2, v2, 3 200; CHECK-LINUXBE-NEXT: sldi r3, r5, 2 201; CHECK-LINUXBE-NEXT: stfiwx f0, r6, r3 202; CHECK-LINUXBE-NEXT: blr 203; 204; CHECK-O0-LABEL: vec_xst_trunc_si: 205; CHECK-O0: # %bb.0: # %entry 206; CHECK-O0-NEXT: li r3, 0 207; CHECK-O0-NEXT: vextuwrx r3, r3, v2 208; CHECK-O0-NEXT: # kill: def $r3 killed $r3 killed $x3 209; CHECK-O0-NEXT: sldi r4, r5, 2 210; CHECK-O0-NEXT: add r4, r6, r4 211; CHECK-O0-NEXT: stw r3, 0(r4) 212; CHECK-O0-NEXT: blr 213; 214; CHECK-AIXBE-LABEL: vec_xst_trunc_si: 215; CHECK-AIXBE: # %bb.0: # %entry 216; CHECK-AIXBE-NEXT: xxsldwi vs0, v2, v2, 3 217; CHECK-AIXBE-NEXT: sldi r3, r3, 2 218; CHECK-AIXBE-NEXT: stfiwx f0, r4, r3 219; CHECK-AIXBE-NEXT: blr 220entry: 221 %0 = bitcast <1 x i128> %__vec to <4 x i32> 222 %conv = extractelement <4 x i32> %0, i32 0 223 %add.ptr = getelementptr inbounds i32, ptr %__ptr, i64 %__offset 224 store i32 %conv, ptr %add.ptr, align 4 225 ret void 226} 227 228define void @vec_xst_trunc_ui(<1 x i128> %__vec, i64 %__offset, ptr nocapture %__ptr) { 229; CHECK-LE-LABEL: vec_xst_trunc_ui: 230; CHECK-LE: # %bb.0: # %entry 231; CHECK-LE-NEXT: sldi r3, r5, 2 232; CHECK-LE-NEXT: stxvrwx v2, r6, r3 233; CHECK-LE-NEXT: blr 234; 235; CHECK-LINUXBE-LABEL: vec_xst_trunc_ui: 236; CHECK-LINUXBE: # %bb.0: # %entry 237; CHECK-LINUXBE-NEXT: xxsldwi vs0, v2, v2, 3 238; CHECK-LINUXBE-NEXT: sldi r3, r5, 2 239; CHECK-LINUXBE-NEXT: stfiwx f0, r6, r3 240; CHECK-LINUXBE-NEXT: blr 241; 242; CHECK-O0-LABEL: vec_xst_trunc_ui: 243; CHECK-O0: # %bb.0: # %entry 244; CHECK-O0-NEXT: li r3, 0 245; CHECK-O0-NEXT: vextuwrx r3, r3, v2 246; CHECK-O0-NEXT: # kill: def $r3 killed $r3 killed $x3 247; CHECK-O0-NEXT: sldi r4, r5, 2 248; CHECK-O0-NEXT: add r4, r6, r4 249; CHECK-O0-NEXT: stw r3, 0(r4) 250; CHECK-O0-NEXT: blr 251; 252; CHECK-AIXBE-LABEL: vec_xst_trunc_ui: 253; CHECK-AIXBE: # %bb.0: # %entry 254; CHECK-AIXBE-NEXT: xxsldwi vs0, v2, v2, 3 255; CHECK-AIXBE-NEXT: sldi r3, r3, 2 256; CHECK-AIXBE-NEXT: stfiwx f0, r4, r3 257; CHECK-AIXBE-NEXT: blr 258entry: 259 %0 = bitcast <1 x i128> %__vec to <4 x i32> 260 %conv = extractelement <4 x i32> %0, i32 0 261 %add.ptr = getelementptr inbounds i32, ptr %__ptr, i64 %__offset 262 store i32 %conv, ptr %add.ptr, align 4 263 ret void 264} 265 266define void @vec_xst_trunc_sll(<1 x i128> %__vec, i64 %__offset, ptr nocapture %__ptr) { 267; CHECK-LE-LABEL: vec_xst_trunc_sll: 268; CHECK-LE: # %bb.0: # %entry 269; CHECK-LE-NEXT: sldi r3, r5, 3 270; CHECK-LE-NEXT: stxvrdx v2, r6, r3 271; CHECK-LE-NEXT: blr 272; 273; CHECK-LINUXBE-LABEL: vec_xst_trunc_sll: 274; CHECK-LINUXBE: # %bb.0: # %entry 275; CHECK-LINUXBE-NEXT: sldi r3, r5, 3 276; CHECK-LINUXBE-NEXT: stxsdx v2, r6, r3 277; CHECK-LINUXBE-NEXT: blr 278; 279; CHECK-O0-LABEL: vec_xst_trunc_sll: 280; CHECK-O0: # %bb.0: # %entry 281; CHECK-O0-NEXT: mfvsrld r3, v2 282; CHECK-O0-NEXT: sldi r4, r5, 3 283; CHECK-O0-NEXT: add r4, r6, r4 284; CHECK-O0-NEXT: std r3, 0(r4) 285; CHECK-O0-NEXT: blr 286; 287; CHECK-AIXBE-LABEL: vec_xst_trunc_sll: 288; CHECK-AIXBE: # %bb.0: # %entry 289; CHECK-AIXBE-NEXT: sldi r3, r3, 3 290; CHECK-AIXBE-NEXT: stxsdx v2, r4, r3 291; CHECK-AIXBE-NEXT: blr 292entry: 293 %0 = bitcast <1 x i128> %__vec to <2 x i64> 294 %conv = extractelement <2 x i64> %0, i32 0 295 %add.ptr = getelementptr inbounds i64, ptr %__ptr, i64 %__offset 296 store i64 %conv, ptr %add.ptr, align 8 297 ret void 298} 299 300define void @vec_xst_trunc_ull(<1 x i128> %__vec, i64 %__offset, ptr nocapture %__ptr) { 301; CHECK-LE-LABEL: vec_xst_trunc_ull: 302; CHECK-LE: # %bb.0: # %entry 303; CHECK-LE-NEXT: sldi r3, r5, 3 304; CHECK-LE-NEXT: stxvrdx v2, r6, r3 305; CHECK-LE-NEXT: blr 306; 307; CHECK-LINUXBE-LABEL: vec_xst_trunc_ull: 308; CHECK-LINUXBE: # %bb.0: # %entry 309; CHECK-LINUXBE-NEXT: sldi r3, r5, 3 310; CHECK-LINUXBE-NEXT: stxsdx v2, r6, r3 311; CHECK-LINUXBE-NEXT: blr 312; 313; CHECK-O0-LABEL: vec_xst_trunc_ull: 314; CHECK-O0: # %bb.0: # %entry 315; CHECK-O0-NEXT: mfvsrld r3, v2 316; CHECK-O0-NEXT: sldi r4, r5, 3 317; CHECK-O0-NEXT: add r4, r6, r4 318; CHECK-O0-NEXT: std r3, 0(r4) 319; CHECK-O0-NEXT: blr 320; 321; CHECK-AIXBE-LABEL: vec_xst_trunc_ull: 322; CHECK-AIXBE: # %bb.0: # %entry 323; CHECK-AIXBE-NEXT: sldi r3, r3, 3 324; CHECK-AIXBE-NEXT: stxsdx v2, r4, r3 325; CHECK-AIXBE-NEXT: blr 326entry: 327 %0 = bitcast <1 x i128> %__vec to <2 x i64> 328 %conv = extractelement <2 x i64> %0, i32 0 329 %add.ptr = getelementptr inbounds i64, ptr %__ptr, i64 %__offset 330 store i64 %conv, ptr %add.ptr, align 8 331 ret void 332} 333 334define dso_local <1 x i128> @vec_xl_zext(i64 %__offset, ptr nocapture readonly %__pointer) { 335; CHECK-LABEL: vec_xl_zext: 336; CHECK: # %bb.0: # %entry 337; CHECK-NEXT: lxvrbx v2, r4, r3 338; CHECK-NEXT: blr 339entry: 340 %add.ptr = getelementptr inbounds i8, ptr %__pointer, i64 %__offset 341 %0 = load i8, ptr %add.ptr, align 1 342 %conv = zext i8 %0 to i128 343 %splat.splatinsert = insertelement <1 x i128> undef, i128 %conv, i32 0 344 ret <1 x i128> %splat.splatinsert 345} 346 347define dso_local <1 x i128> @vec_xl_zext_short(i64 %__offset, ptr nocapture readonly %__pointer) { 348; CHECK-LABEL: vec_xl_zext_short: 349; CHECK: # %bb.0: # %entry 350; CHECK-NEXT: sldi r3, r3, 1 351; CHECK-NEXT: lxvrhx v2, r4, r3 352; CHECK-NEXT: blr 353entry: 354 %add.ptr = getelementptr inbounds i16, ptr %__pointer, i64 %__offset 355 %0 = load i16, ptr %add.ptr, align 2 356 %conv = zext i16 %0 to i128 357 %splat.splatinsert = insertelement <1 x i128> undef, i128 %conv, i32 0 358 ret <1 x i128> %splat.splatinsert 359} 360 361define dso_local <1 x i128> @vec_xl_zext_word(i64 %__offset, ptr nocapture readonly %__pointer) { 362; CHECK-LABEL: vec_xl_zext_word: 363; CHECK: # %bb.0: # %entry 364; CHECK-NEXT: sldi r3, r3, 2 365; CHECK-NEXT: lxvrwx v2, r4, r3 366; CHECK-NEXT: blr 367entry: 368 %add.ptr = getelementptr inbounds i32, ptr %__pointer, i64 %__offset 369 %0 = load i32, ptr %add.ptr, align 4 370 %conv = zext i32 %0 to i128 371 %splat.splatinsert = insertelement <1 x i128> undef, i128 %conv, i32 0 372 ret <1 x i128> %splat.splatinsert 373} 374 375define dso_local <1 x i128> @vec_xl_zext_dw(i64 %__offset, ptr nocapture readonly %__pointer) { 376; CHECK-LABEL: vec_xl_zext_dw: 377; CHECK: # %bb.0: # %entry 378; CHECK-NEXT: sldi r3, r3, 3 379; CHECK-NEXT: lxvrdx v2, r4, r3 380; CHECK-NEXT: blr 381entry: 382 %add.ptr = getelementptr inbounds i64, ptr %__pointer, i64 %__offset 383 %0 = load i64, ptr %add.ptr, align 8 384 %conv = zext i64 %0 to i128 385 %splat.splatinsert = insertelement <1 x i128> undef, i128 %conv, i32 0 386 ret <1 x i128> %splat.splatinsert 387} 388 389define dso_local <1 x i128> @vec_xl_sext_b(i64 %offset, ptr %p) { 390; CHECK-LE-LABEL: vec_xl_sext_b: 391; CHECK-LE: # %bb.0: # %entry 392; CHECK-LE-NEXT: lbzx r3, r4, r3 393; CHECK-LE-NEXT: extsb r3, r3 394; CHECK-LE-NEXT: sradi r4, r3, 63 395; CHECK-LE-NEXT: mtvsrdd v2, r4, r3 396; CHECK-LE-NEXT: blr 397; 398; CHECK-LINUXBE-LABEL: vec_xl_sext_b: 399; CHECK-LINUXBE: # %bb.0: # %entry 400; CHECK-LINUXBE-NEXT: lbzx r3, r4, r3 401; CHECK-LINUXBE-NEXT: extsb r3, r3 402; CHECK-LINUXBE-NEXT: sradi r4, r3, 63 403; CHECK-LINUXBE-NEXT: mtvsrdd v2, r4, r3 404; CHECK-LINUXBE-NEXT: blr 405; 406; CHECK-O0-LABEL: vec_xl_sext_b: 407; CHECK-O0: # %bb.0: # %entry 408; CHECK-O0-NEXT: lbzx r3, r4, r3 409; CHECK-O0-NEXT: extsb r4, r3 410; CHECK-O0-NEXT: sradi r3, r4, 63 411; CHECK-O0-NEXT: mtvsrdd v2, r3, r4 412; CHECK-O0-NEXT: blr 413; 414; CHECK-AIXBE-LABEL: vec_xl_sext_b: 415; CHECK-AIXBE: # %bb.0: # %entry 416; CHECK-AIXBE-NEXT: lbzx r3, r4, r3 417; CHECK-AIXBE-NEXT: extsb r3, r3 418; CHECK-AIXBE-NEXT: sradi r4, r3, 63 419; CHECK-AIXBE-NEXT: mtvsrdd v2, r4, r3 420; CHECK-AIXBE-NEXT: blr 421entry: 422 %add.ptr = getelementptr inbounds i8, ptr %p, i64 %offset 423 %0 = load i8, ptr %add.ptr, align 1 424 %conv = sext i8 %0 to i128 425 %splat.splatinsert = insertelement <1 x i128> undef, i128 %conv, i32 0 426 ret <1 x i128> %splat.splatinsert 427} 428 429define dso_local <1 x i128> @vec_xl_sext_h(i64 %offset, ptr %p) { 430; CHECK-LE-LABEL: vec_xl_sext_h: 431; CHECK-LE: # %bb.0: # %entry 432; CHECK-LE-NEXT: sldi r3, r3, 1 433; CHECK-LE-NEXT: lhax r3, r4, r3 434; CHECK-LE-NEXT: sradi r4, r3, 63 435; CHECK-LE-NEXT: mtvsrdd v2, r4, r3 436; CHECK-LE-NEXT: blr 437; 438; CHECK-LINUXBE-LABEL: vec_xl_sext_h: 439; CHECK-LINUXBE: # %bb.0: # %entry 440; CHECK-LINUXBE-NEXT: sldi r3, r3, 1 441; CHECK-LINUXBE-NEXT: lhax r3, r4, r3 442; CHECK-LINUXBE-NEXT: sradi r4, r3, 63 443; CHECK-LINUXBE-NEXT: mtvsrdd v2, r4, r3 444; CHECK-LINUXBE-NEXT: blr 445; 446; CHECK-O0-LABEL: vec_xl_sext_h: 447; CHECK-O0: # %bb.0: # %entry 448; CHECK-O0-NEXT: sldi r3, r3, 1 449; CHECK-O0-NEXT: lhax r4, r4, r3 450; CHECK-O0-NEXT: sradi r3, r4, 63 451; CHECK-O0-NEXT: mtvsrdd v2, r3, r4 452; CHECK-O0-NEXT: blr 453; 454; CHECK-AIXBE-LABEL: vec_xl_sext_h: 455; CHECK-AIXBE: # %bb.0: # %entry 456; CHECK-AIXBE-NEXT: sldi r3, r3, 1 457; CHECK-AIXBE-NEXT: lhax r3, r4, r3 458; CHECK-AIXBE-NEXT: sradi r4, r3, 63 459; CHECK-AIXBE-NEXT: mtvsrdd v2, r4, r3 460; CHECK-AIXBE-NEXT: blr 461entry: 462 %add.ptr = getelementptr inbounds i16, ptr %p, i64 %offset 463 %0 = load i16, ptr %add.ptr, align 2 464 %conv = sext i16 %0 to i128 465 %splat.splatinsert = insertelement <1 x i128> undef, i128 %conv, i32 0 466 ret <1 x i128> %splat.splatinsert 467} 468 469define dso_local <1 x i128> @vec_xl_sext_w(i64 %offset, ptr %p) { 470; CHECK-LE-LABEL: vec_xl_sext_w: 471; CHECK-LE: # %bb.0: # %entry 472; CHECK-LE-NEXT: sldi r3, r3, 2 473; CHECK-LE-NEXT: lwax r3, r4, r3 474; CHECK-LE-NEXT: sradi r4, r3, 63 475; CHECK-LE-NEXT: mtvsrdd v2, r4, r3 476; CHECK-LE-NEXT: blr 477; 478; CHECK-LINUXBE-LABEL: vec_xl_sext_w: 479; CHECK-LINUXBE: # %bb.0: # %entry 480; CHECK-LINUXBE-NEXT: sldi r3, r3, 2 481; CHECK-LINUXBE-NEXT: lwax r3, r4, r3 482; CHECK-LINUXBE-NEXT: sradi r4, r3, 63 483; CHECK-LINUXBE-NEXT: mtvsrdd v2, r4, r3 484; CHECK-LINUXBE-NEXT: blr 485; 486; CHECK-O0-LABEL: vec_xl_sext_w: 487; CHECK-O0: # %bb.0: # %entry 488; CHECK-O0-NEXT: sldi r3, r3, 2 489; CHECK-O0-NEXT: lwax r4, r4, r3 490; CHECK-O0-NEXT: sradi r3, r4, 63 491; CHECK-O0-NEXT: mtvsrdd v2, r3, r4 492; CHECK-O0-NEXT: blr 493; 494; CHECK-AIXBE-LABEL: vec_xl_sext_w: 495; CHECK-AIXBE: # %bb.0: # %entry 496; CHECK-AIXBE-NEXT: sldi r3, r3, 2 497; CHECK-AIXBE-NEXT: lwax r3, r4, r3 498; CHECK-AIXBE-NEXT: sradi r4, r3, 63 499; CHECK-AIXBE-NEXT: mtvsrdd v2, r4, r3 500; CHECK-AIXBE-NEXT: blr 501entry: 502 %add.ptr = getelementptr inbounds i32, ptr %p, i64 %offset 503 %0 = load i32, ptr %add.ptr, align 4 504 %conv = sext i32 %0 to i128 505 %splat.splatinsert = insertelement <1 x i128> undef, i128 %conv, i32 0 506 ret <1 x i128> %splat.splatinsert 507} 508 509define dso_local <1 x i128> @vec_xl_sext_d(i64 %offset, ptr %p) { 510; CHECK-LE-LABEL: vec_xl_sext_d: 511; CHECK-LE: # %bb.0: # %entry 512; CHECK-LE-NEXT: sldi r3, r3, 3 513; CHECK-LE-NEXT: ldx r3, r4, r3 514; CHECK-LE-NEXT: sradi r4, r3, 63 515; CHECK-LE-NEXT: mtvsrdd v2, r4, r3 516; CHECK-LE-NEXT: blr 517; 518; CHECK-LINUXBE-LABEL: vec_xl_sext_d: 519; CHECK-LINUXBE: # %bb.0: # %entry 520; CHECK-LINUXBE-NEXT: sldi r3, r3, 3 521; CHECK-LINUXBE-NEXT: ldx r3, r4, r3 522; CHECK-LINUXBE-NEXT: sradi r4, r3, 63 523; CHECK-LINUXBE-NEXT: mtvsrdd v2, r4, r3 524; CHECK-LINUXBE-NEXT: blr 525; 526; CHECK-O0-LABEL: vec_xl_sext_d: 527; CHECK-O0: # %bb.0: # %entry 528; CHECK-O0-NEXT: sldi r3, r3, 3 529; CHECK-O0-NEXT: ldx r4, r4, r3 530; CHECK-O0-NEXT: sradi r3, r4, 63 531; CHECK-O0-NEXT: mtvsrdd v2, r3, r4 532; CHECK-O0-NEXT: blr 533; 534; CHECK-AIXBE-LABEL: vec_xl_sext_d: 535; CHECK-AIXBE: # %bb.0: # %entry 536; CHECK-AIXBE-NEXT: sldi r3, r3, 3 537; CHECK-AIXBE-NEXT: ldx r3, r4, r3 538; CHECK-AIXBE-NEXT: sradi r4, r3, 63 539; CHECK-AIXBE-NEXT: mtvsrdd v2, r4, r3 540; CHECK-AIXBE-NEXT: blr 541entry: 542 %add.ptr = getelementptr inbounds i64, ptr %p, i64 %offset 543 %0 = load i64, ptr %add.ptr, align 8 544 %conv = sext i64 %0 to i128 545 %splat.splatinsert = insertelement <1 x i128> undef, i128 %conv, i32 0 546 ret <1 x i128> %splat.splatinsert 547} 548