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 \ 4; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10 5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 6; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 7; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10 8; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ 9; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 10; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10 11; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 12; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 13; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10 14; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ 15; RUN: -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 16; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10 17; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 18; RUN: -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 19; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10 20 21; Function Attrs: nofree norecurse nounwind uwtable willreturn 22define dso_local signext i32 @ld_0_int32_t_uint8_t(i64 %ptr) { 23; CHECK-LABEL: ld_0_int32_t_uint8_t: 24; CHECK: # %bb.0: # %entry 25; CHECK-NEXT: lbz r3, 0(r3) 26; CHECK-NEXT: blr 27entry: 28 %0 = inttoptr i64 %ptr to ptr 29 %1 = load atomic i8, ptr %0 monotonic, align 1 30 %conv = zext i8 %1 to i32 31 ret i32 %conv 32} 33 34; Function Attrs: nofree norecurse nounwind uwtable willreturn 35define dso_local signext i32 @ld_align16_int32_t_uint8_t(ptr nocapture readonly %ptr) { 36; CHECK-LABEL: ld_align16_int32_t_uint8_t: 37; CHECK: # %bb.0: # %entry 38; CHECK-NEXT: lbz r3, 8(r3) 39; CHECK-NEXT: blr 40entry: 41 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 42 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 43 %conv = zext i8 %0 to i32 44 ret i32 %conv 45} 46 47; Function Attrs: nofree norecurse nounwind uwtable willreturn 48define dso_local signext i32 @ld_align32_int32_t_uint8_t(ptr nocapture readonly %ptr) { 49; CHECK-P10-LABEL: ld_align32_int32_t_uint8_t: 50; CHECK-P10: # %bb.0: # %entry 51; CHECK-P10-NEXT: plbz r3, 99999000(r3), 0 52; CHECK-P10-NEXT: clrldi r3, r3, 32 53; CHECK-P10-NEXT: blr 54; 55; CHECK-PREP10-LABEL: ld_align32_int32_t_uint8_t: 56; CHECK-PREP10: # %bb.0: # %entry 57; CHECK-PREP10-NEXT: lis r4, 1525 58; CHECK-PREP10-NEXT: ori r4, r4, 56600 59; CHECK-PREP10-NEXT: lbzx r3, r3, r4 60; CHECK-PREP10-NEXT: blr 61entry: 62 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 63 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 64 %conv = zext i8 %0 to i32 65 ret i32 %conv 66} 67 68; Function Attrs: nofree norecurse nounwind uwtable willreturn 69define dso_local signext i32 @ld_align64_int32_t_uint8_t(ptr nocapture readonly %ptr) { 70; CHECK-P10-LABEL: ld_align64_int32_t_uint8_t: 71; CHECK-P10: # %bb.0: # %entry 72; CHECK-P10-NEXT: pli r4, 244140625 73; CHECK-P10-NEXT: rldic r4, r4, 12, 24 74; CHECK-P10-NEXT: lbzx r3, r3, r4 75; CHECK-P10-NEXT: blr 76; 77; CHECK-PREP10-LABEL: ld_align64_int32_t_uint8_t: 78; CHECK-PREP10: # %bb.0: # %entry 79; CHECK-PREP10-NEXT: lis r4, 3725 80; CHECK-PREP10-NEXT: ori r4, r4, 19025 81; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 82; CHECK-PREP10-NEXT: lbzx r3, r3, r4 83; CHECK-PREP10-NEXT: blr 84entry: 85 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 86 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 87 %conv = zext i8 %0 to i32 88 ret i32 %conv 89} 90 91; Function Attrs: nofree norecurse nounwind uwtable willreturn 92define dso_local signext i32 @ld_reg_int32_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) { 93; CHECK-LABEL: ld_reg_int32_t_uint8_t: 94; CHECK: # %bb.0: # %entry 95; CHECK-NEXT: lbzx r3, r3, r4 96; CHECK-NEXT: blr 97entry: 98 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 99 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 100 %conv = zext i8 %0 to i32 101 ret i32 %conv 102} 103 104; Function Attrs: nofree norecurse nounwind uwtable willreturn 105define dso_local signext i32 @ld_or_int32_t_uint8_t(i64 %ptr, i8 zeroext %off) { 106; CHECK-LABEL: ld_or_int32_t_uint8_t: 107; CHECK: # %bb.0: # %entry 108; CHECK-NEXT: or r3, r4, r3 109; CHECK-NEXT: lbz r3, 0(r3) 110; CHECK-NEXT: blr 111entry: 112 %conv = zext i8 %off to i64 113 %or = or i64 %conv, %ptr 114 %0 = inttoptr i64 %or to ptr 115 %1 = load atomic i8, ptr %0 monotonic, align 1 116 %conv1 = zext i8 %1 to i32 117 ret i32 %conv1 118} 119 120; Function Attrs: nofree norecurse nounwind uwtable willreturn 121define dso_local signext i32 @ld_not_disjoint16_int32_t_uint8_t(i64 %ptr) { 122; CHECK-LABEL: ld_not_disjoint16_int32_t_uint8_t: 123; CHECK: # %bb.0: # %entry 124; CHECK-NEXT: ori r3, r3, 6 125; CHECK-NEXT: lbz r3, 0(r3) 126; CHECK-NEXT: blr 127entry: 128 %or = or i64 %ptr, 6 129 %0 = inttoptr i64 %or to ptr 130 %1 = load atomic i8, ptr %0 monotonic, align 1 131 %conv = zext i8 %1 to i32 132 ret i32 %conv 133} 134 135; Function Attrs: nofree norecurse nounwind uwtable willreturn 136define dso_local signext i32 @ld_disjoint_align16_int32_t_uint8_t(i64 %ptr) { 137; CHECK-LABEL: ld_disjoint_align16_int32_t_uint8_t: 138; CHECK: # %bb.0: # %entry 139; CHECK-NEXT: rldicr r3, r3, 0, 51 140; CHECK-NEXT: lbz r3, 24(r3) 141; CHECK-NEXT: blr 142entry: 143 %and = and i64 %ptr, -4096 144 %or = or i64 %and, 24 145 %0 = inttoptr i64 %or to ptr 146 %1 = load atomic i8, ptr %0 monotonic, align 8 147 %conv = zext i8 %1 to i32 148 ret i32 %conv 149} 150 151; Function Attrs: nofree norecurse nounwind uwtable willreturn 152define dso_local signext i32 @ld_not_disjoint32_int32_t_uint8_t(i64 %ptr) { 153; CHECK-LABEL: ld_not_disjoint32_int32_t_uint8_t: 154; CHECK: # %bb.0: # %entry 155; CHECK-NEXT: ori r3, r3, 34463 156; CHECK-NEXT: oris r3, r3, 1 157; CHECK-NEXT: lbz r3, 0(r3) 158; CHECK-NEXT: blr 159entry: 160 %or = or i64 %ptr, 99999 161 %0 = inttoptr i64 %or to ptr 162 %1 = load atomic i8, ptr %0 monotonic, align 1 163 %conv = zext i8 %1 to i32 164 ret i32 %conv 165} 166 167; Function Attrs: nofree norecurse nounwind uwtable willreturn 168define dso_local signext i32 @ld_disjoint_align32_int32_t_uint8_t(i64 %ptr) { 169; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_uint8_t: 170; CHECK-P10: # %bb.0: # %entry 171; CHECK-P10-NEXT: lis r4, -15264 172; CHECK-P10-NEXT: and r3, r3, r4 173; CHECK-P10-NEXT: plbz r3, 999990000(r3), 0 174; CHECK-P10-NEXT: clrldi r3, r3, 32 175; CHECK-P10-NEXT: blr 176; 177; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_uint8_t: 178; CHECK-PREP10: # %bb.0: # %entry 179; CHECK-PREP10-NEXT: lis r4, -15264 180; CHECK-PREP10-NEXT: and r3, r3, r4 181; CHECK-PREP10-NEXT: lis r4, 15258 182; CHECK-PREP10-NEXT: ori r4, r4, 41712 183; CHECK-PREP10-NEXT: lbzx r3, r3, r4 184; CHECK-PREP10-NEXT: blr 185entry: 186 %and = and i64 %ptr, -1000341504 187 %or = or i64 %and, 999990000 188 %0 = inttoptr i64 %or to ptr 189 %1 = load atomic i8, ptr %0 monotonic, align 16 190 %conv = zext i8 %1 to i32 191 ret i32 %conv 192} 193 194; Function Attrs: nofree norecurse nounwind uwtable willreturn 195define dso_local signext i32 @ld_not_disjoint64_int32_t_uint8_t(i64 %ptr) { 196; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_uint8_t: 197; CHECK-P10: # %bb.0: # %entry 198; CHECK-P10-NEXT: pli r4, 232 199; CHECK-P10-NEXT: pli r5, 3567587329 200; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 201; CHECK-P10-NEXT: or r3, r3, r5 202; CHECK-P10-NEXT: lbz r3, 0(r3) 203; CHECK-P10-NEXT: blr 204; 205; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_uint8_t: 206; CHECK-PREP10: # %bb.0: # %entry 207; CHECK-PREP10-NEXT: li r4, 29 208; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 209; CHECK-PREP10-NEXT: oris r4, r4, 54437 210; CHECK-PREP10-NEXT: ori r4, r4, 4097 211; CHECK-PREP10-NEXT: or r3, r3, r4 212; CHECK-PREP10-NEXT: lbz r3, 0(r3) 213; CHECK-PREP10-NEXT: blr 214entry: 215 %or = or i64 %ptr, 1000000000001 216 %0 = inttoptr i64 %or to ptr 217 %1 = load atomic i8, ptr %0 monotonic, align 1 218 %conv = zext i8 %1 to i32 219 ret i32 %conv 220} 221 222; Function Attrs: nofree norecurse nounwind uwtable willreturn 223define dso_local signext i32 @ld_disjoint_align64_int32_t_uint8_t(i64 %ptr) { 224; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_uint8_t: 225; CHECK-P10: # %bb.0: # %entry 226; CHECK-P10-NEXT: pli r4, 244140625 227; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 228; CHECK-P10-NEXT: rldic r4, r4, 12, 24 229; CHECK-P10-NEXT: lbzx r3, r3, r4 230; CHECK-P10-NEXT: blr 231; 232; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_uint8_t: 233; CHECK-PREP10: # %bb.0: # %entry 234; CHECK-PREP10-NEXT: lis r4, 3725 235; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 236; CHECK-PREP10-NEXT: ori r4, r4, 19025 237; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 238; CHECK-PREP10-NEXT: lbzx r3, r3, r4 239; CHECK-PREP10-NEXT: blr 240entry: 241 %and = and i64 %ptr, -1099511627776 242 %or = or i64 %and, 1000000000000 243 %0 = inttoptr i64 %or to ptr 244 %1 = load atomic i8, ptr %0 monotonic, align 4096 245 %conv = zext i8 %1 to i32 246 ret i32 %conv 247} 248 249; Function Attrs: nofree norecurse nounwind uwtable willreturn 250define dso_local signext i32 @ld_cst_align16_int32_t_uint8_t() { 251; CHECK-LABEL: ld_cst_align16_int32_t_uint8_t: 252; CHECK: # %bb.0: # %entry 253; CHECK-NEXT: lbz r3, 4080(0) 254; CHECK-NEXT: blr 255entry: 256 %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 257 %conv = zext i8 %0 to i32 258 ret i32 %conv 259} 260 261; Function Attrs: nofree norecurse nounwind uwtable willreturn 262define dso_local signext i32 @ld_cst_align32_int32_t_uint8_t() { 263; CHECK-LABEL: ld_cst_align32_int32_t_uint8_t: 264; CHECK: # %bb.0: # %entry 265; CHECK-NEXT: lis r3, 153 266; CHECK-NEXT: lbz r3, -27108(r3) 267; CHECK-NEXT: blr 268entry: 269 %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 270 %conv = zext i8 %0 to i32 271 ret i32 %conv 272} 273 274; Function Attrs: nofree norecurse nounwind uwtable willreturn 275define dso_local signext i32 @ld_cst_align64_int32_t_uint8_t() { 276; CHECK-P10-LABEL: ld_cst_align64_int32_t_uint8_t: 277; CHECK-P10: # %bb.0: # %entry 278; CHECK-P10-NEXT: pli r3, 244140625 279; CHECK-P10-NEXT: rldic r3, r3, 12, 24 280; CHECK-P10-NEXT: lbz r3, 0(r3) 281; CHECK-P10-NEXT: blr 282; 283; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_uint8_t: 284; CHECK-PREP10: # %bb.0: # %entry 285; CHECK-PREP10-NEXT: lis r3, 3725 286; CHECK-PREP10-NEXT: ori r3, r3, 19025 287; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 288; CHECK-PREP10-NEXT: lbz r3, 0(r3) 289; CHECK-PREP10-NEXT: blr 290entry: 291 %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 292 %conv = zext i8 %0 to i32 293 ret i32 %conv 294} 295 296; Function Attrs: nofree norecurse nounwind uwtable willreturn 297define dso_local signext i32 @ld_0_int32_t_int8_t(i64 %ptr) { 298; CHECK-LABEL: ld_0_int32_t_int8_t: 299; CHECK: # %bb.0: # %entry 300; CHECK-NEXT: lbz r3, 0(r3) 301; CHECK-NEXT: extsb r3, r3 302; CHECK-NEXT: blr 303entry: 304 %0 = inttoptr i64 %ptr to ptr 305 %1 = load atomic i8, ptr %0 monotonic, align 1 306 %conv = sext i8 %1 to i32 307 ret i32 %conv 308} 309 310; Function Attrs: nofree norecurse nounwind uwtable willreturn 311define dso_local signext i32 @ld_align16_int32_t_int8_t(ptr nocapture readonly %ptr) { 312; CHECK-LABEL: ld_align16_int32_t_int8_t: 313; CHECK: # %bb.0: # %entry 314; CHECK-NEXT: lbz r3, 8(r3) 315; CHECK-NEXT: extsb r3, r3 316; CHECK-NEXT: blr 317entry: 318 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 319 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 320 %conv = sext i8 %0 to i32 321 ret i32 %conv 322} 323 324; Function Attrs: nofree norecurse nounwind uwtable willreturn 325define dso_local signext i32 @ld_align32_int32_t_int8_t(ptr nocapture readonly %ptr) { 326; CHECK-P10-LABEL: ld_align32_int32_t_int8_t: 327; CHECK-P10: # %bb.0: # %entry 328; CHECK-P10-NEXT: plbz r3, 99999000(r3), 0 329; CHECK-P10-NEXT: extsb r3, r3 330; CHECK-P10-NEXT: blr 331; 332; CHECK-PREP10-LABEL: ld_align32_int32_t_int8_t: 333; CHECK-PREP10: # %bb.0: # %entry 334; CHECK-PREP10-NEXT: lis r4, 1525 335; CHECK-PREP10-NEXT: ori r4, r4, 56600 336; CHECK-PREP10-NEXT: lbzx r3, r3, r4 337; CHECK-PREP10-NEXT: extsb r3, r3 338; CHECK-PREP10-NEXT: blr 339entry: 340 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 341 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 342 %conv = sext i8 %0 to i32 343 ret i32 %conv 344} 345 346; Function Attrs: nofree norecurse nounwind uwtable willreturn 347define dso_local signext i32 @ld_align64_int32_t_int8_t(ptr nocapture readonly %ptr) { 348; CHECK-P10-LABEL: ld_align64_int32_t_int8_t: 349; CHECK-P10: # %bb.0: # %entry 350; CHECK-P10-NEXT: pli r4, 244140625 351; CHECK-P10-NEXT: rldic r4, r4, 12, 24 352; CHECK-P10-NEXT: lbzx r3, r3, r4 353; CHECK-P10-NEXT: extsb r3, r3 354; CHECK-P10-NEXT: blr 355; 356; CHECK-PREP10-LABEL: ld_align64_int32_t_int8_t: 357; CHECK-PREP10: # %bb.0: # %entry 358; CHECK-PREP10-NEXT: lis r4, 3725 359; CHECK-PREP10-NEXT: ori r4, r4, 19025 360; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 361; CHECK-PREP10-NEXT: lbzx r3, r3, r4 362; CHECK-PREP10-NEXT: extsb r3, r3 363; CHECK-PREP10-NEXT: blr 364entry: 365 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 366 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 367 %conv = sext i8 %0 to i32 368 ret i32 %conv 369} 370 371; Function Attrs: nofree norecurse nounwind uwtable willreturn 372define dso_local signext i32 @ld_reg_int32_t_int8_t(ptr nocapture readonly %ptr, i64 %off) { 373; CHECK-LABEL: ld_reg_int32_t_int8_t: 374; CHECK: # %bb.0: # %entry 375; CHECK-NEXT: lbzx r3, r3, r4 376; CHECK-NEXT: extsb r3, r3 377; CHECK-NEXT: blr 378entry: 379 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 380 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 381 %conv = sext i8 %0 to i32 382 ret i32 %conv 383} 384 385; Function Attrs: nofree norecurse nounwind uwtable willreturn 386define dso_local signext i32 @ld_or_int32_t_int8_t(i64 %ptr, i8 zeroext %off) { 387; CHECK-LABEL: ld_or_int32_t_int8_t: 388; CHECK: # %bb.0: # %entry 389; CHECK-NEXT: or r3, r4, r3 390; CHECK-NEXT: lbz r3, 0(r3) 391; CHECK-NEXT: extsb r3, r3 392; CHECK-NEXT: blr 393entry: 394 %conv = zext i8 %off to i64 395 %or = or i64 %conv, %ptr 396 %0 = inttoptr i64 %or to ptr 397 %1 = load atomic i8, ptr %0 monotonic, align 1 398 %conv1 = sext i8 %1 to i32 399 ret i32 %conv1 400} 401 402; Function Attrs: nofree norecurse nounwind uwtable willreturn 403define dso_local signext i32 @ld_not_disjoint16_int32_t_int8_t(i64 %ptr) { 404; CHECK-LABEL: ld_not_disjoint16_int32_t_int8_t: 405; CHECK: # %bb.0: # %entry 406; CHECK-NEXT: ori r3, r3, 6 407; CHECK-NEXT: lbz r3, 0(r3) 408; CHECK-NEXT: extsb r3, r3 409; CHECK-NEXT: blr 410entry: 411 %or = or i64 %ptr, 6 412 %0 = inttoptr i64 %or to ptr 413 %1 = load atomic i8, ptr %0 monotonic, align 1 414 %conv = sext i8 %1 to i32 415 ret i32 %conv 416} 417 418; Function Attrs: nofree norecurse nounwind uwtable willreturn 419define dso_local signext i32 @ld_disjoint_align16_int32_t_int8_t(i64 %ptr) { 420; CHECK-LABEL: ld_disjoint_align16_int32_t_int8_t: 421; CHECK: # %bb.0: # %entry 422; CHECK-NEXT: rldicr r3, r3, 0, 51 423; CHECK-NEXT: lbz r3, 24(r3) 424; CHECK-NEXT: extsb r3, r3 425; CHECK-NEXT: blr 426entry: 427 %and = and i64 %ptr, -4096 428 %or = or i64 %and, 24 429 %0 = inttoptr i64 %or to ptr 430 %1 = load atomic i8, ptr %0 monotonic, align 8 431 %conv = sext i8 %1 to i32 432 ret i32 %conv 433} 434 435; Function Attrs: nofree norecurse nounwind uwtable willreturn 436define dso_local signext i32 @ld_not_disjoint32_int32_t_int8_t(i64 %ptr) { 437; CHECK-LABEL: ld_not_disjoint32_int32_t_int8_t: 438; CHECK: # %bb.0: # %entry 439; CHECK-NEXT: ori r3, r3, 34463 440; CHECK-NEXT: oris r3, r3, 1 441; CHECK-NEXT: lbz r3, 0(r3) 442; CHECK-NEXT: extsb r3, r3 443; CHECK-NEXT: blr 444entry: 445 %or = or i64 %ptr, 99999 446 %0 = inttoptr i64 %or to ptr 447 %1 = load atomic i8, ptr %0 monotonic, align 1 448 %conv = sext i8 %1 to i32 449 ret i32 %conv 450} 451 452; Function Attrs: nofree norecurse nounwind uwtable willreturn 453define dso_local signext i32 @ld_disjoint_align32_int32_t_int8_t(i64 %ptr) { 454; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_int8_t: 455; CHECK-P10: # %bb.0: # %entry 456; CHECK-P10-NEXT: lis r4, -15264 457; CHECK-P10-NEXT: and r3, r3, r4 458; CHECK-P10-NEXT: plbz r3, 999990000(r3), 0 459; CHECK-P10-NEXT: extsb r3, r3 460; CHECK-P10-NEXT: blr 461; 462; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_int8_t: 463; CHECK-PREP10: # %bb.0: # %entry 464; CHECK-PREP10-NEXT: lis r4, -15264 465; CHECK-PREP10-NEXT: and r3, r3, r4 466; CHECK-PREP10-NEXT: lis r4, 15258 467; CHECK-PREP10-NEXT: ori r4, r4, 41712 468; CHECK-PREP10-NEXT: lbzx r3, r3, r4 469; CHECK-PREP10-NEXT: extsb r3, r3 470; CHECK-PREP10-NEXT: blr 471entry: 472 %and = and i64 %ptr, -1000341504 473 %or = or i64 %and, 999990000 474 %0 = inttoptr i64 %or to ptr 475 %1 = load atomic i8, ptr %0 monotonic, align 16 476 %conv = sext i8 %1 to i32 477 ret i32 %conv 478} 479 480; Function Attrs: nofree norecurse nounwind uwtable willreturn 481define dso_local signext i32 @ld_not_disjoint64_int32_t_int8_t(i64 %ptr) { 482; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_int8_t: 483; CHECK-P10: # %bb.0: # %entry 484; CHECK-P10-NEXT: pli r4, 232 485; CHECK-P10-NEXT: pli r5, 3567587329 486; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 487; CHECK-P10-NEXT: or r3, r3, r5 488; CHECK-P10-NEXT: lbz r3, 0(r3) 489; CHECK-P10-NEXT: extsb r3, r3 490; CHECK-P10-NEXT: blr 491; 492; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_int8_t: 493; CHECK-PREP10: # %bb.0: # %entry 494; CHECK-PREP10-NEXT: li r4, 29 495; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 496; CHECK-PREP10-NEXT: oris r4, r4, 54437 497; CHECK-PREP10-NEXT: ori r4, r4, 4097 498; CHECK-PREP10-NEXT: or r3, r3, r4 499; CHECK-PREP10-NEXT: lbz r3, 0(r3) 500; CHECK-PREP10-NEXT: extsb r3, r3 501; CHECK-PREP10-NEXT: blr 502entry: 503 %or = or i64 %ptr, 1000000000001 504 %0 = inttoptr i64 %or to ptr 505 %1 = load atomic i8, ptr %0 monotonic, align 1 506 %conv = sext i8 %1 to i32 507 ret i32 %conv 508} 509 510; Function Attrs: nofree norecurse nounwind uwtable willreturn 511define dso_local signext i32 @ld_disjoint_align64_int32_t_int8_t(i64 %ptr) { 512; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_int8_t: 513; CHECK-P10: # %bb.0: # %entry 514; CHECK-P10-NEXT: pli r4, 244140625 515; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 516; CHECK-P10-NEXT: rldic r4, r4, 12, 24 517; CHECK-P10-NEXT: lbzx r3, r3, r4 518; CHECK-P10-NEXT: extsb r3, r3 519; CHECK-P10-NEXT: blr 520; 521; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_int8_t: 522; CHECK-PREP10: # %bb.0: # %entry 523; CHECK-PREP10-NEXT: lis r4, 3725 524; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 525; CHECK-PREP10-NEXT: ori r4, r4, 19025 526; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 527; CHECK-PREP10-NEXT: lbzx r3, r3, r4 528; CHECK-PREP10-NEXT: extsb r3, r3 529; CHECK-PREP10-NEXT: blr 530entry: 531 %and = and i64 %ptr, -1099511627776 532 %or = or i64 %and, 1000000000000 533 %0 = inttoptr i64 %or to ptr 534 %1 = load atomic i8, ptr %0 monotonic, align 4096 535 %conv = sext i8 %1 to i32 536 ret i32 %conv 537} 538 539; Function Attrs: nofree norecurse nounwind uwtable willreturn 540define dso_local signext i32 @ld_cst_align16_int32_t_int8_t() { 541; CHECK-LABEL: ld_cst_align16_int32_t_int8_t: 542; CHECK: # %bb.0: # %entry 543; CHECK-NEXT: lbz r3, 4080(0) 544; CHECK-NEXT: extsb r3, r3 545; CHECK-NEXT: blr 546entry: 547 %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 548 %conv = sext i8 %0 to i32 549 ret i32 %conv 550} 551 552; Function Attrs: nofree norecurse nounwind uwtable willreturn 553define dso_local signext i32 @ld_cst_align32_int32_t_int8_t() { 554; CHECK-LABEL: ld_cst_align32_int32_t_int8_t: 555; CHECK: # %bb.0: # %entry 556; CHECK-NEXT: lis r3, 153 557; CHECK-NEXT: lbz r3, -27108(r3) 558; CHECK-NEXT: extsb r3, r3 559; CHECK-NEXT: blr 560entry: 561 %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 562 %conv = sext i8 %0 to i32 563 ret i32 %conv 564} 565 566; Function Attrs: nofree norecurse nounwind uwtable willreturn 567define dso_local signext i32 @ld_cst_align64_int32_t_int8_t() { 568; CHECK-P10-LABEL: ld_cst_align64_int32_t_int8_t: 569; CHECK-P10: # %bb.0: # %entry 570; CHECK-P10-NEXT: pli r3, 244140625 571; CHECK-P10-NEXT: rldic r3, r3, 12, 24 572; CHECK-P10-NEXT: lbz r3, 0(r3) 573; CHECK-P10-NEXT: extsb r3, r3 574; CHECK-P10-NEXT: blr 575; 576; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_int8_t: 577; CHECK-PREP10: # %bb.0: # %entry 578; CHECK-PREP10-NEXT: lis r3, 3725 579; CHECK-PREP10-NEXT: ori r3, r3, 19025 580; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 581; CHECK-PREP10-NEXT: lbz r3, 0(r3) 582; CHECK-PREP10-NEXT: extsb r3, r3 583; CHECK-PREP10-NEXT: blr 584entry: 585 %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 586 %conv = sext i8 %0 to i32 587 ret i32 %conv 588} 589 590; Function Attrs: nofree norecurse nounwind uwtable willreturn 591define dso_local signext i32 @ld_0_int32_t_uint16_t(i64 %ptr) { 592; CHECK-LABEL: ld_0_int32_t_uint16_t: 593; CHECK: # %bb.0: # %entry 594; CHECK-NEXT: lhz r3, 0(r3) 595; CHECK-NEXT: blr 596entry: 597 %0 = inttoptr i64 %ptr to ptr 598 %1 = load atomic i16, ptr %0 monotonic, align 2 599 %conv = zext i16 %1 to i32 600 ret i32 %conv 601} 602 603; Function Attrs: nofree norecurse nounwind uwtable willreturn 604define dso_local signext i32 @ld_align16_int32_t_uint16_t(ptr nocapture readonly %ptr) { 605; CHECK-LABEL: ld_align16_int32_t_uint16_t: 606; CHECK: # %bb.0: # %entry 607; CHECK-NEXT: lhz r3, 8(r3) 608; CHECK-NEXT: blr 609entry: 610 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 611 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 612 %conv = zext i16 %0 to i32 613 ret i32 %conv 614} 615 616; Function Attrs: nofree norecurse nounwind uwtable willreturn 617define dso_local signext i32 @ld_align32_int32_t_uint16_t(ptr nocapture readonly %ptr) { 618; CHECK-P10-LABEL: ld_align32_int32_t_uint16_t: 619; CHECK-P10: # %bb.0: # %entry 620; CHECK-P10-NEXT: plhz r3, 99999000(r3), 0 621; CHECK-P10-NEXT: clrldi r3, r3, 32 622; CHECK-P10-NEXT: blr 623; 624; CHECK-PREP10-LABEL: ld_align32_int32_t_uint16_t: 625; CHECK-PREP10: # %bb.0: # %entry 626; CHECK-PREP10-NEXT: lis r4, 1525 627; CHECK-PREP10-NEXT: ori r4, r4, 56600 628; CHECK-PREP10-NEXT: lhzx r3, r3, r4 629; CHECK-PREP10-NEXT: blr 630entry: 631 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 632 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 633 %conv = zext i16 %0 to i32 634 ret i32 %conv 635} 636 637; Function Attrs: nofree norecurse nounwind uwtable willreturn 638define dso_local signext i32 @ld_align64_int32_t_uint16_t(ptr nocapture readonly %ptr) { 639; CHECK-P10-LABEL: ld_align64_int32_t_uint16_t: 640; CHECK-P10: # %bb.0: # %entry 641; CHECK-P10-NEXT: pli r4, 244140625 642; CHECK-P10-NEXT: rldic r4, r4, 12, 24 643; CHECK-P10-NEXT: lhzx r3, r3, r4 644; CHECK-P10-NEXT: blr 645; 646; CHECK-PREP10-LABEL: ld_align64_int32_t_uint16_t: 647; CHECK-PREP10: # %bb.0: # %entry 648; CHECK-PREP10-NEXT: lis r4, 3725 649; CHECK-PREP10-NEXT: ori r4, r4, 19025 650; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 651; CHECK-PREP10-NEXT: lhzx r3, r3, r4 652; CHECK-PREP10-NEXT: blr 653entry: 654 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 655 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 656 %conv = zext i16 %0 to i32 657 ret i32 %conv 658} 659 660; Function Attrs: nofree norecurse nounwind uwtable willreturn 661define dso_local signext i32 @ld_reg_int32_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) { 662; CHECK-LABEL: ld_reg_int32_t_uint16_t: 663; CHECK: # %bb.0: # %entry 664; CHECK-NEXT: lhzx r3, r3, r4 665; CHECK-NEXT: blr 666entry: 667 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 668 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 669 %conv = zext i16 %0 to i32 670 ret i32 %conv 671} 672 673; Function Attrs: nofree norecurse nounwind uwtable willreturn 674define dso_local signext i32 @ld_or_int32_t_uint16_t(i64 %ptr, i8 zeroext %off) { 675; CHECK-LABEL: ld_or_int32_t_uint16_t: 676; CHECK: # %bb.0: # %entry 677; CHECK-NEXT: or r3, r4, r3 678; CHECK-NEXT: lhz r3, 0(r3) 679; CHECK-NEXT: blr 680entry: 681 %conv = zext i8 %off to i64 682 %or = or i64 %conv, %ptr 683 %0 = inttoptr i64 %or to ptr 684 %1 = load atomic i16, ptr %0 monotonic, align 2 685 %conv1 = zext i16 %1 to i32 686 ret i32 %conv1 687} 688 689; Function Attrs: nofree norecurse nounwind uwtable willreturn 690define dso_local signext i32 @ld_not_disjoint16_int32_t_uint16_t(i64 %ptr) { 691; CHECK-LABEL: ld_not_disjoint16_int32_t_uint16_t: 692; CHECK: # %bb.0: # %entry 693; CHECK-NEXT: ori r3, r3, 6 694; CHECK-NEXT: lhz r3, 0(r3) 695; CHECK-NEXT: blr 696entry: 697 %or = or i64 %ptr, 6 698 %0 = inttoptr i64 %or to ptr 699 %1 = load atomic i16, ptr %0 monotonic, align 2 700 %conv = zext i16 %1 to i32 701 ret i32 %conv 702} 703 704; Function Attrs: nofree norecurse nounwind uwtable willreturn 705define dso_local signext i32 @ld_disjoint_align16_int32_t_uint16_t(i64 %ptr) { 706; CHECK-LABEL: ld_disjoint_align16_int32_t_uint16_t: 707; CHECK: # %bb.0: # %entry 708; CHECK-NEXT: rldicr r3, r3, 0, 51 709; CHECK-NEXT: lhz r3, 24(r3) 710; CHECK-NEXT: blr 711entry: 712 %and = and i64 %ptr, -4096 713 %or = or i64 %and, 24 714 %0 = inttoptr i64 %or to ptr 715 %1 = load atomic i16, ptr %0 monotonic, align 8 716 %conv = zext i16 %1 to i32 717 ret i32 %conv 718} 719 720; Function Attrs: nofree norecurse nounwind uwtable willreturn 721define dso_local signext i32 @ld_not_disjoint32_int32_t_uint16_t(i64 %ptr) { 722; CHECK-LABEL: ld_not_disjoint32_int32_t_uint16_t: 723; CHECK: # %bb.0: # %entry 724; CHECK-NEXT: ori r3, r3, 34463 725; CHECK-NEXT: oris r3, r3, 1 726; CHECK-NEXT: lhz r3, 0(r3) 727; CHECK-NEXT: blr 728entry: 729 %or = or i64 %ptr, 99999 730 %0 = inttoptr i64 %or to ptr 731 %1 = load atomic i16, ptr %0 monotonic, align 2 732 %conv = zext i16 %1 to i32 733 ret i32 %conv 734} 735 736; Function Attrs: nofree norecurse nounwind uwtable willreturn 737define dso_local signext i32 @ld_disjoint_align32_int32_t_uint16_t(i64 %ptr) { 738; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_uint16_t: 739; CHECK-P10: # %bb.0: # %entry 740; CHECK-P10-NEXT: lis r4, -15264 741; CHECK-P10-NEXT: and r3, r3, r4 742; CHECK-P10-NEXT: plhz r3, 999990000(r3), 0 743; CHECK-P10-NEXT: clrldi r3, r3, 32 744; CHECK-P10-NEXT: blr 745; 746; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_uint16_t: 747; CHECK-PREP10: # %bb.0: # %entry 748; CHECK-PREP10-NEXT: lis r4, -15264 749; CHECK-PREP10-NEXT: and r3, r3, r4 750; CHECK-PREP10-NEXT: lis r4, 15258 751; CHECK-PREP10-NEXT: ori r4, r4, 41712 752; CHECK-PREP10-NEXT: lhzx r3, r3, r4 753; CHECK-PREP10-NEXT: blr 754entry: 755 %and = and i64 %ptr, -1000341504 756 %or = or i64 %and, 999990000 757 %0 = inttoptr i64 %or to ptr 758 %1 = load atomic i16, ptr %0 monotonic, align 16 759 %conv = zext i16 %1 to i32 760 ret i32 %conv 761} 762 763; Function Attrs: nofree norecurse nounwind uwtable willreturn 764define dso_local signext i32 @ld_not_disjoint64_int32_t_uint16_t(i64 %ptr) { 765; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_uint16_t: 766; CHECK-P10: # %bb.0: # %entry 767; CHECK-P10-NEXT: pli r4, 232 768; CHECK-P10-NEXT: pli r5, 3567587329 769; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 770; CHECK-P10-NEXT: or r3, r3, r5 771; CHECK-P10-NEXT: lhz r3, 0(r3) 772; CHECK-P10-NEXT: blr 773; 774; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_uint16_t: 775; CHECK-PREP10: # %bb.0: # %entry 776; CHECK-PREP10-NEXT: li r4, 29 777; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 778; CHECK-PREP10-NEXT: oris r4, r4, 54437 779; CHECK-PREP10-NEXT: ori r4, r4, 4097 780; CHECK-PREP10-NEXT: or r3, r3, r4 781; CHECK-PREP10-NEXT: lhz r3, 0(r3) 782; CHECK-PREP10-NEXT: blr 783entry: 784 %or = or i64 %ptr, 1000000000001 785 %0 = inttoptr i64 %or to ptr 786 %1 = load atomic i16, ptr %0 monotonic, align 2 787 %conv = zext i16 %1 to i32 788 ret i32 %conv 789} 790 791; Function Attrs: nofree norecurse nounwind uwtable willreturn 792define dso_local signext i32 @ld_disjoint_align64_int32_t_uint16_t(i64 %ptr) { 793; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_uint16_t: 794; CHECK-P10: # %bb.0: # %entry 795; CHECK-P10-NEXT: pli r4, 244140625 796; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 797; CHECK-P10-NEXT: rldic r4, r4, 12, 24 798; CHECK-P10-NEXT: lhzx r3, r3, r4 799; CHECK-P10-NEXT: blr 800; 801; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_uint16_t: 802; CHECK-PREP10: # %bb.0: # %entry 803; CHECK-PREP10-NEXT: lis r4, 3725 804; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 805; CHECK-PREP10-NEXT: ori r4, r4, 19025 806; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 807; CHECK-PREP10-NEXT: lhzx r3, r3, r4 808; CHECK-PREP10-NEXT: blr 809entry: 810 %and = and i64 %ptr, -1099511627776 811 %or = or i64 %and, 1000000000000 812 %0 = inttoptr i64 %or to ptr 813 %1 = load atomic i16, ptr %0 monotonic, align 4096 814 %conv = zext i16 %1 to i32 815 ret i32 %conv 816} 817 818; Function Attrs: nofree norecurse nounwind uwtable willreturn 819define dso_local signext i32 @ld_cst_align16_int32_t_uint16_t() { 820; CHECK-LABEL: ld_cst_align16_int32_t_uint16_t: 821; CHECK: # %bb.0: # %entry 822; CHECK-NEXT: lhz r3, 4080(0) 823; CHECK-NEXT: blr 824entry: 825 %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 826 %conv = zext i16 %0 to i32 827 ret i32 %conv 828} 829 830; Function Attrs: nofree norecurse nounwind uwtable willreturn 831define dso_local signext i32 @ld_cst_align32_int32_t_uint16_t() { 832; CHECK-LABEL: ld_cst_align32_int32_t_uint16_t: 833; CHECK: # %bb.0: # %entry 834; CHECK-NEXT: lis r3, 153 835; CHECK-NEXT: lhz r3, -27108(r3) 836; CHECK-NEXT: blr 837entry: 838 %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 839 %conv = zext i16 %0 to i32 840 ret i32 %conv 841} 842 843; Function Attrs: nofree norecurse nounwind uwtable willreturn 844define dso_local signext i32 @ld_cst_align64_int32_t_uint16_t() { 845; CHECK-P10-LABEL: ld_cst_align64_int32_t_uint16_t: 846; CHECK-P10: # %bb.0: # %entry 847; CHECK-P10-NEXT: pli r3, 244140625 848; CHECK-P10-NEXT: rldic r3, r3, 12, 24 849; CHECK-P10-NEXT: lhz r3, 0(r3) 850; CHECK-P10-NEXT: blr 851; 852; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_uint16_t: 853; CHECK-PREP10: # %bb.0: # %entry 854; CHECK-PREP10-NEXT: lis r3, 3725 855; CHECK-PREP10-NEXT: ori r3, r3, 19025 856; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 857; CHECK-PREP10-NEXT: lhz r3, 0(r3) 858; CHECK-PREP10-NEXT: blr 859entry: 860 %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 861 %conv = zext i16 %0 to i32 862 ret i32 %conv 863} 864 865; Function Attrs: nofree norecurse nounwind uwtable willreturn 866define dso_local signext i32 @ld_0_int32_t_int16_t(i64 %ptr) { 867; CHECK-LABEL: ld_0_int32_t_int16_t: 868; CHECK: # %bb.0: # %entry 869; CHECK-NEXT: lhz r3, 0(r3) 870; CHECK-NEXT: extsh r3, r3 871; CHECK-NEXT: blr 872entry: 873 %0 = inttoptr i64 %ptr to ptr 874 %1 = load atomic i16, ptr %0 monotonic, align 2 875 %conv = sext i16 %1 to i32 876 ret i32 %conv 877} 878 879; Function Attrs: nofree norecurse nounwind uwtable willreturn 880define dso_local signext i32 @ld_align16_int32_t_int16_t(ptr nocapture readonly %ptr) { 881; CHECK-LABEL: ld_align16_int32_t_int16_t: 882; CHECK: # %bb.0: # %entry 883; CHECK-NEXT: lhz r3, 8(r3) 884; CHECK-NEXT: extsh r3, r3 885; CHECK-NEXT: blr 886entry: 887 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 888 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 889 %conv = sext i16 %0 to i32 890 ret i32 %conv 891} 892 893; Function Attrs: nofree norecurse nounwind uwtable willreturn 894define dso_local signext i32 @ld_align32_int32_t_int16_t(ptr nocapture readonly %ptr) { 895; CHECK-P10-LABEL: ld_align32_int32_t_int16_t: 896; CHECK-P10: # %bb.0: # %entry 897; CHECK-P10-NEXT: plhz r3, 99999000(r3), 0 898; CHECK-P10-NEXT: extsh r3, r3 899; CHECK-P10-NEXT: blr 900; 901; CHECK-PREP10-LABEL: ld_align32_int32_t_int16_t: 902; CHECK-PREP10: # %bb.0: # %entry 903; CHECK-PREP10-NEXT: lis r4, 1525 904; CHECK-PREP10-NEXT: ori r4, r4, 56600 905; CHECK-PREP10-NEXT: lhzx r3, r3, r4 906; CHECK-PREP10-NEXT: extsh r3, r3 907; CHECK-PREP10-NEXT: blr 908entry: 909 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 910 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 911 %conv = sext i16 %0 to i32 912 ret i32 %conv 913} 914 915; Function Attrs: nofree norecurse nounwind uwtable willreturn 916define dso_local signext i32 @ld_align64_int32_t_int16_t(ptr nocapture readonly %ptr) { 917; CHECK-P10-LABEL: ld_align64_int32_t_int16_t: 918; CHECK-P10: # %bb.0: # %entry 919; CHECK-P10-NEXT: pli r4, 244140625 920; CHECK-P10-NEXT: rldic r4, r4, 12, 24 921; CHECK-P10-NEXT: lhzx r3, r3, r4 922; CHECK-P10-NEXT: extsh r3, r3 923; CHECK-P10-NEXT: blr 924; 925; CHECK-PREP10-LABEL: ld_align64_int32_t_int16_t: 926; CHECK-PREP10: # %bb.0: # %entry 927; CHECK-PREP10-NEXT: lis r4, 3725 928; CHECK-PREP10-NEXT: ori r4, r4, 19025 929; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 930; CHECK-PREP10-NEXT: lhzx r3, r3, r4 931; CHECK-PREP10-NEXT: extsh r3, r3 932; CHECK-PREP10-NEXT: blr 933entry: 934 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 935 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 936 %conv = sext i16 %0 to i32 937 ret i32 %conv 938} 939 940; Function Attrs: nofree norecurse nounwind uwtable willreturn 941define dso_local signext i32 @ld_reg_int32_t_int16_t(ptr nocapture readonly %ptr, i64 %off) { 942; CHECK-LABEL: ld_reg_int32_t_int16_t: 943; CHECK: # %bb.0: # %entry 944; CHECK-NEXT: lhzx r3, r3, r4 945; CHECK-NEXT: extsh r3, r3 946; CHECK-NEXT: blr 947entry: 948 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 949 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 950 %conv = sext i16 %0 to i32 951 ret i32 %conv 952} 953 954; Function Attrs: nofree norecurse nounwind uwtable willreturn 955define dso_local signext i32 @ld_or_int32_t_int16_t(i64 %ptr, i8 zeroext %off) { 956; CHECK-LABEL: ld_or_int32_t_int16_t: 957; CHECK: # %bb.0: # %entry 958; CHECK-NEXT: or r3, r4, r3 959; CHECK-NEXT: lhz r3, 0(r3) 960; CHECK-NEXT: extsh r3, r3 961; CHECK-NEXT: blr 962entry: 963 %conv = zext i8 %off to i64 964 %or = or i64 %conv, %ptr 965 %0 = inttoptr i64 %or to ptr 966 %1 = load atomic i16, ptr %0 monotonic, align 2 967 %conv1 = sext i16 %1 to i32 968 ret i32 %conv1 969} 970 971; Function Attrs: nofree norecurse nounwind uwtable willreturn 972define dso_local signext i32 @ld_not_disjoint16_int32_t_int16_t(i64 %ptr) { 973; CHECK-LABEL: ld_not_disjoint16_int32_t_int16_t: 974; CHECK: # %bb.0: # %entry 975; CHECK-NEXT: ori r3, r3, 6 976; CHECK-NEXT: lhz r3, 0(r3) 977; CHECK-NEXT: extsh r3, r3 978; CHECK-NEXT: blr 979entry: 980 %or = or i64 %ptr, 6 981 %0 = inttoptr i64 %or to ptr 982 %1 = load atomic i16, ptr %0 monotonic, align 2 983 %conv = sext i16 %1 to i32 984 ret i32 %conv 985} 986 987; Function Attrs: nofree norecurse nounwind uwtable willreturn 988define dso_local signext i32 @ld_disjoint_align16_int32_t_int16_t(i64 %ptr) { 989; CHECK-LABEL: ld_disjoint_align16_int32_t_int16_t: 990; CHECK: # %bb.0: # %entry 991; CHECK-NEXT: rldicr r3, r3, 0, 51 992; CHECK-NEXT: lhz r3, 24(r3) 993; CHECK-NEXT: extsh r3, r3 994; CHECK-NEXT: blr 995entry: 996 %and = and i64 %ptr, -4096 997 %or = or i64 %and, 24 998 %0 = inttoptr i64 %or to ptr 999 %1 = load atomic i16, ptr %0 monotonic, align 8 1000 %conv = sext i16 %1 to i32 1001 ret i32 %conv 1002} 1003 1004; Function Attrs: nofree norecurse nounwind uwtable willreturn 1005define dso_local signext i32 @ld_not_disjoint32_int32_t_int16_t(i64 %ptr) { 1006; CHECK-LABEL: ld_not_disjoint32_int32_t_int16_t: 1007; CHECK: # %bb.0: # %entry 1008; CHECK-NEXT: ori r3, r3, 34463 1009; CHECK-NEXT: oris r3, r3, 1 1010; CHECK-NEXT: lhz r3, 0(r3) 1011; CHECK-NEXT: extsh r3, r3 1012; CHECK-NEXT: blr 1013entry: 1014 %or = or i64 %ptr, 99999 1015 %0 = inttoptr i64 %or to ptr 1016 %1 = load atomic i16, ptr %0 monotonic, align 2 1017 %conv = sext i16 %1 to i32 1018 ret i32 %conv 1019} 1020 1021; Function Attrs: nofree norecurse nounwind uwtable willreturn 1022define dso_local signext i32 @ld_disjoint_align32_int32_t_int16_t(i64 %ptr) { 1023; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_int16_t: 1024; CHECK-P10: # %bb.0: # %entry 1025; CHECK-P10-NEXT: lis r4, -15264 1026; CHECK-P10-NEXT: and r3, r3, r4 1027; CHECK-P10-NEXT: plhz r3, 999990000(r3), 0 1028; CHECK-P10-NEXT: extsh r3, r3 1029; CHECK-P10-NEXT: blr 1030; 1031; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_int16_t: 1032; CHECK-PREP10: # %bb.0: # %entry 1033; CHECK-PREP10-NEXT: lis r4, -15264 1034; CHECK-PREP10-NEXT: and r3, r3, r4 1035; CHECK-PREP10-NEXT: lis r4, 15258 1036; CHECK-PREP10-NEXT: ori r4, r4, 41712 1037; CHECK-PREP10-NEXT: lhzx r3, r3, r4 1038; CHECK-PREP10-NEXT: extsh r3, r3 1039; CHECK-PREP10-NEXT: blr 1040entry: 1041 %and = and i64 %ptr, -1000341504 1042 %or = or i64 %and, 999990000 1043 %0 = inttoptr i64 %or to ptr 1044 %1 = load atomic i16, ptr %0 monotonic, align 16 1045 %conv = sext i16 %1 to i32 1046 ret i32 %conv 1047} 1048 1049; Function Attrs: nofree norecurse nounwind uwtable willreturn 1050define dso_local signext i32 @ld_not_disjoint64_int32_t_int16_t(i64 %ptr) { 1051; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_int16_t: 1052; CHECK-P10: # %bb.0: # %entry 1053; CHECK-P10-NEXT: pli r4, 232 1054; CHECK-P10-NEXT: pli r5, 3567587329 1055; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1056; CHECK-P10-NEXT: or r3, r3, r5 1057; CHECK-P10-NEXT: lhz r3, 0(r3) 1058; CHECK-P10-NEXT: extsh r3, r3 1059; CHECK-P10-NEXT: blr 1060; 1061; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_int16_t: 1062; CHECK-PREP10: # %bb.0: # %entry 1063; CHECK-PREP10-NEXT: li r4, 29 1064; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1065; CHECK-PREP10-NEXT: oris r4, r4, 54437 1066; CHECK-PREP10-NEXT: ori r4, r4, 4097 1067; CHECK-PREP10-NEXT: or r3, r3, r4 1068; CHECK-PREP10-NEXT: lhz r3, 0(r3) 1069; CHECK-PREP10-NEXT: extsh r3, r3 1070; CHECK-PREP10-NEXT: blr 1071entry: 1072 %or = or i64 %ptr, 1000000000001 1073 %0 = inttoptr i64 %or to ptr 1074 %1 = load atomic i16, ptr %0 monotonic, align 2 1075 %conv = sext i16 %1 to i32 1076 ret i32 %conv 1077} 1078 1079; Function Attrs: nofree norecurse nounwind uwtable willreturn 1080define dso_local signext i32 @ld_disjoint_align64_int32_t_int16_t(i64 %ptr) { 1081; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_int16_t: 1082; CHECK-P10: # %bb.0: # %entry 1083; CHECK-P10-NEXT: pli r4, 244140625 1084; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1085; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1086; CHECK-P10-NEXT: lhzx r3, r3, r4 1087; CHECK-P10-NEXT: extsh r3, r3 1088; CHECK-P10-NEXT: blr 1089; 1090; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_int16_t: 1091; CHECK-PREP10: # %bb.0: # %entry 1092; CHECK-PREP10-NEXT: lis r4, 3725 1093; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1094; CHECK-PREP10-NEXT: ori r4, r4, 19025 1095; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1096; CHECK-PREP10-NEXT: lhzx r3, r3, r4 1097; CHECK-PREP10-NEXT: extsh r3, r3 1098; CHECK-PREP10-NEXT: blr 1099entry: 1100 %and = and i64 %ptr, -1099511627776 1101 %or = or i64 %and, 1000000000000 1102 %0 = inttoptr i64 %or to ptr 1103 %1 = load atomic i16, ptr %0 monotonic, align 4096 1104 %conv = sext i16 %1 to i32 1105 ret i32 %conv 1106} 1107 1108; Function Attrs: nofree norecurse nounwind uwtable willreturn 1109define dso_local signext i32 @ld_cst_align16_int32_t_int16_t() { 1110; CHECK-LABEL: ld_cst_align16_int32_t_int16_t: 1111; CHECK: # %bb.0: # %entry 1112; CHECK-NEXT: lhz r3, 4080(0) 1113; CHECK-NEXT: extsh r3, r3 1114; CHECK-NEXT: blr 1115entry: 1116 %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1117 %conv = sext i16 %0 to i32 1118 ret i32 %conv 1119} 1120 1121; Function Attrs: nofree norecurse nounwind uwtable willreturn 1122define dso_local signext i32 @ld_cst_align32_int32_t_int16_t() { 1123; CHECK-LABEL: ld_cst_align32_int32_t_int16_t: 1124; CHECK: # %bb.0: # %entry 1125; CHECK-NEXT: lis r3, 153 1126; CHECK-NEXT: lhz r3, -27108(r3) 1127; CHECK-NEXT: extsh r3, r3 1128; CHECK-NEXT: blr 1129entry: 1130 %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 1131 %conv = sext i16 %0 to i32 1132 ret i32 %conv 1133} 1134 1135; Function Attrs: nofree norecurse nounwind uwtable willreturn 1136define dso_local signext i32 @ld_cst_align64_int32_t_int16_t() { 1137; CHECK-P10-LABEL: ld_cst_align64_int32_t_int16_t: 1138; CHECK-P10: # %bb.0: # %entry 1139; CHECK-P10-NEXT: pli r3, 244140625 1140; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1141; CHECK-P10-NEXT: lhz r3, 0(r3) 1142; CHECK-P10-NEXT: extsh r3, r3 1143; CHECK-P10-NEXT: blr 1144; 1145; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_int16_t: 1146; CHECK-PREP10: # %bb.0: # %entry 1147; CHECK-PREP10-NEXT: lis r3, 3725 1148; CHECK-PREP10-NEXT: ori r3, r3, 19025 1149; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1150; CHECK-PREP10-NEXT: lhz r3, 0(r3) 1151; CHECK-PREP10-NEXT: extsh r3, r3 1152; CHECK-PREP10-NEXT: blr 1153entry: 1154 %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1155 %conv = sext i16 %0 to i32 1156 ret i32 %conv 1157} 1158 1159; Function Attrs: nofree norecurse nounwind uwtable willreturn 1160define dso_local signext i32 @ld_0_int32_t_uint32_t(i64 %ptr) { 1161; CHECK-LABEL: ld_0_int32_t_uint32_t: 1162; CHECK: # %bb.0: # %entry 1163; CHECK-NEXT: lwa r3, 0(r3) 1164; CHECK-NEXT: blr 1165entry: 1166 %0 = inttoptr i64 %ptr to ptr 1167 %1 = load atomic i32, ptr %0 monotonic, align 4 1168 ret i32 %1 1169} 1170 1171; Function Attrs: nofree norecurse nounwind uwtable willreturn 1172define dso_local signext i32 @ld_align16_int32_t_uint32_t(ptr nocapture readonly %ptr) { 1173; CHECK-LABEL: ld_align16_int32_t_uint32_t: 1174; CHECK: # %bb.0: # %entry 1175; CHECK-NEXT: lwa r3, 8(r3) 1176; CHECK-NEXT: blr 1177entry: 1178 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1179 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1180 ret i32 %0 1181} 1182 1183; Function Attrs: nofree norecurse nounwind uwtable willreturn 1184define dso_local signext i32 @ld_align32_int32_t_uint32_t(ptr nocapture readonly %ptr) { 1185; CHECK-P10-LABEL: ld_align32_int32_t_uint32_t: 1186; CHECK-P10: # %bb.0: # %entry 1187; CHECK-P10-NEXT: plwz r3, 99999000(r3), 0 1188; CHECK-P10-NEXT: extsw r3, r3 1189; CHECK-P10-NEXT: blr 1190; 1191; CHECK-PREP10-LABEL: ld_align32_int32_t_uint32_t: 1192; CHECK-PREP10: # %bb.0: # %entry 1193; CHECK-PREP10-NEXT: lis r4, 1525 1194; CHECK-PREP10-NEXT: ori r4, r4, 56600 1195; CHECK-PREP10-NEXT: lwax r3, r3, r4 1196; CHECK-PREP10-NEXT: blr 1197entry: 1198 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 1199 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1200 ret i32 %0 1201} 1202 1203; Function Attrs: nofree norecurse nounwind uwtable willreturn 1204define dso_local signext i32 @ld_align64_int32_t_uint32_t(ptr nocapture readonly %ptr) { 1205; CHECK-P10-LABEL: ld_align64_int32_t_uint32_t: 1206; CHECK-P10: # %bb.0: # %entry 1207; CHECK-P10-NEXT: pli r4, 244140625 1208; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1209; CHECK-P10-NEXT: lwax r3, r3, r4 1210; CHECK-P10-NEXT: blr 1211; 1212; CHECK-PREP10-LABEL: ld_align64_int32_t_uint32_t: 1213; CHECK-PREP10: # %bb.0: # %entry 1214; CHECK-PREP10-NEXT: lis r4, 3725 1215; CHECK-PREP10-NEXT: ori r4, r4, 19025 1216; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1217; CHECK-PREP10-NEXT: lwax r3, r3, r4 1218; CHECK-PREP10-NEXT: blr 1219entry: 1220 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 1221 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1222 ret i32 %0 1223} 1224 1225; Function Attrs: nofree norecurse nounwind uwtable willreturn 1226define dso_local signext i32 @ld_reg_int32_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) { 1227; CHECK-LABEL: ld_reg_int32_t_uint32_t: 1228; CHECK: # %bb.0: # %entry 1229; CHECK-NEXT: lwax r3, r3, r4 1230; CHECK-NEXT: blr 1231entry: 1232 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 1233 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1234 ret i32 %0 1235} 1236 1237; Function Attrs: nofree norecurse nounwind uwtable willreturn 1238define dso_local signext i32 @ld_or_int32_t_uint32_t(i64 %ptr, i8 zeroext %off) { 1239; CHECK-LABEL: ld_or_int32_t_uint32_t: 1240; CHECK: # %bb.0: # %entry 1241; CHECK-NEXT: or r3, r4, r3 1242; CHECK-NEXT: lwa r3, 0(r3) 1243; CHECK-NEXT: blr 1244entry: 1245 %conv = zext i8 %off to i64 1246 %or = or i64 %conv, %ptr 1247 %0 = inttoptr i64 %or to ptr 1248 %1 = load atomic i32, ptr %0 monotonic, align 4 1249 ret i32 %1 1250} 1251 1252; Function Attrs: nofree norecurse nounwind uwtable willreturn 1253define dso_local signext i32 @ld_not_disjoint16_int32_t_uint32_t(i64 %ptr) { 1254; CHECK-LABEL: ld_not_disjoint16_int32_t_uint32_t: 1255; CHECK: # %bb.0: # %entry 1256; CHECK-NEXT: ori r3, r3, 6 1257; CHECK-NEXT: lwa r3, 0(r3) 1258; CHECK-NEXT: blr 1259entry: 1260 %or = or i64 %ptr, 6 1261 %0 = inttoptr i64 %or to ptr 1262 %1 = load atomic i32, ptr %0 monotonic, align 4 1263 ret i32 %1 1264} 1265 1266; Function Attrs: nofree norecurse nounwind uwtable willreturn 1267define dso_local signext i32 @ld_disjoint_align16_int32_t_uint32_t(i64 %ptr) { 1268; CHECK-LABEL: ld_disjoint_align16_int32_t_uint32_t: 1269; CHECK: # %bb.0: # %entry 1270; CHECK-NEXT: rldicr r3, r3, 0, 51 1271; CHECK-NEXT: lwa r3, 24(r3) 1272; CHECK-NEXT: blr 1273entry: 1274 %and = and i64 %ptr, -4096 1275 %or = or i64 %and, 24 1276 %0 = inttoptr i64 %or to ptr 1277 %1 = load atomic i32, ptr %0 monotonic, align 8 1278 ret i32 %1 1279} 1280 1281; Function Attrs: nofree norecurse nounwind uwtable willreturn 1282define dso_local signext i32 @ld_not_disjoint32_int32_t_uint32_t(i64 %ptr) { 1283; CHECK-LABEL: ld_not_disjoint32_int32_t_uint32_t: 1284; CHECK: # %bb.0: # %entry 1285; CHECK-NEXT: ori r3, r3, 34463 1286; CHECK-NEXT: oris r3, r3, 1 1287; CHECK-NEXT: lwa r3, 0(r3) 1288; CHECK-NEXT: blr 1289entry: 1290 %or = or i64 %ptr, 99999 1291 %0 = inttoptr i64 %or to ptr 1292 %1 = load atomic i32, ptr %0 monotonic, align 4 1293 ret i32 %1 1294} 1295 1296; Function Attrs: nofree norecurse nounwind uwtable willreturn 1297define dso_local signext i32 @ld_disjoint_align32_int32_t_uint32_t(i64 %ptr) { 1298; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_uint32_t: 1299; CHECK-P10: # %bb.0: # %entry 1300; CHECK-P10-NEXT: lis r4, -15264 1301; CHECK-P10-NEXT: and r3, r3, r4 1302; CHECK-P10-NEXT: plwz r3, 999990000(r3), 0 1303; CHECK-P10-NEXT: extsw r3, r3 1304; CHECK-P10-NEXT: blr 1305; 1306; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_uint32_t: 1307; CHECK-PREP10: # %bb.0: # %entry 1308; CHECK-PREP10-NEXT: lis r4, -15264 1309; CHECK-PREP10-NEXT: and r3, r3, r4 1310; CHECK-PREP10-NEXT: lis r4, 15258 1311; CHECK-PREP10-NEXT: ori r4, r4, 41712 1312; CHECK-PREP10-NEXT: lwax r3, r3, r4 1313; CHECK-PREP10-NEXT: blr 1314entry: 1315 %and = and i64 %ptr, -1000341504 1316 %or = or i64 %and, 999990000 1317 %0 = inttoptr i64 %or to ptr 1318 %1 = load atomic i32, ptr %0 monotonic, align 16 1319 ret i32 %1 1320} 1321 1322; Function Attrs: nofree norecurse nounwind uwtable willreturn 1323define dso_local signext i32 @ld_not_disjoint64_int32_t_uint32_t(i64 %ptr) { 1324; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_uint32_t: 1325; CHECK-P10: # %bb.0: # %entry 1326; CHECK-P10-NEXT: pli r4, 232 1327; CHECK-P10-NEXT: pli r5, 3567587329 1328; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1329; CHECK-P10-NEXT: or r3, r3, r5 1330; CHECK-P10-NEXT: lwa r3, 0(r3) 1331; CHECK-P10-NEXT: blr 1332; 1333; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_uint32_t: 1334; CHECK-PREP10: # %bb.0: # %entry 1335; CHECK-PREP10-NEXT: li r4, 29 1336; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1337; CHECK-PREP10-NEXT: oris r4, r4, 54437 1338; CHECK-PREP10-NEXT: ori r4, r4, 4097 1339; CHECK-PREP10-NEXT: or r3, r3, r4 1340; CHECK-PREP10-NEXT: lwa r3, 0(r3) 1341; CHECK-PREP10-NEXT: blr 1342entry: 1343 %or = or i64 %ptr, 1000000000001 1344 %0 = inttoptr i64 %or to ptr 1345 %1 = load atomic i32, ptr %0 monotonic, align 4 1346 ret i32 %1 1347} 1348 1349; Function Attrs: nofree norecurse nounwind uwtable willreturn 1350define dso_local signext i32 @ld_disjoint_align64_int32_t_uint32_t(i64 %ptr) { 1351; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_uint32_t: 1352; CHECK-P10: # %bb.0: # %entry 1353; CHECK-P10-NEXT: pli r4, 244140625 1354; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1355; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1356; CHECK-P10-NEXT: lwax r3, r3, r4 1357; CHECK-P10-NEXT: blr 1358; 1359; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_uint32_t: 1360; CHECK-PREP10: # %bb.0: # %entry 1361; CHECK-PREP10-NEXT: lis r4, 3725 1362; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1363; CHECK-PREP10-NEXT: ori r4, r4, 19025 1364; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1365; CHECK-PREP10-NEXT: lwax r3, r3, r4 1366; CHECK-PREP10-NEXT: blr 1367entry: 1368 %and = and i64 %ptr, -1099511627776 1369 %or = or i64 %and, 1000000000000 1370 %0 = inttoptr i64 %or to ptr 1371 %1 = load atomic i32, ptr %0 monotonic, align 4096 1372 ret i32 %1 1373} 1374 1375; Function Attrs: nofree norecurse nounwind uwtable willreturn 1376define dso_local signext i32 @ld_cst_align16_int32_t_uint32_t() { 1377; CHECK-LABEL: ld_cst_align16_int32_t_uint32_t: 1378; CHECK: # %bb.0: # %entry 1379; CHECK-NEXT: lwa r3, 4080(0) 1380; CHECK-NEXT: blr 1381entry: 1382 %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1383 ret i32 %0 1384} 1385 1386; Function Attrs: nofree norecurse nounwind uwtable willreturn 1387define dso_local signext i32 @ld_cst_align32_int32_t_uint32_t() { 1388; CHECK-LABEL: ld_cst_align32_int32_t_uint32_t: 1389; CHECK: # %bb.0: # %entry 1390; CHECK-NEXT: lis r3, 153 1391; CHECK-NEXT: lwa r3, -27108(r3) 1392; CHECK-NEXT: blr 1393entry: 1394 %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 1395 ret i32 %0 1396} 1397 1398; Function Attrs: nofree norecurse nounwind uwtable willreturn 1399define dso_local signext i32 @ld_cst_align64_int32_t_uint32_t() { 1400; CHECK-P10-LABEL: ld_cst_align64_int32_t_uint32_t: 1401; CHECK-P10: # %bb.0: # %entry 1402; CHECK-P10-NEXT: pli r3, 244140625 1403; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1404; CHECK-P10-NEXT: lwa r3, 0(r3) 1405; CHECK-P10-NEXT: blr 1406; 1407; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_uint32_t: 1408; CHECK-PREP10: # %bb.0: # %entry 1409; CHECK-PREP10-NEXT: lis r3, 3725 1410; CHECK-PREP10-NEXT: ori r3, r3, 19025 1411; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1412; CHECK-PREP10-NEXT: lwa r3, 0(r3) 1413; CHECK-PREP10-NEXT: blr 1414entry: 1415 %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1416 ret i32 %0 1417} 1418 1419; Function Attrs: nofree norecurse nounwind uwtable willreturn 1420define dso_local signext i32 @ld_0_int32_t_uint64_t(i64 %ptr) { 1421; CHECK-LABEL: ld_0_int32_t_uint64_t: 1422; CHECK: # %bb.0: # %entry 1423; CHECK-NEXT: ld r3, 0(r3) 1424; CHECK-NEXT: extsw r3, r3 1425; CHECK-NEXT: blr 1426entry: 1427 %0 = inttoptr i64 %ptr to ptr 1428 %1 = load atomic i64, ptr %0 monotonic, align 8 1429 %conv = trunc i64 %1 to i32 1430 ret i32 %conv 1431} 1432 1433; Function Attrs: nofree norecurse nounwind uwtable willreturn 1434define dso_local signext i32 @ld_align16_int32_t_uint64_t(ptr nocapture readonly %ptr) { 1435; CHECK-LABEL: ld_align16_int32_t_uint64_t: 1436; CHECK: # %bb.0: # %entry 1437; CHECK-NEXT: ld r3, 8(r3) 1438; CHECK-NEXT: extsw r3, r3 1439; CHECK-NEXT: blr 1440entry: 1441 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1442 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1443 %conv = trunc i64 %0 to i32 1444 ret i32 %conv 1445} 1446 1447; Function Attrs: nofree norecurse nounwind uwtable willreturn 1448define dso_local signext i32 @ld_align32_int32_t_uint64_t(ptr nocapture readonly %ptr) { 1449; CHECK-P10-LABEL: ld_align32_int32_t_uint64_t: 1450; CHECK-P10: # %bb.0: # %entry 1451; CHECK-P10-NEXT: pld r3, 99999000(r3), 0 1452; CHECK-P10-NEXT: extsw r3, r3 1453; CHECK-P10-NEXT: blr 1454; 1455; CHECK-PREP10-LABEL: ld_align32_int32_t_uint64_t: 1456; CHECK-PREP10: # %bb.0: # %entry 1457; CHECK-PREP10-NEXT: lis r4, 1525 1458; CHECK-PREP10-NEXT: ori r4, r4, 56600 1459; CHECK-PREP10-NEXT: ldx r3, r3, r4 1460; CHECK-PREP10-NEXT: extsw r3, r3 1461; CHECK-PREP10-NEXT: blr 1462entry: 1463 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 1464 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1465 %conv = trunc i64 %0 to i32 1466 ret i32 %conv 1467} 1468 1469; Function Attrs: nofree norecurse nounwind uwtable willreturn 1470define dso_local signext i32 @ld_align64_int32_t_uint64_t(ptr nocapture readonly %ptr) { 1471; CHECK-P10-LABEL: ld_align64_int32_t_uint64_t: 1472; CHECK-P10: # %bb.0: # %entry 1473; CHECK-P10-NEXT: pli r4, 244140625 1474; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1475; CHECK-P10-NEXT: ldx r3, r3, r4 1476; CHECK-P10-NEXT: extsw r3, r3 1477; CHECK-P10-NEXT: blr 1478; 1479; CHECK-PREP10-LABEL: ld_align64_int32_t_uint64_t: 1480; CHECK-PREP10: # %bb.0: # %entry 1481; CHECK-PREP10-NEXT: lis r4, 3725 1482; CHECK-PREP10-NEXT: ori r4, r4, 19025 1483; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1484; CHECK-PREP10-NEXT: ldx r3, r3, r4 1485; CHECK-PREP10-NEXT: extsw r3, r3 1486; CHECK-PREP10-NEXT: blr 1487entry: 1488 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 1489 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1490 %conv = trunc i64 %0 to i32 1491 ret i32 %conv 1492} 1493 1494; Function Attrs: nofree norecurse nounwind uwtable willreturn 1495define dso_local signext i32 @ld_reg_int32_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) { 1496; CHECK-LABEL: ld_reg_int32_t_uint64_t: 1497; CHECK: # %bb.0: # %entry 1498; CHECK-NEXT: ldx r3, r3, r4 1499; CHECK-NEXT: extsw r3, r3 1500; CHECK-NEXT: blr 1501entry: 1502 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 1503 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1504 %conv = trunc i64 %0 to i32 1505 ret i32 %conv 1506} 1507 1508; Function Attrs: nofree norecurse nounwind uwtable willreturn 1509define dso_local signext i32 @ld_or_int32_t_uint64_t(i64 %ptr, i8 zeroext %off) { 1510; CHECK-LABEL: ld_or_int32_t_uint64_t: 1511; CHECK: # %bb.0: # %entry 1512; CHECK-NEXT: or r3, r4, r3 1513; CHECK-NEXT: ld r3, 0(r3) 1514; CHECK-NEXT: extsw r3, r3 1515; CHECK-NEXT: blr 1516entry: 1517 %conv = zext i8 %off to i64 1518 %or = or i64 %conv, %ptr 1519 %0 = inttoptr i64 %or to ptr 1520 %1 = load atomic i64, ptr %0 monotonic, align 8 1521 %conv1 = trunc i64 %1 to i32 1522 ret i32 %conv1 1523} 1524 1525; Function Attrs: nofree norecurse nounwind uwtable willreturn 1526define dso_local signext i32 @ld_not_disjoint16_int32_t_uint64_t(i64 %ptr) { 1527; CHECK-LABEL: ld_not_disjoint16_int32_t_uint64_t: 1528; CHECK: # %bb.0: # %entry 1529; CHECK-NEXT: ori r3, r3, 6 1530; CHECK-NEXT: ld r3, 0(r3) 1531; CHECK-NEXT: extsw r3, r3 1532; CHECK-NEXT: blr 1533entry: 1534 %or = or i64 %ptr, 6 1535 %0 = inttoptr i64 %or to ptr 1536 %1 = load atomic i64, ptr %0 monotonic, align 8 1537 %conv = trunc i64 %1 to i32 1538 ret i32 %conv 1539} 1540 1541; Function Attrs: nofree norecurse nounwind uwtable willreturn 1542define dso_local signext i32 @ld_disjoint_align16_int32_t_uint64_t(i64 %ptr) { 1543; CHECK-LABEL: ld_disjoint_align16_int32_t_uint64_t: 1544; CHECK: # %bb.0: # %entry 1545; CHECK-NEXT: rldicr r3, r3, 0, 51 1546; CHECK-NEXT: ld r3, 24(r3) 1547; CHECK-NEXT: extsw r3, r3 1548; CHECK-NEXT: blr 1549entry: 1550 %and = and i64 %ptr, -4096 1551 %or = or i64 %and, 24 1552 %0 = inttoptr i64 %or to ptr 1553 %1 = load atomic i64, ptr %0 monotonic, align 8 1554 %conv = trunc i64 %1 to i32 1555 ret i32 %conv 1556} 1557 1558; Function Attrs: nofree norecurse nounwind uwtable willreturn 1559define dso_local signext i32 @ld_not_disjoint32_int32_t_uint64_t(i64 %ptr) { 1560; CHECK-LABEL: ld_not_disjoint32_int32_t_uint64_t: 1561; CHECK: # %bb.0: # %entry 1562; CHECK-NEXT: ori r3, r3, 34463 1563; CHECK-NEXT: oris r3, r3, 1 1564; CHECK-NEXT: ld r3, 0(r3) 1565; CHECK-NEXT: extsw r3, r3 1566; CHECK-NEXT: blr 1567entry: 1568 %or = or i64 %ptr, 99999 1569 %0 = inttoptr i64 %or to ptr 1570 %1 = load atomic i64, ptr %0 monotonic, align 8 1571 %conv = trunc i64 %1 to i32 1572 ret i32 %conv 1573} 1574 1575; Function Attrs: nofree norecurse nounwind uwtable willreturn 1576define dso_local signext i32 @ld_disjoint_align32_int32_t_uint64_t(i64 %ptr) { 1577; CHECK-P10-LABEL: ld_disjoint_align32_int32_t_uint64_t: 1578; CHECK-P10: # %bb.0: # %entry 1579; CHECK-P10-NEXT: lis r4, -15264 1580; CHECK-P10-NEXT: and r3, r3, r4 1581; CHECK-P10-NEXT: pld r3, 999990000(r3), 0 1582; CHECK-P10-NEXT: extsw r3, r3 1583; CHECK-P10-NEXT: blr 1584; 1585; CHECK-PREP10-LABEL: ld_disjoint_align32_int32_t_uint64_t: 1586; CHECK-PREP10: # %bb.0: # %entry 1587; CHECK-PREP10-NEXT: lis r4, -15264 1588; CHECK-PREP10-NEXT: and r3, r3, r4 1589; CHECK-PREP10-NEXT: lis r4, 15258 1590; CHECK-PREP10-NEXT: ori r4, r4, 41712 1591; CHECK-PREP10-NEXT: ldx r3, r3, r4 1592; CHECK-PREP10-NEXT: extsw r3, r3 1593; CHECK-PREP10-NEXT: blr 1594entry: 1595 %and = and i64 %ptr, -1000341504 1596 %or = or i64 %and, 999990000 1597 %0 = inttoptr i64 %or to ptr 1598 %1 = load atomic i64, ptr %0 monotonic, align 16 1599 %conv = trunc i64 %1 to i32 1600 ret i32 %conv 1601} 1602 1603; Function Attrs: nofree norecurse nounwind uwtable willreturn 1604define dso_local signext i32 @ld_not_disjoint64_int32_t_uint64_t(i64 %ptr) { 1605; CHECK-P10-LABEL: ld_not_disjoint64_int32_t_uint64_t: 1606; CHECK-P10: # %bb.0: # %entry 1607; CHECK-P10-NEXT: pli r4, 232 1608; CHECK-P10-NEXT: pli r5, 3567587329 1609; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1610; CHECK-P10-NEXT: or r3, r3, r5 1611; CHECK-P10-NEXT: ld r3, 0(r3) 1612; CHECK-P10-NEXT: extsw r3, r3 1613; CHECK-P10-NEXT: blr 1614; 1615; CHECK-PREP10-LABEL: ld_not_disjoint64_int32_t_uint64_t: 1616; CHECK-PREP10: # %bb.0: # %entry 1617; CHECK-PREP10-NEXT: li r4, 29 1618; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1619; CHECK-PREP10-NEXT: oris r4, r4, 54437 1620; CHECK-PREP10-NEXT: ori r4, r4, 4097 1621; CHECK-PREP10-NEXT: or r3, r3, r4 1622; CHECK-PREP10-NEXT: ld r3, 0(r3) 1623; CHECK-PREP10-NEXT: extsw r3, r3 1624; CHECK-PREP10-NEXT: blr 1625entry: 1626 %or = or i64 %ptr, 1000000000001 1627 %0 = inttoptr i64 %or to ptr 1628 %1 = load atomic i64, ptr %0 monotonic, align 8 1629 %conv = trunc i64 %1 to i32 1630 ret i32 %conv 1631} 1632 1633; Function Attrs: nofree norecurse nounwind uwtable willreturn 1634define dso_local signext i32 @ld_disjoint_align64_int32_t_uint64_t(i64 %ptr) { 1635; CHECK-P10-LABEL: ld_disjoint_align64_int32_t_uint64_t: 1636; CHECK-P10: # %bb.0: # %entry 1637; CHECK-P10-NEXT: pli r4, 244140625 1638; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1639; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1640; CHECK-P10-NEXT: ldx r3, r3, r4 1641; CHECK-P10-NEXT: extsw r3, r3 1642; CHECK-P10-NEXT: blr 1643; 1644; CHECK-PREP10-LABEL: ld_disjoint_align64_int32_t_uint64_t: 1645; CHECK-PREP10: # %bb.0: # %entry 1646; CHECK-PREP10-NEXT: lis r4, 3725 1647; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1648; CHECK-PREP10-NEXT: ori r4, r4, 19025 1649; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1650; CHECK-PREP10-NEXT: ldx r3, r3, r4 1651; CHECK-PREP10-NEXT: extsw r3, r3 1652; CHECK-PREP10-NEXT: blr 1653entry: 1654 %and = and i64 %ptr, -1099511627776 1655 %or = or i64 %and, 1000000000000 1656 %0 = inttoptr i64 %or to ptr 1657 %1 = load atomic i64, ptr %0 monotonic, align 4096 1658 %conv = trunc i64 %1 to i32 1659 ret i32 %conv 1660} 1661 1662; Function Attrs: nofree norecurse nounwind uwtable willreturn 1663define dso_local signext i32 @ld_cst_align16_int32_t_uint64_t() { 1664; CHECK-LABEL: ld_cst_align16_int32_t_uint64_t: 1665; CHECK: # %bb.0: # %entry 1666; CHECK-NEXT: ld r3, 4080(0) 1667; CHECK-NEXT: extsw r3, r3 1668; CHECK-NEXT: blr 1669entry: 1670 %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1671 %conv = trunc i64 %0 to i32 1672 ret i32 %conv 1673} 1674 1675; Function Attrs: nofree norecurse nounwind uwtable willreturn 1676define dso_local signext i32 @ld_cst_align32_int32_t_uint64_t() { 1677; CHECK-LABEL: ld_cst_align32_int32_t_uint64_t: 1678; CHECK: # %bb.0: # %entry 1679; CHECK-NEXT: lis r3, 153 1680; CHECK-NEXT: ld r3, -27108(r3) 1681; CHECK-NEXT: extsw r3, r3 1682; CHECK-NEXT: blr 1683entry: 1684 %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 1685 %conv = trunc i64 %0 to i32 1686 ret i32 %conv 1687} 1688 1689; Function Attrs: nofree norecurse nounwind uwtable willreturn 1690define dso_local signext i32 @ld_cst_align64_int32_t_uint64_t() { 1691; CHECK-P10-LABEL: ld_cst_align64_int32_t_uint64_t: 1692; CHECK-P10: # %bb.0: # %entry 1693; CHECK-P10-NEXT: pli r3, 244140625 1694; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1695; CHECK-P10-NEXT: ld r3, 0(r3) 1696; CHECK-P10-NEXT: extsw r3, r3 1697; CHECK-P10-NEXT: blr 1698; 1699; CHECK-PREP10-LABEL: ld_cst_align64_int32_t_uint64_t: 1700; CHECK-PREP10: # %bb.0: # %entry 1701; CHECK-PREP10-NEXT: lis r3, 3725 1702; CHECK-PREP10-NEXT: ori r3, r3, 19025 1703; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1704; CHECK-PREP10-NEXT: ld r3, 0(r3) 1705; CHECK-PREP10-NEXT: extsw r3, r3 1706; CHECK-PREP10-NEXT: blr 1707entry: 1708 %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1709 %conv = trunc i64 %0 to i32 1710 ret i32 %conv 1711} 1712 1713; Function Attrs: nofree norecurse nounwind uwtable willreturn 1714define dso_local zeroext i32 @ld_0_uint32_t_uint8_t(i64 %ptr) { 1715; CHECK-LABEL: ld_0_uint32_t_uint8_t: 1716; CHECK: # %bb.0: # %entry 1717; CHECK-NEXT: lbz r3, 0(r3) 1718; CHECK-NEXT: blr 1719entry: 1720 %0 = inttoptr i64 %ptr to ptr 1721 %1 = load atomic i8, ptr %0 monotonic, align 1 1722 %conv = zext i8 %1 to i32 1723 ret i32 %conv 1724} 1725 1726; Function Attrs: nofree norecurse nounwind uwtable willreturn 1727define dso_local zeroext i32 @ld_align16_uint32_t_uint8_t(ptr nocapture readonly %ptr) { 1728; CHECK-LABEL: ld_align16_uint32_t_uint8_t: 1729; CHECK: # %bb.0: # %entry 1730; CHECK-NEXT: lbz r3, 8(r3) 1731; CHECK-NEXT: blr 1732entry: 1733 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1734 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1735 %conv = zext i8 %0 to i32 1736 ret i32 %conv 1737} 1738 1739; Function Attrs: nofree norecurse nounwind uwtable willreturn 1740define dso_local zeroext i32 @ld_align32_uint32_t_uint8_t(ptr nocapture readonly %ptr) { 1741; CHECK-P10-LABEL: ld_align32_uint32_t_uint8_t: 1742; CHECK-P10: # %bb.0: # %entry 1743; CHECK-P10-NEXT: plbz r3, 99999000(r3), 0 1744; CHECK-P10-NEXT: clrldi r3, r3, 32 1745; CHECK-P10-NEXT: blr 1746; 1747; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint8_t: 1748; CHECK-PREP10: # %bb.0: # %entry 1749; CHECK-PREP10-NEXT: lis r4, 1525 1750; CHECK-PREP10-NEXT: ori r4, r4, 56600 1751; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1752; CHECK-PREP10-NEXT: blr 1753entry: 1754 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 1755 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1756 %conv = zext i8 %0 to i32 1757 ret i32 %conv 1758} 1759 1760; Function Attrs: nofree norecurse nounwind uwtable willreturn 1761define dso_local zeroext i32 @ld_align64_uint32_t_uint8_t(ptr nocapture readonly %ptr) { 1762; CHECK-P10-LABEL: ld_align64_uint32_t_uint8_t: 1763; CHECK-P10: # %bb.0: # %entry 1764; CHECK-P10-NEXT: pli r4, 244140625 1765; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1766; CHECK-P10-NEXT: lbzx r3, r3, r4 1767; CHECK-P10-NEXT: blr 1768; 1769; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint8_t: 1770; CHECK-PREP10: # %bb.0: # %entry 1771; CHECK-PREP10-NEXT: lis r4, 3725 1772; CHECK-PREP10-NEXT: ori r4, r4, 19025 1773; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1774; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1775; CHECK-PREP10-NEXT: blr 1776entry: 1777 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 1778 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1779 %conv = zext i8 %0 to i32 1780 ret i32 %conv 1781} 1782 1783; Function Attrs: nofree norecurse nounwind uwtable willreturn 1784define dso_local zeroext i32 @ld_reg_uint32_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) { 1785; CHECK-LABEL: ld_reg_uint32_t_uint8_t: 1786; CHECK: # %bb.0: # %entry 1787; CHECK-NEXT: lbzx r3, r3, r4 1788; CHECK-NEXT: blr 1789entry: 1790 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 1791 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1792 %conv = zext i8 %0 to i32 1793 ret i32 %conv 1794} 1795 1796; Function Attrs: nofree norecurse nounwind uwtable willreturn 1797define dso_local zeroext i32 @ld_or_uint32_t_uint8_t(i64 %ptr, i8 zeroext %off) { 1798; CHECK-LABEL: ld_or_uint32_t_uint8_t: 1799; CHECK: # %bb.0: # %entry 1800; CHECK-NEXT: or r3, r4, r3 1801; CHECK-NEXT: lbz r3, 0(r3) 1802; CHECK-NEXT: blr 1803entry: 1804 %conv = zext i8 %off to i64 1805 %or = or i64 %conv, %ptr 1806 %0 = inttoptr i64 %or to ptr 1807 %1 = load atomic i8, ptr %0 monotonic, align 1 1808 %conv1 = zext i8 %1 to i32 1809 ret i32 %conv1 1810} 1811 1812; Function Attrs: nofree norecurse nounwind uwtable willreturn 1813define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint8_t(i64 %ptr) { 1814; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint8_t: 1815; CHECK: # %bb.0: # %entry 1816; CHECK-NEXT: ori r3, r3, 6 1817; CHECK-NEXT: lbz r3, 0(r3) 1818; CHECK-NEXT: blr 1819entry: 1820 %or = or i64 %ptr, 6 1821 %0 = inttoptr i64 %or to ptr 1822 %1 = load atomic i8, ptr %0 monotonic, align 1 1823 %conv = zext i8 %1 to i32 1824 ret i32 %conv 1825} 1826 1827; Function Attrs: nofree norecurse nounwind uwtable willreturn 1828define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint8_t(i64 %ptr) { 1829; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint8_t: 1830; CHECK: # %bb.0: # %entry 1831; CHECK-NEXT: rldicr r3, r3, 0, 51 1832; CHECK-NEXT: lbz r3, 24(r3) 1833; CHECK-NEXT: blr 1834entry: 1835 %and = and i64 %ptr, -4096 1836 %or = or i64 %and, 24 1837 %0 = inttoptr i64 %or to ptr 1838 %1 = load atomic i8, ptr %0 monotonic, align 8 1839 %conv = zext i8 %1 to i32 1840 ret i32 %conv 1841} 1842 1843; Function Attrs: nofree norecurse nounwind uwtable willreturn 1844define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint8_t(i64 %ptr) { 1845; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint8_t: 1846; CHECK: # %bb.0: # %entry 1847; CHECK-NEXT: ori r3, r3, 34463 1848; CHECK-NEXT: oris r3, r3, 1 1849; CHECK-NEXT: lbz r3, 0(r3) 1850; CHECK-NEXT: blr 1851entry: 1852 %or = or i64 %ptr, 99999 1853 %0 = inttoptr i64 %or to ptr 1854 %1 = load atomic i8, ptr %0 monotonic, align 1 1855 %conv = zext i8 %1 to i32 1856 ret i32 %conv 1857} 1858 1859; Function Attrs: nofree norecurse nounwind uwtable willreturn 1860define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint8_t(i64 %ptr) { 1861; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint8_t: 1862; CHECK-P10: # %bb.0: # %entry 1863; CHECK-P10-NEXT: lis r4, -15264 1864; CHECK-P10-NEXT: and r3, r3, r4 1865; CHECK-P10-NEXT: plbz r3, 999990000(r3), 0 1866; CHECK-P10-NEXT: clrldi r3, r3, 32 1867; CHECK-P10-NEXT: blr 1868; 1869; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint8_t: 1870; CHECK-PREP10: # %bb.0: # %entry 1871; CHECK-PREP10-NEXT: lis r4, -15264 1872; CHECK-PREP10-NEXT: and r3, r3, r4 1873; CHECK-PREP10-NEXT: lis r4, 15258 1874; CHECK-PREP10-NEXT: ori r4, r4, 41712 1875; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1876; CHECK-PREP10-NEXT: blr 1877entry: 1878 %and = and i64 %ptr, -1000341504 1879 %or = or i64 %and, 999990000 1880 %0 = inttoptr i64 %or to ptr 1881 %1 = load atomic i8, ptr %0 monotonic, align 16 1882 %conv = zext i8 %1 to i32 1883 ret i32 %conv 1884} 1885 1886; Function Attrs: nofree norecurse nounwind uwtable willreturn 1887define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint8_t(i64 %ptr) { 1888; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint8_t: 1889; CHECK-P10: # %bb.0: # %entry 1890; CHECK-P10-NEXT: pli r4, 232 1891; CHECK-P10-NEXT: pli r5, 3567587329 1892; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1893; CHECK-P10-NEXT: or r3, r3, r5 1894; CHECK-P10-NEXT: lbz r3, 0(r3) 1895; CHECK-P10-NEXT: blr 1896; 1897; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint8_t: 1898; CHECK-PREP10: # %bb.0: # %entry 1899; CHECK-PREP10-NEXT: li r4, 29 1900; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1901; CHECK-PREP10-NEXT: oris r4, r4, 54437 1902; CHECK-PREP10-NEXT: ori r4, r4, 4097 1903; CHECK-PREP10-NEXT: or r3, r3, r4 1904; CHECK-PREP10-NEXT: lbz r3, 0(r3) 1905; CHECK-PREP10-NEXT: blr 1906entry: 1907 %or = or i64 %ptr, 1000000000001 1908 %0 = inttoptr i64 %or to ptr 1909 %1 = load atomic i8, ptr %0 monotonic, align 1 1910 %conv = zext i8 %1 to i32 1911 ret i32 %conv 1912} 1913 1914; Function Attrs: nofree norecurse nounwind uwtable willreturn 1915define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint8_t(i64 %ptr) { 1916; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint8_t: 1917; CHECK-P10: # %bb.0: # %entry 1918; CHECK-P10-NEXT: pli r4, 244140625 1919; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1920; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1921; CHECK-P10-NEXT: lbzx r3, r3, r4 1922; CHECK-P10-NEXT: blr 1923; 1924; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint8_t: 1925; CHECK-PREP10: # %bb.0: # %entry 1926; CHECK-PREP10-NEXT: lis r4, 3725 1927; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1928; CHECK-PREP10-NEXT: ori r4, r4, 19025 1929; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1930; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1931; CHECK-PREP10-NEXT: blr 1932entry: 1933 %and = and i64 %ptr, -1099511627776 1934 %or = or i64 %and, 1000000000000 1935 %0 = inttoptr i64 %or to ptr 1936 %1 = load atomic i8, ptr %0 monotonic, align 4096 1937 %conv = zext i8 %1 to i32 1938 ret i32 %conv 1939} 1940 1941; Function Attrs: nofree norecurse nounwind uwtable willreturn 1942define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint8_t() { 1943; CHECK-LABEL: ld_cst_align16_uint32_t_uint8_t: 1944; CHECK: # %bb.0: # %entry 1945; CHECK-NEXT: lbz r3, 4080(0) 1946; CHECK-NEXT: blr 1947entry: 1948 %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1949 %conv = zext i8 %0 to i32 1950 ret i32 %conv 1951} 1952 1953; Function Attrs: nofree norecurse nounwind uwtable willreturn 1954define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint8_t() { 1955; CHECK-LABEL: ld_cst_align32_uint32_t_uint8_t: 1956; CHECK: # %bb.0: # %entry 1957; CHECK-NEXT: lis r3, 153 1958; CHECK-NEXT: lbz r3, -27108(r3) 1959; CHECK-NEXT: blr 1960entry: 1961 %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 1962 %conv = zext i8 %0 to i32 1963 ret i32 %conv 1964} 1965 1966; Function Attrs: nofree norecurse nounwind uwtable willreturn 1967define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint8_t() { 1968; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint8_t: 1969; CHECK-P10: # %bb.0: # %entry 1970; CHECK-P10-NEXT: pli r3, 244140625 1971; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1972; CHECK-P10-NEXT: lbz r3, 0(r3) 1973; CHECK-P10-NEXT: blr 1974; 1975; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint8_t: 1976; CHECK-PREP10: # %bb.0: # %entry 1977; CHECK-PREP10-NEXT: lis r3, 3725 1978; CHECK-PREP10-NEXT: ori r3, r3, 19025 1979; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1980; CHECK-PREP10-NEXT: lbz r3, 0(r3) 1981; CHECK-PREP10-NEXT: blr 1982entry: 1983 %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1984 %conv = zext i8 %0 to i32 1985 ret i32 %conv 1986} 1987 1988; Function Attrs: nofree norecurse nounwind uwtable willreturn 1989define dso_local zeroext i32 @ld_0_uint32_t_int8_t(i64 %ptr) { 1990; CHECK-LABEL: ld_0_uint32_t_int8_t: 1991; CHECK: # %bb.0: # %entry 1992; CHECK-NEXT: lbz r3, 0(r3) 1993; CHECK-NEXT: extsb r3, r3 1994; CHECK-NEXT: clrldi r3, r3, 32 1995; CHECK-NEXT: blr 1996entry: 1997 %0 = inttoptr i64 %ptr to ptr 1998 %1 = load atomic i8, ptr %0 monotonic, align 1 1999 %conv = sext i8 %1 to i32 2000 ret i32 %conv 2001} 2002 2003; Function Attrs: nofree norecurse nounwind uwtable willreturn 2004define dso_local zeroext i32 @ld_align16_uint32_t_int8_t(ptr nocapture readonly %ptr) { 2005; CHECK-LABEL: ld_align16_uint32_t_int8_t: 2006; CHECK: # %bb.0: # %entry 2007; CHECK-NEXT: lbz r3, 8(r3) 2008; CHECK-NEXT: extsb r3, r3 2009; CHECK-NEXT: clrldi r3, r3, 32 2010; CHECK-NEXT: blr 2011entry: 2012 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2013 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2014 %conv = sext i8 %0 to i32 2015 ret i32 %conv 2016} 2017 2018; Function Attrs: nofree norecurse nounwind uwtable willreturn 2019define dso_local zeroext i32 @ld_align32_uint32_t_int8_t(ptr nocapture readonly %ptr) { 2020; CHECK-P10-LABEL: ld_align32_uint32_t_int8_t: 2021; CHECK-P10: # %bb.0: # %entry 2022; CHECK-P10-NEXT: plbz r3, 99999000(r3), 0 2023; CHECK-P10-NEXT: extsb r3, r3 2024; CHECK-P10-NEXT: clrldi r3, r3, 32 2025; CHECK-P10-NEXT: blr 2026; 2027; CHECK-PREP10-LABEL: ld_align32_uint32_t_int8_t: 2028; CHECK-PREP10: # %bb.0: # %entry 2029; CHECK-PREP10-NEXT: lis r4, 1525 2030; CHECK-PREP10-NEXT: ori r4, r4, 56600 2031; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2032; CHECK-PREP10-NEXT: extsb r3, r3 2033; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2034; CHECK-PREP10-NEXT: blr 2035entry: 2036 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2037 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2038 %conv = sext i8 %0 to i32 2039 ret i32 %conv 2040} 2041 2042; Function Attrs: nofree norecurse nounwind uwtable willreturn 2043define dso_local zeroext i32 @ld_align64_uint32_t_int8_t(ptr nocapture readonly %ptr) { 2044; CHECK-P10-LABEL: ld_align64_uint32_t_int8_t: 2045; CHECK-P10: # %bb.0: # %entry 2046; CHECK-P10-NEXT: pli r4, 244140625 2047; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2048; CHECK-P10-NEXT: lbzx r3, r3, r4 2049; CHECK-P10-NEXT: extsb r3, r3 2050; CHECK-P10-NEXT: clrldi r3, r3, 32 2051; CHECK-P10-NEXT: blr 2052; 2053; CHECK-PREP10-LABEL: ld_align64_uint32_t_int8_t: 2054; CHECK-PREP10: # %bb.0: # %entry 2055; CHECK-PREP10-NEXT: lis r4, 3725 2056; CHECK-PREP10-NEXT: ori r4, r4, 19025 2057; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2058; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2059; CHECK-PREP10-NEXT: extsb r3, r3 2060; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2061; CHECK-PREP10-NEXT: blr 2062entry: 2063 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2064 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2065 %conv = sext i8 %0 to i32 2066 ret i32 %conv 2067} 2068 2069; Function Attrs: nofree norecurse nounwind uwtable willreturn 2070define dso_local zeroext i32 @ld_reg_uint32_t_int8_t(ptr nocapture readonly %ptr, i64 %off) { 2071; CHECK-LABEL: ld_reg_uint32_t_int8_t: 2072; CHECK: # %bb.0: # %entry 2073; CHECK-NEXT: lbzx r3, r3, r4 2074; CHECK-NEXT: extsb r3, r3 2075; CHECK-NEXT: clrldi r3, r3, 32 2076; CHECK-NEXT: blr 2077entry: 2078 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2079 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2080 %conv = sext i8 %0 to i32 2081 ret i32 %conv 2082} 2083 2084; Function Attrs: nofree norecurse nounwind uwtable willreturn 2085define dso_local zeroext i32 @ld_or_uint32_t_int8_t(i64 %ptr, i8 zeroext %off) { 2086; CHECK-LABEL: ld_or_uint32_t_int8_t: 2087; CHECK: # %bb.0: # %entry 2088; CHECK-NEXT: or r3, r4, r3 2089; CHECK-NEXT: lbz r3, 0(r3) 2090; CHECK-NEXT: extsb r3, r3 2091; CHECK-NEXT: clrldi r3, r3, 32 2092; CHECK-NEXT: blr 2093entry: 2094 %conv = zext i8 %off to i64 2095 %or = or i64 %conv, %ptr 2096 %0 = inttoptr i64 %or to ptr 2097 %1 = load atomic i8, ptr %0 monotonic, align 1 2098 %conv1 = sext i8 %1 to i32 2099 ret i32 %conv1 2100} 2101 2102; Function Attrs: nofree norecurse nounwind uwtable willreturn 2103define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_int8_t(i64 %ptr) { 2104; CHECK-LABEL: ld_not_disjoint16_uint32_t_int8_t: 2105; CHECK: # %bb.0: # %entry 2106; CHECK-NEXT: ori r3, r3, 6 2107; CHECK-NEXT: lbz r3, 0(r3) 2108; CHECK-NEXT: extsb r3, r3 2109; CHECK-NEXT: clrldi r3, r3, 32 2110; CHECK-NEXT: blr 2111entry: 2112 %or = or i64 %ptr, 6 2113 %0 = inttoptr i64 %or to ptr 2114 %1 = load atomic i8, ptr %0 monotonic, align 1 2115 %conv = sext i8 %1 to i32 2116 ret i32 %conv 2117} 2118 2119; Function Attrs: nofree norecurse nounwind uwtable willreturn 2120define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_int8_t(i64 %ptr) { 2121; CHECK-LABEL: ld_disjoint_align16_uint32_t_int8_t: 2122; CHECK: # %bb.0: # %entry 2123; CHECK-NEXT: rldicr r3, r3, 0, 51 2124; CHECK-NEXT: lbz r3, 24(r3) 2125; CHECK-NEXT: extsb r3, r3 2126; CHECK-NEXT: clrldi r3, r3, 32 2127; CHECK-NEXT: blr 2128entry: 2129 %and = and i64 %ptr, -4096 2130 %or = or i64 %and, 24 2131 %0 = inttoptr i64 %or to ptr 2132 %1 = load atomic i8, ptr %0 monotonic, align 8 2133 %conv = sext i8 %1 to i32 2134 ret i32 %conv 2135} 2136 2137; Function Attrs: nofree norecurse nounwind uwtable willreturn 2138define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_int8_t(i64 %ptr) { 2139; CHECK-LABEL: ld_not_disjoint32_uint32_t_int8_t: 2140; CHECK: # %bb.0: # %entry 2141; CHECK-NEXT: ori r3, r3, 34463 2142; CHECK-NEXT: oris r3, r3, 1 2143; CHECK-NEXT: lbz r3, 0(r3) 2144; CHECK-NEXT: extsb r3, r3 2145; CHECK-NEXT: clrldi r3, r3, 32 2146; CHECK-NEXT: blr 2147entry: 2148 %or = or i64 %ptr, 99999 2149 %0 = inttoptr i64 %or to ptr 2150 %1 = load atomic i8, ptr %0 monotonic, align 1 2151 %conv = sext i8 %1 to i32 2152 ret i32 %conv 2153} 2154 2155; Function Attrs: nofree norecurse nounwind uwtable willreturn 2156define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_int8_t(i64 %ptr) { 2157; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_int8_t: 2158; CHECK-P10: # %bb.0: # %entry 2159; CHECK-P10-NEXT: lis r4, -15264 2160; CHECK-P10-NEXT: and r3, r3, r4 2161; CHECK-P10-NEXT: plbz r3, 999990000(r3), 0 2162; CHECK-P10-NEXT: extsb r3, r3 2163; CHECK-P10-NEXT: clrldi r3, r3, 32 2164; CHECK-P10-NEXT: blr 2165; 2166; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_int8_t: 2167; CHECK-PREP10: # %bb.0: # %entry 2168; CHECK-PREP10-NEXT: lis r4, -15264 2169; CHECK-PREP10-NEXT: and r3, r3, r4 2170; CHECK-PREP10-NEXT: lis r4, 15258 2171; CHECK-PREP10-NEXT: ori r4, r4, 41712 2172; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2173; CHECK-PREP10-NEXT: extsb r3, r3 2174; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2175; CHECK-PREP10-NEXT: blr 2176entry: 2177 %and = and i64 %ptr, -1000341504 2178 %or = or i64 %and, 999990000 2179 %0 = inttoptr i64 %or to ptr 2180 %1 = load atomic i8, ptr %0 monotonic, align 16 2181 %conv = sext i8 %1 to i32 2182 ret i32 %conv 2183} 2184 2185; Function Attrs: nofree norecurse nounwind uwtable willreturn 2186define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_int8_t(i64 %ptr) { 2187; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_int8_t: 2188; CHECK-P10: # %bb.0: # %entry 2189; CHECK-P10-NEXT: pli r4, 232 2190; CHECK-P10-NEXT: pli r5, 3567587329 2191; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 2192; CHECK-P10-NEXT: or r3, r3, r5 2193; CHECK-P10-NEXT: lbz r3, 0(r3) 2194; CHECK-P10-NEXT: extsb r3, r3 2195; CHECK-P10-NEXT: clrldi r3, r3, 32 2196; CHECK-P10-NEXT: blr 2197; 2198; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_int8_t: 2199; CHECK-PREP10: # %bb.0: # %entry 2200; CHECK-PREP10-NEXT: li r4, 29 2201; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 2202; CHECK-PREP10-NEXT: oris r4, r4, 54437 2203; CHECK-PREP10-NEXT: ori r4, r4, 4097 2204; CHECK-PREP10-NEXT: or r3, r3, r4 2205; CHECK-PREP10-NEXT: lbz r3, 0(r3) 2206; CHECK-PREP10-NEXT: extsb r3, r3 2207; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2208; CHECK-PREP10-NEXT: blr 2209entry: 2210 %or = or i64 %ptr, 1000000000001 2211 %0 = inttoptr i64 %or to ptr 2212 %1 = load atomic i8, ptr %0 monotonic, align 1 2213 %conv = sext i8 %1 to i32 2214 ret i32 %conv 2215} 2216 2217; Function Attrs: nofree norecurse nounwind uwtable willreturn 2218define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_int8_t(i64 %ptr) { 2219; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_int8_t: 2220; CHECK-P10: # %bb.0: # %entry 2221; CHECK-P10-NEXT: pli r4, 244140625 2222; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 2223; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2224; CHECK-P10-NEXT: lbzx r3, r3, r4 2225; CHECK-P10-NEXT: extsb r3, r3 2226; CHECK-P10-NEXT: clrldi r3, r3, 32 2227; CHECK-P10-NEXT: blr 2228; 2229; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_int8_t: 2230; CHECK-PREP10: # %bb.0: # %entry 2231; CHECK-PREP10-NEXT: lis r4, 3725 2232; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 2233; CHECK-PREP10-NEXT: ori r4, r4, 19025 2234; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2235; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2236; CHECK-PREP10-NEXT: extsb r3, r3 2237; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2238; CHECK-PREP10-NEXT: blr 2239entry: 2240 %and = and i64 %ptr, -1099511627776 2241 %or = or i64 %and, 1000000000000 2242 %0 = inttoptr i64 %or to ptr 2243 %1 = load atomic i8, ptr %0 monotonic, align 4096 2244 %conv = sext i8 %1 to i32 2245 ret i32 %conv 2246} 2247 2248; Function Attrs: nofree norecurse nounwind uwtable willreturn 2249define dso_local zeroext i32 @ld_cst_align16_uint32_t_int8_t() { 2250; CHECK-LABEL: ld_cst_align16_uint32_t_int8_t: 2251; CHECK: # %bb.0: # %entry 2252; CHECK-NEXT: lbz r3, 4080(0) 2253; CHECK-NEXT: extsb r3, r3 2254; CHECK-NEXT: clrldi r3, r3, 32 2255; CHECK-NEXT: blr 2256entry: 2257 %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2258 %conv = sext i8 %0 to i32 2259 ret i32 %conv 2260} 2261 2262; Function Attrs: nofree norecurse nounwind uwtable willreturn 2263define dso_local zeroext i32 @ld_cst_align32_uint32_t_int8_t() { 2264; CHECK-LABEL: ld_cst_align32_uint32_t_int8_t: 2265; CHECK: # %bb.0: # %entry 2266; CHECK-NEXT: lis r3, 153 2267; CHECK-NEXT: lbz r3, -27108(r3) 2268; CHECK-NEXT: extsb r3, r3 2269; CHECK-NEXT: clrldi r3, r3, 32 2270; CHECK-NEXT: blr 2271entry: 2272 %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 2273 %conv = sext i8 %0 to i32 2274 ret i32 %conv 2275} 2276 2277; Function Attrs: nofree norecurse nounwind uwtable willreturn 2278define dso_local zeroext i32 @ld_cst_align64_uint32_t_int8_t() { 2279; CHECK-P10-LABEL: ld_cst_align64_uint32_t_int8_t: 2280; CHECK-P10: # %bb.0: # %entry 2281; CHECK-P10-NEXT: pli r3, 244140625 2282; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2283; CHECK-P10-NEXT: lbz r3, 0(r3) 2284; CHECK-P10-NEXT: extsb r3, r3 2285; CHECK-P10-NEXT: clrldi r3, r3, 32 2286; CHECK-P10-NEXT: blr 2287; 2288; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_int8_t: 2289; CHECK-PREP10: # %bb.0: # %entry 2290; CHECK-PREP10-NEXT: lis r3, 3725 2291; CHECK-PREP10-NEXT: ori r3, r3, 19025 2292; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2293; CHECK-PREP10-NEXT: lbz r3, 0(r3) 2294; CHECK-PREP10-NEXT: extsb r3, r3 2295; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2296; CHECK-PREP10-NEXT: blr 2297entry: 2298 %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2299 %conv = sext i8 %0 to i32 2300 ret i32 %conv 2301} 2302 2303; Function Attrs: nofree norecurse nounwind uwtable willreturn 2304define dso_local zeroext i32 @ld_0_uint32_t_uint16_t(i64 %ptr) { 2305; CHECK-LABEL: ld_0_uint32_t_uint16_t: 2306; CHECK: # %bb.0: # %entry 2307; CHECK-NEXT: lhz r3, 0(r3) 2308; CHECK-NEXT: blr 2309entry: 2310 %0 = inttoptr i64 %ptr to ptr 2311 %1 = load atomic i16, ptr %0 monotonic, align 2 2312 %conv = zext i16 %1 to i32 2313 ret i32 %conv 2314} 2315 2316; Function Attrs: nofree norecurse nounwind uwtable willreturn 2317define dso_local zeroext i32 @ld_align16_uint32_t_uint16_t(ptr nocapture readonly %ptr) { 2318; CHECK-LABEL: ld_align16_uint32_t_uint16_t: 2319; CHECK: # %bb.0: # %entry 2320; CHECK-NEXT: lhz r3, 8(r3) 2321; CHECK-NEXT: blr 2322entry: 2323 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2324 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2325 %conv = zext i16 %0 to i32 2326 ret i32 %conv 2327} 2328 2329; Function Attrs: nofree norecurse nounwind uwtable willreturn 2330define dso_local zeroext i32 @ld_align32_uint32_t_uint16_t(ptr nocapture readonly %ptr) { 2331; CHECK-P10-LABEL: ld_align32_uint32_t_uint16_t: 2332; CHECK-P10: # %bb.0: # %entry 2333; CHECK-P10-NEXT: plhz r3, 99999000(r3), 0 2334; CHECK-P10-NEXT: clrldi r3, r3, 32 2335; CHECK-P10-NEXT: blr 2336; 2337; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint16_t: 2338; CHECK-PREP10: # %bb.0: # %entry 2339; CHECK-PREP10-NEXT: lis r4, 1525 2340; CHECK-PREP10-NEXT: ori r4, r4, 56600 2341; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2342; CHECK-PREP10-NEXT: blr 2343entry: 2344 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2345 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2346 %conv = zext i16 %0 to i32 2347 ret i32 %conv 2348} 2349 2350; Function Attrs: nofree norecurse nounwind uwtable willreturn 2351define dso_local zeroext i32 @ld_align64_uint32_t_uint16_t(ptr nocapture readonly %ptr) { 2352; CHECK-P10-LABEL: ld_align64_uint32_t_uint16_t: 2353; CHECK-P10: # %bb.0: # %entry 2354; CHECK-P10-NEXT: pli r4, 244140625 2355; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2356; CHECK-P10-NEXT: lhzx r3, r3, r4 2357; CHECK-P10-NEXT: blr 2358; 2359; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint16_t: 2360; CHECK-PREP10: # %bb.0: # %entry 2361; CHECK-PREP10-NEXT: lis r4, 3725 2362; CHECK-PREP10-NEXT: ori r4, r4, 19025 2363; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2364; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2365; CHECK-PREP10-NEXT: blr 2366entry: 2367 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2368 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2369 %conv = zext i16 %0 to i32 2370 ret i32 %conv 2371} 2372 2373; Function Attrs: nofree norecurse nounwind uwtable willreturn 2374define dso_local zeroext i32 @ld_reg_uint32_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) { 2375; CHECK-LABEL: ld_reg_uint32_t_uint16_t: 2376; CHECK: # %bb.0: # %entry 2377; CHECK-NEXT: lhzx r3, r3, r4 2378; CHECK-NEXT: blr 2379entry: 2380 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2381 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2382 %conv = zext i16 %0 to i32 2383 ret i32 %conv 2384} 2385 2386; Function Attrs: nofree norecurse nounwind uwtable willreturn 2387define dso_local zeroext i32 @ld_or_uint32_t_uint16_t(i64 %ptr, i8 zeroext %off) { 2388; CHECK-LABEL: ld_or_uint32_t_uint16_t: 2389; CHECK: # %bb.0: # %entry 2390; CHECK-NEXT: or r3, r4, r3 2391; CHECK-NEXT: lhz r3, 0(r3) 2392; CHECK-NEXT: blr 2393entry: 2394 %conv = zext i8 %off to i64 2395 %or = or i64 %conv, %ptr 2396 %0 = inttoptr i64 %or to ptr 2397 %1 = load atomic i16, ptr %0 monotonic, align 2 2398 %conv1 = zext i16 %1 to i32 2399 ret i32 %conv1 2400} 2401 2402; Function Attrs: nofree norecurse nounwind uwtable willreturn 2403define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint16_t(i64 %ptr) { 2404; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint16_t: 2405; CHECK: # %bb.0: # %entry 2406; CHECK-NEXT: ori r3, r3, 6 2407; CHECK-NEXT: lhz r3, 0(r3) 2408; CHECK-NEXT: blr 2409entry: 2410 %or = or i64 %ptr, 6 2411 %0 = inttoptr i64 %or to ptr 2412 %1 = load atomic i16, ptr %0 monotonic, align 2 2413 %conv = zext i16 %1 to i32 2414 ret i32 %conv 2415} 2416 2417; Function Attrs: nofree norecurse nounwind uwtable willreturn 2418define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint16_t(i64 %ptr) { 2419; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint16_t: 2420; CHECK: # %bb.0: # %entry 2421; CHECK-NEXT: rldicr r3, r3, 0, 51 2422; CHECK-NEXT: lhz r3, 24(r3) 2423; CHECK-NEXT: blr 2424entry: 2425 %and = and i64 %ptr, -4096 2426 %or = or i64 %and, 24 2427 %0 = inttoptr i64 %or to ptr 2428 %1 = load atomic i16, ptr %0 monotonic, align 8 2429 %conv = zext i16 %1 to i32 2430 ret i32 %conv 2431} 2432 2433; Function Attrs: nofree norecurse nounwind uwtable willreturn 2434define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint16_t(i64 %ptr) { 2435; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint16_t: 2436; CHECK: # %bb.0: # %entry 2437; CHECK-NEXT: ori r3, r3, 34463 2438; CHECK-NEXT: oris r3, r3, 1 2439; CHECK-NEXT: lhz r3, 0(r3) 2440; CHECK-NEXT: blr 2441entry: 2442 %or = or i64 %ptr, 99999 2443 %0 = inttoptr i64 %or to ptr 2444 %1 = load atomic i16, ptr %0 monotonic, align 2 2445 %conv = zext i16 %1 to i32 2446 ret i32 %conv 2447} 2448 2449; Function Attrs: nofree norecurse nounwind uwtable willreturn 2450define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint16_t(i64 %ptr) { 2451; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint16_t: 2452; CHECK-P10: # %bb.0: # %entry 2453; CHECK-P10-NEXT: lis r4, -15264 2454; CHECK-P10-NEXT: and r3, r3, r4 2455; CHECK-P10-NEXT: plhz r3, 999990000(r3), 0 2456; CHECK-P10-NEXT: clrldi r3, r3, 32 2457; CHECK-P10-NEXT: blr 2458; 2459; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint16_t: 2460; CHECK-PREP10: # %bb.0: # %entry 2461; CHECK-PREP10-NEXT: lis r4, -15264 2462; CHECK-PREP10-NEXT: and r3, r3, r4 2463; CHECK-PREP10-NEXT: lis r4, 15258 2464; CHECK-PREP10-NEXT: ori r4, r4, 41712 2465; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2466; CHECK-PREP10-NEXT: blr 2467entry: 2468 %and = and i64 %ptr, -1000341504 2469 %or = or i64 %and, 999990000 2470 %0 = inttoptr i64 %or to ptr 2471 %1 = load atomic i16, ptr %0 monotonic, align 16 2472 %conv = zext i16 %1 to i32 2473 ret i32 %conv 2474} 2475 2476; Function Attrs: nofree norecurse nounwind uwtable willreturn 2477define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint16_t(i64 %ptr) { 2478; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint16_t: 2479; CHECK-P10: # %bb.0: # %entry 2480; CHECK-P10-NEXT: pli r4, 232 2481; CHECK-P10-NEXT: pli r5, 3567587329 2482; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 2483; CHECK-P10-NEXT: or r3, r3, r5 2484; CHECK-P10-NEXT: lhz r3, 0(r3) 2485; CHECK-P10-NEXT: blr 2486; 2487; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint16_t: 2488; CHECK-PREP10: # %bb.0: # %entry 2489; CHECK-PREP10-NEXT: li r4, 29 2490; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 2491; CHECK-PREP10-NEXT: oris r4, r4, 54437 2492; CHECK-PREP10-NEXT: ori r4, r4, 4097 2493; CHECK-PREP10-NEXT: or r3, r3, r4 2494; CHECK-PREP10-NEXT: lhz r3, 0(r3) 2495; CHECK-PREP10-NEXT: blr 2496entry: 2497 %or = or i64 %ptr, 1000000000001 2498 %0 = inttoptr i64 %or to ptr 2499 %1 = load atomic i16, ptr %0 monotonic, align 2 2500 %conv = zext i16 %1 to i32 2501 ret i32 %conv 2502} 2503 2504; Function Attrs: nofree norecurse nounwind uwtable willreturn 2505define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint16_t(i64 %ptr) { 2506; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint16_t: 2507; CHECK-P10: # %bb.0: # %entry 2508; CHECK-P10-NEXT: pli r4, 244140625 2509; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 2510; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2511; CHECK-P10-NEXT: lhzx r3, r3, r4 2512; CHECK-P10-NEXT: blr 2513; 2514; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint16_t: 2515; CHECK-PREP10: # %bb.0: # %entry 2516; CHECK-PREP10-NEXT: lis r4, 3725 2517; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 2518; CHECK-PREP10-NEXT: ori r4, r4, 19025 2519; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2520; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2521; CHECK-PREP10-NEXT: blr 2522entry: 2523 %and = and i64 %ptr, -1099511627776 2524 %or = or i64 %and, 1000000000000 2525 %0 = inttoptr i64 %or to ptr 2526 %1 = load atomic i16, ptr %0 monotonic, align 4096 2527 %conv = zext i16 %1 to i32 2528 ret i32 %conv 2529} 2530 2531; Function Attrs: nofree norecurse nounwind uwtable willreturn 2532define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint16_t() { 2533; CHECK-LABEL: ld_cst_align16_uint32_t_uint16_t: 2534; CHECK: # %bb.0: # %entry 2535; CHECK-NEXT: lhz r3, 4080(0) 2536; CHECK-NEXT: blr 2537entry: 2538 %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2539 %conv = zext i16 %0 to i32 2540 ret i32 %conv 2541} 2542 2543; Function Attrs: nofree norecurse nounwind uwtable willreturn 2544define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint16_t() { 2545; CHECK-LABEL: ld_cst_align32_uint32_t_uint16_t: 2546; CHECK: # %bb.0: # %entry 2547; CHECK-NEXT: lis r3, 153 2548; CHECK-NEXT: lhz r3, -27108(r3) 2549; CHECK-NEXT: blr 2550entry: 2551 %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 2552 %conv = zext i16 %0 to i32 2553 ret i32 %conv 2554} 2555 2556; Function Attrs: nofree norecurse nounwind uwtable willreturn 2557define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint16_t() { 2558; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint16_t: 2559; CHECK-P10: # %bb.0: # %entry 2560; CHECK-P10-NEXT: pli r3, 244140625 2561; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2562; CHECK-P10-NEXT: lhz r3, 0(r3) 2563; CHECK-P10-NEXT: blr 2564; 2565; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint16_t: 2566; CHECK-PREP10: # %bb.0: # %entry 2567; CHECK-PREP10-NEXT: lis r3, 3725 2568; CHECK-PREP10-NEXT: ori r3, r3, 19025 2569; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2570; CHECK-PREP10-NEXT: lhz r3, 0(r3) 2571; CHECK-PREP10-NEXT: blr 2572entry: 2573 %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2574 %conv = zext i16 %0 to i32 2575 ret i32 %conv 2576} 2577 2578; Function Attrs: nofree norecurse nounwind uwtable willreturn 2579define dso_local zeroext i32 @ld_0_uint32_t_int16_t(i64 %ptr) { 2580; CHECK-LABEL: ld_0_uint32_t_int16_t: 2581; CHECK: # %bb.0: # %entry 2582; CHECK-NEXT: lha r3, 0(r3) 2583; CHECK-NEXT: clrldi r3, r3, 32 2584; CHECK-NEXT: blr 2585entry: 2586 %0 = inttoptr i64 %ptr to ptr 2587 %1 = load atomic i16, ptr %0 monotonic, align 2 2588 %conv = sext i16 %1 to i32 2589 ret i32 %conv 2590} 2591 2592; Function Attrs: nofree norecurse nounwind uwtable willreturn 2593define dso_local zeroext i32 @ld_align16_uint32_t_int16_t(ptr nocapture readonly %ptr) { 2594; CHECK-LABEL: ld_align16_uint32_t_int16_t: 2595; CHECK: # %bb.0: # %entry 2596; CHECK-NEXT: lha r3, 8(r3) 2597; CHECK-NEXT: clrldi r3, r3, 32 2598; CHECK-NEXT: blr 2599entry: 2600 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2601 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2602 %conv = sext i16 %0 to i32 2603 ret i32 %conv 2604} 2605 2606; Function Attrs: nofree norecurse nounwind uwtable willreturn 2607define dso_local zeroext i32 @ld_align32_uint32_t_int16_t(ptr nocapture readonly %ptr) { 2608; CHECK-P10-LABEL: ld_align32_uint32_t_int16_t: 2609; CHECK-P10: # %bb.0: # %entry 2610; CHECK-P10-NEXT: plhz r3, 99999000(r3), 0 2611; CHECK-P10-NEXT: extsh r3, r3 2612; CHECK-P10-NEXT: clrldi r3, r3, 32 2613; CHECK-P10-NEXT: blr 2614; 2615; CHECK-PREP10-LABEL: ld_align32_uint32_t_int16_t: 2616; CHECK-PREP10: # %bb.0: # %entry 2617; CHECK-PREP10-NEXT: lis r4, 1525 2618; CHECK-PREP10-NEXT: ori r4, r4, 56600 2619; CHECK-PREP10-NEXT: lhax r3, r3, r4 2620; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2621; CHECK-PREP10-NEXT: blr 2622entry: 2623 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2624 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2625 %conv = sext i16 %0 to i32 2626 ret i32 %conv 2627} 2628 2629; Function Attrs: nofree norecurse nounwind uwtable willreturn 2630define dso_local zeroext i32 @ld_align64_uint32_t_int16_t(ptr nocapture readonly %ptr) { 2631; CHECK-P10-LABEL: ld_align64_uint32_t_int16_t: 2632; CHECK-P10: # %bb.0: # %entry 2633; CHECK-P10-NEXT: pli r4, 244140625 2634; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2635; CHECK-P10-NEXT: lhax r3, r3, r4 2636; CHECK-P10-NEXT: clrldi r3, r3, 32 2637; CHECK-P10-NEXT: blr 2638; 2639; CHECK-PREP10-LABEL: ld_align64_uint32_t_int16_t: 2640; CHECK-PREP10: # %bb.0: # %entry 2641; CHECK-PREP10-NEXT: lis r4, 3725 2642; CHECK-PREP10-NEXT: ori r4, r4, 19025 2643; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2644; CHECK-PREP10-NEXT: lhax r3, r3, r4 2645; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2646; CHECK-PREP10-NEXT: blr 2647entry: 2648 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2649 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2650 %conv = sext i16 %0 to i32 2651 ret i32 %conv 2652} 2653 2654; Function Attrs: nofree norecurse nounwind uwtable willreturn 2655define dso_local zeroext i32 @ld_reg_uint32_t_int16_t(ptr nocapture readonly %ptr, i64 %off) { 2656; CHECK-LABEL: ld_reg_uint32_t_int16_t: 2657; CHECK: # %bb.0: # %entry 2658; CHECK-NEXT: lhax r3, r3, r4 2659; CHECK-NEXT: clrldi r3, r3, 32 2660; CHECK-NEXT: blr 2661entry: 2662 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2663 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2664 %conv = sext i16 %0 to i32 2665 ret i32 %conv 2666} 2667 2668; Function Attrs: nofree norecurse nounwind uwtable willreturn 2669define dso_local zeroext i32 @ld_or_uint32_t_int16_t(i64 %ptr, i8 zeroext %off) { 2670; CHECK-LABEL: ld_or_uint32_t_int16_t: 2671; CHECK: # %bb.0: # %entry 2672; CHECK-NEXT: or r3, r4, r3 2673; CHECK-NEXT: lha r3, 0(r3) 2674; CHECK-NEXT: clrldi r3, r3, 32 2675; CHECK-NEXT: blr 2676entry: 2677 %conv = zext i8 %off to i64 2678 %or = or i64 %conv, %ptr 2679 %0 = inttoptr i64 %or to ptr 2680 %1 = load atomic i16, ptr %0 monotonic, align 2 2681 %conv1 = sext i16 %1 to i32 2682 ret i32 %conv1 2683} 2684 2685; Function Attrs: nofree norecurse nounwind uwtable willreturn 2686define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_int16_t(i64 %ptr) { 2687; CHECK-LABEL: ld_not_disjoint16_uint32_t_int16_t: 2688; CHECK: # %bb.0: # %entry 2689; CHECK-NEXT: ori r3, r3, 6 2690; CHECK-NEXT: lha r3, 0(r3) 2691; CHECK-NEXT: clrldi r3, r3, 32 2692; CHECK-NEXT: blr 2693entry: 2694 %or = or i64 %ptr, 6 2695 %0 = inttoptr i64 %or to ptr 2696 %1 = load atomic i16, ptr %0 monotonic, align 2 2697 %conv = sext i16 %1 to i32 2698 ret i32 %conv 2699} 2700 2701; Function Attrs: nofree norecurse nounwind uwtable willreturn 2702define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_int16_t(i64 %ptr) { 2703; CHECK-LABEL: ld_disjoint_align16_uint32_t_int16_t: 2704; CHECK: # %bb.0: # %entry 2705; CHECK-NEXT: rldicr r3, r3, 0, 51 2706; CHECK-NEXT: lha r3, 24(r3) 2707; CHECK-NEXT: clrldi r3, r3, 32 2708; CHECK-NEXT: blr 2709entry: 2710 %and = and i64 %ptr, -4096 2711 %or = or i64 %and, 24 2712 %0 = inttoptr i64 %or to ptr 2713 %1 = load atomic i16, ptr %0 monotonic, align 8 2714 %conv = sext i16 %1 to i32 2715 ret i32 %conv 2716} 2717 2718; Function Attrs: nofree norecurse nounwind uwtable willreturn 2719define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_int16_t(i64 %ptr) { 2720; CHECK-LABEL: ld_not_disjoint32_uint32_t_int16_t: 2721; CHECK: # %bb.0: # %entry 2722; CHECK-NEXT: ori r3, r3, 34463 2723; CHECK-NEXT: oris r3, r3, 1 2724; CHECK-NEXT: lha r3, 0(r3) 2725; CHECK-NEXT: clrldi r3, r3, 32 2726; CHECK-NEXT: blr 2727entry: 2728 %or = or i64 %ptr, 99999 2729 %0 = inttoptr i64 %or to ptr 2730 %1 = load atomic i16, ptr %0 monotonic, align 2 2731 %conv = sext i16 %1 to i32 2732 ret i32 %conv 2733} 2734 2735; Function Attrs: nofree norecurse nounwind uwtable willreturn 2736define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_int16_t(i64 %ptr) { 2737; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_int16_t: 2738; CHECK-P10: # %bb.0: # %entry 2739; CHECK-P10-NEXT: lis r4, -15264 2740; CHECK-P10-NEXT: and r3, r3, r4 2741; CHECK-P10-NEXT: plhz r3, 999990000(r3), 0 2742; CHECK-P10-NEXT: extsh r3, r3 2743; CHECK-P10-NEXT: clrldi r3, r3, 32 2744; CHECK-P10-NEXT: blr 2745; 2746; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_int16_t: 2747; CHECK-PREP10: # %bb.0: # %entry 2748; CHECK-PREP10-NEXT: lis r4, -15264 2749; CHECK-PREP10-NEXT: and r3, r3, r4 2750; CHECK-PREP10-NEXT: lis r4, 15258 2751; CHECK-PREP10-NEXT: ori r4, r4, 41712 2752; CHECK-PREP10-NEXT: lhax r3, r3, r4 2753; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2754; CHECK-PREP10-NEXT: blr 2755entry: 2756 %and = and i64 %ptr, -1000341504 2757 %or = or i64 %and, 999990000 2758 %0 = inttoptr i64 %or to ptr 2759 %1 = load atomic i16, ptr %0 monotonic, align 16 2760 %conv = sext i16 %1 to i32 2761 ret i32 %conv 2762} 2763 2764; Function Attrs: nofree norecurse nounwind uwtable willreturn 2765define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_int16_t(i64 %ptr) { 2766; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_int16_t: 2767; CHECK-P10: # %bb.0: # %entry 2768; CHECK-P10-NEXT: pli r4, 232 2769; CHECK-P10-NEXT: pli r5, 3567587329 2770; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 2771; CHECK-P10-NEXT: or r3, r3, r5 2772; CHECK-P10-NEXT: lha r3, 0(r3) 2773; CHECK-P10-NEXT: clrldi r3, r3, 32 2774; CHECK-P10-NEXT: blr 2775; 2776; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_int16_t: 2777; CHECK-PREP10: # %bb.0: # %entry 2778; CHECK-PREP10-NEXT: li r4, 29 2779; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 2780; CHECK-PREP10-NEXT: oris r4, r4, 54437 2781; CHECK-PREP10-NEXT: ori r4, r4, 4097 2782; CHECK-PREP10-NEXT: or r3, r3, r4 2783; CHECK-PREP10-NEXT: lha r3, 0(r3) 2784; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2785; CHECK-PREP10-NEXT: blr 2786entry: 2787 %or = or i64 %ptr, 1000000000001 2788 %0 = inttoptr i64 %or to ptr 2789 %1 = load atomic i16, ptr %0 monotonic, align 2 2790 %conv = sext i16 %1 to i32 2791 ret i32 %conv 2792} 2793 2794; Function Attrs: nofree norecurse nounwind uwtable willreturn 2795define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_int16_t(i64 %ptr) { 2796; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_int16_t: 2797; CHECK-P10: # %bb.0: # %entry 2798; CHECK-P10-NEXT: pli r4, 244140625 2799; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 2800; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2801; CHECK-P10-NEXT: lhax r3, r3, r4 2802; CHECK-P10-NEXT: clrldi r3, r3, 32 2803; CHECK-P10-NEXT: blr 2804; 2805; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_int16_t: 2806; CHECK-PREP10: # %bb.0: # %entry 2807; CHECK-PREP10-NEXT: lis r4, 3725 2808; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 2809; CHECK-PREP10-NEXT: ori r4, r4, 19025 2810; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2811; CHECK-PREP10-NEXT: lhax r3, r3, r4 2812; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2813; CHECK-PREP10-NEXT: blr 2814entry: 2815 %and = and i64 %ptr, -1099511627776 2816 %or = or i64 %and, 1000000000000 2817 %0 = inttoptr i64 %or to ptr 2818 %1 = load atomic i16, ptr %0 monotonic, align 4096 2819 %conv = sext i16 %1 to i32 2820 ret i32 %conv 2821} 2822 2823; Function Attrs: nofree norecurse nounwind uwtable willreturn 2824define dso_local zeroext i32 @ld_cst_align16_uint32_t_int16_t() { 2825; CHECK-LABEL: ld_cst_align16_uint32_t_int16_t: 2826; CHECK: # %bb.0: # %entry 2827; CHECK-NEXT: lha r3, 4080(0) 2828; CHECK-NEXT: clrldi r3, r3, 32 2829; CHECK-NEXT: blr 2830entry: 2831 %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2832 %conv = sext i16 %0 to i32 2833 ret i32 %conv 2834} 2835 2836; Function Attrs: nofree norecurse nounwind uwtable willreturn 2837define dso_local zeroext i32 @ld_cst_align32_uint32_t_int16_t() { 2838; CHECK-LABEL: ld_cst_align32_uint32_t_int16_t: 2839; CHECK: # %bb.0: # %entry 2840; CHECK-NEXT: lis r3, 153 2841; CHECK-NEXT: lha r3, -27108(r3) 2842; CHECK-NEXT: clrldi r3, r3, 32 2843; CHECK-NEXT: blr 2844entry: 2845 %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 2846 %conv = sext i16 %0 to i32 2847 ret i32 %conv 2848} 2849 2850; Function Attrs: nofree norecurse nounwind uwtable willreturn 2851define dso_local zeroext i32 @ld_cst_align64_uint32_t_int16_t() { 2852; CHECK-P10-LABEL: ld_cst_align64_uint32_t_int16_t: 2853; CHECK-P10: # %bb.0: # %entry 2854; CHECK-P10-NEXT: pli r3, 244140625 2855; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2856; CHECK-P10-NEXT: lha r3, 0(r3) 2857; CHECK-P10-NEXT: clrldi r3, r3, 32 2858; CHECK-P10-NEXT: blr 2859; 2860; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_int16_t: 2861; CHECK-PREP10: # %bb.0: # %entry 2862; CHECK-PREP10-NEXT: lis r3, 3725 2863; CHECK-PREP10-NEXT: ori r3, r3, 19025 2864; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2865; CHECK-PREP10-NEXT: lha r3, 0(r3) 2866; CHECK-PREP10-NEXT: clrldi r3, r3, 32 2867; CHECK-PREP10-NEXT: blr 2868entry: 2869 %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2870 %conv = sext i16 %0 to i32 2871 ret i32 %conv 2872} 2873 2874; Function Attrs: nofree norecurse nounwind uwtable willreturn 2875define dso_local zeroext i32 @ld_0_uint32_t_uint32_t(i64 %ptr) { 2876; CHECK-LABEL: ld_0_uint32_t_uint32_t: 2877; CHECK: # %bb.0: # %entry 2878; CHECK-NEXT: lwz r3, 0(r3) 2879; CHECK-NEXT: blr 2880entry: 2881 %0 = inttoptr i64 %ptr to ptr 2882 %1 = load atomic i32, ptr %0 monotonic, align 4 2883 ret i32 %1 2884} 2885 2886; Function Attrs: nofree norecurse nounwind uwtable willreturn 2887define dso_local zeroext i32 @ld_align16_uint32_t_uint32_t(ptr nocapture readonly %ptr) { 2888; CHECK-LABEL: ld_align16_uint32_t_uint32_t: 2889; CHECK: # %bb.0: # %entry 2890; CHECK-NEXT: lwz r3, 8(r3) 2891; CHECK-NEXT: blr 2892entry: 2893 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2894 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 2895 ret i32 %0 2896} 2897 2898; Function Attrs: nofree norecurse nounwind uwtable willreturn 2899define dso_local zeroext i32 @ld_align32_uint32_t_uint32_t(ptr nocapture readonly %ptr) { 2900; CHECK-P10-LABEL: ld_align32_uint32_t_uint32_t: 2901; CHECK-P10: # %bb.0: # %entry 2902; CHECK-P10-NEXT: plwz r3, 99999000(r3), 0 2903; CHECK-P10-NEXT: clrldi r3, r3, 32 2904; CHECK-P10-NEXT: blr 2905; 2906; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint32_t: 2907; CHECK-PREP10: # %bb.0: # %entry 2908; CHECK-PREP10-NEXT: lis r4, 1525 2909; CHECK-PREP10-NEXT: ori r4, r4, 56600 2910; CHECK-PREP10-NEXT: lwzx r3, r3, r4 2911; CHECK-PREP10-NEXT: blr 2912entry: 2913 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2914 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 2915 ret i32 %0 2916} 2917 2918; Function Attrs: nofree norecurse nounwind uwtable willreturn 2919define dso_local zeroext i32 @ld_align64_uint32_t_uint32_t(ptr nocapture readonly %ptr) { 2920; CHECK-P10-LABEL: ld_align64_uint32_t_uint32_t: 2921; CHECK-P10: # %bb.0: # %entry 2922; CHECK-P10-NEXT: pli r4, 244140625 2923; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2924; CHECK-P10-NEXT: lwzx r3, r3, r4 2925; CHECK-P10-NEXT: blr 2926; 2927; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint32_t: 2928; CHECK-PREP10: # %bb.0: # %entry 2929; CHECK-PREP10-NEXT: lis r4, 3725 2930; CHECK-PREP10-NEXT: ori r4, r4, 19025 2931; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2932; CHECK-PREP10-NEXT: lwzx r3, r3, r4 2933; CHECK-PREP10-NEXT: blr 2934entry: 2935 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2936 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 2937 ret i32 %0 2938} 2939 2940; Function Attrs: nofree norecurse nounwind uwtable willreturn 2941define dso_local zeroext i32 @ld_reg_uint32_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) { 2942; CHECK-LABEL: ld_reg_uint32_t_uint32_t: 2943; CHECK: # %bb.0: # %entry 2944; CHECK-NEXT: lwzx r3, r3, r4 2945; CHECK-NEXT: blr 2946entry: 2947 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2948 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 2949 ret i32 %0 2950} 2951 2952; Function Attrs: nofree norecurse nounwind uwtable willreturn 2953define dso_local zeroext i32 @ld_or_uint32_t_uint32_t(i64 %ptr, i8 zeroext %off) { 2954; CHECK-LABEL: ld_or_uint32_t_uint32_t: 2955; CHECK: # %bb.0: # %entry 2956; CHECK-NEXT: or r3, r4, r3 2957; CHECK-NEXT: lwz r3, 0(r3) 2958; CHECK-NEXT: blr 2959entry: 2960 %conv = zext i8 %off to i64 2961 %or = or i64 %conv, %ptr 2962 %0 = inttoptr i64 %or to ptr 2963 %1 = load atomic i32, ptr %0 monotonic, align 4 2964 ret i32 %1 2965} 2966 2967; Function Attrs: nofree norecurse nounwind uwtable willreturn 2968define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint32_t(i64 %ptr) { 2969; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint32_t: 2970; CHECK: # %bb.0: # %entry 2971; CHECK-NEXT: ori r3, r3, 6 2972; CHECK-NEXT: lwz r3, 0(r3) 2973; CHECK-NEXT: blr 2974entry: 2975 %or = or i64 %ptr, 6 2976 %0 = inttoptr i64 %or to ptr 2977 %1 = load atomic i32, ptr %0 monotonic, align 4 2978 ret i32 %1 2979} 2980 2981; Function Attrs: nofree norecurse nounwind uwtable willreturn 2982define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint32_t(i64 %ptr) { 2983; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint32_t: 2984; CHECK: # %bb.0: # %entry 2985; CHECK-NEXT: rldicr r3, r3, 0, 51 2986; CHECK-NEXT: lwz r3, 24(r3) 2987; CHECK-NEXT: blr 2988entry: 2989 %and = and i64 %ptr, -4096 2990 %or = or i64 %and, 24 2991 %0 = inttoptr i64 %or to ptr 2992 %1 = load atomic i32, ptr %0 monotonic, align 8 2993 ret i32 %1 2994} 2995 2996; Function Attrs: nofree norecurse nounwind uwtable willreturn 2997define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint32_t(i64 %ptr) { 2998; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint32_t: 2999; CHECK: # %bb.0: # %entry 3000; CHECK-NEXT: ori r3, r3, 34463 3001; CHECK-NEXT: oris r3, r3, 1 3002; CHECK-NEXT: lwz r3, 0(r3) 3003; CHECK-NEXT: blr 3004entry: 3005 %or = or i64 %ptr, 99999 3006 %0 = inttoptr i64 %or to ptr 3007 %1 = load atomic i32, ptr %0 monotonic, align 4 3008 ret i32 %1 3009} 3010 3011; Function Attrs: nofree norecurse nounwind uwtable willreturn 3012define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint32_t(i64 %ptr) { 3013; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint32_t: 3014; CHECK-P10: # %bb.0: # %entry 3015; CHECK-P10-NEXT: lis r4, -15264 3016; CHECK-P10-NEXT: and r3, r3, r4 3017; CHECK-P10-NEXT: plwz r3, 999990000(r3), 0 3018; CHECK-P10-NEXT: clrldi r3, r3, 32 3019; CHECK-P10-NEXT: blr 3020; 3021; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint32_t: 3022; CHECK-PREP10: # %bb.0: # %entry 3023; CHECK-PREP10-NEXT: lis r4, -15264 3024; CHECK-PREP10-NEXT: and r3, r3, r4 3025; CHECK-PREP10-NEXT: lis r4, 15258 3026; CHECK-PREP10-NEXT: ori r4, r4, 41712 3027; CHECK-PREP10-NEXT: lwzx r3, r3, r4 3028; CHECK-PREP10-NEXT: blr 3029entry: 3030 %and = and i64 %ptr, -1000341504 3031 %or = or i64 %and, 999990000 3032 %0 = inttoptr i64 %or to ptr 3033 %1 = load atomic i32, ptr %0 monotonic, align 16 3034 ret i32 %1 3035} 3036 3037; Function Attrs: nofree norecurse nounwind uwtable willreturn 3038define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint32_t(i64 %ptr) { 3039; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint32_t: 3040; CHECK-P10: # %bb.0: # %entry 3041; CHECK-P10-NEXT: pli r4, 232 3042; CHECK-P10-NEXT: pli r5, 3567587329 3043; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 3044; CHECK-P10-NEXT: or r3, r3, r5 3045; CHECK-P10-NEXT: lwz r3, 0(r3) 3046; CHECK-P10-NEXT: blr 3047; 3048; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint32_t: 3049; CHECK-PREP10: # %bb.0: # %entry 3050; CHECK-PREP10-NEXT: li r4, 29 3051; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 3052; CHECK-PREP10-NEXT: oris r4, r4, 54437 3053; CHECK-PREP10-NEXT: ori r4, r4, 4097 3054; CHECK-PREP10-NEXT: or r3, r3, r4 3055; CHECK-PREP10-NEXT: lwz r3, 0(r3) 3056; CHECK-PREP10-NEXT: blr 3057entry: 3058 %or = or i64 %ptr, 1000000000001 3059 %0 = inttoptr i64 %or to ptr 3060 %1 = load atomic i32, ptr %0 monotonic, align 4 3061 ret i32 %1 3062} 3063 3064; Function Attrs: nofree norecurse nounwind uwtable willreturn 3065define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint32_t(i64 %ptr) { 3066; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint32_t: 3067; CHECK-P10: # %bb.0: # %entry 3068; CHECK-P10-NEXT: pli r4, 244140625 3069; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3070; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3071; CHECK-P10-NEXT: lwzx r3, r3, r4 3072; CHECK-P10-NEXT: blr 3073; 3074; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint32_t: 3075; CHECK-PREP10: # %bb.0: # %entry 3076; CHECK-PREP10-NEXT: lis r4, 3725 3077; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3078; CHECK-PREP10-NEXT: ori r4, r4, 19025 3079; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3080; CHECK-PREP10-NEXT: lwzx r3, r3, r4 3081; CHECK-PREP10-NEXT: blr 3082entry: 3083 %and = and i64 %ptr, -1099511627776 3084 %or = or i64 %and, 1000000000000 3085 %0 = inttoptr i64 %or to ptr 3086 %1 = load atomic i32, ptr %0 monotonic, align 4096 3087 ret i32 %1 3088} 3089 3090; Function Attrs: nofree norecurse nounwind uwtable willreturn 3091define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint32_t() { 3092; CHECK-LABEL: ld_cst_align16_uint32_t_uint32_t: 3093; CHECK: # %bb.0: # %entry 3094; CHECK-NEXT: lwz r3, 4080(0) 3095; CHECK-NEXT: blr 3096entry: 3097 %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3098 ret i32 %0 3099} 3100 3101; Function Attrs: nofree norecurse nounwind uwtable willreturn 3102define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint32_t() { 3103; CHECK-LABEL: ld_cst_align32_uint32_t_uint32_t: 3104; CHECK: # %bb.0: # %entry 3105; CHECK-NEXT: lis r3, 153 3106; CHECK-NEXT: lwz r3, -27108(r3) 3107; CHECK-NEXT: blr 3108entry: 3109 %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 3110 ret i32 %0 3111} 3112 3113; Function Attrs: nofree norecurse nounwind uwtable willreturn 3114define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint32_t() { 3115; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint32_t: 3116; CHECK-P10: # %bb.0: # %entry 3117; CHECK-P10-NEXT: pli r3, 244140625 3118; CHECK-P10-NEXT: rldic r3, r3, 12, 24 3119; CHECK-P10-NEXT: lwz r3, 0(r3) 3120; CHECK-P10-NEXT: blr 3121; 3122; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint32_t: 3123; CHECK-PREP10: # %bb.0: # %entry 3124; CHECK-PREP10-NEXT: lis r3, 3725 3125; CHECK-PREP10-NEXT: ori r3, r3, 19025 3126; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 3127; CHECK-PREP10-NEXT: lwz r3, 0(r3) 3128; CHECK-PREP10-NEXT: blr 3129entry: 3130 %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3131 ret i32 %0 3132} 3133 3134; Function Attrs: nofree norecurse nounwind uwtable willreturn 3135define dso_local zeroext i32 @ld_0_uint32_t_uint64_t(i64 %ptr) { 3136; CHECK-LABEL: ld_0_uint32_t_uint64_t: 3137; CHECK: # %bb.0: # %entry 3138; CHECK-NEXT: ld r3, 0(r3) 3139; CHECK-NEXT: clrldi r3, r3, 32 3140; CHECK-NEXT: blr 3141entry: 3142 %0 = inttoptr i64 %ptr to ptr 3143 %1 = load atomic i64, ptr %0 monotonic, align 8 3144 %conv = trunc i64 %1 to i32 3145 ret i32 %conv 3146} 3147 3148; Function Attrs: nofree norecurse nounwind uwtable willreturn 3149define dso_local zeroext i32 @ld_align16_uint32_t_uint64_t(ptr nocapture readonly %ptr) { 3150; CHECK-LABEL: ld_align16_uint32_t_uint64_t: 3151; CHECK: # %bb.0: # %entry 3152; CHECK-NEXT: ld r3, 8(r3) 3153; CHECK-NEXT: clrldi r3, r3, 32 3154; CHECK-NEXT: blr 3155entry: 3156 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3157 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 3158 %conv = trunc i64 %0 to i32 3159 ret i32 %conv 3160} 3161 3162; Function Attrs: nofree norecurse nounwind uwtable willreturn 3163define dso_local zeroext i32 @ld_align32_uint32_t_uint64_t(ptr nocapture readonly %ptr) { 3164; CHECK-P10-LABEL: ld_align32_uint32_t_uint64_t: 3165; CHECK-P10: # %bb.0: # %entry 3166; CHECK-P10-NEXT: pld r3, 99999000(r3), 0 3167; CHECK-P10-NEXT: clrldi r3, r3, 32 3168; CHECK-P10-NEXT: blr 3169; 3170; CHECK-PREP10-LABEL: ld_align32_uint32_t_uint64_t: 3171; CHECK-PREP10: # %bb.0: # %entry 3172; CHECK-PREP10-NEXT: lis r4, 1525 3173; CHECK-PREP10-NEXT: ori r4, r4, 56600 3174; CHECK-PREP10-NEXT: ldx r3, r3, r4 3175; CHECK-PREP10-NEXT: clrldi r3, r3, 32 3176; CHECK-PREP10-NEXT: blr 3177entry: 3178 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3179 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 3180 %conv = trunc i64 %0 to i32 3181 ret i32 %conv 3182} 3183 3184; Function Attrs: nofree norecurse nounwind uwtable willreturn 3185define dso_local zeroext i32 @ld_align64_uint32_t_uint64_t(ptr nocapture readonly %ptr) { 3186; CHECK-P10-LABEL: ld_align64_uint32_t_uint64_t: 3187; CHECK-P10: # %bb.0: # %entry 3188; CHECK-P10-NEXT: pli r4, 244140625 3189; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3190; CHECK-P10-NEXT: ldx r3, r3, r4 3191; CHECK-P10-NEXT: clrldi r3, r3, 32 3192; CHECK-P10-NEXT: blr 3193; 3194; CHECK-PREP10-LABEL: ld_align64_uint32_t_uint64_t: 3195; CHECK-PREP10: # %bb.0: # %entry 3196; CHECK-PREP10-NEXT: lis r4, 3725 3197; CHECK-PREP10-NEXT: ori r4, r4, 19025 3198; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3199; CHECK-PREP10-NEXT: ldx r3, r3, r4 3200; CHECK-PREP10-NEXT: clrldi r3, r3, 32 3201; CHECK-PREP10-NEXT: blr 3202entry: 3203 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3204 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 3205 %conv = trunc i64 %0 to i32 3206 ret i32 %conv 3207} 3208 3209; Function Attrs: nofree norecurse nounwind uwtable willreturn 3210define dso_local zeroext i32 @ld_reg_uint32_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) { 3211; CHECK-LABEL: ld_reg_uint32_t_uint64_t: 3212; CHECK: # %bb.0: # %entry 3213; CHECK-NEXT: ldx r3, r3, r4 3214; CHECK-NEXT: clrldi r3, r3, 32 3215; CHECK-NEXT: blr 3216entry: 3217 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3218 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 3219 %conv = trunc i64 %0 to i32 3220 ret i32 %conv 3221} 3222 3223; Function Attrs: nofree norecurse nounwind uwtable willreturn 3224define dso_local zeroext i32 @ld_or_uint32_t_uint64_t(i64 %ptr, i8 zeroext %off) { 3225; CHECK-LABEL: ld_or_uint32_t_uint64_t: 3226; CHECK: # %bb.0: # %entry 3227; CHECK-NEXT: or r3, r4, r3 3228; CHECK-NEXT: ld r3, 0(r3) 3229; CHECK-NEXT: clrldi r3, r3, 32 3230; CHECK-NEXT: blr 3231entry: 3232 %conv = zext i8 %off to i64 3233 %or = or i64 %conv, %ptr 3234 %0 = inttoptr i64 %or to ptr 3235 %1 = load atomic i64, ptr %0 monotonic, align 8 3236 %conv1 = trunc i64 %1 to i32 3237 ret i32 %conv1 3238} 3239 3240; Function Attrs: nofree norecurse nounwind uwtable willreturn 3241define dso_local zeroext i32 @ld_not_disjoint16_uint32_t_uint64_t(i64 %ptr) { 3242; CHECK-LABEL: ld_not_disjoint16_uint32_t_uint64_t: 3243; CHECK: # %bb.0: # %entry 3244; CHECK-NEXT: ori r3, r3, 6 3245; CHECK-NEXT: ld r3, 0(r3) 3246; CHECK-NEXT: clrldi r3, r3, 32 3247; CHECK-NEXT: blr 3248entry: 3249 %or = or i64 %ptr, 6 3250 %0 = inttoptr i64 %or to ptr 3251 %1 = load atomic i64, ptr %0 monotonic, align 8 3252 %conv = trunc i64 %1 to i32 3253 ret i32 %conv 3254} 3255 3256; Function Attrs: nofree norecurse nounwind uwtable willreturn 3257define dso_local zeroext i32 @ld_disjoint_align16_uint32_t_uint64_t(i64 %ptr) { 3258; CHECK-LABEL: ld_disjoint_align16_uint32_t_uint64_t: 3259; CHECK: # %bb.0: # %entry 3260; CHECK-NEXT: rldicr r3, r3, 0, 51 3261; CHECK-NEXT: ld r3, 24(r3) 3262; CHECK-NEXT: clrldi r3, r3, 32 3263; CHECK-NEXT: blr 3264entry: 3265 %and = and i64 %ptr, -4096 3266 %or = or i64 %and, 24 3267 %0 = inttoptr i64 %or to ptr 3268 %1 = load atomic i64, ptr %0 monotonic, align 8 3269 %conv = trunc i64 %1 to i32 3270 ret i32 %conv 3271} 3272 3273; Function Attrs: nofree norecurse nounwind uwtable willreturn 3274define dso_local zeroext i32 @ld_not_disjoint32_uint32_t_uint64_t(i64 %ptr) { 3275; CHECK-LABEL: ld_not_disjoint32_uint32_t_uint64_t: 3276; CHECK: # %bb.0: # %entry 3277; CHECK-NEXT: ori r3, r3, 34463 3278; CHECK-NEXT: oris r3, r3, 1 3279; CHECK-NEXT: ld r3, 0(r3) 3280; CHECK-NEXT: clrldi r3, r3, 32 3281; CHECK-NEXT: blr 3282entry: 3283 %or = or i64 %ptr, 99999 3284 %0 = inttoptr i64 %or to ptr 3285 %1 = load atomic i64, ptr %0 monotonic, align 8 3286 %conv = trunc i64 %1 to i32 3287 ret i32 %conv 3288} 3289 3290; Function Attrs: nofree norecurse nounwind uwtable willreturn 3291define dso_local zeroext i32 @ld_disjoint_align32_uint32_t_uint64_t(i64 %ptr) { 3292; CHECK-P10-LABEL: ld_disjoint_align32_uint32_t_uint64_t: 3293; CHECK-P10: # %bb.0: # %entry 3294; CHECK-P10-NEXT: lis r4, -15264 3295; CHECK-P10-NEXT: and r3, r3, r4 3296; CHECK-P10-NEXT: pld r3, 999990000(r3), 0 3297; CHECK-P10-NEXT: clrldi r3, r3, 32 3298; CHECK-P10-NEXT: blr 3299; 3300; CHECK-PREP10-LABEL: ld_disjoint_align32_uint32_t_uint64_t: 3301; CHECK-PREP10: # %bb.0: # %entry 3302; CHECK-PREP10-NEXT: lis r4, -15264 3303; CHECK-PREP10-NEXT: and r3, r3, r4 3304; CHECK-PREP10-NEXT: lis r4, 15258 3305; CHECK-PREP10-NEXT: ori r4, r4, 41712 3306; CHECK-PREP10-NEXT: ldx r3, r3, r4 3307; CHECK-PREP10-NEXT: clrldi r3, r3, 32 3308; CHECK-PREP10-NEXT: blr 3309entry: 3310 %and = and i64 %ptr, -1000341504 3311 %or = or i64 %and, 999990000 3312 %0 = inttoptr i64 %or to ptr 3313 %1 = load atomic i64, ptr %0 monotonic, align 16 3314 %conv = trunc i64 %1 to i32 3315 ret i32 %conv 3316} 3317 3318; Function Attrs: nofree norecurse nounwind uwtable willreturn 3319define dso_local zeroext i32 @ld_not_disjoint64_uint32_t_uint64_t(i64 %ptr) { 3320; CHECK-P10-LABEL: ld_not_disjoint64_uint32_t_uint64_t: 3321; CHECK-P10: # %bb.0: # %entry 3322; CHECK-P10-NEXT: pli r4, 232 3323; CHECK-P10-NEXT: pli r5, 3567587329 3324; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 3325; CHECK-P10-NEXT: or r3, r3, r5 3326; CHECK-P10-NEXT: ld r3, 0(r3) 3327; CHECK-P10-NEXT: clrldi r3, r3, 32 3328; CHECK-P10-NEXT: blr 3329; 3330; CHECK-PREP10-LABEL: ld_not_disjoint64_uint32_t_uint64_t: 3331; CHECK-PREP10: # %bb.0: # %entry 3332; CHECK-PREP10-NEXT: li r4, 29 3333; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 3334; CHECK-PREP10-NEXT: oris r4, r4, 54437 3335; CHECK-PREP10-NEXT: ori r4, r4, 4097 3336; CHECK-PREP10-NEXT: or r3, r3, r4 3337; CHECK-PREP10-NEXT: ld r3, 0(r3) 3338; CHECK-PREP10-NEXT: clrldi r3, r3, 32 3339; CHECK-PREP10-NEXT: blr 3340entry: 3341 %or = or i64 %ptr, 1000000000001 3342 %0 = inttoptr i64 %or to ptr 3343 %1 = load atomic i64, ptr %0 monotonic, align 8 3344 %conv = trunc i64 %1 to i32 3345 ret i32 %conv 3346} 3347 3348; Function Attrs: nofree norecurse nounwind uwtable willreturn 3349define dso_local zeroext i32 @ld_disjoint_align64_uint32_t_uint64_t(i64 %ptr) { 3350; CHECK-P10-LABEL: ld_disjoint_align64_uint32_t_uint64_t: 3351; CHECK-P10: # %bb.0: # %entry 3352; CHECK-P10-NEXT: pli r4, 244140625 3353; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3354; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3355; CHECK-P10-NEXT: ldx r3, r3, r4 3356; CHECK-P10-NEXT: clrldi r3, r3, 32 3357; CHECK-P10-NEXT: blr 3358; 3359; CHECK-PREP10-LABEL: ld_disjoint_align64_uint32_t_uint64_t: 3360; CHECK-PREP10: # %bb.0: # %entry 3361; CHECK-PREP10-NEXT: lis r4, 3725 3362; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3363; CHECK-PREP10-NEXT: ori r4, r4, 19025 3364; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3365; CHECK-PREP10-NEXT: ldx r3, r3, r4 3366; CHECK-PREP10-NEXT: clrldi r3, r3, 32 3367; CHECK-PREP10-NEXT: blr 3368entry: 3369 %and = and i64 %ptr, -1099511627776 3370 %or = or i64 %and, 1000000000000 3371 %0 = inttoptr i64 %or to ptr 3372 %1 = load atomic i64, ptr %0 monotonic, align 4096 3373 %conv = trunc i64 %1 to i32 3374 ret i32 %conv 3375} 3376 3377; Function Attrs: nofree norecurse nounwind uwtable willreturn 3378define dso_local zeroext i32 @ld_cst_align16_uint32_t_uint64_t() { 3379; CHECK-LABEL: ld_cst_align16_uint32_t_uint64_t: 3380; CHECK: # %bb.0: # %entry 3381; CHECK-NEXT: ld r3, 4080(0) 3382; CHECK-NEXT: clrldi r3, r3, 32 3383; CHECK-NEXT: blr 3384entry: 3385 %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3386 %conv = trunc i64 %0 to i32 3387 ret i32 %conv 3388} 3389 3390; Function Attrs: nofree norecurse nounwind uwtable willreturn 3391define dso_local zeroext i32 @ld_cst_align32_uint32_t_uint64_t() { 3392; CHECK-LABEL: ld_cst_align32_uint32_t_uint64_t: 3393; CHECK: # %bb.0: # %entry 3394; CHECK-NEXT: lis r3, 153 3395; CHECK-NEXT: ld r3, -27108(r3) 3396; CHECK-NEXT: clrldi r3, r3, 32 3397; CHECK-NEXT: blr 3398entry: 3399 %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 3400 %conv = trunc i64 %0 to i32 3401 ret i32 %conv 3402} 3403 3404; Function Attrs: nofree norecurse nounwind uwtable willreturn 3405define dso_local zeroext i32 @ld_cst_align64_uint32_t_uint64_t() { 3406; CHECK-P10-LABEL: ld_cst_align64_uint32_t_uint64_t: 3407; CHECK-P10: # %bb.0: # %entry 3408; CHECK-P10-NEXT: pli r3, 244140625 3409; CHECK-P10-NEXT: rldic r3, r3, 12, 24 3410; CHECK-P10-NEXT: ld r3, 0(r3) 3411; CHECK-P10-NEXT: clrldi r3, r3, 32 3412; CHECK-P10-NEXT: blr 3413; 3414; CHECK-PREP10-LABEL: ld_cst_align64_uint32_t_uint64_t: 3415; CHECK-PREP10: # %bb.0: # %entry 3416; CHECK-PREP10-NEXT: lis r3, 3725 3417; CHECK-PREP10-NEXT: ori r3, r3, 19025 3418; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 3419; CHECK-PREP10-NEXT: ld r3, 0(r3) 3420; CHECK-PREP10-NEXT: clrldi r3, r3, 32 3421; CHECK-PREP10-NEXT: blr 3422entry: 3423 %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3424 %conv = trunc i64 %0 to i32 3425 ret i32 %conv 3426} 3427 3428; Function Attrs: nofree norecurse nounwind uwtable willreturn 3429define dso_local void @st_0_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) { 3430; CHECK-LABEL: st_0_uint32_t_uint8_t: 3431; CHECK: # %bb.0: # %entry 3432; CHECK-NEXT: stb r4, 0(r3) 3433; CHECK-NEXT: blr 3434entry: 3435 %0 = inttoptr i64 %ptr to ptr 3436 %conv = trunc i32 %str to i8 3437 store atomic i8 %conv, ptr %0 monotonic, align 1 3438 ret void 3439} 3440 3441; Function Attrs: nofree norecurse nounwind uwtable willreturn 3442define dso_local void @st_align16_uint32_t_uint8_t(ptr nocapture %ptr, i32 zeroext %str) { 3443; CHECK-LABEL: st_align16_uint32_t_uint8_t: 3444; CHECK: # %bb.0: # %entry 3445; CHECK-NEXT: stb r4, 8(r3) 3446; CHECK-NEXT: blr 3447entry: 3448 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3449 %conv = trunc i32 %str to i8 3450 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 3451 ret void 3452} 3453 3454; Function Attrs: nofree norecurse nounwind uwtable willreturn 3455define dso_local void @st_align32_uint32_t_uint8_t(ptr nocapture %ptr, i32 zeroext %str) { 3456; CHECK-P10-LABEL: st_align32_uint32_t_uint8_t: 3457; CHECK-P10: # %bb.0: # %entry 3458; CHECK-P10-NEXT: pstb r4, 99999000(r3), 0 3459; CHECK-P10-NEXT: blr 3460; 3461; CHECK-PREP10-LABEL: st_align32_uint32_t_uint8_t: 3462; CHECK-PREP10: # %bb.0: # %entry 3463; CHECK-PREP10-NEXT: lis r5, 1525 3464; CHECK-PREP10-NEXT: ori r5, r5, 56600 3465; CHECK-PREP10-NEXT: stbx r4, r3, r5 3466; CHECK-PREP10-NEXT: blr 3467entry: 3468 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3469 %conv = trunc i32 %str to i8 3470 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 3471 ret void 3472} 3473 3474; Function Attrs: nofree norecurse nounwind uwtable willreturn 3475define dso_local void @st_align64_uint32_t_uint8_t(ptr nocapture %ptr, i32 zeroext %str) { 3476; CHECK-P10-LABEL: st_align64_uint32_t_uint8_t: 3477; CHECK-P10: # %bb.0: # %entry 3478; CHECK-P10-NEXT: pli r5, 244140625 3479; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3480; CHECK-P10-NEXT: stbx r4, r3, r5 3481; CHECK-P10-NEXT: blr 3482; 3483; CHECK-PREP10-LABEL: st_align64_uint32_t_uint8_t: 3484; CHECK-PREP10: # %bb.0: # %entry 3485; CHECK-PREP10-NEXT: lis r5, 3725 3486; CHECK-PREP10-NEXT: ori r5, r5, 19025 3487; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3488; CHECK-PREP10-NEXT: stbx r4, r3, r5 3489; CHECK-PREP10-NEXT: blr 3490entry: 3491 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3492 %conv = trunc i32 %str to i8 3493 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 3494 ret void 3495} 3496 3497; Function Attrs: nofree norecurse nounwind uwtable willreturn 3498define dso_local void @st_reg_uint32_t_uint8_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) { 3499; CHECK-LABEL: st_reg_uint32_t_uint8_t: 3500; CHECK: # %bb.0: # %entry 3501; CHECK-NEXT: stbx r5, r3, r4 3502; CHECK-NEXT: blr 3503entry: 3504 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3505 %conv = trunc i32 %str to i8 3506 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 3507 ret void 3508} 3509 3510; Function Attrs: nofree norecurse nounwind uwtable willreturn 3511define dso_local void @st_or1_uint32_t_uint8_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) { 3512; CHECK-LABEL: st_or1_uint32_t_uint8_t: 3513; CHECK: # %bb.0: # %entry 3514; CHECK-NEXT: or r3, r4, r3 3515; CHECK-NEXT: stb r5, 0(r3) 3516; CHECK-NEXT: blr 3517entry: 3518 %conv = zext i8 %off to i64 3519 %or = or i64 %conv, %ptr 3520 %0 = inttoptr i64 %or to ptr 3521 %conv1 = trunc i32 %str to i8 3522 store atomic i8 %conv1, ptr %0 monotonic, align 1 3523 ret void 3524} 3525 3526; Function Attrs: nofree norecurse nounwind uwtable willreturn 3527define dso_local void @st_not_disjoint16_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) { 3528; CHECK-LABEL: st_not_disjoint16_uint32_t_uint8_t: 3529; CHECK: # %bb.0: # %entry 3530; CHECK-NEXT: ori r3, r3, 6 3531; CHECK-NEXT: stb r4, 0(r3) 3532; CHECK-NEXT: blr 3533entry: 3534 %or = or i64 %ptr, 6 3535 %0 = inttoptr i64 %or to ptr 3536 %conv = trunc i32 %str to i8 3537 store atomic i8 %conv, ptr %0 monotonic, align 1 3538 ret void 3539} 3540 3541; Function Attrs: nofree norecurse nounwind uwtable willreturn 3542define dso_local void @st_disjoint_align16_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) { 3543; CHECK-LABEL: st_disjoint_align16_uint32_t_uint8_t: 3544; CHECK: # %bb.0: # %entry 3545; CHECK-NEXT: rldicr r3, r3, 0, 51 3546; CHECK-NEXT: stb r4, 24(r3) 3547; CHECK-NEXT: blr 3548entry: 3549 %and = and i64 %ptr, -4096 3550 %or = or i64 %and, 24 3551 %0 = inttoptr i64 %or to ptr 3552 %conv = trunc i32 %str to i8 3553 store atomic i8 %conv, ptr %0 monotonic, align 8 3554 ret void 3555} 3556 3557; Function Attrs: nofree norecurse nounwind uwtable willreturn 3558define dso_local void @st_not_disjoint32_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) { 3559; CHECK-LABEL: st_not_disjoint32_uint32_t_uint8_t: 3560; CHECK: # %bb.0: # %entry 3561; CHECK-NEXT: ori r3, r3, 34463 3562; CHECK-NEXT: oris r3, r3, 1 3563; CHECK-NEXT: stb r4, 0(r3) 3564; CHECK-NEXT: blr 3565entry: 3566 %or = or i64 %ptr, 99999 3567 %0 = inttoptr i64 %or to ptr 3568 %conv = trunc i32 %str to i8 3569 store atomic i8 %conv, ptr %0 monotonic, align 1 3570 ret void 3571} 3572 3573; Function Attrs: nofree norecurse nounwind uwtable willreturn 3574define dso_local void @st_disjoint_align32_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) { 3575; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint8_t: 3576; CHECK-P10: # %bb.0: # %entry 3577; CHECK-P10-NEXT: lis r5, -15264 3578; CHECK-P10-NEXT: and r3, r3, r5 3579; CHECK-P10-NEXT: pstb r4, 999990000(r3), 0 3580; CHECK-P10-NEXT: blr 3581; 3582; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint8_t: 3583; CHECK-PREP10: # %bb.0: # %entry 3584; CHECK-PREP10-NEXT: lis r5, -15264 3585; CHECK-PREP10-NEXT: and r3, r3, r5 3586; CHECK-PREP10-NEXT: lis r5, 15258 3587; CHECK-PREP10-NEXT: ori r5, r5, 41712 3588; CHECK-PREP10-NEXT: stbx r4, r3, r5 3589; CHECK-PREP10-NEXT: blr 3590entry: 3591 %and = and i64 %ptr, -1000341504 3592 %or = or i64 %and, 999990000 3593 %0 = inttoptr i64 %or to ptr 3594 %conv = trunc i32 %str to i8 3595 store atomic i8 %conv, ptr %0 monotonic, align 16 3596 ret void 3597} 3598 3599; Function Attrs: nofree norecurse nounwind uwtable willreturn 3600define dso_local void @st_not_disjoint64_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) { 3601; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint8_t: 3602; CHECK-P10: # %bb.0: # %entry 3603; CHECK-P10-NEXT: pli r5, 232 3604; CHECK-P10-NEXT: pli r6, 3567587329 3605; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 3606; CHECK-P10-NEXT: or r3, r3, r6 3607; CHECK-P10-NEXT: stb r4, 0(r3) 3608; CHECK-P10-NEXT: blr 3609; 3610; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint8_t: 3611; CHECK-PREP10: # %bb.0: # %entry 3612; CHECK-PREP10-NEXT: li r5, 29 3613; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 3614; CHECK-PREP10-NEXT: oris r5, r5, 54437 3615; CHECK-PREP10-NEXT: ori r5, r5, 4097 3616; CHECK-PREP10-NEXT: or r3, r3, r5 3617; CHECK-PREP10-NEXT: stb r4, 0(r3) 3618; CHECK-PREP10-NEXT: blr 3619entry: 3620 %or = or i64 %ptr, 1000000000001 3621 %0 = inttoptr i64 %or to ptr 3622 %conv = trunc i32 %str to i8 3623 store atomic i8 %conv, ptr %0 monotonic, align 1 3624 ret void 3625} 3626 3627; Function Attrs: nofree norecurse nounwind uwtable willreturn 3628define dso_local void @st_disjoint_align64_uint32_t_uint8_t(i64 %ptr, i32 zeroext %str) { 3629; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint8_t: 3630; CHECK-P10: # %bb.0: # %entry 3631; CHECK-P10-NEXT: pli r5, 244140625 3632; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3633; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3634; CHECK-P10-NEXT: stbx r4, r3, r5 3635; CHECK-P10-NEXT: blr 3636; 3637; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint8_t: 3638; CHECK-PREP10: # %bb.0: # %entry 3639; CHECK-PREP10-NEXT: lis r5, 3725 3640; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3641; CHECK-PREP10-NEXT: ori r5, r5, 19025 3642; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3643; CHECK-PREP10-NEXT: stbx r4, r3, r5 3644; CHECK-PREP10-NEXT: blr 3645entry: 3646 %and = and i64 %ptr, -1099511627776 3647 %or = or i64 %and, 1000000000000 3648 %0 = inttoptr i64 %or to ptr 3649 %conv = trunc i32 %str to i8 3650 store atomic i8 %conv, ptr %0 monotonic, align 4096 3651 ret void 3652} 3653 3654; Function Attrs: nofree norecurse nounwind uwtable willreturn 3655define dso_local void @st_cst_align16_uint32_t_uint8_t(i32 zeroext %str) { 3656; CHECK-LABEL: st_cst_align16_uint32_t_uint8_t: 3657; CHECK: # %bb.0: # %entry 3658; CHECK-NEXT: stb r3, 4080(0) 3659; CHECK-NEXT: blr 3660entry: 3661 %conv = trunc i32 %str to i8 3662 store atomic i8 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3663 ret void 3664} 3665 3666; Function Attrs: nofree norecurse nounwind uwtable willreturn 3667define dso_local void @st_cst_align32_uint32_t_uint8_t(i32 zeroext %str) { 3668; CHECK-LABEL: st_cst_align32_uint32_t_uint8_t: 3669; CHECK: # %bb.0: # %entry 3670; CHECK-NEXT: lis r4, 153 3671; CHECK-NEXT: stb r3, -27108(r4) 3672; CHECK-NEXT: blr 3673entry: 3674 %conv = trunc i32 %str to i8 3675 store atomic i8 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 3676 ret void 3677} 3678 3679; Function Attrs: nofree norecurse nounwind uwtable willreturn 3680define dso_local void @st_cst_align64_uint32_t_uint8_t(i32 zeroext %str) { 3681; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint8_t: 3682; CHECK-P10: # %bb.0: # %entry 3683; CHECK-P10-NEXT: pli r4, 244140625 3684; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3685; CHECK-P10-NEXT: stb r3, 0(r4) 3686; CHECK-P10-NEXT: blr 3687; 3688; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint8_t: 3689; CHECK-PREP10: # %bb.0: # %entry 3690; CHECK-PREP10-NEXT: lis r4, 3725 3691; CHECK-PREP10-NEXT: ori r4, r4, 19025 3692; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3693; CHECK-PREP10-NEXT: stb r3, 0(r4) 3694; CHECK-PREP10-NEXT: blr 3695entry: 3696 %conv = trunc i32 %str to i8 3697 store atomic i8 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3698 ret void 3699} 3700 3701; Function Attrs: nofree norecurse nounwind uwtable willreturn 3702define dso_local void @st_0_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) { 3703; CHECK-LABEL: st_0_uint32_t_uint16_t: 3704; CHECK: # %bb.0: # %entry 3705; CHECK-NEXT: sth r4, 0(r3) 3706; CHECK-NEXT: blr 3707entry: 3708 %0 = inttoptr i64 %ptr to ptr 3709 %conv = trunc i32 %str to i16 3710 store atomic i16 %conv, ptr %0 monotonic, align 2 3711 ret void 3712} 3713 3714; Function Attrs: nofree norecurse nounwind uwtable willreturn 3715define dso_local void @st_align16_uint32_t_uint16_t(ptr nocapture %ptr, i32 zeroext %str) { 3716; CHECK-LABEL: st_align16_uint32_t_uint16_t: 3717; CHECK: # %bb.0: # %entry 3718; CHECK-NEXT: sth r4, 8(r3) 3719; CHECK-NEXT: blr 3720entry: 3721 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3722 %conv = trunc i32 %str to i16 3723 store atomic i16 %conv, ptr %add.ptr monotonic, align 2 3724 ret void 3725} 3726 3727; Function Attrs: nofree norecurse nounwind uwtable willreturn 3728define dso_local void @st_align32_uint32_t_uint16_t(ptr nocapture %ptr, i32 zeroext %str) { 3729; CHECK-P10-LABEL: st_align32_uint32_t_uint16_t: 3730; CHECK-P10: # %bb.0: # %entry 3731; CHECK-P10-NEXT: psth r4, 99999000(r3), 0 3732; CHECK-P10-NEXT: blr 3733; 3734; CHECK-PREP10-LABEL: st_align32_uint32_t_uint16_t: 3735; CHECK-PREP10: # %bb.0: # %entry 3736; CHECK-PREP10-NEXT: lis r5, 1525 3737; CHECK-PREP10-NEXT: ori r5, r5, 56600 3738; CHECK-PREP10-NEXT: sthx r4, r3, r5 3739; CHECK-PREP10-NEXT: blr 3740entry: 3741 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3742 %conv = trunc i32 %str to i16 3743 store atomic i16 %conv, ptr %add.ptr monotonic, align 2 3744 ret void 3745} 3746 3747; Function Attrs: nofree norecurse nounwind uwtable willreturn 3748define dso_local void @st_align64_uint32_t_uint16_t(ptr nocapture %ptr, i32 zeroext %str) { 3749; CHECK-P10-LABEL: st_align64_uint32_t_uint16_t: 3750; CHECK-P10: # %bb.0: # %entry 3751; CHECK-P10-NEXT: pli r5, 244140625 3752; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3753; CHECK-P10-NEXT: sthx r4, r3, r5 3754; CHECK-P10-NEXT: blr 3755; 3756; CHECK-PREP10-LABEL: st_align64_uint32_t_uint16_t: 3757; CHECK-PREP10: # %bb.0: # %entry 3758; CHECK-PREP10-NEXT: lis r5, 3725 3759; CHECK-PREP10-NEXT: ori r5, r5, 19025 3760; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3761; CHECK-PREP10-NEXT: sthx r4, r3, r5 3762; CHECK-PREP10-NEXT: blr 3763entry: 3764 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3765 %conv = trunc i32 %str to i16 3766 store atomic i16 %conv, ptr %add.ptr monotonic, align 2 3767 ret void 3768} 3769 3770; Function Attrs: nofree norecurse nounwind uwtable willreturn 3771define dso_local void @st_reg_uint32_t_uint16_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) { 3772; CHECK-LABEL: st_reg_uint32_t_uint16_t: 3773; CHECK: # %bb.0: # %entry 3774; CHECK-NEXT: sthx r5, r3, r4 3775; CHECK-NEXT: blr 3776entry: 3777 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3778 %conv = trunc i32 %str to i16 3779 store atomic i16 %conv, ptr %add.ptr monotonic, align 2 3780 ret void 3781} 3782 3783; Function Attrs: nofree norecurse nounwind uwtable willreturn 3784define dso_local void @st_or1_uint32_t_uint16_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) { 3785; CHECK-LABEL: st_or1_uint32_t_uint16_t: 3786; CHECK: # %bb.0: # %entry 3787; CHECK-NEXT: or r3, r4, r3 3788; CHECK-NEXT: sth r5, 0(r3) 3789; CHECK-NEXT: blr 3790entry: 3791 %conv = zext i8 %off to i64 3792 %or = or i64 %conv, %ptr 3793 %0 = inttoptr i64 %or to ptr 3794 %conv1 = trunc i32 %str to i16 3795 store atomic i16 %conv1, ptr %0 monotonic, align 2 3796 ret void 3797} 3798 3799; Function Attrs: nofree norecurse nounwind uwtable willreturn 3800define dso_local void @st_not_disjoint16_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) { 3801; CHECK-LABEL: st_not_disjoint16_uint32_t_uint16_t: 3802; CHECK: # %bb.0: # %entry 3803; CHECK-NEXT: ori r3, r3, 6 3804; CHECK-NEXT: sth r4, 0(r3) 3805; CHECK-NEXT: blr 3806entry: 3807 %or = or i64 %ptr, 6 3808 %0 = inttoptr i64 %or to ptr 3809 %conv = trunc i32 %str to i16 3810 store atomic i16 %conv, ptr %0 monotonic, align 2 3811 ret void 3812} 3813 3814; Function Attrs: nofree norecurse nounwind uwtable willreturn 3815define dso_local void @st_disjoint_align16_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) { 3816; CHECK-LABEL: st_disjoint_align16_uint32_t_uint16_t: 3817; CHECK: # %bb.0: # %entry 3818; CHECK-NEXT: rldicr r3, r3, 0, 51 3819; CHECK-NEXT: sth r4, 24(r3) 3820; CHECK-NEXT: blr 3821entry: 3822 %and = and i64 %ptr, -4096 3823 %or = or i64 %and, 24 3824 %0 = inttoptr i64 %or to ptr 3825 %conv = trunc i32 %str to i16 3826 store atomic i16 %conv, ptr %0 monotonic, align 8 3827 ret void 3828} 3829 3830; Function Attrs: nofree norecurse nounwind uwtable willreturn 3831define dso_local void @st_not_disjoint32_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) { 3832; CHECK-LABEL: st_not_disjoint32_uint32_t_uint16_t: 3833; CHECK: # %bb.0: # %entry 3834; CHECK-NEXT: ori r3, r3, 34463 3835; CHECK-NEXT: oris r3, r3, 1 3836; CHECK-NEXT: sth r4, 0(r3) 3837; CHECK-NEXT: blr 3838entry: 3839 %or = or i64 %ptr, 99999 3840 %0 = inttoptr i64 %or to ptr 3841 %conv = trunc i32 %str to i16 3842 store atomic i16 %conv, ptr %0 monotonic, align 2 3843 ret void 3844} 3845 3846; Function Attrs: nofree norecurse nounwind uwtable willreturn 3847define dso_local void @st_disjoint_align32_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) { 3848; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint16_t: 3849; CHECK-P10: # %bb.0: # %entry 3850; CHECK-P10-NEXT: lis r5, -15264 3851; CHECK-P10-NEXT: and r3, r3, r5 3852; CHECK-P10-NEXT: psth r4, 999990000(r3), 0 3853; CHECK-P10-NEXT: blr 3854; 3855; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint16_t: 3856; CHECK-PREP10: # %bb.0: # %entry 3857; CHECK-PREP10-NEXT: lis r5, -15264 3858; CHECK-PREP10-NEXT: and r3, r3, r5 3859; CHECK-PREP10-NEXT: lis r5, 15258 3860; CHECK-PREP10-NEXT: ori r5, r5, 41712 3861; CHECK-PREP10-NEXT: sthx r4, r3, r5 3862; CHECK-PREP10-NEXT: blr 3863entry: 3864 %and = and i64 %ptr, -1000341504 3865 %or = or i64 %and, 999990000 3866 %0 = inttoptr i64 %or to ptr 3867 %conv = trunc i32 %str to i16 3868 store atomic i16 %conv, ptr %0 monotonic, align 16 3869 ret void 3870} 3871 3872; Function Attrs: nofree norecurse nounwind uwtable willreturn 3873define dso_local void @st_not_disjoint64_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) { 3874; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint16_t: 3875; CHECK-P10: # %bb.0: # %entry 3876; CHECK-P10-NEXT: pli r5, 232 3877; CHECK-P10-NEXT: pli r6, 3567587329 3878; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 3879; CHECK-P10-NEXT: or r3, r3, r6 3880; CHECK-P10-NEXT: sth r4, 0(r3) 3881; CHECK-P10-NEXT: blr 3882; 3883; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint16_t: 3884; CHECK-PREP10: # %bb.0: # %entry 3885; CHECK-PREP10-NEXT: li r5, 29 3886; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 3887; CHECK-PREP10-NEXT: oris r5, r5, 54437 3888; CHECK-PREP10-NEXT: ori r5, r5, 4097 3889; CHECK-PREP10-NEXT: or r3, r3, r5 3890; CHECK-PREP10-NEXT: sth r4, 0(r3) 3891; CHECK-PREP10-NEXT: blr 3892entry: 3893 %or = or i64 %ptr, 1000000000001 3894 %0 = inttoptr i64 %or to ptr 3895 %conv = trunc i32 %str to i16 3896 store atomic i16 %conv, ptr %0 monotonic, align 2 3897 ret void 3898} 3899 3900; Function Attrs: nofree norecurse nounwind uwtable willreturn 3901define dso_local void @st_disjoint_align64_uint32_t_uint16_t(i64 %ptr, i32 zeroext %str) { 3902; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint16_t: 3903; CHECK-P10: # %bb.0: # %entry 3904; CHECK-P10-NEXT: pli r5, 244140625 3905; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3906; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3907; CHECK-P10-NEXT: sthx r4, r3, r5 3908; CHECK-P10-NEXT: blr 3909; 3910; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint16_t: 3911; CHECK-PREP10: # %bb.0: # %entry 3912; CHECK-PREP10-NEXT: lis r5, 3725 3913; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3914; CHECK-PREP10-NEXT: ori r5, r5, 19025 3915; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3916; CHECK-PREP10-NEXT: sthx r4, r3, r5 3917; CHECK-PREP10-NEXT: blr 3918entry: 3919 %and = and i64 %ptr, -1099511627776 3920 %or = or i64 %and, 1000000000000 3921 %0 = inttoptr i64 %or to ptr 3922 %conv = trunc i32 %str to i16 3923 store atomic i16 %conv, ptr %0 monotonic, align 4096 3924 ret void 3925} 3926 3927; Function Attrs: nofree norecurse nounwind uwtable willreturn 3928define dso_local void @st_cst_align16_uint32_t_uint16_t(i32 zeroext %str) { 3929; CHECK-LABEL: st_cst_align16_uint32_t_uint16_t: 3930; CHECK: # %bb.0: # %entry 3931; CHECK-NEXT: sth r3, 4080(0) 3932; CHECK-NEXT: blr 3933entry: 3934 %conv = trunc i32 %str to i16 3935 store atomic i16 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3936 ret void 3937} 3938 3939; Function Attrs: nofree norecurse nounwind uwtable willreturn 3940define dso_local void @st_cst_align32_uint32_t_uint16_t(i32 zeroext %str) { 3941; CHECK-LABEL: st_cst_align32_uint32_t_uint16_t: 3942; CHECK: # %bb.0: # %entry 3943; CHECK-NEXT: lis r4, 153 3944; CHECK-NEXT: sth r3, -27108(r4) 3945; CHECK-NEXT: blr 3946entry: 3947 %conv = trunc i32 %str to i16 3948 store atomic i16 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 3949 ret void 3950} 3951 3952; Function Attrs: nofree norecurse nounwind uwtable willreturn 3953define dso_local void @st_cst_align64_uint32_t_uint16_t(i32 zeroext %str) { 3954; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint16_t: 3955; CHECK-P10: # %bb.0: # %entry 3956; CHECK-P10-NEXT: pli r4, 244140625 3957; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3958; CHECK-P10-NEXT: sth r3, 0(r4) 3959; CHECK-P10-NEXT: blr 3960; 3961; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint16_t: 3962; CHECK-PREP10: # %bb.0: # %entry 3963; CHECK-PREP10-NEXT: lis r4, 3725 3964; CHECK-PREP10-NEXT: ori r4, r4, 19025 3965; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3966; CHECK-PREP10-NEXT: sth r3, 0(r4) 3967; CHECK-PREP10-NEXT: blr 3968entry: 3969 %conv = trunc i32 %str to i16 3970 store atomic i16 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3971 ret void 3972} 3973 3974; Function Attrs: nofree norecurse nounwind uwtable willreturn 3975define dso_local void @st_0_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) { 3976; CHECK-LABEL: st_0_uint32_t_uint32_t: 3977; CHECK: # %bb.0: # %entry 3978; CHECK-NEXT: stw r4, 0(r3) 3979; CHECK-NEXT: blr 3980entry: 3981 %0 = inttoptr i64 %ptr to ptr 3982 store atomic i32 %str, ptr %0 monotonic, align 4 3983 ret void 3984} 3985 3986; Function Attrs: nofree norecurse nounwind uwtable willreturn 3987define dso_local void @st_align16_uint32_t_uint32_t(ptr nocapture %ptr, i32 zeroext %str) { 3988; CHECK-LABEL: st_align16_uint32_t_uint32_t: 3989; CHECK: # %bb.0: # %entry 3990; CHECK-NEXT: stw r4, 8(r3) 3991; CHECK-NEXT: blr 3992entry: 3993 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3994 store atomic i32 %str, ptr %add.ptr monotonic, align 4 3995 ret void 3996} 3997 3998; Function Attrs: nofree norecurse nounwind uwtable willreturn 3999define dso_local void @st_align32_uint32_t_uint32_t(ptr nocapture %ptr, i32 zeroext %str) { 4000; CHECK-P10-LABEL: st_align32_uint32_t_uint32_t: 4001; CHECK-P10: # %bb.0: # %entry 4002; CHECK-P10-NEXT: pstw r4, 99999000(r3), 0 4003; CHECK-P10-NEXT: blr 4004; 4005; CHECK-PREP10-LABEL: st_align32_uint32_t_uint32_t: 4006; CHECK-PREP10: # %bb.0: # %entry 4007; CHECK-PREP10-NEXT: lis r5, 1525 4008; CHECK-PREP10-NEXT: ori r5, r5, 56600 4009; CHECK-PREP10-NEXT: stwx r4, r3, r5 4010; CHECK-PREP10-NEXT: blr 4011entry: 4012 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 4013 store atomic i32 %str, ptr %add.ptr monotonic, align 4 4014 ret void 4015} 4016 4017; Function Attrs: nofree norecurse nounwind uwtable willreturn 4018define dso_local void @st_align64_uint32_t_uint32_t(ptr nocapture %ptr, i32 zeroext %str) { 4019; CHECK-P10-LABEL: st_align64_uint32_t_uint32_t: 4020; CHECK-P10: # %bb.0: # %entry 4021; CHECK-P10-NEXT: pli r5, 244140625 4022; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4023; CHECK-P10-NEXT: stwx r4, r3, r5 4024; CHECK-P10-NEXT: blr 4025; 4026; CHECK-PREP10-LABEL: st_align64_uint32_t_uint32_t: 4027; CHECK-PREP10: # %bb.0: # %entry 4028; CHECK-PREP10-NEXT: lis r5, 3725 4029; CHECK-PREP10-NEXT: ori r5, r5, 19025 4030; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4031; CHECK-PREP10-NEXT: stwx r4, r3, r5 4032; CHECK-PREP10-NEXT: blr 4033entry: 4034 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 4035 store atomic i32 %str, ptr %add.ptr monotonic, align 4 4036 ret void 4037} 4038 4039; Function Attrs: nofree norecurse nounwind uwtable willreturn 4040define dso_local void @st_reg_uint32_t_uint32_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) { 4041; CHECK-LABEL: st_reg_uint32_t_uint32_t: 4042; CHECK: # %bb.0: # %entry 4043; CHECK-NEXT: stwx r5, r3, r4 4044; CHECK-NEXT: blr 4045entry: 4046 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 4047 store atomic i32 %str, ptr %add.ptr monotonic, align 4 4048 ret void 4049} 4050 4051; Function Attrs: nofree norecurse nounwind uwtable willreturn 4052define dso_local void @st_or1_uint32_t_uint32_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) { 4053; CHECK-LABEL: st_or1_uint32_t_uint32_t: 4054; CHECK: # %bb.0: # %entry 4055; CHECK-NEXT: or r3, r4, r3 4056; CHECK-NEXT: stw r5, 0(r3) 4057; CHECK-NEXT: blr 4058entry: 4059 %conv = zext i8 %off to i64 4060 %or = or i64 %conv, %ptr 4061 %0 = inttoptr i64 %or to ptr 4062 store atomic i32 %str, ptr %0 monotonic, align 4 4063 ret void 4064} 4065 4066; Function Attrs: nofree norecurse nounwind uwtable willreturn 4067define dso_local void @st_not_disjoint16_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) { 4068; CHECK-LABEL: st_not_disjoint16_uint32_t_uint32_t: 4069; CHECK: # %bb.0: # %entry 4070; CHECK-NEXT: ori r3, r3, 6 4071; CHECK-NEXT: stw r4, 0(r3) 4072; CHECK-NEXT: blr 4073entry: 4074 %or = or i64 %ptr, 6 4075 %0 = inttoptr i64 %or to ptr 4076 store atomic i32 %str, ptr %0 monotonic, align 4 4077 ret void 4078} 4079 4080; Function Attrs: nofree norecurse nounwind uwtable willreturn 4081define dso_local void @st_disjoint_align16_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) { 4082; CHECK-LABEL: st_disjoint_align16_uint32_t_uint32_t: 4083; CHECK: # %bb.0: # %entry 4084; CHECK-NEXT: rldicr r3, r3, 0, 51 4085; CHECK-NEXT: stw r4, 24(r3) 4086; CHECK-NEXT: blr 4087entry: 4088 %and = and i64 %ptr, -4096 4089 %or = or i64 %and, 24 4090 %0 = inttoptr i64 %or to ptr 4091 store atomic i32 %str, ptr %0 monotonic, align 8 4092 ret void 4093} 4094 4095; Function Attrs: nofree norecurse nounwind uwtable willreturn 4096define dso_local void @st_not_disjoint32_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) { 4097; CHECK-LABEL: st_not_disjoint32_uint32_t_uint32_t: 4098; CHECK: # %bb.0: # %entry 4099; CHECK-NEXT: ori r3, r3, 34463 4100; CHECK-NEXT: oris r3, r3, 1 4101; CHECK-NEXT: stw r4, 0(r3) 4102; CHECK-NEXT: blr 4103entry: 4104 %or = or i64 %ptr, 99999 4105 %0 = inttoptr i64 %or to ptr 4106 store atomic i32 %str, ptr %0 monotonic, align 4 4107 ret void 4108} 4109 4110; Function Attrs: nofree norecurse nounwind uwtable willreturn 4111define dso_local void @st_disjoint_align32_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) { 4112; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint32_t: 4113; CHECK-P10: # %bb.0: # %entry 4114; CHECK-P10-NEXT: lis r5, -15264 4115; CHECK-P10-NEXT: and r3, r3, r5 4116; CHECK-P10-NEXT: pstw r4, 999990000(r3), 0 4117; CHECK-P10-NEXT: blr 4118; 4119; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint32_t: 4120; CHECK-PREP10: # %bb.0: # %entry 4121; CHECK-PREP10-NEXT: lis r5, -15264 4122; CHECK-PREP10-NEXT: and r3, r3, r5 4123; CHECK-PREP10-NEXT: lis r5, 15258 4124; CHECK-PREP10-NEXT: ori r5, r5, 41712 4125; CHECK-PREP10-NEXT: stwx r4, r3, r5 4126; CHECK-PREP10-NEXT: blr 4127entry: 4128 %and = and i64 %ptr, -1000341504 4129 %or = or i64 %and, 999990000 4130 %0 = inttoptr i64 %or to ptr 4131 store atomic i32 %str, ptr %0 monotonic, align 16 4132 ret void 4133} 4134 4135; Function Attrs: nofree norecurse nounwind uwtable willreturn 4136define dso_local void @st_not_disjoint64_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) { 4137; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint32_t: 4138; CHECK-P10: # %bb.0: # %entry 4139; CHECK-P10-NEXT: pli r5, 232 4140; CHECK-P10-NEXT: pli r6, 3567587329 4141; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 4142; CHECK-P10-NEXT: or r3, r3, r6 4143; CHECK-P10-NEXT: stw r4, 0(r3) 4144; CHECK-P10-NEXT: blr 4145; 4146; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint32_t: 4147; CHECK-PREP10: # %bb.0: # %entry 4148; CHECK-PREP10-NEXT: li r5, 29 4149; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 4150; CHECK-PREP10-NEXT: oris r5, r5, 54437 4151; CHECK-PREP10-NEXT: ori r5, r5, 4097 4152; CHECK-PREP10-NEXT: or r3, r3, r5 4153; CHECK-PREP10-NEXT: stw r4, 0(r3) 4154; CHECK-PREP10-NEXT: blr 4155entry: 4156 %or = or i64 %ptr, 1000000000001 4157 %0 = inttoptr i64 %or to ptr 4158 store atomic i32 %str, ptr %0 monotonic, align 4 4159 ret void 4160} 4161 4162; Function Attrs: nofree norecurse nounwind uwtable willreturn 4163define dso_local void @st_disjoint_align64_uint32_t_uint32_t(i64 %ptr, i32 zeroext %str) { 4164; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint32_t: 4165; CHECK-P10: # %bb.0: # %entry 4166; CHECK-P10-NEXT: pli r5, 244140625 4167; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 4168; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4169; CHECK-P10-NEXT: stwx r4, r3, r5 4170; CHECK-P10-NEXT: blr 4171; 4172; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint32_t: 4173; CHECK-PREP10: # %bb.0: # %entry 4174; CHECK-PREP10-NEXT: lis r5, 3725 4175; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 4176; CHECK-PREP10-NEXT: ori r5, r5, 19025 4177; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4178; CHECK-PREP10-NEXT: stwx r4, r3, r5 4179; CHECK-PREP10-NEXT: blr 4180entry: 4181 %and = and i64 %ptr, -1099511627776 4182 %or = or i64 %and, 1000000000000 4183 %0 = inttoptr i64 %or to ptr 4184 store atomic i32 %str, ptr %0 monotonic, align 4096 4185 ret void 4186} 4187 4188; Function Attrs: nofree norecurse nounwind uwtable willreturn 4189define dso_local void @st_cst_align16_uint32_t_uint32_t(i32 zeroext %str) { 4190; CHECK-LABEL: st_cst_align16_uint32_t_uint32_t: 4191; CHECK: # %bb.0: # %entry 4192; CHECK-NEXT: stw r3, 4080(0) 4193; CHECK-NEXT: blr 4194entry: 4195 store atomic i32 %str, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 4196 ret void 4197} 4198 4199; Function Attrs: nofree norecurse nounwind uwtable willreturn 4200define dso_local void @st_cst_align32_uint32_t_uint32_t(i32 zeroext %str) { 4201; CHECK-LABEL: st_cst_align32_uint32_t_uint32_t: 4202; CHECK: # %bb.0: # %entry 4203; CHECK-NEXT: lis r4, 153 4204; CHECK-NEXT: stw r3, -27108(r4) 4205; CHECK-NEXT: blr 4206entry: 4207 store atomic i32 %str, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 4208 ret void 4209} 4210 4211; Function Attrs: nofree norecurse nounwind uwtable willreturn 4212define dso_local void @st_cst_align64_uint32_t_uint32_t(i32 zeroext %str) { 4213; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint32_t: 4214; CHECK-P10: # %bb.0: # %entry 4215; CHECK-P10-NEXT: pli r4, 244140625 4216; CHECK-P10-NEXT: rldic r4, r4, 12, 24 4217; CHECK-P10-NEXT: stw r3, 0(r4) 4218; CHECK-P10-NEXT: blr 4219; 4220; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint32_t: 4221; CHECK-PREP10: # %bb.0: # %entry 4222; CHECK-PREP10-NEXT: lis r4, 3725 4223; CHECK-PREP10-NEXT: ori r4, r4, 19025 4224; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 4225; CHECK-PREP10-NEXT: stw r3, 0(r4) 4226; CHECK-PREP10-NEXT: blr 4227entry: 4228 store atomic i32 %str, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 4229 ret void 4230} 4231 4232; Function Attrs: nofree norecurse nounwind uwtable willreturn 4233define dso_local void @st_0_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) { 4234; CHECK-LABEL: st_0_uint32_t_uint64_t: 4235; CHECK: # %bb.0: # %entry 4236; CHECK-NEXT: std r4, 0(r3) 4237; CHECK-NEXT: blr 4238entry: 4239 %0 = inttoptr i64 %ptr to ptr 4240 %conv = zext i32 %str to i64 4241 store atomic i64 %conv, ptr %0 monotonic, align 8 4242 ret void 4243} 4244 4245; Function Attrs: nofree norecurse nounwind uwtable willreturn 4246define dso_local void @st_align16_uint32_t_uint64_t(ptr nocapture %ptr, i32 zeroext %str) { 4247; CHECK-LABEL: st_align16_uint32_t_uint64_t: 4248; CHECK: # %bb.0: # %entry 4249; CHECK-NEXT: std r4, 8(r3) 4250; CHECK-NEXT: blr 4251entry: 4252 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 4253 %conv = zext i32 %str to i64 4254 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4255 ret void 4256} 4257 4258; Function Attrs: nofree norecurse nounwind uwtable willreturn 4259define dso_local void @st_align32_uint32_t_uint64_t(ptr nocapture %ptr, i32 zeroext %str) { 4260; CHECK-P10-LABEL: st_align32_uint32_t_uint64_t: 4261; CHECK-P10: # %bb.0: # %entry 4262; CHECK-P10-NEXT: pstd r4, 99999000(r3), 0 4263; CHECK-P10-NEXT: blr 4264; 4265; CHECK-PREP10-LABEL: st_align32_uint32_t_uint64_t: 4266; CHECK-PREP10: # %bb.0: # %entry 4267; CHECK-PREP10-NEXT: lis r5, 1525 4268; CHECK-PREP10-NEXT: ori r5, r5, 56600 4269; CHECK-PREP10-NEXT: stdx r4, r3, r5 4270; CHECK-PREP10-NEXT: blr 4271entry: 4272 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 4273 %conv = zext i32 %str to i64 4274 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4275 ret void 4276} 4277 4278; Function Attrs: nofree norecurse nounwind uwtable willreturn 4279define dso_local void @st_align64_uint32_t_uint64_t(ptr nocapture %ptr, i32 zeroext %str) { 4280; CHECK-P10-LABEL: st_align64_uint32_t_uint64_t: 4281; CHECK-P10: # %bb.0: # %entry 4282; CHECK-P10-NEXT: pli r5, 244140625 4283; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4284; CHECK-P10-NEXT: stdx r4, r3, r5 4285; CHECK-P10-NEXT: blr 4286; 4287; CHECK-PREP10-LABEL: st_align64_uint32_t_uint64_t: 4288; CHECK-PREP10: # %bb.0: # %entry 4289; CHECK-PREP10-NEXT: lis r5, 3725 4290; CHECK-PREP10-NEXT: ori r5, r5, 19025 4291; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4292; CHECK-PREP10-NEXT: stdx r4, r3, r5 4293; CHECK-PREP10-NEXT: blr 4294entry: 4295 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 4296 %conv = zext i32 %str to i64 4297 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4298 ret void 4299} 4300 4301; Function Attrs: nofree norecurse nounwind uwtable willreturn 4302define dso_local void @st_reg_uint32_t_uint64_t(ptr nocapture %ptr, i64 %off, i32 zeroext %str) { 4303; CHECK-LABEL: st_reg_uint32_t_uint64_t: 4304; CHECK: # %bb.0: # %entry 4305; CHECK-NEXT: stdx r5, r3, r4 4306; CHECK-NEXT: blr 4307entry: 4308 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 4309 %conv = zext i32 %str to i64 4310 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4311 ret void 4312} 4313 4314; Function Attrs: nofree norecurse nounwind uwtable willreturn 4315define dso_local void @st_or1_uint32_t_uint64_t(i64 %ptr, i8 zeroext %off, i32 zeroext %str) { 4316; CHECK-LABEL: st_or1_uint32_t_uint64_t: 4317; CHECK: # %bb.0: # %entry 4318; CHECK-NEXT: or r3, r4, r3 4319; CHECK-NEXT: std r5, 0(r3) 4320; CHECK-NEXT: blr 4321entry: 4322 %conv = zext i8 %off to i64 4323 %or = or i64 %conv, %ptr 4324 %0 = inttoptr i64 %or to ptr 4325 %conv1 = zext i32 %str to i64 4326 store atomic i64 %conv1, ptr %0 monotonic, align 8 4327 ret void 4328} 4329 4330; Function Attrs: nofree norecurse nounwind uwtable willreturn 4331define dso_local void @st_not_disjoint16_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) { 4332; CHECK-LABEL: st_not_disjoint16_uint32_t_uint64_t: 4333; CHECK: # %bb.0: # %entry 4334; CHECK-NEXT: ori r3, r3, 6 4335; CHECK-NEXT: std r4, 0(r3) 4336; CHECK-NEXT: blr 4337entry: 4338 %or = or i64 %ptr, 6 4339 %0 = inttoptr i64 %or to ptr 4340 %conv = zext i32 %str to i64 4341 store atomic i64 %conv, ptr %0 monotonic, align 8 4342 ret void 4343} 4344 4345; Function Attrs: nofree norecurse nounwind uwtable willreturn 4346define dso_local void @st_disjoint_align16_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) { 4347; CHECK-LABEL: st_disjoint_align16_uint32_t_uint64_t: 4348; CHECK: # %bb.0: # %entry 4349; CHECK-NEXT: rldicr r3, r3, 0, 51 4350; CHECK-NEXT: std r4, 24(r3) 4351; CHECK-NEXT: blr 4352entry: 4353 %and = and i64 %ptr, -4096 4354 %or = or i64 %and, 24 4355 %0 = inttoptr i64 %or to ptr 4356 %conv = zext i32 %str to i64 4357 store atomic i64 %conv, ptr %0 monotonic, align 8 4358 ret void 4359} 4360 4361; Function Attrs: nofree norecurse nounwind uwtable willreturn 4362define dso_local void @st_not_disjoint32_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) { 4363; CHECK-LABEL: st_not_disjoint32_uint32_t_uint64_t: 4364; CHECK: # %bb.0: # %entry 4365; CHECK-NEXT: ori r3, r3, 34463 4366; CHECK-NEXT: oris r3, r3, 1 4367; CHECK-NEXT: std r4, 0(r3) 4368; CHECK-NEXT: blr 4369entry: 4370 %or = or i64 %ptr, 99999 4371 %0 = inttoptr i64 %or to ptr 4372 %conv = zext i32 %str to i64 4373 store atomic i64 %conv, ptr %0 monotonic, align 8 4374 ret void 4375} 4376 4377; Function Attrs: nofree norecurse nounwind uwtable willreturn 4378define dso_local void @st_disjoint_align32_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) { 4379; CHECK-P10-LABEL: st_disjoint_align32_uint32_t_uint64_t: 4380; CHECK-P10: # %bb.0: # %entry 4381; CHECK-P10-NEXT: lis r5, -15264 4382; CHECK-P10-NEXT: and r3, r3, r5 4383; CHECK-P10-NEXT: pstd r4, 999990000(r3), 0 4384; CHECK-P10-NEXT: blr 4385; 4386; CHECK-PREP10-LABEL: st_disjoint_align32_uint32_t_uint64_t: 4387; CHECK-PREP10: # %bb.0: # %entry 4388; CHECK-PREP10-NEXT: lis r5, -15264 4389; CHECK-PREP10-NEXT: and r3, r3, r5 4390; CHECK-PREP10-NEXT: lis r5, 15258 4391; CHECK-PREP10-NEXT: ori r5, r5, 41712 4392; CHECK-PREP10-NEXT: stdx r4, r3, r5 4393; CHECK-PREP10-NEXT: blr 4394entry: 4395 %and = and i64 %ptr, -1000341504 4396 %or = or i64 %and, 999990000 4397 %0 = inttoptr i64 %or to ptr 4398 %conv = zext i32 %str to i64 4399 store atomic i64 %conv, ptr %0 monotonic, align 16 4400 ret void 4401} 4402 4403; Function Attrs: nofree norecurse nounwind uwtable willreturn 4404define dso_local void @st_not_disjoint64_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) { 4405; CHECK-P10-LABEL: st_not_disjoint64_uint32_t_uint64_t: 4406; CHECK-P10: # %bb.0: # %entry 4407; CHECK-P10-NEXT: pli r5, 232 4408; CHECK-P10-NEXT: pli r6, 3567587329 4409; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 4410; CHECK-P10-NEXT: or r3, r3, r6 4411; CHECK-P10-NEXT: std r4, 0(r3) 4412; CHECK-P10-NEXT: blr 4413; 4414; CHECK-PREP10-LABEL: st_not_disjoint64_uint32_t_uint64_t: 4415; CHECK-PREP10: # %bb.0: # %entry 4416; CHECK-PREP10-NEXT: li r5, 29 4417; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 4418; CHECK-PREP10-NEXT: oris r5, r5, 54437 4419; CHECK-PREP10-NEXT: ori r5, r5, 4097 4420; CHECK-PREP10-NEXT: or r3, r3, r5 4421; CHECK-PREP10-NEXT: std r4, 0(r3) 4422; CHECK-PREP10-NEXT: blr 4423entry: 4424 %or = or i64 %ptr, 1000000000001 4425 %0 = inttoptr i64 %or to ptr 4426 %conv = zext i32 %str to i64 4427 store atomic i64 %conv, ptr %0 monotonic, align 8 4428 ret void 4429} 4430 4431; Function Attrs: nofree norecurse nounwind uwtable willreturn 4432define dso_local void @st_disjoint_align64_uint32_t_uint64_t(i64 %ptr, i32 zeroext %str) { 4433; CHECK-P10-LABEL: st_disjoint_align64_uint32_t_uint64_t: 4434; CHECK-P10: # %bb.0: # %entry 4435; CHECK-P10-NEXT: pli r5, 244140625 4436; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 4437; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4438; CHECK-P10-NEXT: stdx r4, r3, r5 4439; CHECK-P10-NEXT: blr 4440; 4441; CHECK-PREP10-LABEL: st_disjoint_align64_uint32_t_uint64_t: 4442; CHECK-PREP10: # %bb.0: # %entry 4443; CHECK-PREP10-NEXT: lis r5, 3725 4444; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 4445; CHECK-PREP10-NEXT: ori r5, r5, 19025 4446; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4447; CHECK-PREP10-NEXT: stdx r4, r3, r5 4448; CHECK-PREP10-NEXT: blr 4449entry: 4450 %and = and i64 %ptr, -1099511627776 4451 %or = or i64 %and, 1000000000000 4452 %0 = inttoptr i64 %or to ptr 4453 %conv = zext i32 %str to i64 4454 store atomic i64 %conv, ptr %0 monotonic, align 4096 4455 ret void 4456} 4457 4458; Function Attrs: nofree norecurse nounwind uwtable willreturn 4459define dso_local void @st_cst_align16_uint32_t_uint64_t(i32 zeroext %str) { 4460; CHECK-LABEL: st_cst_align16_uint32_t_uint64_t: 4461; CHECK: # %bb.0: # %entry 4462; CHECK-NEXT: std r3, 4080(0) 4463; CHECK-NEXT: blr 4464entry: 4465 %conv = zext i32 %str to i64 4466 store atomic i64 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 4467 ret void 4468} 4469 4470; Function Attrs: nofree norecurse nounwind uwtable willreturn 4471define dso_local void @st_cst_align32_uint32_t_uint64_t(i32 zeroext %str) { 4472; CHECK-LABEL: st_cst_align32_uint32_t_uint64_t: 4473; CHECK: # %bb.0: # %entry 4474; CHECK-NEXT: lis r4, 153 4475; CHECK-NEXT: std r3, -27108(r4) 4476; CHECK-NEXT: blr 4477entry: 4478 %conv = zext i32 %str to i64 4479 store atomic i64 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 4480 ret void 4481} 4482 4483; Function Attrs: nofree norecurse nounwind uwtable willreturn 4484define dso_local void @st_cst_align64_uint32_t_uint64_t(i32 zeroext %str) { 4485; CHECK-P10-LABEL: st_cst_align64_uint32_t_uint64_t: 4486; CHECK-P10: # %bb.0: # %entry 4487; CHECK-P10-NEXT: pli r4, 244140625 4488; CHECK-P10-NEXT: rldic r4, r4, 12, 24 4489; CHECK-P10-NEXT: std r3, 0(r4) 4490; CHECK-P10-NEXT: blr 4491; 4492; CHECK-PREP10-LABEL: st_cst_align64_uint32_t_uint64_t: 4493; CHECK-PREP10: # %bb.0: # %entry 4494; CHECK-PREP10-NEXT: lis r4, 3725 4495; CHECK-PREP10-NEXT: ori r4, r4, 19025 4496; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 4497; CHECK-PREP10-NEXT: std r3, 0(r4) 4498; CHECK-PREP10-NEXT: blr 4499entry: 4500 %conv = zext i32 %str to i64 4501 store atomic i64 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 4502 ret void 4503} 4504 4505; Function Attrs: nofree norecurse nounwind uwtable willreturn 4506define dso_local void @st_0_int32_t_uint64_t(i64 %ptr, i32 signext %str) { 4507; CHECK-LABEL: st_0_int32_t_uint64_t: 4508; CHECK: # %bb.0: # %entry 4509; CHECK-NEXT: std r4, 0(r3) 4510; CHECK-NEXT: blr 4511entry: 4512 %0 = inttoptr i64 %ptr to ptr 4513 %conv = sext i32 %str to i64 4514 store atomic i64 %conv, ptr %0 monotonic, align 8 4515 ret void 4516} 4517 4518; Function Attrs: nofree norecurse nounwind uwtable willreturn 4519define dso_local void @st_align16_int32_t_uint64_t(ptr nocapture %ptr, i32 signext %str) { 4520; CHECK-LABEL: st_align16_int32_t_uint64_t: 4521; CHECK: # %bb.0: # %entry 4522; CHECK-NEXT: std r4, 8(r3) 4523; CHECK-NEXT: blr 4524entry: 4525 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 4526 %conv = sext i32 %str to i64 4527 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4528 ret void 4529} 4530 4531; Function Attrs: nofree norecurse nounwind uwtable willreturn 4532define dso_local void @st_align32_int32_t_uint64_t(ptr nocapture %ptr, i32 signext %str) { 4533; CHECK-P10-LABEL: st_align32_int32_t_uint64_t: 4534; CHECK-P10: # %bb.0: # %entry 4535; CHECK-P10-NEXT: pstd r4, 99999000(r3), 0 4536; CHECK-P10-NEXT: blr 4537; 4538; CHECK-PREP10-LABEL: st_align32_int32_t_uint64_t: 4539; CHECK-PREP10: # %bb.0: # %entry 4540; CHECK-PREP10-NEXT: lis r5, 1525 4541; CHECK-PREP10-NEXT: ori r5, r5, 56600 4542; CHECK-PREP10-NEXT: stdx r4, r3, r5 4543; CHECK-PREP10-NEXT: blr 4544entry: 4545 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 4546 %conv = sext i32 %str to i64 4547 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4548 ret void 4549} 4550 4551; Function Attrs: nofree norecurse nounwind uwtable willreturn 4552define dso_local void @st_align64_int32_t_uint64_t(ptr nocapture %ptr, i32 signext %str) { 4553; CHECK-P10-LABEL: st_align64_int32_t_uint64_t: 4554; CHECK-P10: # %bb.0: # %entry 4555; CHECK-P10-NEXT: pli r5, 244140625 4556; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4557; CHECK-P10-NEXT: stdx r4, r3, r5 4558; CHECK-P10-NEXT: blr 4559; 4560; CHECK-PREP10-LABEL: st_align64_int32_t_uint64_t: 4561; CHECK-PREP10: # %bb.0: # %entry 4562; CHECK-PREP10-NEXT: lis r5, 3725 4563; CHECK-PREP10-NEXT: ori r5, r5, 19025 4564; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4565; CHECK-PREP10-NEXT: stdx r4, r3, r5 4566; CHECK-PREP10-NEXT: blr 4567entry: 4568 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 4569 %conv = sext i32 %str to i64 4570 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4571 ret void 4572} 4573 4574; Function Attrs: nofree norecurse nounwind uwtable willreturn 4575define dso_local void @st_reg_int32_t_uint64_t(ptr nocapture %ptr, i64 %off, i32 signext %str) { 4576; CHECK-LABEL: st_reg_int32_t_uint64_t: 4577; CHECK: # %bb.0: # %entry 4578; CHECK-NEXT: stdx r5, r3, r4 4579; CHECK-NEXT: blr 4580entry: 4581 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 4582 %conv = sext i32 %str to i64 4583 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4584 ret void 4585} 4586 4587; Function Attrs: nofree norecurse nounwind uwtable willreturn 4588define dso_local void @st_or1_int32_t_uint64_t(i64 %ptr, i8 zeroext %off, i32 signext %str) { 4589; CHECK-LABEL: st_or1_int32_t_uint64_t: 4590; CHECK: # %bb.0: # %entry 4591; CHECK-NEXT: or r3, r4, r3 4592; CHECK-NEXT: std r5, 0(r3) 4593; CHECK-NEXT: blr 4594entry: 4595 %conv = zext i8 %off to i64 4596 %or = or i64 %conv, %ptr 4597 %0 = inttoptr i64 %or to ptr 4598 %conv1 = sext i32 %str to i64 4599 store atomic i64 %conv1, ptr %0 monotonic, align 8 4600 ret void 4601} 4602 4603; Function Attrs: nofree norecurse nounwind uwtable willreturn 4604define dso_local void @st_not_disjoint16_int32_t_uint64_t(i64 %ptr, i32 signext %str) { 4605; CHECK-LABEL: st_not_disjoint16_int32_t_uint64_t: 4606; CHECK: # %bb.0: # %entry 4607; CHECK-NEXT: ori r3, r3, 6 4608; CHECK-NEXT: std r4, 0(r3) 4609; CHECK-NEXT: blr 4610entry: 4611 %or = or i64 %ptr, 6 4612 %0 = inttoptr i64 %or to ptr 4613 %conv = sext i32 %str to i64 4614 store atomic i64 %conv, ptr %0 monotonic, align 8 4615 ret void 4616} 4617 4618; Function Attrs: nofree norecurse nounwind uwtable willreturn 4619define dso_local void @st_disjoint_align16_int32_t_uint64_t(i64 %ptr, i32 signext %str) { 4620; CHECK-LABEL: st_disjoint_align16_int32_t_uint64_t: 4621; CHECK: # %bb.0: # %entry 4622; CHECK-NEXT: rldicr r3, r3, 0, 51 4623; CHECK-NEXT: std r4, 24(r3) 4624; CHECK-NEXT: blr 4625entry: 4626 %and = and i64 %ptr, -4096 4627 %or = or i64 %and, 24 4628 %0 = inttoptr i64 %or to ptr 4629 %conv = sext i32 %str to i64 4630 store atomic i64 %conv, ptr %0 monotonic, align 8 4631 ret void 4632} 4633 4634; Function Attrs: nofree norecurse nounwind uwtable willreturn 4635define dso_local void @st_not_disjoint32_int32_t_uint64_t(i64 %ptr, i32 signext %str) { 4636; CHECK-LABEL: st_not_disjoint32_int32_t_uint64_t: 4637; CHECK: # %bb.0: # %entry 4638; CHECK-NEXT: ori r3, r3, 34463 4639; CHECK-NEXT: oris r3, r3, 1 4640; CHECK-NEXT: std r4, 0(r3) 4641; CHECK-NEXT: blr 4642entry: 4643 %or = or i64 %ptr, 99999 4644 %0 = inttoptr i64 %or to ptr 4645 %conv = sext i32 %str to i64 4646 store atomic i64 %conv, ptr %0 monotonic, align 8 4647 ret void 4648} 4649 4650; Function Attrs: nofree norecurse nounwind uwtable willreturn 4651define dso_local void @st_disjoint_align32_int32_t_uint64_t(i64 %ptr, i32 signext %str) { 4652; CHECK-P10-LABEL: st_disjoint_align32_int32_t_uint64_t: 4653; CHECK-P10: # %bb.0: # %entry 4654; CHECK-P10-NEXT: lis r5, -15264 4655; CHECK-P10-NEXT: and r3, r3, r5 4656; CHECK-P10-NEXT: pstd r4, 999990000(r3), 0 4657; CHECK-P10-NEXT: blr 4658; 4659; CHECK-PREP10-LABEL: st_disjoint_align32_int32_t_uint64_t: 4660; CHECK-PREP10: # %bb.0: # %entry 4661; CHECK-PREP10-NEXT: lis r5, -15264 4662; CHECK-PREP10-NEXT: and r3, r3, r5 4663; CHECK-PREP10-NEXT: lis r5, 15258 4664; CHECK-PREP10-NEXT: ori r5, r5, 41712 4665; CHECK-PREP10-NEXT: stdx r4, r3, r5 4666; CHECK-PREP10-NEXT: blr 4667entry: 4668 %and = and i64 %ptr, -1000341504 4669 %or = or i64 %and, 999990000 4670 %0 = inttoptr i64 %or to ptr 4671 %conv = sext i32 %str to i64 4672 store atomic i64 %conv, ptr %0 monotonic, align 16 4673 ret void 4674} 4675 4676; Function Attrs: nofree norecurse nounwind uwtable willreturn 4677define dso_local void @st_not_disjoint64_int32_t_uint64_t(i64 %ptr, i32 signext %str) { 4678; CHECK-P10-LABEL: st_not_disjoint64_int32_t_uint64_t: 4679; CHECK-P10: # %bb.0: # %entry 4680; CHECK-P10-NEXT: pli r5, 232 4681; CHECK-P10-NEXT: pli r6, 3567587329 4682; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 4683; CHECK-P10-NEXT: or r3, r3, r6 4684; CHECK-P10-NEXT: std r4, 0(r3) 4685; CHECK-P10-NEXT: blr 4686; 4687; CHECK-PREP10-LABEL: st_not_disjoint64_int32_t_uint64_t: 4688; CHECK-PREP10: # %bb.0: # %entry 4689; CHECK-PREP10-NEXT: li r5, 29 4690; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 4691; CHECK-PREP10-NEXT: oris r5, r5, 54437 4692; CHECK-PREP10-NEXT: ori r5, r5, 4097 4693; CHECK-PREP10-NEXT: or r3, r3, r5 4694; CHECK-PREP10-NEXT: std r4, 0(r3) 4695; CHECK-PREP10-NEXT: blr 4696entry: 4697 %or = or i64 %ptr, 1000000000001 4698 %0 = inttoptr i64 %or to ptr 4699 %conv = sext i32 %str to i64 4700 store atomic i64 %conv, ptr %0 monotonic, align 8 4701 ret void 4702} 4703 4704; Function Attrs: nofree norecurse nounwind uwtable willreturn 4705define dso_local void @st_disjoint_align64_int32_t_uint64_t(i64 %ptr, i32 signext %str) { 4706; CHECK-P10-LABEL: st_disjoint_align64_int32_t_uint64_t: 4707; CHECK-P10: # %bb.0: # %entry 4708; CHECK-P10-NEXT: pli r5, 244140625 4709; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 4710; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4711; CHECK-P10-NEXT: stdx r4, r3, r5 4712; CHECK-P10-NEXT: blr 4713; 4714; CHECK-PREP10-LABEL: st_disjoint_align64_int32_t_uint64_t: 4715; CHECK-PREP10: # %bb.0: # %entry 4716; CHECK-PREP10-NEXT: lis r5, 3725 4717; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 4718; CHECK-PREP10-NEXT: ori r5, r5, 19025 4719; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4720; CHECK-PREP10-NEXT: stdx r4, r3, r5 4721; CHECK-PREP10-NEXT: blr 4722entry: 4723 %and = and i64 %ptr, -1099511627776 4724 %or = or i64 %and, 1000000000000 4725 %0 = inttoptr i64 %or to ptr 4726 %conv = sext i32 %str to i64 4727 store atomic i64 %conv, ptr %0 monotonic, align 4096 4728 ret void 4729} 4730 4731; Function Attrs: nofree norecurse nounwind uwtable willreturn 4732define dso_local void @st_cst_align16_int32_t_uint64_t(i32 signext %str) { 4733; CHECK-LABEL: st_cst_align16_int32_t_uint64_t: 4734; CHECK: # %bb.0: # %entry 4735; CHECK-NEXT: std r3, 4080(0) 4736; CHECK-NEXT: blr 4737entry: 4738 %conv = sext i32 %str to i64 4739 store atomic i64 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 4740 ret void 4741} 4742 4743; Function Attrs: nofree norecurse nounwind uwtable willreturn 4744define dso_local void @st_cst_align32_int32_t_uint64_t(i32 signext %str) { 4745; CHECK-LABEL: st_cst_align32_int32_t_uint64_t: 4746; CHECK: # %bb.0: # %entry 4747; CHECK-NEXT: lis r4, 153 4748; CHECK-NEXT: std r3, -27108(r4) 4749; CHECK-NEXT: blr 4750entry: 4751 %conv = sext i32 %str to i64 4752 store atomic i64 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 4753 ret void 4754} 4755 4756; Function Attrs: nofree norecurse nounwind uwtable willreturn 4757define dso_local void @st_cst_align64_int32_t_uint64_t(i32 signext %str) { 4758; CHECK-P10-LABEL: st_cst_align64_int32_t_uint64_t: 4759; CHECK-P10: # %bb.0: # %entry 4760; CHECK-P10-NEXT: pli r4, 244140625 4761; CHECK-P10-NEXT: rldic r4, r4, 12, 24 4762; CHECK-P10-NEXT: std r3, 0(r4) 4763; CHECK-P10-NEXT: blr 4764; 4765; CHECK-PREP10-LABEL: st_cst_align64_int32_t_uint64_t: 4766; CHECK-PREP10: # %bb.0: # %entry 4767; CHECK-PREP10-NEXT: lis r4, 3725 4768; CHECK-PREP10-NEXT: ori r4, r4, 19025 4769; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 4770; CHECK-PREP10-NEXT: std r3, 0(r4) 4771; CHECK-PREP10-NEXT: blr 4772entry: 4773 %conv = sext i32 %str to i64 4774 store atomic i64 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 4775 ret void 4776} 4777