1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc < %s -mtriple=s390x-linux-gnu -mcpu=z16 | FileCheck %s 3 4; Sign-extending atomic loads. 5define void @f1(ptr %src, ptr %dst) { 6; CHECK-LABEL: f1: 7; CHECK: # %bb.0: 8; CHECK-NEXT: lb %r0, 0(%r2) 9; CHECK-NEXT: sth %r0, 0(%r3) 10; CHECK-NEXT: br %r14 11 %b = load atomic i8, ptr %src seq_cst, align 1 12 %s = sext i8 %b to i16 13 store volatile i16 %s, ptr %dst 14 ret void 15} 16 17define void @f2(ptr %src, ptr %dst) { 18; CHECK-LABEL: f2: 19; CHECK: # %bb.0: 20; CHECK-NEXT: lb %r0, 0(%r2) 21; CHECK-NEXT: st %r0, 0(%r3) 22; CHECK-NEXT: br %r14 23 %b = load atomic i8, ptr %src seq_cst, align 1 24 %s = sext i8 %b to i32 25 store volatile i32 %s, ptr %dst 26 ret void 27} 28 29define void @f3(ptr %src, ptr %dst) { 30; CHECK-LABEL: f3: 31; CHECK: # %bb.0: 32; CHECK-NEXT: lgb %r0, 0(%r2) 33; CHECK-NEXT: stg %r0, 0(%r3) 34; CHECK-NEXT: br %r14 35 %b = load atomic i8, ptr %src seq_cst, align 1 36 %s = sext i8 %b to i64 37 store volatile i64 %s, ptr %dst 38 ret void 39} 40 41define void @f4(ptr %src, ptr %dst) { 42; CHECK-LABEL: f4: 43; CHECK: # %bb.0: 44; CHECK-NEXT: lh %r0, 0(%r2) 45; CHECK-NEXT: st %r0, 0(%r3) 46; CHECK-NEXT: br %r14 47 %b = load atomic i16, ptr %src seq_cst, align 2 48 %s = sext i16 %b to i32 49 store volatile i32 %s, ptr %dst 50 ret void 51} 52 53define void @f5(ptr %src, ptr %dst) { 54; CHECK-LABEL: f5: 55; CHECK: # %bb.0: 56; CHECK-NEXT: lgh %r0, 0(%r2) 57; CHECK-NEXT: stg %r0, 0(%r3) 58; CHECK-NEXT: br %r14 59 %b = load atomic i16, ptr %src seq_cst, align 2 60 %s = sext i16 %b to i64 61 store volatile i64 %s, ptr %dst 62 ret void 63} 64 65define void @f6(ptr %src, ptr %dst) { 66; CHECK-LABEL: f6: 67; CHECK: # %bb.0: 68; CHECK-NEXT: lgf %r0, 0(%r2) 69; CHECK-NEXT: stg %r0, 0(%r3) 70; CHECK-NEXT: br %r14 71 %b = load atomic i32, ptr %src seq_cst, align 4 72 %s = sext i32 %b to i64 73 store volatile i64 %s, ptr %dst 74 ret void 75} 76 77; Zero-extending atomic loads. 78define void @f7(ptr %src, ptr %dst) { 79; CHECK-LABEL: f7: 80; CHECK: # %bb.0: 81; CHECK-NEXT: llc %r0, 0(%r2) 82; CHECK-NEXT: sth %r0, 0(%r3) 83; CHECK-NEXT: br %r14 84 %b = load atomic i8, ptr %src seq_cst, align 1 85 %z = zext i8 %b to i16 86 store volatile i16 %z, ptr %dst 87 ret void 88} 89 90define void @f8(ptr %src, ptr %dst) { 91; CHECK-LABEL: f8: 92; CHECK: # %bb.0: 93; CHECK-NEXT: llc %r0, 0(%r2) 94; CHECK-NEXT: st %r0, 0(%r3) 95; CHECK-NEXT: br %r14 96 %b = load atomic i8, ptr %src seq_cst, align 1 97 %z = zext i8 %b to i32 98 store volatile i32 %z, ptr %dst 99 ret void 100} 101 102define void @f9(ptr %src, ptr %dst) { 103; CHECK-LABEL: f9: 104; CHECK: # %bb.0: 105; CHECK-NEXT: llgc %r0, 0(%r2) 106; CHECK-NEXT: stg %r0, 0(%r3) 107; CHECK-NEXT: br %r14 108 %b = load atomic i8, ptr %src seq_cst, align 1 109 %z = zext i8 %b to i64 110 store volatile i64 %z, ptr %dst 111 ret void 112} 113 114define void @f10(ptr %src, ptr %dst) { 115; CHECK-LABEL: f10: 116; CHECK: # %bb.0: 117; CHECK-NEXT: llh %r0, 0(%r2) 118; CHECK-NEXT: st %r0, 0(%r3) 119; CHECK-NEXT: br %r14 120 %b = load atomic i16, ptr %src seq_cst, align 2 121 %z = zext i16 %b to i32 122 store volatile i32 %z, ptr %dst 123 ret void 124} 125 126define void @f11(ptr %src, ptr %dst) { 127; CHECK-LABEL: f11: 128; CHECK: # %bb.0: 129; CHECK-NEXT: llgh %r0, 0(%r2) 130; CHECK-NEXT: stg %r0, 0(%r3) 131; CHECK-NEXT: br %r14 132 %b = load atomic i16, ptr %src seq_cst, align 2 133 %z = zext i16 %b to i64 134 store volatile i64 %z, ptr %dst 135 ret void 136} 137 138define void @f12(ptr %src, ptr %dst) { 139; CHECK-LABEL: f12: 140; CHECK: # %bb.0: 141; CHECK-NEXT: llgf %r0, 0(%r2) 142; CHECK-NEXT: stg %r0, 0(%r3) 143; CHECK-NEXT: br %r14 144 %b = load atomic i32, ptr %src seq_cst, align 4 145 %z = zext i32 %b to i64 146 store volatile i64 %z, ptr %dst 147 ret void 148} 149 150; reg/mem 151define i64 @f13(i64 %a, ptr %src) { 152; CHECK-LABEL: f13: 153; CHECK: # %bb.0: 154; CHECK-NEXT: ag %r2, 0(%r3) 155; CHECK-NEXT: br %r14 156 %b = load atomic i64, ptr %src seq_cst, align 8 157 %add = add i64 %a, %b 158 ret i64 %add 159} 160 161; reg/mem op with extension from memory. 162define i64 @f14(i64 %a, ptr %src) { 163; CHECK-LABEL: f14: 164; CHECK: # %bb.0: 165; CHECK-NEXT: slgf %r2, 0(%r3) 166; CHECK-NEXT: br %r14 167 %b = load atomic i32, ptr %src seq_cst, align 4 168 %bext = zext i32 %b to i64 169 %sub = sub i64 %a, %bext 170 ret i64 %sub 171} 172 173define float @f15(float %f1, ptr %ptr, float %acc) { 174; CHECK-LABEL: f15: 175; CHECK: # %bb.0: 176; CHECK-NEXT: maeb %f2, %f0, 0(%r2) 177; CHECK-NEXT: ldr %f0, %f2 178; CHECK-NEXT: br %r14 179 %f2 = load atomic float, ptr %ptr seq_cst, align 4 180 %res = call float @llvm.fma.f32 (float %f1, float %f2, float %acc) 181 ret float %res 182} 183declare float @llvm.fma.f32(float %f1, float %f2, float %f3) 184 185define double @f15_b(ptr %src) { 186; CHECK-LABEL: f15_b: 187; CHECK: # %bb.0: 188; CHECK-NEXT: ldeb %f0, 0(%r2) 189; CHECK-NEXT: br %r14 190 %V = load atomic float, ptr %src seq_cst, align 4 191 %Res = fpext float %V to double 192 ret double %Res 193} 194 195define fp128 @f15_c(ptr %src) { 196; CHECK-LABEL: f15_c: 197; CHECK: # %bb.0: 198; CHECK-NEXT: lde %f0, 0(%r3) 199; CHECK-NEXT: ldebr %f0, %f0 200; CHECK-NEXT: wflld %v0, %f0 201; CHECK-NEXT: vst %v0, 0(%r2), 3 202; CHECK-NEXT: br %r14 203 %V = load atomic float, ptr %src seq_cst, align 4 204 %Res = fpext float %V to fp128 205 ret fp128 %Res 206} 207 208define fp128 @f15_d(ptr %src) { 209; CHECK-LABEL: f15_d: 210; CHECK: # %bb.0: 211; CHECK-NEXT: ld %f0, 0(%r3) 212; CHECK-NEXT: wflld %v0, %f0 213; CHECK-NEXT: vst %v0, 0(%r2), 3 214; CHECK-NEXT: br %r14 215 %V = load atomic double, ptr %src seq_cst, align 8 216 %Res = fpext double %V to fp128 217 ret fp128 %Res 218} 219 220; Do it twice for good measure given the involved DAG combines. 221define void @f16(ptr %src, ptr %dst) { 222; CHECK-LABEL: f16: 223; CHECK: # %bb.0: 224; CHECK-NEXT: llgc %r0, 0(%r2) 225; CHECK-NEXT: lgbr %r1, %r0 226; CHECK-NEXT: stg %r1, 0(%r3) 227; CHECK-NEXT: stg %r0, 0(%r3) 228; CHECK-NEXT: llgc %r0, 0(%r2) 229; CHECK-NEXT: lgbr %r1, %r0 230; CHECK-NEXT: stg %r1, 0(%r3) 231; CHECK-NEXT: stg %r0, 0(%r3) 232; CHECK-NEXT: br %r14 233 %b = load atomic i8, ptr %src seq_cst, align 1 234 %s = sext i8 %b to i64 235 %z = zext i8 %b to i64 236 store volatile i64 %s, ptr %dst 237 store volatile i64 %z, ptr %dst 238 239 %b2 = load atomic i8, ptr %src seq_cst, align 1 240 %s2 = sext i8 %b2 to i64 241 %z2 = zext i8 %b2 to i64 242 store volatile i64 %s2, ptr %dst 243 store volatile i64 %z2, ptr %dst 244 245 ret void 246} 247 248define void @f16_b(ptr %src, ptr %dst) { 249; CHECK-LABEL: f16_b: 250; CHECK: # %bb.0: 251; CHECK-NEXT: lgb %r0, 0(%r2) 252; CHECK-NEXT: sth %r0, 0(%r3) 253; CHECK-NEXT: stg %r0, 0(%r3) 254; CHECK-NEXT: br %r14 255 %b = load atomic i8, ptr %src seq_cst, align 1 256 %s = sext i8 %b to i16 257 store volatile i16 %s, ptr %dst 258 259 %s2 = sext i8 %b to i64 260 store volatile i64 %s2, ptr %dst 261 262 ret void 263} 264 265define void @f16_c(ptr %src, ptr %dst) { 266; CHECK-LABEL: f16_c: 267; CHECK: # %bb.0: 268; CHECK-NEXT: llgc %r0, 0(%r2) 269; CHECK-NEXT: sth %r0, 0(%r3) 270; CHECK-NEXT: stg %r0, 0(%r3) 271; CHECK-NEXT: br %r14 272 %b = load atomic i8, ptr %src seq_cst, align 1 273 %z = zext i8 %b to i16 274 store volatile i16 %z, ptr %dst 275 276 %z2 = zext i8 %b to i64 277 store volatile i64 %z2, ptr %dst 278 279 ret void 280} 281 282; Check that two i8 loads use a reg/reg op. 283define i8 @f16_d(ptr %src, ptr %src2) { 284; CHECK-LABEL: f16_d: 285; CHECK: # %bb.0: 286; CHECK-NEXT: lb %r2, 0(%r2) 287; CHECK-NEXT: lb %r0, 0(%r3) 288; CHECK-NEXT: ar %r2, %r0 289; CHECK-NEXT: br %r14 290 %b = load atomic i8, ptr %src seq_cst, align 1 291 %b2 = load atomic i8, ptr %src2 seq_cst, align 1 292 %add = add i8 %b, %b2 293 ret i8 %add 294} 295 296; Binary operations on a byte in memory, with an atomic load. 297define void @f17(ptr %ptr) { 298; CHECK-LABEL: f17: 299; CHECK: # %bb.0: 300; CHECK-NEXT: ni 0(%r2), 1 301; CHECK-NEXT: br %r14 302 %val = load atomic i8, ptr %ptr seq_cst, align 1 303 %xor = and i8 %val, -255 304 store i8 %xor, ptr %ptr 305 ret void 306} 307 308define void @f18(ptr %src) { 309; CHECK-LABEL: f18: 310; CHECK: # %bb.0: 311; CHECK-NEXT: oiy 4096(%r2), 1 312; CHECK-NEXT: br %r14 313 %ptr = getelementptr i8, ptr %src, i64 4096 314 %val = load atomic i8, ptr %ptr seq_cst, align 1 315 %xor = or i8 %val, -255 316 store i8 %xor, ptr %ptr 317 ret void 318} 319 320define void @f19(ptr %src) { 321; CHECK-LABEL: f19: 322; CHECK: # %bb.0: 323; CHECK-NEXT: xi 4095(%r2), 1 324; CHECK-NEXT: br %r14 325 %ptr = getelementptr i8, ptr %src, i64 4095 326 %val = load atomic i8, ptr %ptr seq_cst, align 1 327 %xor = xor i8 %val, -255 328 store i8 %xor, ptr %ptr 329 ret void 330} 331 332; TM 333define double @f20(ptr %src, double %a, double %b) { 334; CHECK-LABEL: f20: 335; CHECK: # %bb.0: 336; CHECK-NEXT: tm 0(%r2), 1 337; CHECK-NEXT: je .LBB25_2 338; CHECK-NEXT: # %bb.1: 339; CHECK-NEXT: ldr %f2, %f0 340; CHECK-NEXT: .LBB25_2: 341; CHECK-NEXT: ldr %f0, %f2 342; CHECK-NEXT: br %r14 343 %byte = load atomic i8, ptr %src seq_cst, align 1 344 %and = and i8 %byte, 1 345 %cmp = icmp eq i8 %and, 0 346 %res = select i1 %cmp, double %b, double %a 347 ret double %res 348} 349 350; vector load and replicate 351define void @f21(ptr %src, ptr %dst) { 352; CHECK-LABEL: f21: 353; CHECK: # %bb.0: 354; CHECK-NEXT: vlrepb %v0, 0(%r2) 355; CHECK-NEXT: vst %v0, 0(%r3), 3 356; CHECK-NEXT: br %r14 357 %b = load atomic i8, ptr %src seq_cst, align 1 358 %v = insertelement <16 x i8> undef, i8 %b, i32 1 359 store volatile <16 x i8> %v, ptr %dst 360 ret void 361} 362 363define void @f22(ptr %src, ptr %dst) { 364; CHECK-LABEL: f22: 365; CHECK: # %bb.0: 366; CHECK-NEXT: vlreph %v0, 0(%r2) 367; CHECK-NEXT: vst %v0, 0(%r3), 3 368; CHECK-NEXT: br %r14 369 %b = load atomic i16, ptr %src seq_cst, align 2 370 %v = insertelement <8 x i16> undef, i16 %b, i32 1 371 store volatile <8 x i16> %v, ptr %dst 372 ret void 373} 374 375define void @f23(ptr %src, ptr %dst) { 376; CHECK-LABEL: f23: 377; CHECK: # %bb.0: 378; CHECK-NEXT: vlrepf %v0, 0(%r2) 379; CHECK-NEXT: vst %v0, 0(%r3), 3 380; CHECK-NEXT: br %r14 381 %b = load atomic i32, ptr %src seq_cst, align 4 382 %v = insertelement <4 x i32> undef, i32 %b, i32 2 383 store volatile <4 x i32> %v, ptr %dst 384 ret void 385} 386 387define void @f24(ptr %src, ptr %dst) { 388; CHECK-LABEL: f24: 389; CHECK: # %bb.0: 390; CHECK-NEXT: vlrepg %v0, 0(%r2) 391; CHECK-NEXT: vst %v0, 0(%r3), 3 392; CHECK-NEXT: br %r14 393 %b = load atomic i64, ptr %src seq_cst, align 8 394 %v = insertelement <2 x i64> undef, i64 %b, i32 0 395 store volatile <2 x i64> %v, ptr %dst 396 ret void 397} 398 399define void @f25(ptr %src, ptr %dst) { 400; CHECK-LABEL: f25: 401; CHECK: # %bb.0: 402; CHECK-NEXT: vlrepf %v0, 0(%r2) 403; CHECK-NEXT: vst %v0, 0(%r3), 3 404; CHECK-NEXT: br %r14 405 %b = load atomic float, ptr %src seq_cst, align 4 406 %v = insertelement <4 x float> undef, float %b, i32 1 407 store volatile <4 x float> %v, ptr %dst 408 ret void 409} 410 411; Do *not* use vlrep for an extending load. 412define <4 x i32> @f25_c(ptr %ptr) { 413; CHECK-LABEL: f25_c: 414; CHECK: # %bb.0: 415; CHECK-NEXT: lb %r0, 0(%r2) 416; CHECK-NEXT: vlvgp %v0, %r0, %r0 417; CHECK-NEXT: vrepf %v24, %v0, 1 418; CHECK-NEXT: br %r14 419 %L = load atomic i8, ptr %ptr seq_cst, align 4 420 %S = sext i8 %L to i32 421 %val = insertelement <4 x i32> undef, i32 %S, i32 0 422 %ret = shufflevector <4 x i32> %val, <4 x i32> undef, 423 <4 x i32> zeroinitializer 424 ret <4 x i32> %ret 425} 426 427; Do *not* use vlrep if there is another scalar use. 428define <4 x i32> @f25_d(ptr %ptr, ptr %dst) { 429; CHECK-LABEL: f25_d: 430; CHECK: # %bb.0: 431; CHECK-NEXT: l %r0, 0(%r2) 432; CHECK-NEXT: vlvgp %v0, %r0, %r0 433; CHECK-NEXT: vrepf %v24, %v0, 1 434; CHECK-NEXT: st %r0, 0(%r3) 435; CHECK-NEXT: br %r14 436 %L = load atomic i32, ptr %ptr seq_cst, align 4 437 store i32 %L, ptr %dst, align 4 438 %val = insertelement <4 x i32> undef, i32 %L, i32 0 439 %ret = shufflevector <4 x i32> %val, <4 x i32> undef, 440 <4 x i32> zeroinitializer 441 ret <4 x i32> %ret 442} 443 444define void @f26(ptr %src, ptr %dst) { 445; CHECK-LABEL: f26: 446; CHECK: # %bb.0: 447; CHECK-NEXT: vlrepg %v0, 0(%r2) 448; CHECK-NEXT: vst %v0, 0(%r3), 3 449; CHECK-NEXT: br %r14 450 %b = load atomic double, ptr %src seq_cst, align 8 451 %v = insertelement <2 x double> undef, double %b, i32 0 452 store volatile <2 x double> %v, ptr %dst 453 ret void 454} 455 456; Vector Load logical element and zero. 457define <16 x i8> @f27(ptr %ptr) { 458; CHECK-LABEL: f27: 459; CHECK: # %bb.0: 460; CHECK-NEXT: vllezb %v24, 0(%r2) 461; CHECK-NEXT: br %r14 462 %val = load atomic i8, ptr %ptr seq_cst, align 1 463 %ret = insertelement <16 x i8> zeroinitializer, i8 %val, i32 7 464 ret <16 x i8> %ret 465} 466 467define <8 x i16> @f28(ptr %ptr) { 468; CHECK-LABEL: f28: 469; CHECK: # %bb.0: 470; CHECK-NEXT: vllezh %v24, 0(%r2) 471; CHECK-NEXT: br %r14 472 %val = load atomic i16, ptr %ptr seq_cst, align 2 473 %ret = insertelement <8 x i16> zeroinitializer, i16 %val, i32 3 474 ret <8 x i16> %ret 475} 476 477define <4 x i32> @f29(ptr %ptr) { 478; CHECK-LABEL: f29: 479; CHECK: # %bb.0: 480; CHECK-NEXT: vllezf %v24, 0(%r2) 481; CHECK-NEXT: br %r14 482 %val = load atomic i32, ptr %ptr seq_cst, align 4 483 %ret = insertelement <4 x i32> zeroinitializer, i32 %val, i32 1 484 ret <4 x i32> %ret 485} 486 487define <2 x i64> @f30(ptr %ptr) { 488; CHECK-LABEL: f30: 489; CHECK: # %bb.0: 490; CHECK-NEXT: vllezg %v24, 0(%r2) 491; CHECK-NEXT: br %r14 492 %val = load atomic i64, ptr %ptr seq_cst, align 8 493 %ret = insertelement <2 x i64> zeroinitializer, i64 %val, i32 0 494 ret <2 x i64> %ret 495} 496 497define <4 x i32> @f31(ptr %ptr) { 498; CHECK-LABEL: f31: 499; CHECK: # %bb.0: 500; CHECK-NEXT: vllezlf %v24, 0(%r2) 501; CHECK-NEXT: br %r14 502 %val = load atomic i32, ptr %ptr seq_cst, align 4 503 %ret = insertelement <4 x i32> zeroinitializer, i32 %val, i32 0 504 ret <4 x i32> %ret 505} 506 507define <4 x float> @f32(ptr %ptr) { 508; CHECK-LABEL: f32: 509; CHECK: # %bb.0: 510; CHECK-NEXT: vllezlf %v24, 0(%r2) 511; CHECK-NEXT: br %r14 512 %val = load atomic float, ptr %ptr seq_cst, align 4 513 %ret = insertelement <4 x float> zeroinitializer, float %val, i32 0 514 ret <4 x float> %ret 515} 516 517; Vector Load element. 518define <16 x i8> @f33(<16 x i8> %val, ptr %ptr) { 519; CHECK-LABEL: f33: 520; CHECK: # %bb.0: 521; CHECK-NEXT: vleb %v24, 0(%r2), 0 522; CHECK-NEXT: br %r14 523 %element = load atomic i8, ptr %ptr seq_cst, align 1 524 %ret = insertelement <16 x i8> %val, i8 %element, i32 0 525 ret <16 x i8> %ret 526} 527 528define <8 x i16> @f34(<8 x i16> %val, ptr %ptr) { 529; CHECK-LABEL: f34: 530; CHECK: # %bb.0: 531; CHECK-NEXT: vleh %v24, 0(%r2), 0 532; CHECK-NEXT: br %r14 533 %element = load atomic i16, ptr %ptr seq_cst, align 2 534 %ret = insertelement <8 x i16> %val, i16 %element, i32 0 535 ret <8 x i16> %ret 536} 537 538define <4 x i32> @f35(<4 x i32> %val, ptr %ptr) { 539; CHECK-LABEL: f35: 540; CHECK: # %bb.0: 541; CHECK-NEXT: vlef %v24, 0(%r2), 0 542; CHECK-NEXT: br %r14 543 %element = load atomic i32, ptr %ptr seq_cst, align 4 544 %ret = insertelement <4 x i32> %val, i32 %element, i32 0 545 ret <4 x i32> %ret 546} 547 548define <2 x i64> @f36(<2 x i64> %val, ptr %ptr) { 549; CHECK-LABEL: f36: 550; CHECK: # %bb.0: 551; CHECK-NEXT: vleg %v24, 0(%r2), 0 552; CHECK-NEXT: br %r14 553 %element = load atomic i64, ptr %ptr seq_cst, align 8 554 %ret = insertelement <2 x i64> %val, i64 %element, i32 0 555 ret <2 x i64> %ret 556} 557 558; Test operation on memory involving atomic load and store. 559define void @f39(ptr %ptr) { 560; CHECK-LABEL: f39: 561; CHECK: # %bb.0: 562; CHECK-NEXT: oi 0(%r2), 1 563; CHECK-NEXT: bcr 14, %r0 564; CHECK-NEXT: br %r14 565 %val = load atomic i8, ptr %ptr seq_cst, align 1 566 %or = or i8 %val, -255 567 store atomic i8 %or, ptr %ptr seq_cst, align 1 568 ret void 569} 570 571; Some atomic stores of immediates. 572define void @f40(ptr %ptr) { 573; CHECK-LABEL: f40: 574; CHECK: # %bb.0: 575; CHECK-NEXT: mvi 0(%r2), 128 576; CHECK-NEXT: bcr 14, %r0 577; CHECK-NEXT: br %r14 578 store atomic i8 128, ptr %ptr seq_cst, align 1 579 ret void 580} 581 582define void @f41(ptr %ptr) { 583; CHECK-LABEL: f41: 584; CHECK: # %bb.0: 585; CHECK-NEXT: mvhi 0(%r2), -1 586; CHECK-NEXT: bcr 14, %r0 587; CHECK-NEXT: br %r14 588 store atomic i32 4294967295, ptr %ptr seq_cst, align 4 589 ret void 590} 591 592define void @f42(ptr %ptr) { 593; CHECK-LABEL: f42: 594; CHECK: # %bb.0: 595; CHECK-NEXT: mvhi 0(%r2), -1 596; CHECK-NEXT: bcr 14, %r0 597; CHECK-NEXT: br %r14 598 store atomic i32 4294967295, ptr %ptr seq_cst, align 4 599 ret void 600} 601 602define void @f43(ptr %ptr) { 603; CHECK-LABEL: f43: 604; CHECK: # %bb.0: 605; CHECK-NEXT: llihl %r0, 255 606; CHECK-NEXT: oilf %r0, 4294967295 607; CHECK-NEXT: stg %r0, 0(%r2) 608; CHECK-NEXT: bcr 14, %r0 609; CHECK-NEXT: br %r14 610 store atomic i64 1099511627775, ptr %ptr seq_cst, align 8 611 ret void 612} 613 614define void @f44(ptr %ptr) { 615; CHECK-LABEL: f44: 616; CHECK: # %bb.0: 617; CHECK-NEXT: larl %r1, .LCPI49_0 618; CHECK-NEXT: ld %f0, 0(%r1) 619; CHECK-NEXT: std %f0, 0(%r2) 620; CHECK-NEXT: bcr 14, %r0 621; CHECK-NEXT: br %r14 622 store atomic double 0x3ff0000020000000, ptr %ptr seq_cst, align 8 623 ret void 624} 625 626; Vector Store Element. 627define void @f45(<16 x i8> %val, ptr %ptr) { 628; CHECK-LABEL: f45: 629; CHECK: # %bb.0: 630; CHECK-NEXT: vsteb %v24, 0(%r2), 0 631; CHECK-NEXT: bcr 14, %r0 632; CHECK-NEXT: br %r14 633 %element = extractelement <16 x i8> %val, i32 0 634 store atomic i8 %element, ptr %ptr seq_cst, align 1 635 ret void 636} 637 638define void @f46(<8 x i16> %val, ptr %base) { 639; CHECK-LABEL: f46: 640; CHECK: # %bb.0: 641; CHECK-NEXT: vsteh %v24, 4094(%r2), 5 642; CHECK-NEXT: bcr 14, %r0 643; CHECK-NEXT: br %r14 644 %ptr = getelementptr i16, ptr %base, i32 2047 645 %element = extractelement <8 x i16> %val, i32 5 646 store atomic i16 %element, ptr %ptr seq_cst, align 2 647 ret void 648} 649 650define void @f47(<4 x i32> %val, ptr %ptr) { 651; CHECK-LABEL: f47: 652; CHECK: # %bb.0: 653; CHECK-NEXT: vstef %v24, 0(%r2), 3 654; CHECK-NEXT: bcr 14, %r0 655; CHECK-NEXT: br %r14 656 %element = extractelement <4 x i32> %val, i32 3 657 store atomic i32 %element, ptr %ptr seq_cst, align 4 658 ret void 659} 660 661define void @f48(<2 x i64> %val, ptr %ptr) { 662; CHECK-LABEL: f48: 663; CHECK: # %bb.0: 664; CHECK-NEXT: vsteg %v24, 0(%r2), 1 665; CHECK-NEXT: bcr 14, %r0 666; CHECK-NEXT: br %r14 667 %element = extractelement <2 x i64> %val, i32 1 668 store atomic i64 %element, ptr %ptr seq_cst, align 8 669 ret void 670} 671 672define void @f49(<4 x float> %val, ptr %ptr) { 673; CHECK-LABEL: f49: 674; CHECK: # %bb.0: 675; CHECK-NEXT: vstef %v24, 0(%r2), 0 676; CHECK-NEXT: bcr 14, %r0 677; CHECK-NEXT: br %r14 678 %element = extractelement <4 x float> %val, i32 0 679 store atomic float %element, ptr %ptr seq_cst, align 4 680 ret void 681} 682 683define void @f50(<2 x double> %val, ptr %ptr) { 684; CHECK-LABEL: f50: 685; CHECK: # %bb.0: 686; CHECK-NEXT: vsteg %v24, 0(%r2), 1 687; CHECK-NEXT: bcr 14, %r0 688; CHECK-NEXT: br %r14 689 %element = extractelement <2 x double> %val, i32 1 690 store atomic double %element, ptr %ptr seq_cst, align 8 691 ret void 692} 693 694define void @f51(ptr %src, ptr %dst) { 695; CHECK-LABEL: f51: 696; CHECK: # %bb.0: 697; CHECK-NEXT: lpq %r0, 0(%r2) 698; CHECK-NEXT: vlvgp %v0, %r0, %r1 699; CHECK-NEXT: vgmf %v1, 2, 8 700; CHECK-NEXT: aebr %f0, %f1 701; CHECK-NEXT: ste %f0, 0(%r3) 702; CHECK-NEXT: bcr 14, %r0 703; CHECK-NEXT: br %r14 704 %atomic-load = load atomic i128, ptr %src seq_cst, align 16 705 %b0 = bitcast i128 %atomic-load to <4 x float> 706 %vecext = extractelement <4 x float> %b0, i64 0 707 %add = fadd float %vecext, 1.000000e+00 708 store atomic float %add, ptr %dst seq_cst, align 4 709 ret void 710} 711 712define void @f52(ptr %src, ptr %dst) { 713; CHECK-LABEL: f52: 714; CHECK: # %bb.0: 715; CHECK-NEXT: lpq %r0, 0(%r2) 716; CHECK-NEXT: vlvgp %v0, %r0, %r1 717; CHECK-NEXT: vgmg %v1, 2, 11 718; CHECK-NEXT: adbr %f0, %f1 719; CHECK-NEXT: std %f0, 0(%r3) 720; CHECK-NEXT: bcr 14, %r0 721; CHECK-NEXT: br %r14 722 %atomic-load = load atomic i128, ptr %src seq_cst, align 16 723 %b0 = bitcast i128 %atomic-load to <2 x double> 724 %vecext = extractelement <2 x double> %b0, i64 0 725 %add = fadd double %vecext, 1.000000e+00 726 store atomic double %add, ptr %dst seq_cst, align 8 727 ret void 728} 729 730define void @fun58(ptr %ptr, i64 %arg) { 731; CHECK-LABEL: fun58: 732; CHECK: # %bb.0: 733; CHECK-NEXT: st %r3, 0(%r2) 734; CHECK-NEXT: bcr 14, %r0 735; CHECK-NEXT: br %r14 736 %res = trunc i64 %arg to i32 737 store atomic i32 %res, ptr %ptr seq_cst, align 4 738 ret void 739} 740