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,CHECK-P9 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,CHECK-P9 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,CHECK-P8 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,CHECK-P8 20 21; Function Attrs: nofree norecurse nounwind uwtable willreturn 22define dso_local i64 @ld_0_int64_t_uint8_t(i64 %ptr) { 23; CHECK-LABEL: ld_0_int64_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 i64 31 ret i64 %conv 32} 33 34; Function Attrs: nofree norecurse nounwind uwtable willreturn 35define dso_local i64 @ld_align16_int64_t_uint8_t(ptr nocapture readonly %ptr) { 36; CHECK-LABEL: ld_align16_int64_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 i64 44 ret i64 %conv 45} 46 47; Function Attrs: nofree norecurse nounwind uwtable willreturn 48define dso_local i64 @ld_align32_int64_t_uint8_t(ptr nocapture readonly %ptr) { 49; CHECK-P10-LABEL: ld_align32_int64_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_int64_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 i64 65 ret i64 %conv 66} 67 68; Function Attrs: nofree norecurse nounwind uwtable willreturn 69define dso_local i64 @ld_align64_int64_t_uint8_t(ptr nocapture readonly %ptr) { 70; CHECK-P10-LABEL: ld_align64_int64_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_int64_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 i64 88 ret i64 %conv 89} 90 91; Function Attrs: nofree norecurse nounwind uwtable willreturn 92define dso_local i64 @ld_reg_int64_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) { 93; CHECK-LABEL: ld_reg_int64_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 i64 101 ret i64 %conv 102} 103 104; Function Attrs: nofree norecurse nounwind uwtable willreturn 105define dso_local i64 @ld_or_int64_t_uint8_t(i64 %ptr, i8 zeroext %off) { 106; CHECK-LABEL: ld_or_int64_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 i64 117 ret i64 %conv1 118} 119 120; Function Attrs: nofree norecurse nounwind uwtable willreturn 121define dso_local i64 @ld_not_disjoint16_int64_t_uint8_t(i64 %ptr) { 122; CHECK-LABEL: ld_not_disjoint16_int64_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 i64 132 ret i64 %conv 133} 134 135; Function Attrs: nofree norecurse nounwind uwtable willreturn 136define dso_local i64 @ld_disjoint_align16_int64_t_uint8_t(i64 %ptr) { 137; CHECK-LABEL: ld_disjoint_align16_int64_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 i64 148 ret i64 %conv 149} 150 151; Function Attrs: nofree norecurse nounwind uwtable willreturn 152define dso_local i64 @ld_not_disjoint32_int64_t_uint8_t(i64 %ptr) { 153; CHECK-LABEL: ld_not_disjoint32_int64_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 i64 164 ret i64 %conv 165} 166 167; Function Attrs: nofree norecurse nounwind uwtable willreturn 168define dso_local i64 @ld_disjoint_align32_int64_t_uint8_t(i64 %ptr) { 169; CHECK-P10-LABEL: ld_disjoint_align32_int64_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_int64_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 i64 191 ret i64 %conv 192} 193 194; Function Attrs: nofree norecurse nounwind uwtable willreturn 195define dso_local i64 @ld_not_disjoint64_int64_t_uint8_t(i64 %ptr) { 196; CHECK-P10-LABEL: ld_not_disjoint64_int64_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_int64_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 i64 219 ret i64 %conv 220} 221 222; Function Attrs: nofree norecurse nounwind uwtable willreturn 223define dso_local i64 @ld_disjoint_align64_int64_t_uint8_t(i64 %ptr) { 224; CHECK-P10-LABEL: ld_disjoint_align64_int64_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_int64_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 i64 246 ret i64 %conv 247} 248 249; Function Attrs: nofree norecurse nounwind uwtable willreturn 250define dso_local i64 @ld_cst_align16_int64_t_uint8_t() { 251; CHECK-LABEL: ld_cst_align16_int64_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 i64 258 ret i64 %conv 259} 260 261; Function Attrs: nofree norecurse nounwind uwtable willreturn 262define dso_local i64 @ld_cst_align32_int64_t_uint8_t() { 263; CHECK-LABEL: ld_cst_align32_int64_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 i64 271 ret i64 %conv 272} 273 274; Function Attrs: nofree norecurse nounwind uwtable willreturn 275define dso_local i64 @ld_cst_align64_int64_t_uint8_t() { 276; CHECK-P10-LABEL: ld_cst_align64_int64_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_int64_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 i64 293 ret i64 %conv 294} 295 296; Function Attrs: nofree norecurse nounwind uwtable willreturn 297define dso_local i64 @ld_0_int64_t_int8_t(i64 %ptr) { 298; CHECK-LABEL: ld_0_int64_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 i64 307 ret i64 %conv 308} 309 310; Function Attrs: nofree norecurse nounwind uwtable willreturn 311define dso_local i64 @ld_align16_int64_t_int8_t(ptr nocapture readonly %ptr) { 312; CHECK-LABEL: ld_align16_int64_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 i64 321 ret i64 %conv 322} 323 324; Function Attrs: nofree norecurse nounwind uwtable willreturn 325define dso_local i64 @ld_align32_int64_t_int8_t(ptr nocapture readonly %ptr) { 326; CHECK-P10-LABEL: ld_align32_int64_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_int64_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 i64 343 ret i64 %conv 344} 345 346; Function Attrs: nofree norecurse nounwind uwtable willreturn 347define dso_local i64 @ld_align64_int64_t_int8_t(ptr nocapture readonly %ptr) { 348; CHECK-P10-LABEL: ld_align64_int64_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_int64_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 i64 368 ret i64 %conv 369} 370 371; Function Attrs: nofree norecurse nounwind uwtable willreturn 372define dso_local i64 @ld_reg_int64_t_int8_t(ptr nocapture readonly %ptr, i64 %off) { 373; CHECK-LABEL: ld_reg_int64_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 i64 382 ret i64 %conv 383} 384 385; Function Attrs: nofree norecurse nounwind uwtable willreturn 386define dso_local i64 @ld_or_int64_t_int8_t(i64 %ptr, i8 zeroext %off) { 387; CHECK-LABEL: ld_or_int64_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 i64 399 ret i64 %conv1 400} 401 402; Function Attrs: nofree norecurse nounwind uwtable willreturn 403define dso_local i64 @ld_not_disjoint16_int64_t_int8_t(i64 %ptr) { 404; CHECK-LABEL: ld_not_disjoint16_int64_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 i64 415 ret i64 %conv 416} 417 418; Function Attrs: nofree norecurse nounwind uwtable willreturn 419define dso_local i64 @ld_disjoint_align16_int64_t_int8_t(i64 %ptr) { 420; CHECK-LABEL: ld_disjoint_align16_int64_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 i64 432 ret i64 %conv 433} 434 435; Function Attrs: nofree norecurse nounwind uwtable willreturn 436define dso_local i64 @ld_not_disjoint32_int64_t_int8_t(i64 %ptr) { 437; CHECK-LABEL: ld_not_disjoint32_int64_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 i64 449 ret i64 %conv 450} 451 452; Function Attrs: nofree norecurse nounwind uwtable willreturn 453define dso_local i64 @ld_disjoint_align32_int64_t_int8_t(i64 %ptr) { 454; CHECK-P10-LABEL: ld_disjoint_align32_int64_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_int64_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 i64 477 ret i64 %conv 478} 479 480; Function Attrs: nofree norecurse nounwind uwtable willreturn 481define dso_local i64 @ld_not_disjoint64_int64_t_int8_t(i64 %ptr) { 482; CHECK-P10-LABEL: ld_not_disjoint64_int64_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_int64_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 i64 507 ret i64 %conv 508} 509 510; Function Attrs: nofree norecurse nounwind uwtable willreturn 511define dso_local i64 @ld_disjoint_align64_int64_t_int8_t(i64 %ptr) { 512; CHECK-P10-LABEL: ld_disjoint_align64_int64_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_int64_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 i64 536 ret i64 %conv 537} 538 539; Function Attrs: nofree norecurse nounwind uwtable willreturn 540define dso_local i64 @ld_cst_align16_int64_t_int8_t() { 541; CHECK-LABEL: ld_cst_align16_int64_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 i64 549 ret i64 %conv 550} 551 552; Function Attrs: nofree norecurse nounwind uwtable willreturn 553define dso_local i64 @ld_cst_align32_int64_t_int8_t() { 554; CHECK-LABEL: ld_cst_align32_int64_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 i64 563 ret i64 %conv 564} 565 566; Function Attrs: nofree norecurse nounwind uwtable willreturn 567define dso_local i64 @ld_cst_align64_int64_t_int8_t() { 568; CHECK-P10-LABEL: ld_cst_align64_int64_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_int64_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 i64 587 ret i64 %conv 588} 589 590; Function Attrs: nofree norecurse nounwind uwtable willreturn 591define dso_local i64 @ld_0_int64_t_uint16_t(i64 %ptr) { 592; CHECK-LABEL: ld_0_int64_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 i64 600 ret i64 %conv 601} 602 603; Function Attrs: nofree norecurse nounwind uwtable willreturn 604define dso_local i64 @ld_align16_int64_t_uint16_t(ptr nocapture readonly %ptr) { 605; CHECK-LABEL: ld_align16_int64_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 i64 613 ret i64 %conv 614} 615 616; Function Attrs: nofree norecurse nounwind uwtable willreturn 617define dso_local i64 @ld_align32_int64_t_uint16_t(ptr nocapture readonly %ptr) { 618; CHECK-P10-LABEL: ld_align32_int64_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_int64_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 i64 634 ret i64 %conv 635} 636 637; Function Attrs: nofree norecurse nounwind uwtable willreturn 638define dso_local i64 @ld_align64_int64_t_uint16_t(ptr nocapture readonly %ptr) { 639; CHECK-P10-LABEL: ld_align64_int64_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_int64_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 i64 657 ret i64 %conv 658} 659 660; Function Attrs: nofree norecurse nounwind uwtable willreturn 661define dso_local i64 @ld_reg_int64_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) { 662; CHECK-LABEL: ld_reg_int64_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 i64 670 ret i64 %conv 671} 672 673; Function Attrs: nofree norecurse nounwind uwtable willreturn 674define dso_local i64 @ld_or_int64_t_uint16_t(i64 %ptr, i8 zeroext %off) { 675; CHECK-LABEL: ld_or_int64_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 i64 686 ret i64 %conv1 687} 688 689; Function Attrs: nofree norecurse nounwind uwtable willreturn 690define dso_local i64 @ld_not_disjoint16_int64_t_uint16_t(i64 %ptr) { 691; CHECK-LABEL: ld_not_disjoint16_int64_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 i64 701 ret i64 %conv 702} 703 704; Function Attrs: nofree norecurse nounwind uwtable willreturn 705define dso_local i64 @ld_disjoint_align16_int64_t_uint16_t(i64 %ptr) { 706; CHECK-LABEL: ld_disjoint_align16_int64_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 i64 717 ret i64 %conv 718} 719 720; Function Attrs: nofree norecurse nounwind uwtable willreturn 721define dso_local i64 @ld_not_disjoint32_int64_t_uint16_t(i64 %ptr) { 722; CHECK-LABEL: ld_not_disjoint32_int64_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 i64 733 ret i64 %conv 734} 735 736; Function Attrs: nofree norecurse nounwind uwtable willreturn 737define dso_local i64 @ld_disjoint_align32_int64_t_uint16_t(i64 %ptr) { 738; CHECK-P10-LABEL: ld_disjoint_align32_int64_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_int64_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 i64 760 ret i64 %conv 761} 762 763; Function Attrs: nofree norecurse nounwind uwtable willreturn 764define dso_local i64 @ld_not_disjoint64_int64_t_uint16_t(i64 %ptr) { 765; CHECK-P10-LABEL: ld_not_disjoint64_int64_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_int64_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 i64 788 ret i64 %conv 789} 790 791; Function Attrs: nofree norecurse nounwind uwtable willreturn 792define dso_local i64 @ld_disjoint_align64_int64_t_uint16_t(i64 %ptr) { 793; CHECK-P10-LABEL: ld_disjoint_align64_int64_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_int64_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 i64 815 ret i64 %conv 816} 817 818; Function Attrs: nofree norecurse nounwind uwtable willreturn 819define dso_local i64 @ld_cst_align16_int64_t_uint16_t() { 820; CHECK-LABEL: ld_cst_align16_int64_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 i64 827 ret i64 %conv 828} 829 830; Function Attrs: nofree norecurse nounwind uwtable willreturn 831define dso_local i64 @ld_cst_align32_int64_t_uint16_t() { 832; CHECK-LABEL: ld_cst_align32_int64_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 i64 840 ret i64 %conv 841} 842 843; Function Attrs: nofree norecurse nounwind uwtable willreturn 844define dso_local i64 @ld_cst_align64_int64_t_uint16_t() { 845; CHECK-P10-LABEL: ld_cst_align64_int64_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_int64_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 i64 862 ret i64 %conv 863} 864 865; Function Attrs: nofree norecurse nounwind uwtable willreturn 866define dso_local i64 @ld_0_int64_t_int16_t(i64 %ptr) { 867; CHECK-LABEL: ld_0_int64_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 i64 876 ret i64 %conv 877} 878 879; Function Attrs: nofree norecurse nounwind uwtable willreturn 880define dso_local i64 @ld_align16_int64_t_int16_t(ptr nocapture readonly %ptr) { 881; CHECK-LABEL: ld_align16_int64_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 i64 890 ret i64 %conv 891} 892 893; Function Attrs: nofree norecurse nounwind uwtable willreturn 894define dso_local i64 @ld_align32_int64_t_int16_t(ptr nocapture readonly %ptr) { 895; CHECK-P10-LABEL: ld_align32_int64_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_int64_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 i64 912 ret i64 %conv 913} 914 915; Function Attrs: nofree norecurse nounwind uwtable willreturn 916define dso_local i64 @ld_align64_int64_t_int16_t(ptr nocapture readonly %ptr) { 917; CHECK-P10-LABEL: ld_align64_int64_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_int64_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 i64 937 ret i64 %conv 938} 939 940; Function Attrs: nofree norecurse nounwind uwtable willreturn 941define dso_local i64 @ld_reg_int64_t_int16_t(ptr nocapture readonly %ptr, i64 %off) { 942; CHECK-LABEL: ld_reg_int64_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 i64 951 ret i64 %conv 952} 953 954; Function Attrs: nofree norecurse nounwind uwtable willreturn 955define dso_local i64 @ld_or_int64_t_int16_t(i64 %ptr, i8 zeroext %off) { 956; CHECK-LABEL: ld_or_int64_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 i64 968 ret i64 %conv1 969} 970 971; Function Attrs: nofree norecurse nounwind uwtable willreturn 972define dso_local i64 @ld_not_disjoint16_int64_t_int16_t(i64 %ptr) { 973; CHECK-LABEL: ld_not_disjoint16_int64_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 i64 984 ret i64 %conv 985} 986 987; Function Attrs: nofree norecurse nounwind uwtable willreturn 988define dso_local i64 @ld_disjoint_align16_int64_t_int16_t(i64 %ptr) { 989; CHECK-LABEL: ld_disjoint_align16_int64_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 i64 1001 ret i64 %conv 1002} 1003 1004; Function Attrs: nofree norecurse nounwind uwtable willreturn 1005define dso_local i64 @ld_not_disjoint32_int64_t_int16_t(i64 %ptr) { 1006; CHECK-LABEL: ld_not_disjoint32_int64_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 i64 1018 ret i64 %conv 1019} 1020 1021; Function Attrs: nofree norecurse nounwind uwtable willreturn 1022define dso_local i64 @ld_disjoint_align32_int64_t_int16_t(i64 %ptr) { 1023; CHECK-P10-LABEL: ld_disjoint_align32_int64_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_int64_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 i64 1046 ret i64 %conv 1047} 1048 1049; Function Attrs: nofree norecurse nounwind uwtable willreturn 1050define dso_local i64 @ld_not_disjoint64_int64_t_int16_t(i64 %ptr) { 1051; CHECK-P10-LABEL: ld_not_disjoint64_int64_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_int64_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 i64 1076 ret i64 %conv 1077} 1078 1079; Function Attrs: nofree norecurse nounwind uwtable willreturn 1080define dso_local i64 @ld_disjoint_align64_int64_t_int16_t(i64 %ptr) { 1081; CHECK-P10-LABEL: ld_disjoint_align64_int64_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_int64_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 i64 1105 ret i64 %conv 1106} 1107 1108; Function Attrs: nofree norecurse nounwind uwtable willreturn 1109define dso_local i64 @ld_cst_align16_int64_t_int16_t() { 1110; CHECK-LABEL: ld_cst_align16_int64_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 i64 1118 ret i64 %conv 1119} 1120 1121; Function Attrs: nofree norecurse nounwind uwtable willreturn 1122define dso_local i64 @ld_cst_align32_int64_t_int16_t() { 1123; CHECK-LABEL: ld_cst_align32_int64_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 i64 1132 ret i64 %conv 1133} 1134 1135; Function Attrs: nofree norecurse nounwind uwtable willreturn 1136define dso_local i64 @ld_cst_align64_int64_t_int16_t() { 1137; CHECK-P10-LABEL: ld_cst_align64_int64_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_int64_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 i64 1156 ret i64 %conv 1157} 1158 1159; Function Attrs: nofree norecurse nounwind uwtable willreturn 1160define dso_local i64 @ld_0_int64_t_uint32_t(i64 %ptr) { 1161; CHECK-LABEL: ld_0_int64_t_uint32_t: 1162; CHECK: # %bb.0: # %entry 1163; CHECK-NEXT: lwz 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 %conv = zext i32 %1 to i64 1169 ret i64 %conv 1170} 1171 1172; Function Attrs: nofree norecurse nounwind uwtable willreturn 1173define dso_local i64 @ld_align16_int64_t_uint32_t(ptr nocapture readonly %ptr) { 1174; CHECK-LABEL: ld_align16_int64_t_uint32_t: 1175; CHECK: # %bb.0: # %entry 1176; CHECK-NEXT: lwz r3, 8(r3) 1177; CHECK-NEXT: blr 1178entry: 1179 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1180 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1181 %conv = zext i32 %0 to i64 1182 ret i64 %conv 1183} 1184 1185; Function Attrs: nofree norecurse nounwind uwtable willreturn 1186define dso_local i64 @ld_align32_int64_t_uint32_t(ptr nocapture readonly %ptr) { 1187; CHECK-P10-LABEL: ld_align32_int64_t_uint32_t: 1188; CHECK-P10: # %bb.0: # %entry 1189; CHECK-P10-NEXT: plwz r3, 99999000(r3), 0 1190; CHECK-P10-NEXT: clrldi r3, r3, 32 1191; CHECK-P10-NEXT: blr 1192; 1193; CHECK-PREP10-LABEL: ld_align32_int64_t_uint32_t: 1194; CHECK-PREP10: # %bb.0: # %entry 1195; CHECK-PREP10-NEXT: lis r4, 1525 1196; CHECK-PREP10-NEXT: ori r4, r4, 56600 1197; CHECK-PREP10-NEXT: lwzx r3, r3, r4 1198; CHECK-PREP10-NEXT: blr 1199entry: 1200 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 1201 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1202 %conv = zext i32 %0 to i64 1203 ret i64 %conv 1204} 1205 1206; Function Attrs: nofree norecurse nounwind uwtable willreturn 1207define dso_local i64 @ld_align64_int64_t_uint32_t(ptr nocapture readonly %ptr) { 1208; CHECK-P10-LABEL: ld_align64_int64_t_uint32_t: 1209; CHECK-P10: # %bb.0: # %entry 1210; CHECK-P10-NEXT: pli r4, 244140625 1211; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1212; CHECK-P10-NEXT: lwzx r3, r3, r4 1213; CHECK-P10-NEXT: blr 1214; 1215; CHECK-PREP10-LABEL: ld_align64_int64_t_uint32_t: 1216; CHECK-PREP10: # %bb.0: # %entry 1217; CHECK-PREP10-NEXT: lis r4, 3725 1218; CHECK-PREP10-NEXT: ori r4, r4, 19025 1219; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1220; CHECK-PREP10-NEXT: lwzx r3, r3, r4 1221; CHECK-PREP10-NEXT: blr 1222entry: 1223 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 1224 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1225 %conv = zext i32 %0 to i64 1226 ret i64 %conv 1227} 1228 1229; Function Attrs: nofree norecurse nounwind uwtable willreturn 1230define dso_local i64 @ld_reg_int64_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) { 1231; CHECK-LABEL: ld_reg_int64_t_uint32_t: 1232; CHECK: # %bb.0: # %entry 1233; CHECK-NEXT: lwzx r3, r3, r4 1234; CHECK-NEXT: blr 1235entry: 1236 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 1237 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1238 %conv = zext i32 %0 to i64 1239 ret i64 %conv 1240} 1241 1242; Function Attrs: nofree norecurse nounwind uwtable willreturn 1243define dso_local i64 @ld_or_int64_t_uint32_t(i64 %ptr, i8 zeroext %off) { 1244; CHECK-LABEL: ld_or_int64_t_uint32_t: 1245; CHECK: # %bb.0: # %entry 1246; CHECK-NEXT: or r3, r4, r3 1247; CHECK-NEXT: lwz r3, 0(r3) 1248; CHECK-NEXT: blr 1249entry: 1250 %conv = zext i8 %off to i64 1251 %or = or i64 %conv, %ptr 1252 %0 = inttoptr i64 %or to ptr 1253 %1 = load atomic i32, ptr %0 monotonic, align 4 1254 %conv1 = zext i32 %1 to i64 1255 ret i64 %conv1 1256} 1257 1258; Function Attrs: nofree norecurse nounwind uwtable willreturn 1259define dso_local i64 @ld_not_disjoint16_int64_t_uint32_t(i64 %ptr) { 1260; CHECK-LABEL: ld_not_disjoint16_int64_t_uint32_t: 1261; CHECK: # %bb.0: # %entry 1262; CHECK-NEXT: ori r3, r3, 6 1263; CHECK-NEXT: lwz r3, 0(r3) 1264; CHECK-NEXT: blr 1265entry: 1266 %or = or i64 %ptr, 6 1267 %0 = inttoptr i64 %or to ptr 1268 %1 = load atomic i32, ptr %0 monotonic, align 4 1269 %conv = zext i32 %1 to i64 1270 ret i64 %conv 1271} 1272 1273; Function Attrs: nofree norecurse nounwind uwtable willreturn 1274define dso_local i64 @ld_disjoint_align16_int64_t_uint32_t(i64 %ptr) { 1275; CHECK-LABEL: ld_disjoint_align16_int64_t_uint32_t: 1276; CHECK: # %bb.0: # %entry 1277; CHECK-NEXT: rldicr r3, r3, 0, 51 1278; CHECK-NEXT: lwz r3, 24(r3) 1279; CHECK-NEXT: blr 1280entry: 1281 %and = and i64 %ptr, -4096 1282 %or = or i64 %and, 24 1283 %0 = inttoptr i64 %or to ptr 1284 %1 = load atomic i32, ptr %0 monotonic, align 8 1285 %conv = zext i32 %1 to i64 1286 ret i64 %conv 1287} 1288 1289; Function Attrs: nofree norecurse nounwind uwtable willreturn 1290define dso_local i64 @ld_not_disjoint32_int64_t_uint32_t(i64 %ptr) { 1291; CHECK-LABEL: ld_not_disjoint32_int64_t_uint32_t: 1292; CHECK: # %bb.0: # %entry 1293; CHECK-NEXT: ori r3, r3, 34463 1294; CHECK-NEXT: oris r3, r3, 1 1295; CHECK-NEXT: lwz r3, 0(r3) 1296; CHECK-NEXT: blr 1297entry: 1298 %or = or i64 %ptr, 99999 1299 %0 = inttoptr i64 %or to ptr 1300 %1 = load atomic i32, ptr %0 monotonic, align 4 1301 %conv = zext i32 %1 to i64 1302 ret i64 %conv 1303} 1304 1305; Function Attrs: nofree norecurse nounwind uwtable willreturn 1306define dso_local i64 @ld_disjoint_align32_int64_t_uint32_t(i64 %ptr) { 1307; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_uint32_t: 1308; CHECK-P10: # %bb.0: # %entry 1309; CHECK-P10-NEXT: lis r4, -15264 1310; CHECK-P10-NEXT: and r3, r3, r4 1311; CHECK-P10-NEXT: plwz r3, 999990000(r3), 0 1312; CHECK-P10-NEXT: clrldi r3, r3, 32 1313; CHECK-P10-NEXT: blr 1314; 1315; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_uint32_t: 1316; CHECK-PREP10: # %bb.0: # %entry 1317; CHECK-PREP10-NEXT: lis r4, -15264 1318; CHECK-PREP10-NEXT: and r3, r3, r4 1319; CHECK-PREP10-NEXT: lis r4, 15258 1320; CHECK-PREP10-NEXT: ori r4, r4, 41712 1321; CHECK-PREP10-NEXT: lwzx r3, r3, r4 1322; CHECK-PREP10-NEXT: blr 1323entry: 1324 %and = and i64 %ptr, -1000341504 1325 %or = or i64 %and, 999990000 1326 %0 = inttoptr i64 %or to ptr 1327 %1 = load atomic i32, ptr %0 monotonic, align 16 1328 %conv = zext i32 %1 to i64 1329 ret i64 %conv 1330} 1331 1332; Function Attrs: nofree norecurse nounwind uwtable willreturn 1333define dso_local i64 @ld_not_disjoint64_int64_t_uint32_t(i64 %ptr) { 1334; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_uint32_t: 1335; CHECK-P10: # %bb.0: # %entry 1336; CHECK-P10-NEXT: pli r4, 232 1337; CHECK-P10-NEXT: pli r5, 3567587329 1338; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1339; CHECK-P10-NEXT: or r3, r3, r5 1340; CHECK-P10-NEXT: lwz r3, 0(r3) 1341; CHECK-P10-NEXT: blr 1342; 1343; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_uint32_t: 1344; CHECK-PREP10: # %bb.0: # %entry 1345; CHECK-PREP10-NEXT: li r4, 29 1346; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1347; CHECK-PREP10-NEXT: oris r4, r4, 54437 1348; CHECK-PREP10-NEXT: ori r4, r4, 4097 1349; CHECK-PREP10-NEXT: or r3, r3, r4 1350; CHECK-PREP10-NEXT: lwz r3, 0(r3) 1351; CHECK-PREP10-NEXT: blr 1352entry: 1353 %or = or i64 %ptr, 1000000000001 1354 %0 = inttoptr i64 %or to ptr 1355 %1 = load atomic i32, ptr %0 monotonic, align 4 1356 %conv = zext i32 %1 to i64 1357 ret i64 %conv 1358} 1359 1360; Function Attrs: nofree norecurse nounwind uwtable willreturn 1361define dso_local i64 @ld_disjoint_align64_int64_t_uint32_t(i64 %ptr) { 1362; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_uint32_t: 1363; CHECK-P10: # %bb.0: # %entry 1364; CHECK-P10-NEXT: pli r4, 244140625 1365; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1366; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1367; CHECK-P10-NEXT: lwzx r3, r3, r4 1368; CHECK-P10-NEXT: blr 1369; 1370; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_uint32_t: 1371; CHECK-PREP10: # %bb.0: # %entry 1372; CHECK-PREP10-NEXT: lis r4, 3725 1373; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1374; CHECK-PREP10-NEXT: ori r4, r4, 19025 1375; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1376; CHECK-PREP10-NEXT: lwzx r3, r3, r4 1377; CHECK-PREP10-NEXT: blr 1378entry: 1379 %and = and i64 %ptr, -1099511627776 1380 %or = or i64 %and, 1000000000000 1381 %0 = inttoptr i64 %or to ptr 1382 %1 = load atomic i32, ptr %0 monotonic, align 4096 1383 %conv = zext i32 %1 to i64 1384 ret i64 %conv 1385} 1386 1387; Function Attrs: nofree norecurse nounwind uwtable willreturn 1388define dso_local i64 @ld_cst_align16_int64_t_uint32_t() { 1389; CHECK-LABEL: ld_cst_align16_int64_t_uint32_t: 1390; CHECK: # %bb.0: # %entry 1391; CHECK-NEXT: lwz r3, 4080(0) 1392; CHECK-NEXT: blr 1393entry: 1394 %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1395 %conv = zext i32 %0 to i64 1396 ret i64 %conv 1397} 1398 1399; Function Attrs: nofree norecurse nounwind uwtable willreturn 1400define dso_local i64 @ld_cst_align32_int64_t_uint32_t() { 1401; CHECK-LABEL: ld_cst_align32_int64_t_uint32_t: 1402; CHECK: # %bb.0: # %entry 1403; CHECK-NEXT: lis r3, 153 1404; CHECK-NEXT: lwz r3, -27108(r3) 1405; CHECK-NEXT: blr 1406entry: 1407 %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 1408 %conv = zext i32 %0 to i64 1409 ret i64 %conv 1410} 1411 1412; Function Attrs: nofree norecurse nounwind uwtable willreturn 1413define dso_local i64 @ld_cst_align64_int64_t_uint32_t() { 1414; CHECK-P10-LABEL: ld_cst_align64_int64_t_uint32_t: 1415; CHECK-P10: # %bb.0: # %entry 1416; CHECK-P10-NEXT: pli r3, 244140625 1417; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1418; CHECK-P10-NEXT: lwz r3, 0(r3) 1419; CHECK-P10-NEXT: blr 1420; 1421; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_uint32_t: 1422; CHECK-PREP10: # %bb.0: # %entry 1423; CHECK-PREP10-NEXT: lis r3, 3725 1424; CHECK-PREP10-NEXT: ori r3, r3, 19025 1425; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1426; CHECK-PREP10-NEXT: lwz r3, 0(r3) 1427; CHECK-PREP10-NEXT: blr 1428entry: 1429 %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1430 %conv = zext i32 %0 to i64 1431 ret i64 %conv 1432} 1433 1434; Function Attrs: nofree norecurse nounwind uwtable willreturn 1435define dso_local i64 @ld_0_int64_t_int32_t(i64 %ptr) { 1436; CHECK-LABEL: ld_0_int64_t_int32_t: 1437; CHECK: # %bb.0: # %entry 1438; CHECK-NEXT: lwa r3, 0(r3) 1439; CHECK-NEXT: blr 1440entry: 1441 %0 = inttoptr i64 %ptr to ptr 1442 %1 = load atomic i32, ptr %0 monotonic, align 4 1443 %conv = sext i32 %1 to i64 1444 ret i64 %conv 1445} 1446 1447; Function Attrs: nofree norecurse nounwind uwtable willreturn 1448define dso_local i64 @ld_align16_int64_t_int32_t(ptr nocapture readonly %ptr) { 1449; CHECK-LABEL: ld_align16_int64_t_int32_t: 1450; CHECK: # %bb.0: # %entry 1451; CHECK-NEXT: lwa r3, 8(r3) 1452; CHECK-NEXT: blr 1453entry: 1454 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1455 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1456 %conv = sext i32 %0 to i64 1457 ret i64 %conv 1458} 1459 1460; Function Attrs: nofree norecurse nounwind uwtable willreturn 1461define dso_local i64 @ld_align32_int64_t_int32_t(ptr nocapture readonly %ptr) { 1462; CHECK-P10-LABEL: ld_align32_int64_t_int32_t: 1463; CHECK-P10: # %bb.0: # %entry 1464; CHECK-P10-NEXT: plwz r3, 99999000(r3), 0 1465; CHECK-P10-NEXT: extsw r3, r3 1466; CHECK-P10-NEXT: blr 1467; 1468; CHECK-PREP10-LABEL: ld_align32_int64_t_int32_t: 1469; CHECK-PREP10: # %bb.0: # %entry 1470; CHECK-PREP10-NEXT: lis r4, 1525 1471; CHECK-PREP10-NEXT: ori r4, r4, 56600 1472; CHECK-PREP10-NEXT: lwax r3, r3, r4 1473; CHECK-PREP10-NEXT: blr 1474entry: 1475 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 1476 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1477 %conv = sext i32 %0 to i64 1478 ret i64 %conv 1479} 1480 1481; Function Attrs: nofree norecurse nounwind uwtable willreturn 1482define dso_local i64 @ld_align64_int64_t_int32_t(ptr nocapture readonly %ptr) { 1483; CHECK-P10-LABEL: ld_align64_int64_t_int32_t: 1484; CHECK-P10: # %bb.0: # %entry 1485; CHECK-P10-NEXT: pli r4, 244140625 1486; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1487; CHECK-P10-NEXT: lwax r3, r3, r4 1488; CHECK-P10-NEXT: blr 1489; 1490; CHECK-PREP10-LABEL: ld_align64_int64_t_int32_t: 1491; CHECK-PREP10: # %bb.0: # %entry 1492; CHECK-PREP10-NEXT: lis r4, 3725 1493; CHECK-PREP10-NEXT: ori r4, r4, 19025 1494; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1495; CHECK-PREP10-NEXT: lwax r3, r3, r4 1496; CHECK-PREP10-NEXT: blr 1497entry: 1498 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 1499 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1500 %conv = sext i32 %0 to i64 1501 ret i64 %conv 1502} 1503 1504; Function Attrs: nofree norecurse nounwind uwtable willreturn 1505define dso_local i64 @ld_reg_int64_t_int32_t(ptr nocapture readonly %ptr, i64 %off) { 1506; CHECK-LABEL: ld_reg_int64_t_int32_t: 1507; CHECK: # %bb.0: # %entry 1508; CHECK-NEXT: lwax r3, r3, r4 1509; CHECK-NEXT: blr 1510entry: 1511 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 1512 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 1513 %conv = sext i32 %0 to i64 1514 ret i64 %conv 1515} 1516 1517; Function Attrs: nofree norecurse nounwind uwtable willreturn 1518define dso_local i64 @ld_or_int64_t_int32_t(i64 %ptr, i8 zeroext %off) { 1519; CHECK-LABEL: ld_or_int64_t_int32_t: 1520; CHECK: # %bb.0: # %entry 1521; CHECK-NEXT: or r3, r4, r3 1522; CHECK-NEXT: lwa r3, 0(r3) 1523; CHECK-NEXT: blr 1524entry: 1525 %conv = zext i8 %off to i64 1526 %or = or i64 %conv, %ptr 1527 %0 = inttoptr i64 %or to ptr 1528 %1 = load atomic i32, ptr %0 monotonic, align 4 1529 %conv1 = sext i32 %1 to i64 1530 ret i64 %conv1 1531} 1532 1533; Function Attrs: nofree norecurse nounwind uwtable willreturn 1534define dso_local i64 @ld_not_disjoint16_int64_t_int32_t(i64 %ptr) { 1535; CHECK-LABEL: ld_not_disjoint16_int64_t_int32_t: 1536; CHECK: # %bb.0: # %entry 1537; CHECK-NEXT: ori r3, r3, 6 1538; CHECK-NEXT: lwa r3, 0(r3) 1539; CHECK-NEXT: blr 1540entry: 1541 %or = or i64 %ptr, 6 1542 %0 = inttoptr i64 %or to ptr 1543 %1 = load atomic i32, ptr %0 monotonic, align 4 1544 %conv = sext i32 %1 to i64 1545 ret i64 %conv 1546} 1547 1548; Function Attrs: nofree norecurse nounwind uwtable willreturn 1549define dso_local i64 @ld_disjoint_align16_int64_t_int32_t(i64 %ptr) { 1550; CHECK-LABEL: ld_disjoint_align16_int64_t_int32_t: 1551; CHECK: # %bb.0: # %entry 1552; CHECK-NEXT: rldicr r3, r3, 0, 51 1553; CHECK-NEXT: lwa r3, 24(r3) 1554; CHECK-NEXT: blr 1555entry: 1556 %and = and i64 %ptr, -4096 1557 %or = or i64 %and, 24 1558 %0 = inttoptr i64 %or to ptr 1559 %1 = load atomic i32, ptr %0 monotonic, align 8 1560 %conv = sext i32 %1 to i64 1561 ret i64 %conv 1562} 1563 1564; Function Attrs: nofree norecurse nounwind uwtable willreturn 1565define dso_local i64 @ld_not_disjoint32_int64_t_int32_t(i64 %ptr) { 1566; CHECK-LABEL: ld_not_disjoint32_int64_t_int32_t: 1567; CHECK: # %bb.0: # %entry 1568; CHECK-NEXT: ori r3, r3, 34463 1569; CHECK-NEXT: oris r3, r3, 1 1570; CHECK-NEXT: lwa r3, 0(r3) 1571; CHECK-NEXT: blr 1572entry: 1573 %or = or i64 %ptr, 99999 1574 %0 = inttoptr i64 %or to ptr 1575 %1 = load atomic i32, ptr %0 monotonic, align 4 1576 %conv = sext i32 %1 to i64 1577 ret i64 %conv 1578} 1579 1580; Function Attrs: nofree norecurse nounwind uwtable willreturn 1581define dso_local i64 @ld_disjoint_align32_int64_t_int32_t(i64 %ptr) { 1582; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_int32_t: 1583; CHECK-P10: # %bb.0: # %entry 1584; CHECK-P10-NEXT: lis r4, -15264 1585; CHECK-P10-NEXT: and r3, r3, r4 1586; CHECK-P10-NEXT: plwz r3, 999990000(r3), 0 1587; CHECK-P10-NEXT: extsw r3, r3 1588; CHECK-P10-NEXT: blr 1589; 1590; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_int32_t: 1591; CHECK-PREP10: # %bb.0: # %entry 1592; CHECK-PREP10-NEXT: lis r4, -15264 1593; CHECK-PREP10-NEXT: and r3, r3, r4 1594; CHECK-PREP10-NEXT: lis r4, 15258 1595; CHECK-PREP10-NEXT: ori r4, r4, 41712 1596; CHECK-PREP10-NEXT: lwax r3, r3, r4 1597; CHECK-PREP10-NEXT: blr 1598entry: 1599 %and = and i64 %ptr, -1000341504 1600 %or = or i64 %and, 999990000 1601 %0 = inttoptr i64 %or to ptr 1602 %1 = load atomic i32, ptr %0 monotonic, align 16 1603 %conv = sext i32 %1 to i64 1604 ret i64 %conv 1605} 1606 1607; Function Attrs: nofree norecurse nounwind uwtable willreturn 1608define dso_local i64 @ld_not_disjoint64_int64_t_int32_t(i64 %ptr) { 1609; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_int32_t: 1610; CHECK-P10: # %bb.0: # %entry 1611; CHECK-P10-NEXT: pli r4, 232 1612; CHECK-P10-NEXT: pli r5, 3567587329 1613; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1614; CHECK-P10-NEXT: or r3, r3, r5 1615; CHECK-P10-NEXT: lwa r3, 0(r3) 1616; CHECK-P10-NEXT: blr 1617; 1618; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_int32_t: 1619; CHECK-PREP10: # %bb.0: # %entry 1620; CHECK-PREP10-NEXT: li r4, 29 1621; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1622; CHECK-PREP10-NEXT: oris r4, r4, 54437 1623; CHECK-PREP10-NEXT: ori r4, r4, 4097 1624; CHECK-PREP10-NEXT: or r3, r3, r4 1625; CHECK-PREP10-NEXT: lwa r3, 0(r3) 1626; CHECK-PREP10-NEXT: blr 1627entry: 1628 %or = or i64 %ptr, 1000000000001 1629 %0 = inttoptr i64 %or to ptr 1630 %1 = load atomic i32, ptr %0 monotonic, align 4 1631 %conv = sext i32 %1 to i64 1632 ret i64 %conv 1633} 1634 1635; Function Attrs: nofree norecurse nounwind uwtable willreturn 1636define dso_local i64 @ld_disjoint_align64_int64_t_int32_t(i64 %ptr) { 1637; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_int32_t: 1638; CHECK-P10: # %bb.0: # %entry 1639; CHECK-P10-NEXT: pli r4, 244140625 1640; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1641; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1642; CHECK-P10-NEXT: lwax r3, r3, r4 1643; CHECK-P10-NEXT: blr 1644; 1645; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_int32_t: 1646; CHECK-PREP10: # %bb.0: # %entry 1647; CHECK-PREP10-NEXT: lis r4, 3725 1648; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1649; CHECK-PREP10-NEXT: ori r4, r4, 19025 1650; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1651; CHECK-PREP10-NEXT: lwax r3, r3, r4 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 i32, ptr %0 monotonic, align 4096 1658 %conv = sext i32 %1 to i64 1659 ret i64 %conv 1660} 1661 1662; Function Attrs: nofree norecurse nounwind uwtable willreturn 1663define dso_local i64 @ld_cst_align16_int64_t_int32_t() { 1664; CHECK-LABEL: ld_cst_align16_int64_t_int32_t: 1665; CHECK: # %bb.0: # %entry 1666; CHECK-NEXT: lwa r3, 4080(0) 1667; CHECK-NEXT: blr 1668entry: 1669 %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1670 %conv = sext i32 %0 to i64 1671 ret i64 %conv 1672} 1673 1674; Function Attrs: nofree norecurse nounwind uwtable willreturn 1675define dso_local i64 @ld_cst_align32_int64_t_int32_t() { 1676; CHECK-LABEL: ld_cst_align32_int64_t_int32_t: 1677; CHECK: # %bb.0: # %entry 1678; CHECK-NEXT: lis r3, 153 1679; CHECK-NEXT: lwa r3, -27108(r3) 1680; CHECK-NEXT: blr 1681entry: 1682 %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 1683 %conv = sext i32 %0 to i64 1684 ret i64 %conv 1685} 1686 1687; Function Attrs: nofree norecurse nounwind uwtable willreturn 1688define dso_local i64 @ld_cst_align64_int64_t_int32_t() { 1689; CHECK-P10-LABEL: ld_cst_align64_int64_t_int32_t: 1690; CHECK-P10: # %bb.0: # %entry 1691; CHECK-P10-NEXT: pli r3, 244140625 1692; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1693; CHECK-P10-NEXT: lwa r3, 0(r3) 1694; CHECK-P10-NEXT: blr 1695; 1696; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_int32_t: 1697; CHECK-PREP10: # %bb.0: # %entry 1698; CHECK-PREP10-NEXT: lis r3, 3725 1699; CHECK-PREP10-NEXT: ori r3, r3, 19025 1700; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1701; CHECK-PREP10-NEXT: lwa r3, 0(r3) 1702; CHECK-PREP10-NEXT: blr 1703entry: 1704 %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1705 %conv = sext i32 %0 to i64 1706 ret i64 %conv 1707} 1708 1709; Function Attrs: nofree norecurse nounwind uwtable willreturn 1710define dso_local i64 @ld_0_int64_t_uint64_t(i64 %ptr) { 1711; CHECK-LABEL: ld_0_int64_t_uint64_t: 1712; CHECK: # %bb.0: # %entry 1713; CHECK-NEXT: ld r3, 0(r3) 1714; CHECK-NEXT: blr 1715entry: 1716 %0 = inttoptr i64 %ptr to ptr 1717 %1 = load atomic i64, ptr %0 monotonic, align 8 1718 ret i64 %1 1719} 1720 1721; Function Attrs: nofree norecurse nounwind uwtable willreturn 1722define dso_local i64 @ld_align16_int64_t_uint64_t(ptr nocapture readonly %ptr) { 1723; CHECK-LABEL: ld_align16_int64_t_uint64_t: 1724; CHECK: # %bb.0: # %entry 1725; CHECK-NEXT: ld r3, 8(r3) 1726; CHECK-NEXT: blr 1727entry: 1728 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1729 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1730 ret i64 %0 1731} 1732 1733; Function Attrs: nofree norecurse nounwind uwtable willreturn 1734define dso_local i64 @ld_align32_int64_t_uint64_t(ptr nocapture readonly %ptr) { 1735; CHECK-P10-LABEL: ld_align32_int64_t_uint64_t: 1736; CHECK-P10: # %bb.0: # %entry 1737; CHECK-P10-NEXT: pld r3, 99999000(r3), 0 1738; CHECK-P10-NEXT: blr 1739; 1740; CHECK-PREP10-LABEL: ld_align32_int64_t_uint64_t: 1741; CHECK-PREP10: # %bb.0: # %entry 1742; CHECK-PREP10-NEXT: lis r4, 1525 1743; CHECK-PREP10-NEXT: ori r4, r4, 56600 1744; CHECK-PREP10-NEXT: ldx r3, r3, r4 1745; CHECK-PREP10-NEXT: blr 1746entry: 1747 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 1748 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1749 ret i64 %0 1750} 1751 1752; Function Attrs: nofree norecurse nounwind uwtable willreturn 1753define dso_local i64 @ld_align64_int64_t_uint64_t(ptr nocapture readonly %ptr) { 1754; CHECK-P10-LABEL: ld_align64_int64_t_uint64_t: 1755; CHECK-P10: # %bb.0: # %entry 1756; CHECK-P10-NEXT: pli r4, 244140625 1757; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1758; CHECK-P10-NEXT: ldx r3, r3, r4 1759; CHECK-P10-NEXT: blr 1760; 1761; CHECK-PREP10-LABEL: ld_align64_int64_t_uint64_t: 1762; CHECK-PREP10: # %bb.0: # %entry 1763; CHECK-PREP10-NEXT: lis r4, 3725 1764; CHECK-PREP10-NEXT: ori r4, r4, 19025 1765; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1766; CHECK-PREP10-NEXT: ldx r3, r3, r4 1767; CHECK-PREP10-NEXT: blr 1768entry: 1769 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 1770 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1771 ret i64 %0 1772} 1773 1774; Function Attrs: nofree norecurse nounwind uwtable willreturn 1775define dso_local i64 @ld_reg_int64_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) { 1776; CHECK-LABEL: ld_reg_int64_t_uint64_t: 1777; CHECK: # %bb.0: # %entry 1778; CHECK-NEXT: ldx r3, r3, r4 1779; CHECK-NEXT: blr 1780entry: 1781 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 1782 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1783 ret i64 %0 1784} 1785 1786; Function Attrs: nofree norecurse nounwind uwtable willreturn 1787define dso_local i64 @ld_or_int64_t_uint64_t(i64 %ptr, i8 zeroext %off) { 1788; CHECK-LABEL: ld_or_int64_t_uint64_t: 1789; CHECK: # %bb.0: # %entry 1790; CHECK-NEXT: or r3, r4, r3 1791; CHECK-NEXT: ld r3, 0(r3) 1792; CHECK-NEXT: blr 1793entry: 1794 %conv = zext i8 %off to i64 1795 %or = or i64 %conv, %ptr 1796 %0 = inttoptr i64 %or to ptr 1797 %1 = load atomic i64, ptr %0 monotonic, align 8 1798 ret i64 %1 1799} 1800 1801; Function Attrs: nofree norecurse nounwind uwtable willreturn 1802define dso_local i64 @ld_not_disjoint16_int64_t_uint64_t(i64 %ptr) { 1803; CHECK-LABEL: ld_not_disjoint16_int64_t_uint64_t: 1804; CHECK: # %bb.0: # %entry 1805; CHECK-NEXT: ori r3, r3, 6 1806; CHECK-NEXT: ld r3, 0(r3) 1807; CHECK-NEXT: blr 1808entry: 1809 %or = or i64 %ptr, 6 1810 %0 = inttoptr i64 %or to ptr 1811 %1 = load atomic i64, ptr %0 monotonic, align 8 1812 ret i64 %1 1813} 1814 1815; Function Attrs: nofree norecurse nounwind uwtable willreturn 1816define dso_local i64 @ld_disjoint_align16_int64_t_uint64_t(i64 %ptr) { 1817; CHECK-LABEL: ld_disjoint_align16_int64_t_uint64_t: 1818; CHECK: # %bb.0: # %entry 1819; CHECK-NEXT: rldicr r3, r3, 0, 51 1820; CHECK-NEXT: ld r3, 24(r3) 1821; CHECK-NEXT: blr 1822entry: 1823 %and = and i64 %ptr, -4096 1824 %or = or i64 %and, 24 1825 %0 = inttoptr i64 %or to ptr 1826 %1 = load atomic i64, ptr %0 monotonic, align 8 1827 ret i64 %1 1828} 1829 1830; Function Attrs: nofree norecurse nounwind uwtable willreturn 1831define dso_local i64 @ld_not_disjoint32_int64_t_uint64_t(i64 %ptr) { 1832; CHECK-LABEL: ld_not_disjoint32_int64_t_uint64_t: 1833; CHECK: # %bb.0: # %entry 1834; CHECK-NEXT: ori r3, r3, 34463 1835; CHECK-NEXT: oris r3, r3, 1 1836; CHECK-NEXT: ld r3, 0(r3) 1837; CHECK-NEXT: blr 1838entry: 1839 %or = or i64 %ptr, 99999 1840 %0 = inttoptr i64 %or to ptr 1841 %1 = load atomic i64, ptr %0 monotonic, align 8 1842 ret i64 %1 1843} 1844 1845; Function Attrs: nofree norecurse nounwind uwtable willreturn 1846define dso_local i64 @ld_disjoint_align32_int64_t_uint64_t(i64 %ptr) { 1847; CHECK-P10-LABEL: ld_disjoint_align32_int64_t_uint64_t: 1848; CHECK-P10: # %bb.0: # %entry 1849; CHECK-P10-NEXT: lis r4, -15264 1850; CHECK-P10-NEXT: and r3, r3, r4 1851; CHECK-P10-NEXT: pld r3, 999990000(r3), 0 1852; CHECK-P10-NEXT: blr 1853; 1854; CHECK-PREP10-LABEL: ld_disjoint_align32_int64_t_uint64_t: 1855; CHECK-PREP10: # %bb.0: # %entry 1856; CHECK-PREP10-NEXT: lis r4, -15264 1857; CHECK-PREP10-NEXT: and r3, r3, r4 1858; CHECK-PREP10-NEXT: lis r4, 15258 1859; CHECK-PREP10-NEXT: ori r4, r4, 41712 1860; CHECK-PREP10-NEXT: ldx r3, r3, r4 1861; CHECK-PREP10-NEXT: blr 1862entry: 1863 %and = and i64 %ptr, -1000341504 1864 %or = or i64 %and, 999990000 1865 %0 = inttoptr i64 %or to ptr 1866 %1 = load atomic i64, ptr %0 monotonic, align 16 1867 ret i64 %1 1868} 1869 1870; Function Attrs: nofree norecurse nounwind uwtable willreturn 1871define dso_local i64 @ld_not_disjoint64_int64_t_uint64_t(i64 %ptr) { 1872; CHECK-P10-LABEL: ld_not_disjoint64_int64_t_uint64_t: 1873; CHECK-P10: # %bb.0: # %entry 1874; CHECK-P10-NEXT: pli r4, 232 1875; CHECK-P10-NEXT: pli r5, 3567587329 1876; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1877; CHECK-P10-NEXT: or r3, r3, r5 1878; CHECK-P10-NEXT: ld r3, 0(r3) 1879; CHECK-P10-NEXT: blr 1880; 1881; CHECK-PREP10-LABEL: ld_not_disjoint64_int64_t_uint64_t: 1882; CHECK-PREP10: # %bb.0: # %entry 1883; CHECK-PREP10-NEXT: li r4, 29 1884; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1885; CHECK-PREP10-NEXT: oris r4, r4, 54437 1886; CHECK-PREP10-NEXT: ori r4, r4, 4097 1887; CHECK-PREP10-NEXT: or r3, r3, r4 1888; CHECK-PREP10-NEXT: ld r3, 0(r3) 1889; CHECK-PREP10-NEXT: blr 1890entry: 1891 %or = or i64 %ptr, 1000000000001 1892 %0 = inttoptr i64 %or to ptr 1893 %1 = load atomic i64, ptr %0 monotonic, align 8 1894 ret i64 %1 1895} 1896 1897; Function Attrs: nofree norecurse nounwind uwtable willreturn 1898define dso_local i64 @ld_disjoint_align64_int64_t_uint64_t(i64 %ptr) { 1899; CHECK-P10-LABEL: ld_disjoint_align64_int64_t_uint64_t: 1900; CHECK-P10: # %bb.0: # %entry 1901; CHECK-P10-NEXT: pli r4, 244140625 1902; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1903; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1904; CHECK-P10-NEXT: ldx r3, r3, r4 1905; CHECK-P10-NEXT: blr 1906; 1907; CHECK-PREP10-LABEL: ld_disjoint_align64_int64_t_uint64_t: 1908; CHECK-PREP10: # %bb.0: # %entry 1909; CHECK-PREP10-NEXT: lis r4, 3725 1910; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1911; CHECK-PREP10-NEXT: ori r4, r4, 19025 1912; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1913; CHECK-PREP10-NEXT: ldx r3, r3, r4 1914; CHECK-PREP10-NEXT: blr 1915entry: 1916 %and = and i64 %ptr, -1099511627776 1917 %or = or i64 %and, 1000000000000 1918 %0 = inttoptr i64 %or to ptr 1919 %1 = load atomic i64, ptr %0 monotonic, align 4096 1920 ret i64 %1 1921} 1922 1923; Function Attrs: nofree norecurse nounwind uwtable willreturn 1924define dso_local i64 @ld_cst_align16_int64_t_uint64_t() { 1925; CHECK-LABEL: ld_cst_align16_int64_t_uint64_t: 1926; CHECK: # %bb.0: # %entry 1927; CHECK-NEXT: ld r3, 4080(0) 1928; CHECK-NEXT: blr 1929entry: 1930 %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1931 ret i64 %0 1932} 1933 1934; Function Attrs: nofree norecurse nounwind uwtable willreturn 1935define dso_local i64 @ld_cst_align32_int64_t_uint64_t() { 1936; CHECK-LABEL: ld_cst_align32_int64_t_uint64_t: 1937; CHECK: # %bb.0: # %entry 1938; CHECK-NEXT: lis r3, 153 1939; CHECK-NEXT: ld r3, -27108(r3) 1940; CHECK-NEXT: blr 1941entry: 1942 %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 1943 ret i64 %0 1944} 1945 1946; Function Attrs: nofree norecurse nounwind uwtable willreturn 1947define dso_local i64 @ld_cst_align64_int64_t_uint64_t() { 1948; CHECK-P10-LABEL: ld_cst_align64_int64_t_uint64_t: 1949; CHECK-P10: # %bb.0: # %entry 1950; CHECK-P10-NEXT: pli r3, 244140625 1951; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1952; CHECK-P10-NEXT: ld r3, 0(r3) 1953; CHECK-P10-NEXT: blr 1954; 1955; CHECK-PREP10-LABEL: ld_cst_align64_int64_t_uint64_t: 1956; CHECK-PREP10: # %bb.0: # %entry 1957; CHECK-PREP10-NEXT: lis r3, 3725 1958; CHECK-PREP10-NEXT: ori r3, r3, 19025 1959; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1960; CHECK-PREP10-NEXT: ld r3, 0(r3) 1961; CHECK-PREP10-NEXT: blr 1962entry: 1963 %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1964 ret i64 %0 1965} 1966 1967; Function Attrs: nofree norecurse nounwind uwtable willreturn 1968define dso_local i64 @ld_0_uint64_t_uint8_t(i64 %ptr) { 1969; CHECK-LABEL: ld_0_uint64_t_uint8_t: 1970; CHECK: # %bb.0: # %entry 1971; CHECK-NEXT: lbz r3, 0(r3) 1972; CHECK-NEXT: blr 1973entry: 1974 %0 = inttoptr i64 %ptr to ptr 1975 %1 = load atomic i8, ptr %0 monotonic, align 1 1976 %conv = zext i8 %1 to i64 1977 ret i64 %conv 1978} 1979 1980; Function Attrs: nofree norecurse nounwind uwtable willreturn 1981define dso_local i64 @ld_align16_uint64_t_uint8_t(ptr nocapture readonly %ptr) { 1982; CHECK-LABEL: ld_align16_uint64_t_uint8_t: 1983; CHECK: # %bb.0: # %entry 1984; CHECK-NEXT: lbz r3, 8(r3) 1985; CHECK-NEXT: blr 1986entry: 1987 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1988 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1989 %conv = zext i8 %0 to i64 1990 ret i64 %conv 1991} 1992 1993; Function Attrs: nofree norecurse nounwind uwtable willreturn 1994define dso_local i64 @ld_align32_uint64_t_uint8_t(ptr nocapture readonly %ptr) { 1995; CHECK-P10-LABEL: ld_align32_uint64_t_uint8_t: 1996; CHECK-P10: # %bb.0: # %entry 1997; CHECK-P10-NEXT: plbz r3, 99999000(r3), 0 1998; CHECK-P10-NEXT: clrldi r3, r3, 32 1999; CHECK-P10-NEXT: blr 2000; 2001; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint8_t: 2002; CHECK-PREP10: # %bb.0: # %entry 2003; CHECK-PREP10-NEXT: lis r4, 1525 2004; CHECK-PREP10-NEXT: ori r4, r4, 56600 2005; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2006; CHECK-PREP10-NEXT: blr 2007entry: 2008 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2009 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2010 %conv = zext i8 %0 to i64 2011 ret i64 %conv 2012} 2013 2014; Function Attrs: nofree norecurse nounwind uwtable willreturn 2015define dso_local i64 @ld_align64_uint64_t_uint8_t(ptr nocapture readonly %ptr) { 2016; CHECK-P10-LABEL: ld_align64_uint64_t_uint8_t: 2017; CHECK-P10: # %bb.0: # %entry 2018; CHECK-P10-NEXT: pli r4, 244140625 2019; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2020; CHECK-P10-NEXT: lbzx r3, r3, r4 2021; CHECK-P10-NEXT: blr 2022; 2023; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint8_t: 2024; CHECK-PREP10: # %bb.0: # %entry 2025; CHECK-PREP10-NEXT: lis r4, 3725 2026; CHECK-PREP10-NEXT: ori r4, r4, 19025 2027; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2028; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2029; CHECK-PREP10-NEXT: blr 2030entry: 2031 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2032 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2033 %conv = zext i8 %0 to i64 2034 ret i64 %conv 2035} 2036 2037; Function Attrs: nofree norecurse nounwind uwtable willreturn 2038define dso_local i64 @ld_reg_uint64_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) { 2039; CHECK-LABEL: ld_reg_uint64_t_uint8_t: 2040; CHECK: # %bb.0: # %entry 2041; CHECK-NEXT: lbzx r3, r3, r4 2042; CHECK-NEXT: blr 2043entry: 2044 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2045 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2046 %conv = zext i8 %0 to i64 2047 ret i64 %conv 2048} 2049 2050; Function Attrs: nofree norecurse nounwind uwtable willreturn 2051define dso_local i64 @ld_or_uint64_t_uint8_t(i64 %ptr, i8 zeroext %off) { 2052; CHECK-LABEL: ld_or_uint64_t_uint8_t: 2053; CHECK: # %bb.0: # %entry 2054; CHECK-NEXT: or r3, r4, r3 2055; CHECK-NEXT: lbz r3, 0(r3) 2056; CHECK-NEXT: blr 2057entry: 2058 %conv = zext i8 %off to i64 2059 %or = or i64 %conv, %ptr 2060 %0 = inttoptr i64 %or to ptr 2061 %1 = load atomic i8, ptr %0 monotonic, align 1 2062 %conv1 = zext i8 %1 to i64 2063 ret i64 %conv1 2064} 2065 2066; Function Attrs: nofree norecurse nounwind uwtable willreturn 2067define dso_local i64 @ld_not_disjoint16_uint64_t_uint8_t(i64 %ptr) { 2068; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint8_t: 2069; CHECK: # %bb.0: # %entry 2070; CHECK-NEXT: ori r3, r3, 6 2071; CHECK-NEXT: lbz r3, 0(r3) 2072; CHECK-NEXT: blr 2073entry: 2074 %or = or i64 %ptr, 6 2075 %0 = inttoptr i64 %or to ptr 2076 %1 = load atomic i8, ptr %0 monotonic, align 1 2077 %conv = zext i8 %1 to i64 2078 ret i64 %conv 2079} 2080 2081; Function Attrs: nofree norecurse nounwind uwtable willreturn 2082define dso_local i64 @ld_disjoint_align16_uint64_t_uint8_t(i64 %ptr) { 2083; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint8_t: 2084; CHECK: # %bb.0: # %entry 2085; CHECK-NEXT: rldicr r3, r3, 0, 51 2086; CHECK-NEXT: lbz r3, 24(r3) 2087; CHECK-NEXT: blr 2088entry: 2089 %and = and i64 %ptr, -4096 2090 %or = or i64 %and, 24 2091 %0 = inttoptr i64 %or to ptr 2092 %1 = load atomic i8, ptr %0 monotonic, align 8 2093 %conv = zext i8 %1 to i64 2094 ret i64 %conv 2095} 2096 2097; Function Attrs: nofree norecurse nounwind uwtable willreturn 2098define dso_local i64 @ld_not_disjoint32_uint64_t_uint8_t(i64 %ptr) { 2099; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint8_t: 2100; CHECK: # %bb.0: # %entry 2101; CHECK-NEXT: ori r3, r3, 34463 2102; CHECK-NEXT: oris r3, r3, 1 2103; CHECK-NEXT: lbz r3, 0(r3) 2104; CHECK-NEXT: blr 2105entry: 2106 %or = or i64 %ptr, 99999 2107 %0 = inttoptr i64 %or to ptr 2108 %1 = load atomic i8, ptr %0 monotonic, align 1 2109 %conv = zext i8 %1 to i64 2110 ret i64 %conv 2111} 2112 2113; Function Attrs: nofree norecurse nounwind uwtable willreturn 2114define dso_local i64 @ld_disjoint_align32_uint64_t_uint8_t(i64 %ptr) { 2115; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_uint8_t: 2116; CHECK-P10: # %bb.0: # %entry 2117; CHECK-P10-NEXT: lis r4, -15264 2118; CHECK-P10-NEXT: and r3, r3, r4 2119; CHECK-P10-NEXT: plbz r3, 999990000(r3), 0 2120; CHECK-P10-NEXT: clrldi r3, r3, 32 2121; CHECK-P10-NEXT: blr 2122; 2123; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_uint8_t: 2124; CHECK-PREP10: # %bb.0: # %entry 2125; CHECK-PREP10-NEXT: lis r4, -15264 2126; CHECK-PREP10-NEXT: and r3, r3, r4 2127; CHECK-PREP10-NEXT: lis r4, 15258 2128; CHECK-PREP10-NEXT: ori r4, r4, 41712 2129; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2130; CHECK-PREP10-NEXT: blr 2131entry: 2132 %and = and i64 %ptr, -1000341504 2133 %or = or i64 %and, 999990000 2134 %0 = inttoptr i64 %or to ptr 2135 %1 = load atomic i8, ptr %0 monotonic, align 16 2136 %conv = zext i8 %1 to i64 2137 ret i64 %conv 2138} 2139 2140; Function Attrs: nofree norecurse nounwind uwtable willreturn 2141define dso_local i64 @ld_not_disjoint64_uint64_t_uint8_t(i64 %ptr) { 2142; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_uint8_t: 2143; CHECK-P10: # %bb.0: # %entry 2144; CHECK-P10-NEXT: pli r4, 232 2145; CHECK-P10-NEXT: pli r5, 3567587329 2146; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 2147; CHECK-P10-NEXT: or r3, r3, r5 2148; CHECK-P10-NEXT: lbz r3, 0(r3) 2149; CHECK-P10-NEXT: blr 2150; 2151; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint8_t: 2152; CHECK-PREP10: # %bb.0: # %entry 2153; CHECK-PREP10-NEXT: li r4, 29 2154; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 2155; CHECK-PREP10-NEXT: oris r4, r4, 54437 2156; CHECK-PREP10-NEXT: ori r4, r4, 4097 2157; CHECK-PREP10-NEXT: or r3, r3, r4 2158; CHECK-PREP10-NEXT: lbz r3, 0(r3) 2159; CHECK-PREP10-NEXT: blr 2160entry: 2161 %or = or i64 %ptr, 1000000000001 2162 %0 = inttoptr i64 %or to ptr 2163 %1 = load atomic i8, ptr %0 monotonic, align 1 2164 %conv = zext i8 %1 to i64 2165 ret i64 %conv 2166} 2167 2168; Function Attrs: nofree norecurse nounwind uwtable willreturn 2169define dso_local i64 @ld_disjoint_align64_uint64_t_uint8_t(i64 %ptr) { 2170; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_uint8_t: 2171; CHECK-P10: # %bb.0: # %entry 2172; CHECK-P10-NEXT: pli r4, 244140625 2173; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 2174; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2175; CHECK-P10-NEXT: lbzx r3, r3, r4 2176; CHECK-P10-NEXT: blr 2177; 2178; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint8_t: 2179; CHECK-PREP10: # %bb.0: # %entry 2180; CHECK-PREP10-NEXT: lis r4, 3725 2181; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 2182; CHECK-PREP10-NEXT: ori r4, r4, 19025 2183; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2184; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2185; CHECK-PREP10-NEXT: blr 2186entry: 2187 %and = and i64 %ptr, -1099511627776 2188 %or = or i64 %and, 1000000000000 2189 %0 = inttoptr i64 %or to ptr 2190 %1 = load atomic i8, ptr %0 monotonic, align 4096 2191 %conv = zext i8 %1 to i64 2192 ret i64 %conv 2193} 2194 2195; Function Attrs: nofree norecurse nounwind uwtable willreturn 2196define dso_local i64 @ld_cst_align16_uint64_t_uint8_t() { 2197; CHECK-LABEL: ld_cst_align16_uint64_t_uint8_t: 2198; CHECK: # %bb.0: # %entry 2199; CHECK-NEXT: lbz r3, 4080(0) 2200; CHECK-NEXT: blr 2201entry: 2202 %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2203 %conv = zext i8 %0 to i64 2204 ret i64 %conv 2205} 2206 2207; Function Attrs: nofree norecurse nounwind uwtable willreturn 2208define dso_local i64 @ld_cst_align32_uint64_t_uint8_t() { 2209; CHECK-LABEL: ld_cst_align32_uint64_t_uint8_t: 2210; CHECK: # %bb.0: # %entry 2211; CHECK-NEXT: lis r3, 153 2212; CHECK-NEXT: lbz r3, -27108(r3) 2213; CHECK-NEXT: blr 2214entry: 2215 %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 2216 %conv = zext i8 %0 to i64 2217 ret i64 %conv 2218} 2219 2220; Function Attrs: nofree norecurse nounwind uwtable willreturn 2221define dso_local i64 @ld_cst_align64_uint64_t_uint8_t() { 2222; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint8_t: 2223; CHECK-P10: # %bb.0: # %entry 2224; CHECK-P10-NEXT: pli r3, 244140625 2225; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2226; CHECK-P10-NEXT: lbz r3, 0(r3) 2227; CHECK-P10-NEXT: blr 2228; 2229; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint8_t: 2230; CHECK-PREP10: # %bb.0: # %entry 2231; CHECK-PREP10-NEXT: lis r3, 3725 2232; CHECK-PREP10-NEXT: ori r3, r3, 19025 2233; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2234; CHECK-PREP10-NEXT: lbz r3, 0(r3) 2235; CHECK-PREP10-NEXT: blr 2236entry: 2237 %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2238 %conv = zext i8 %0 to i64 2239 ret i64 %conv 2240} 2241 2242; Function Attrs: nofree norecurse nounwind uwtable willreturn 2243define dso_local i64 @ld_0_uint64_t_int8_t(i64 %ptr) { 2244; CHECK-LABEL: ld_0_uint64_t_int8_t: 2245; CHECK: # %bb.0: # %entry 2246; CHECK-NEXT: lbz r3, 0(r3) 2247; CHECK-NEXT: extsb r3, r3 2248; CHECK-NEXT: blr 2249entry: 2250 %0 = inttoptr i64 %ptr to ptr 2251 %1 = load atomic i8, ptr %0 monotonic, align 1 2252 %conv = sext i8 %1 to i64 2253 ret i64 %conv 2254} 2255 2256; Function Attrs: nofree norecurse nounwind uwtable willreturn 2257define dso_local i64 @ld_align16_uint64_t_int8_t(ptr nocapture readonly %ptr) { 2258; CHECK-LABEL: ld_align16_uint64_t_int8_t: 2259; CHECK: # %bb.0: # %entry 2260; CHECK-NEXT: lbz r3, 8(r3) 2261; CHECK-NEXT: extsb r3, r3 2262; CHECK-NEXT: blr 2263entry: 2264 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2265 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2266 %conv = sext i8 %0 to i64 2267 ret i64 %conv 2268} 2269 2270; Function Attrs: nofree norecurse nounwind uwtable willreturn 2271define dso_local i64 @ld_align32_uint64_t_int8_t(ptr nocapture readonly %ptr) { 2272; CHECK-P10-LABEL: ld_align32_uint64_t_int8_t: 2273; CHECK-P10: # %bb.0: # %entry 2274; CHECK-P10-NEXT: plbz r3, 99999000(r3), 0 2275; CHECK-P10-NEXT: extsb r3, r3 2276; CHECK-P10-NEXT: blr 2277; 2278; CHECK-PREP10-LABEL: ld_align32_uint64_t_int8_t: 2279; CHECK-PREP10: # %bb.0: # %entry 2280; CHECK-PREP10-NEXT: lis r4, 1525 2281; CHECK-PREP10-NEXT: ori r4, r4, 56600 2282; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2283; CHECK-PREP10-NEXT: extsb r3, r3 2284; CHECK-PREP10-NEXT: blr 2285entry: 2286 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2287 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2288 %conv = sext i8 %0 to i64 2289 ret i64 %conv 2290} 2291 2292; Function Attrs: nofree norecurse nounwind uwtable willreturn 2293define dso_local i64 @ld_align64_uint64_t_int8_t(ptr nocapture readonly %ptr) { 2294; CHECK-P10-LABEL: ld_align64_uint64_t_int8_t: 2295; CHECK-P10: # %bb.0: # %entry 2296; CHECK-P10-NEXT: pli r4, 244140625 2297; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2298; CHECK-P10-NEXT: lbzx r3, r3, r4 2299; CHECK-P10-NEXT: extsb r3, r3 2300; CHECK-P10-NEXT: blr 2301; 2302; CHECK-PREP10-LABEL: ld_align64_uint64_t_int8_t: 2303; CHECK-PREP10: # %bb.0: # %entry 2304; CHECK-PREP10-NEXT: lis r4, 3725 2305; CHECK-PREP10-NEXT: ori r4, r4, 19025 2306; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2307; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2308; CHECK-PREP10-NEXT: extsb r3, r3 2309; CHECK-PREP10-NEXT: blr 2310entry: 2311 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2312 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2313 %conv = sext i8 %0 to i64 2314 ret i64 %conv 2315} 2316 2317; Function Attrs: nofree norecurse nounwind uwtable willreturn 2318define dso_local i64 @ld_reg_uint64_t_int8_t(ptr nocapture readonly %ptr, i64 %off) { 2319; CHECK-LABEL: ld_reg_uint64_t_int8_t: 2320; CHECK: # %bb.0: # %entry 2321; CHECK-NEXT: lbzx r3, r3, r4 2322; CHECK-NEXT: extsb r3, r3 2323; CHECK-NEXT: blr 2324entry: 2325 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2326 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 2327 %conv = sext i8 %0 to i64 2328 ret i64 %conv 2329} 2330 2331; Function Attrs: nofree norecurse nounwind uwtable willreturn 2332define dso_local i64 @ld_or_uint64_t_int8_t(i64 %ptr, i8 zeroext %off) { 2333; CHECK-LABEL: ld_or_uint64_t_int8_t: 2334; CHECK: # %bb.0: # %entry 2335; CHECK-NEXT: or r3, r4, r3 2336; CHECK-NEXT: lbz r3, 0(r3) 2337; CHECK-NEXT: extsb r3, r3 2338; CHECK-NEXT: blr 2339entry: 2340 %conv = zext i8 %off to i64 2341 %or = or i64 %conv, %ptr 2342 %0 = inttoptr i64 %or to ptr 2343 %1 = load atomic i8, ptr %0 monotonic, align 1 2344 %conv1 = sext i8 %1 to i64 2345 ret i64 %conv1 2346} 2347 2348; Function Attrs: nofree norecurse nounwind uwtable willreturn 2349define dso_local i64 @ld_not_disjoint16_uint64_t_int8_t(i64 %ptr) { 2350; CHECK-LABEL: ld_not_disjoint16_uint64_t_int8_t: 2351; CHECK: # %bb.0: # %entry 2352; CHECK-NEXT: ori r3, r3, 6 2353; CHECK-NEXT: lbz r3, 0(r3) 2354; CHECK-NEXT: extsb r3, r3 2355; CHECK-NEXT: blr 2356entry: 2357 %or = or i64 %ptr, 6 2358 %0 = inttoptr i64 %or to ptr 2359 %1 = load atomic i8, ptr %0 monotonic, align 1 2360 %conv = sext i8 %1 to i64 2361 ret i64 %conv 2362} 2363 2364; Function Attrs: nofree norecurse nounwind uwtable willreturn 2365define dso_local i64 @ld_disjoint_align16_uint64_t_int8_t(i64 %ptr) { 2366; CHECK-LABEL: ld_disjoint_align16_uint64_t_int8_t: 2367; CHECK: # %bb.0: # %entry 2368; CHECK-NEXT: rldicr r3, r3, 0, 51 2369; CHECK-NEXT: lbz r3, 24(r3) 2370; CHECK-NEXT: extsb r3, r3 2371; CHECK-NEXT: blr 2372entry: 2373 %and = and i64 %ptr, -4096 2374 %or = or i64 %and, 24 2375 %0 = inttoptr i64 %or to ptr 2376 %1 = load atomic i8, ptr %0 monotonic, align 8 2377 %conv = sext i8 %1 to i64 2378 ret i64 %conv 2379} 2380 2381; Function Attrs: nofree norecurse nounwind uwtable willreturn 2382define dso_local i64 @ld_not_disjoint32_uint64_t_int8_t(i64 %ptr) { 2383; CHECK-LABEL: ld_not_disjoint32_uint64_t_int8_t: 2384; CHECK: # %bb.0: # %entry 2385; CHECK-NEXT: ori r3, r3, 34463 2386; CHECK-NEXT: oris r3, r3, 1 2387; CHECK-NEXT: lbz r3, 0(r3) 2388; CHECK-NEXT: extsb r3, r3 2389; CHECK-NEXT: blr 2390entry: 2391 %or = or i64 %ptr, 99999 2392 %0 = inttoptr i64 %or to ptr 2393 %1 = load atomic i8, ptr %0 monotonic, align 1 2394 %conv = sext i8 %1 to i64 2395 ret i64 %conv 2396} 2397 2398; Function Attrs: nofree norecurse nounwind uwtable willreturn 2399define dso_local i64 @ld_disjoint_align32_uint64_t_int8_t(i64 %ptr) { 2400; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_int8_t: 2401; CHECK-P10: # %bb.0: # %entry 2402; CHECK-P10-NEXT: lis r4, -15264 2403; CHECK-P10-NEXT: and r3, r3, r4 2404; CHECK-P10-NEXT: plbz r3, 999990000(r3), 0 2405; CHECK-P10-NEXT: extsb r3, r3 2406; CHECK-P10-NEXT: blr 2407; 2408; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_int8_t: 2409; CHECK-PREP10: # %bb.0: # %entry 2410; CHECK-PREP10-NEXT: lis r4, -15264 2411; CHECK-PREP10-NEXT: and r3, r3, r4 2412; CHECK-PREP10-NEXT: lis r4, 15258 2413; CHECK-PREP10-NEXT: ori r4, r4, 41712 2414; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2415; CHECK-PREP10-NEXT: extsb r3, r3 2416; CHECK-PREP10-NEXT: blr 2417entry: 2418 %and = and i64 %ptr, -1000341504 2419 %or = or i64 %and, 999990000 2420 %0 = inttoptr i64 %or to ptr 2421 %1 = load atomic i8, ptr %0 monotonic, align 16 2422 %conv = sext i8 %1 to i64 2423 ret i64 %conv 2424} 2425 2426; Function Attrs: nofree norecurse nounwind uwtable willreturn 2427define dso_local i64 @ld_not_disjoint64_uint64_t_int8_t(i64 %ptr) { 2428; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_int8_t: 2429; CHECK-P10: # %bb.0: # %entry 2430; CHECK-P10-NEXT: pli r4, 232 2431; CHECK-P10-NEXT: pli r5, 3567587329 2432; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 2433; CHECK-P10-NEXT: or r3, r3, r5 2434; CHECK-P10-NEXT: lbz r3, 0(r3) 2435; CHECK-P10-NEXT: extsb r3, r3 2436; CHECK-P10-NEXT: blr 2437; 2438; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_int8_t: 2439; CHECK-PREP10: # %bb.0: # %entry 2440; CHECK-PREP10-NEXT: li r4, 29 2441; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 2442; CHECK-PREP10-NEXT: oris r4, r4, 54437 2443; CHECK-PREP10-NEXT: ori r4, r4, 4097 2444; CHECK-PREP10-NEXT: or r3, r3, r4 2445; CHECK-PREP10-NEXT: lbz r3, 0(r3) 2446; CHECK-PREP10-NEXT: extsb r3, r3 2447; CHECK-PREP10-NEXT: blr 2448entry: 2449 %or = or i64 %ptr, 1000000000001 2450 %0 = inttoptr i64 %or to ptr 2451 %1 = load atomic i8, ptr %0 monotonic, align 1 2452 %conv = sext i8 %1 to i64 2453 ret i64 %conv 2454} 2455 2456; Function Attrs: nofree norecurse nounwind uwtable willreturn 2457define dso_local i64 @ld_disjoint_align64_uint64_t_int8_t(i64 %ptr) { 2458; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_int8_t: 2459; CHECK-P10: # %bb.0: # %entry 2460; CHECK-P10-NEXT: pli r4, 244140625 2461; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 2462; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2463; CHECK-P10-NEXT: lbzx r3, r3, r4 2464; CHECK-P10-NEXT: extsb r3, r3 2465; CHECK-P10-NEXT: blr 2466; 2467; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_int8_t: 2468; CHECK-PREP10: # %bb.0: # %entry 2469; CHECK-PREP10-NEXT: lis r4, 3725 2470; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 2471; CHECK-PREP10-NEXT: ori r4, r4, 19025 2472; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2473; CHECK-PREP10-NEXT: lbzx r3, r3, r4 2474; CHECK-PREP10-NEXT: extsb r3, r3 2475; CHECK-PREP10-NEXT: blr 2476entry: 2477 %and = and i64 %ptr, -1099511627776 2478 %or = or i64 %and, 1000000000000 2479 %0 = inttoptr i64 %or to ptr 2480 %1 = load atomic i8, ptr %0 monotonic, align 4096 2481 %conv = sext i8 %1 to i64 2482 ret i64 %conv 2483} 2484 2485; Function Attrs: nofree norecurse nounwind uwtable willreturn 2486define dso_local i64 @ld_cst_align16_uint64_t_int8_t() { 2487; CHECK-LABEL: ld_cst_align16_uint64_t_int8_t: 2488; CHECK: # %bb.0: # %entry 2489; CHECK-NEXT: lbz r3, 4080(0) 2490; CHECK-NEXT: extsb r3, r3 2491; CHECK-NEXT: blr 2492entry: 2493 %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2494 %conv = sext i8 %0 to i64 2495 ret i64 %conv 2496} 2497 2498; Function Attrs: nofree norecurse nounwind uwtable willreturn 2499define dso_local i64 @ld_cst_align32_uint64_t_int8_t() { 2500; CHECK-LABEL: ld_cst_align32_uint64_t_int8_t: 2501; CHECK: # %bb.0: # %entry 2502; CHECK-NEXT: lis r3, 153 2503; CHECK-NEXT: lbz r3, -27108(r3) 2504; CHECK-NEXT: extsb r3, r3 2505; CHECK-NEXT: blr 2506entry: 2507 %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 2508 %conv = sext i8 %0 to i64 2509 ret i64 %conv 2510} 2511 2512; Function Attrs: nofree norecurse nounwind uwtable willreturn 2513define dso_local i64 @ld_cst_align64_uint64_t_int8_t() { 2514; CHECK-P10-LABEL: ld_cst_align64_uint64_t_int8_t: 2515; CHECK-P10: # %bb.0: # %entry 2516; CHECK-P10-NEXT: pli r3, 244140625 2517; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2518; CHECK-P10-NEXT: lbz r3, 0(r3) 2519; CHECK-P10-NEXT: extsb r3, r3 2520; CHECK-P10-NEXT: blr 2521; 2522; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_int8_t: 2523; CHECK-PREP10: # %bb.0: # %entry 2524; CHECK-PREP10-NEXT: lis r3, 3725 2525; CHECK-PREP10-NEXT: ori r3, r3, 19025 2526; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2527; CHECK-PREP10-NEXT: lbz r3, 0(r3) 2528; CHECK-PREP10-NEXT: extsb r3, r3 2529; CHECK-PREP10-NEXT: blr 2530entry: 2531 %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2532 %conv = sext i8 %0 to i64 2533 ret i64 %conv 2534} 2535 2536; Function Attrs: nofree norecurse nounwind uwtable willreturn 2537define dso_local i64 @ld_0_uint64_t_uint16_t(i64 %ptr) { 2538; CHECK-LABEL: ld_0_uint64_t_uint16_t: 2539; CHECK: # %bb.0: # %entry 2540; CHECK-NEXT: lhz r3, 0(r3) 2541; CHECK-NEXT: blr 2542entry: 2543 %0 = inttoptr i64 %ptr to ptr 2544 %1 = load atomic i16, ptr %0 monotonic, align 2 2545 %conv = zext i16 %1 to i64 2546 ret i64 %conv 2547} 2548 2549; Function Attrs: nofree norecurse nounwind uwtable willreturn 2550define dso_local i64 @ld_align16_uint64_t_uint16_t(ptr nocapture readonly %ptr) { 2551; CHECK-LABEL: ld_align16_uint64_t_uint16_t: 2552; CHECK: # %bb.0: # %entry 2553; CHECK-NEXT: lhz r3, 8(r3) 2554; CHECK-NEXT: blr 2555entry: 2556 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2557 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2558 %conv = zext i16 %0 to i64 2559 ret i64 %conv 2560} 2561 2562; Function Attrs: nofree norecurse nounwind uwtable willreturn 2563define dso_local i64 @ld_align32_uint64_t_uint16_t(ptr nocapture readonly %ptr) { 2564; CHECK-P10-LABEL: ld_align32_uint64_t_uint16_t: 2565; CHECK-P10: # %bb.0: # %entry 2566; CHECK-P10-NEXT: plhz r3, 99999000(r3), 0 2567; CHECK-P10-NEXT: clrldi r3, r3, 32 2568; CHECK-P10-NEXT: blr 2569; 2570; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint16_t: 2571; CHECK-PREP10: # %bb.0: # %entry 2572; CHECK-PREP10-NEXT: lis r4, 1525 2573; CHECK-PREP10-NEXT: ori r4, r4, 56600 2574; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2575; CHECK-PREP10-NEXT: blr 2576entry: 2577 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2578 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2579 %conv = zext i16 %0 to i64 2580 ret i64 %conv 2581} 2582 2583; Function Attrs: nofree norecurse nounwind uwtable willreturn 2584define dso_local i64 @ld_align64_uint64_t_uint16_t(ptr nocapture readonly %ptr) { 2585; CHECK-P10-LABEL: ld_align64_uint64_t_uint16_t: 2586; CHECK-P10: # %bb.0: # %entry 2587; CHECK-P10-NEXT: pli r4, 244140625 2588; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2589; CHECK-P10-NEXT: lhzx r3, r3, r4 2590; CHECK-P10-NEXT: blr 2591; 2592; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint16_t: 2593; CHECK-PREP10: # %bb.0: # %entry 2594; CHECK-PREP10-NEXT: lis r4, 3725 2595; CHECK-PREP10-NEXT: ori r4, r4, 19025 2596; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2597; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2598; CHECK-PREP10-NEXT: blr 2599entry: 2600 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2601 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2602 %conv = zext i16 %0 to i64 2603 ret i64 %conv 2604} 2605 2606; Function Attrs: nofree norecurse nounwind uwtable willreturn 2607define dso_local i64 @ld_reg_uint64_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) { 2608; CHECK-LABEL: ld_reg_uint64_t_uint16_t: 2609; CHECK: # %bb.0: # %entry 2610; CHECK-NEXT: lhzx r3, r3, r4 2611; CHECK-NEXT: blr 2612entry: 2613 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2614 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2615 %conv = zext i16 %0 to i64 2616 ret i64 %conv 2617} 2618 2619; Function Attrs: nofree norecurse nounwind uwtable willreturn 2620define dso_local i64 @ld_or_uint64_t_uint16_t(i64 %ptr, i8 zeroext %off) { 2621; CHECK-LABEL: ld_or_uint64_t_uint16_t: 2622; CHECK: # %bb.0: # %entry 2623; CHECK-NEXT: or r3, r4, r3 2624; CHECK-NEXT: lhz r3, 0(r3) 2625; CHECK-NEXT: blr 2626entry: 2627 %conv = zext i8 %off to i64 2628 %or = or i64 %conv, %ptr 2629 %0 = inttoptr i64 %or to ptr 2630 %1 = load atomic i16, ptr %0 monotonic, align 2 2631 %conv1 = zext i16 %1 to i64 2632 ret i64 %conv1 2633} 2634 2635; Function Attrs: nofree norecurse nounwind uwtable willreturn 2636define dso_local i64 @ld_not_disjoint16_uint64_t_uint16_t(i64 %ptr) { 2637; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint16_t: 2638; CHECK: # %bb.0: # %entry 2639; CHECK-NEXT: ori r3, r3, 6 2640; CHECK-NEXT: lhz r3, 0(r3) 2641; CHECK-NEXT: blr 2642entry: 2643 %or = or i64 %ptr, 6 2644 %0 = inttoptr i64 %or to ptr 2645 %1 = load atomic i16, ptr %0 monotonic, align 2 2646 %conv = zext i16 %1 to i64 2647 ret i64 %conv 2648} 2649 2650; Function Attrs: nofree norecurse nounwind uwtable willreturn 2651define dso_local i64 @ld_disjoint_align16_uint64_t_uint16_t(i64 %ptr) { 2652; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint16_t: 2653; CHECK: # %bb.0: # %entry 2654; CHECK-NEXT: rldicr r3, r3, 0, 51 2655; CHECK-NEXT: lhz r3, 24(r3) 2656; CHECK-NEXT: blr 2657entry: 2658 %and = and i64 %ptr, -4096 2659 %or = or i64 %and, 24 2660 %0 = inttoptr i64 %or to ptr 2661 %1 = load atomic i16, ptr %0 monotonic, align 8 2662 %conv = zext i16 %1 to i64 2663 ret i64 %conv 2664} 2665 2666; Function Attrs: nofree norecurse nounwind uwtable willreturn 2667define dso_local i64 @ld_not_disjoint32_uint64_t_uint16_t(i64 %ptr) { 2668; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint16_t: 2669; CHECK: # %bb.0: # %entry 2670; CHECK-NEXT: ori r3, r3, 34463 2671; CHECK-NEXT: oris r3, r3, 1 2672; CHECK-NEXT: lhz r3, 0(r3) 2673; CHECK-NEXT: blr 2674entry: 2675 %or = or i64 %ptr, 99999 2676 %0 = inttoptr i64 %or to ptr 2677 %1 = load atomic i16, ptr %0 monotonic, align 2 2678 %conv = zext i16 %1 to i64 2679 ret i64 %conv 2680} 2681 2682; Function Attrs: nofree norecurse nounwind uwtable willreturn 2683define dso_local i64 @ld_disjoint_align32_uint64_t_uint16_t(i64 %ptr) { 2684; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_uint16_t: 2685; CHECK-P10: # %bb.0: # %entry 2686; CHECK-P10-NEXT: lis r4, -15264 2687; CHECK-P10-NEXT: and r3, r3, r4 2688; CHECK-P10-NEXT: plhz r3, 999990000(r3), 0 2689; CHECK-P10-NEXT: clrldi r3, r3, 32 2690; CHECK-P10-NEXT: blr 2691; 2692; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_uint16_t: 2693; CHECK-PREP10: # %bb.0: # %entry 2694; CHECK-PREP10-NEXT: lis r4, -15264 2695; CHECK-PREP10-NEXT: and r3, r3, r4 2696; CHECK-PREP10-NEXT: lis r4, 15258 2697; CHECK-PREP10-NEXT: ori r4, r4, 41712 2698; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2699; CHECK-PREP10-NEXT: blr 2700entry: 2701 %and = and i64 %ptr, -1000341504 2702 %or = or i64 %and, 999990000 2703 %0 = inttoptr i64 %or to ptr 2704 %1 = load atomic i16, ptr %0 monotonic, align 16 2705 %conv = zext i16 %1 to i64 2706 ret i64 %conv 2707} 2708 2709; Function Attrs: nofree norecurse nounwind uwtable willreturn 2710define dso_local i64 @ld_not_disjoint64_uint64_t_uint16_t(i64 %ptr) { 2711; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_uint16_t: 2712; CHECK-P10: # %bb.0: # %entry 2713; CHECK-P10-NEXT: pli r4, 232 2714; CHECK-P10-NEXT: pli r5, 3567587329 2715; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 2716; CHECK-P10-NEXT: or r3, r3, r5 2717; CHECK-P10-NEXT: lhz r3, 0(r3) 2718; CHECK-P10-NEXT: blr 2719; 2720; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint16_t: 2721; CHECK-PREP10: # %bb.0: # %entry 2722; CHECK-PREP10-NEXT: li r4, 29 2723; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 2724; CHECK-PREP10-NEXT: oris r4, r4, 54437 2725; CHECK-PREP10-NEXT: ori r4, r4, 4097 2726; CHECK-PREP10-NEXT: or r3, r3, r4 2727; CHECK-PREP10-NEXT: lhz r3, 0(r3) 2728; CHECK-PREP10-NEXT: blr 2729entry: 2730 %or = or i64 %ptr, 1000000000001 2731 %0 = inttoptr i64 %or to ptr 2732 %1 = load atomic i16, ptr %0 monotonic, align 2 2733 %conv = zext i16 %1 to i64 2734 ret i64 %conv 2735} 2736 2737; Function Attrs: nofree norecurse nounwind uwtable willreturn 2738define dso_local i64 @ld_disjoint_align64_uint64_t_uint16_t(i64 %ptr) { 2739; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_uint16_t: 2740; CHECK-P10: # %bb.0: # %entry 2741; CHECK-P10-NEXT: pli r4, 244140625 2742; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 2743; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2744; CHECK-P10-NEXT: lhzx r3, r3, r4 2745; CHECK-P10-NEXT: blr 2746; 2747; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint16_t: 2748; CHECK-PREP10: # %bb.0: # %entry 2749; CHECK-PREP10-NEXT: lis r4, 3725 2750; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 2751; CHECK-PREP10-NEXT: ori r4, r4, 19025 2752; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2753; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2754; CHECK-PREP10-NEXT: blr 2755entry: 2756 %and = and i64 %ptr, -1099511627776 2757 %or = or i64 %and, 1000000000000 2758 %0 = inttoptr i64 %or to ptr 2759 %1 = load atomic i16, ptr %0 monotonic, align 4096 2760 %conv = zext i16 %1 to i64 2761 ret i64 %conv 2762} 2763 2764; Function Attrs: nofree norecurse nounwind uwtable willreturn 2765define dso_local i64 @ld_cst_align16_uint64_t_uint16_t() { 2766; CHECK-LABEL: ld_cst_align16_uint64_t_uint16_t: 2767; CHECK: # %bb.0: # %entry 2768; CHECK-NEXT: lhz r3, 4080(0) 2769; CHECK-NEXT: blr 2770entry: 2771 %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2772 %conv = zext i16 %0 to i64 2773 ret i64 %conv 2774} 2775 2776; Function Attrs: nofree norecurse nounwind uwtable willreturn 2777define dso_local i64 @ld_cst_align32_uint64_t_uint16_t() { 2778; CHECK-LABEL: ld_cst_align32_uint64_t_uint16_t: 2779; CHECK: # %bb.0: # %entry 2780; CHECK-NEXT: lis r3, 153 2781; CHECK-NEXT: lhz r3, -27108(r3) 2782; CHECK-NEXT: blr 2783entry: 2784 %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 2785 %conv = zext i16 %0 to i64 2786 ret i64 %conv 2787} 2788 2789; Function Attrs: nofree norecurse nounwind uwtable willreturn 2790define dso_local i64 @ld_cst_align64_uint64_t_uint16_t() { 2791; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint16_t: 2792; CHECK-P10: # %bb.0: # %entry 2793; CHECK-P10-NEXT: pli r3, 244140625 2794; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2795; CHECK-P10-NEXT: lhz r3, 0(r3) 2796; CHECK-P10-NEXT: blr 2797; 2798; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint16_t: 2799; CHECK-PREP10: # %bb.0: # %entry 2800; CHECK-PREP10-NEXT: lis r3, 3725 2801; CHECK-PREP10-NEXT: ori r3, r3, 19025 2802; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2803; CHECK-PREP10-NEXT: lhz r3, 0(r3) 2804; CHECK-PREP10-NEXT: blr 2805entry: 2806 %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2807 %conv = zext i16 %0 to i64 2808 ret i64 %conv 2809} 2810 2811; Function Attrs: nofree norecurse nounwind uwtable willreturn 2812define dso_local i64 @ld_0_uint64_t_int16_t(i64 %ptr) { 2813; CHECK-LABEL: ld_0_uint64_t_int16_t: 2814; CHECK: # %bb.0: # %entry 2815; CHECK-NEXT: lhz r3, 0(r3) 2816; CHECK-NEXT: extsh r3, r3 2817; CHECK-NEXT: blr 2818entry: 2819 %0 = inttoptr i64 %ptr to ptr 2820 %1 = load atomic i16, ptr %0 monotonic, align 2 2821 %conv = sext i16 %1 to i64 2822 ret i64 %conv 2823} 2824 2825; Function Attrs: nofree norecurse nounwind uwtable willreturn 2826define dso_local i64 @ld_align16_uint64_t_int16_t(ptr nocapture readonly %ptr) { 2827; CHECK-LABEL: ld_align16_uint64_t_int16_t: 2828; CHECK: # %bb.0: # %entry 2829; CHECK-NEXT: lhz r3, 8(r3) 2830; CHECK-NEXT: extsh r3, r3 2831; CHECK-NEXT: blr 2832entry: 2833 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2834 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2835 %conv = sext i16 %0 to i64 2836 ret i64 %conv 2837} 2838 2839; Function Attrs: nofree norecurse nounwind uwtable willreturn 2840define dso_local i64 @ld_align32_uint64_t_int16_t(ptr nocapture readonly %ptr) { 2841; CHECK-P10-LABEL: ld_align32_uint64_t_int16_t: 2842; CHECK-P10: # %bb.0: # %entry 2843; CHECK-P10-NEXT: plhz r3, 99999000(r3), 0 2844; CHECK-P10-NEXT: extsh r3, r3 2845; CHECK-P10-NEXT: blr 2846; 2847; CHECK-PREP10-LABEL: ld_align32_uint64_t_int16_t: 2848; CHECK-PREP10: # %bb.0: # %entry 2849; CHECK-PREP10-NEXT: lis r4, 1525 2850; CHECK-PREP10-NEXT: ori r4, r4, 56600 2851; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2852; CHECK-PREP10-NEXT: extsh r3, r3 2853; CHECK-PREP10-NEXT: blr 2854entry: 2855 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2856 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2857 %conv = sext i16 %0 to i64 2858 ret i64 %conv 2859} 2860 2861; Function Attrs: nofree norecurse nounwind uwtable willreturn 2862define dso_local i64 @ld_align64_uint64_t_int16_t(ptr nocapture readonly %ptr) { 2863; CHECK-P10-LABEL: ld_align64_uint64_t_int16_t: 2864; CHECK-P10: # %bb.0: # %entry 2865; CHECK-P10-NEXT: pli r4, 244140625 2866; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2867; CHECK-P10-NEXT: lhzx r3, r3, r4 2868; CHECK-P10-NEXT: extsh r3, r3 2869; CHECK-P10-NEXT: blr 2870; 2871; CHECK-PREP10-LABEL: ld_align64_uint64_t_int16_t: 2872; CHECK-PREP10: # %bb.0: # %entry 2873; CHECK-PREP10-NEXT: lis r4, 3725 2874; CHECK-PREP10-NEXT: ori r4, r4, 19025 2875; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2876; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2877; CHECK-PREP10-NEXT: extsh r3, r3 2878; CHECK-PREP10-NEXT: blr 2879entry: 2880 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2881 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2882 %conv = sext i16 %0 to i64 2883 ret i64 %conv 2884} 2885 2886; Function Attrs: nofree norecurse nounwind uwtable willreturn 2887define dso_local i64 @ld_reg_uint64_t_int16_t(ptr nocapture readonly %ptr, i64 %off) { 2888; CHECK-LABEL: ld_reg_uint64_t_int16_t: 2889; CHECK: # %bb.0: # %entry 2890; CHECK-NEXT: lhzx r3, r3, r4 2891; CHECK-NEXT: extsh r3, r3 2892; CHECK-NEXT: blr 2893entry: 2894 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2895 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2896 %conv = sext i16 %0 to i64 2897 ret i64 %conv 2898} 2899 2900; Function Attrs: nofree norecurse nounwind uwtable willreturn 2901define dso_local i64 @ld_or_uint64_t_int16_t(i64 %ptr, i8 zeroext %off) { 2902; CHECK-LABEL: ld_or_uint64_t_int16_t: 2903; CHECK: # %bb.0: # %entry 2904; CHECK-NEXT: or r3, r4, r3 2905; CHECK-NEXT: lhz r3, 0(r3) 2906; CHECK-NEXT: extsh r3, r3 2907; CHECK-NEXT: blr 2908entry: 2909 %conv = zext i8 %off to i64 2910 %or = or i64 %conv, %ptr 2911 %0 = inttoptr i64 %or to ptr 2912 %1 = load atomic i16, ptr %0 monotonic, align 2 2913 %conv1 = sext i16 %1 to i64 2914 ret i64 %conv1 2915} 2916 2917; Function Attrs: nofree norecurse nounwind uwtable willreturn 2918define dso_local i64 @ld_not_disjoint16_uint64_t_int16_t(i64 %ptr) { 2919; CHECK-LABEL: ld_not_disjoint16_uint64_t_int16_t: 2920; CHECK: # %bb.0: # %entry 2921; CHECK-NEXT: ori r3, r3, 6 2922; CHECK-NEXT: lhz r3, 0(r3) 2923; CHECK-NEXT: extsh r3, r3 2924; CHECK-NEXT: blr 2925entry: 2926 %or = or i64 %ptr, 6 2927 %0 = inttoptr i64 %or to ptr 2928 %1 = load atomic i16, ptr %0 monotonic, align 2 2929 %conv = sext i16 %1 to i64 2930 ret i64 %conv 2931} 2932 2933; Function Attrs: nofree norecurse nounwind uwtable willreturn 2934define dso_local i64 @ld_disjoint_align16_uint64_t_int16_t(i64 %ptr) { 2935; CHECK-LABEL: ld_disjoint_align16_uint64_t_int16_t: 2936; CHECK: # %bb.0: # %entry 2937; CHECK-NEXT: rldicr r3, r3, 0, 51 2938; CHECK-NEXT: lhz r3, 24(r3) 2939; CHECK-NEXT: extsh r3, r3 2940; CHECK-NEXT: blr 2941entry: 2942 %and = and i64 %ptr, -4096 2943 %or = or i64 %and, 24 2944 %0 = inttoptr i64 %or to ptr 2945 %1 = load atomic i16, ptr %0 monotonic, align 8 2946 %conv = sext i16 %1 to i64 2947 ret i64 %conv 2948} 2949 2950; Function Attrs: nofree norecurse nounwind uwtable willreturn 2951define dso_local i64 @ld_not_disjoint32_uint64_t_int16_t(i64 %ptr) { 2952; CHECK-LABEL: ld_not_disjoint32_uint64_t_int16_t: 2953; CHECK: # %bb.0: # %entry 2954; CHECK-NEXT: ori r3, r3, 34463 2955; CHECK-NEXT: oris r3, r3, 1 2956; CHECK-NEXT: lhz r3, 0(r3) 2957; CHECK-NEXT: extsh r3, r3 2958; CHECK-NEXT: blr 2959entry: 2960 %or = or i64 %ptr, 99999 2961 %0 = inttoptr i64 %or to ptr 2962 %1 = load atomic i16, ptr %0 monotonic, align 2 2963 %conv = sext i16 %1 to i64 2964 ret i64 %conv 2965} 2966 2967; Function Attrs: nofree norecurse nounwind uwtable willreturn 2968define dso_local i64 @ld_disjoint_align32_uint64_t_int16_t(i64 %ptr) { 2969; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_int16_t: 2970; CHECK-P10: # %bb.0: # %entry 2971; CHECK-P10-NEXT: lis r4, -15264 2972; CHECK-P10-NEXT: and r3, r3, r4 2973; CHECK-P10-NEXT: plhz r3, 999990000(r3), 0 2974; CHECK-P10-NEXT: extsh r3, r3 2975; CHECK-P10-NEXT: blr 2976; 2977; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_int16_t: 2978; CHECK-PREP10: # %bb.0: # %entry 2979; CHECK-PREP10-NEXT: lis r4, -15264 2980; CHECK-PREP10-NEXT: and r3, r3, r4 2981; CHECK-PREP10-NEXT: lis r4, 15258 2982; CHECK-PREP10-NEXT: ori r4, r4, 41712 2983; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2984; CHECK-PREP10-NEXT: extsh r3, r3 2985; CHECK-PREP10-NEXT: blr 2986entry: 2987 %and = and i64 %ptr, -1000341504 2988 %or = or i64 %and, 999990000 2989 %0 = inttoptr i64 %or to ptr 2990 %1 = load atomic i16, ptr %0 monotonic, align 16 2991 %conv = sext i16 %1 to i64 2992 ret i64 %conv 2993} 2994 2995; Function Attrs: nofree norecurse nounwind uwtable willreturn 2996define dso_local i64 @ld_not_disjoint64_uint64_t_int16_t(i64 %ptr) { 2997; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_int16_t: 2998; CHECK-P10: # %bb.0: # %entry 2999; CHECK-P10-NEXT: pli r4, 232 3000; CHECK-P10-NEXT: pli r5, 3567587329 3001; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 3002; CHECK-P10-NEXT: or r3, r3, r5 3003; CHECK-P10-NEXT: lhz r3, 0(r3) 3004; CHECK-P10-NEXT: extsh r3, r3 3005; CHECK-P10-NEXT: blr 3006; 3007; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_int16_t: 3008; CHECK-PREP10: # %bb.0: # %entry 3009; CHECK-PREP10-NEXT: li r4, 29 3010; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 3011; CHECK-PREP10-NEXT: oris r4, r4, 54437 3012; CHECK-PREP10-NEXT: ori r4, r4, 4097 3013; CHECK-PREP10-NEXT: or r3, r3, r4 3014; CHECK-PREP10-NEXT: lhz r3, 0(r3) 3015; CHECK-PREP10-NEXT: extsh r3, r3 3016; CHECK-PREP10-NEXT: blr 3017entry: 3018 %or = or i64 %ptr, 1000000000001 3019 %0 = inttoptr i64 %or to ptr 3020 %1 = load atomic i16, ptr %0 monotonic, align 2 3021 %conv = sext i16 %1 to i64 3022 ret i64 %conv 3023} 3024 3025; Function Attrs: nofree norecurse nounwind uwtable willreturn 3026define dso_local i64 @ld_disjoint_align64_uint64_t_int16_t(i64 %ptr) { 3027; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_int16_t: 3028; CHECK-P10: # %bb.0: # %entry 3029; CHECK-P10-NEXT: pli r4, 244140625 3030; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3031; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3032; CHECK-P10-NEXT: lhzx r3, r3, r4 3033; CHECK-P10-NEXT: extsh r3, r3 3034; CHECK-P10-NEXT: blr 3035; 3036; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_int16_t: 3037; CHECK-PREP10: # %bb.0: # %entry 3038; CHECK-PREP10-NEXT: lis r4, 3725 3039; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3040; CHECK-PREP10-NEXT: ori r4, r4, 19025 3041; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3042; CHECK-PREP10-NEXT: lhzx r3, r3, r4 3043; CHECK-PREP10-NEXT: extsh r3, r3 3044; CHECK-PREP10-NEXT: blr 3045entry: 3046 %and = and i64 %ptr, -1099511627776 3047 %or = or i64 %and, 1000000000000 3048 %0 = inttoptr i64 %or to ptr 3049 %1 = load atomic i16, ptr %0 monotonic, align 4096 3050 %conv = sext i16 %1 to i64 3051 ret i64 %conv 3052} 3053 3054; Function Attrs: nofree norecurse nounwind uwtable willreturn 3055define dso_local i64 @ld_cst_align16_uint64_t_int16_t() { 3056; CHECK-LABEL: ld_cst_align16_uint64_t_int16_t: 3057; CHECK: # %bb.0: # %entry 3058; CHECK-NEXT: lhz r3, 4080(0) 3059; CHECK-NEXT: extsh r3, r3 3060; CHECK-NEXT: blr 3061entry: 3062 %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3063 %conv = sext i16 %0 to i64 3064 ret i64 %conv 3065} 3066 3067; Function Attrs: nofree norecurse nounwind uwtable willreturn 3068define dso_local i64 @ld_cst_align32_uint64_t_int16_t() { 3069; CHECK-LABEL: ld_cst_align32_uint64_t_int16_t: 3070; CHECK: # %bb.0: # %entry 3071; CHECK-NEXT: lis r3, 153 3072; CHECK-NEXT: lhz r3, -27108(r3) 3073; CHECK-NEXT: extsh r3, r3 3074; CHECK-NEXT: blr 3075entry: 3076 %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 3077 %conv = sext i16 %0 to i64 3078 ret i64 %conv 3079} 3080 3081; Function Attrs: nofree norecurse nounwind uwtable willreturn 3082define dso_local i64 @ld_cst_align64_uint64_t_int16_t() { 3083; CHECK-P10-LABEL: ld_cst_align64_uint64_t_int16_t: 3084; CHECK-P10: # %bb.0: # %entry 3085; CHECK-P10-NEXT: pli r3, 244140625 3086; CHECK-P10-NEXT: rldic r3, r3, 12, 24 3087; CHECK-P10-NEXT: lhz r3, 0(r3) 3088; CHECK-P10-NEXT: extsh r3, r3 3089; CHECK-P10-NEXT: blr 3090; 3091; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_int16_t: 3092; CHECK-PREP10: # %bb.0: # %entry 3093; CHECK-PREP10-NEXT: lis r3, 3725 3094; CHECK-PREP10-NEXT: ori r3, r3, 19025 3095; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 3096; CHECK-PREP10-NEXT: lhz r3, 0(r3) 3097; CHECK-PREP10-NEXT: extsh r3, r3 3098; CHECK-PREP10-NEXT: blr 3099entry: 3100 %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3101 %conv = sext i16 %0 to i64 3102 ret i64 %conv 3103} 3104 3105; Function Attrs: nofree norecurse nounwind uwtable willreturn 3106define dso_local i64 @ld_0_uint64_t_uint32_t(i64 %ptr) { 3107; CHECK-LABEL: ld_0_uint64_t_uint32_t: 3108; CHECK: # %bb.0: # %entry 3109; CHECK-NEXT: lwz r3, 0(r3) 3110; CHECK-NEXT: blr 3111entry: 3112 %0 = inttoptr i64 %ptr to ptr 3113 %1 = load atomic i32, ptr %0 monotonic, align 4 3114 %conv = zext i32 %1 to i64 3115 ret i64 %conv 3116} 3117 3118; Function Attrs: nofree norecurse nounwind uwtable willreturn 3119define dso_local i64 @ld_align16_uint64_t_uint32_t(ptr nocapture readonly %ptr) { 3120; CHECK-LABEL: ld_align16_uint64_t_uint32_t: 3121; CHECK: # %bb.0: # %entry 3122; CHECK-NEXT: lwz r3, 8(r3) 3123; CHECK-NEXT: blr 3124entry: 3125 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3126 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 3127 %conv = zext i32 %0 to i64 3128 ret i64 %conv 3129} 3130 3131; Function Attrs: nofree norecurse nounwind uwtable willreturn 3132define dso_local i64 @ld_align32_uint64_t_uint32_t(ptr nocapture readonly %ptr) { 3133; CHECK-P10-LABEL: ld_align32_uint64_t_uint32_t: 3134; CHECK-P10: # %bb.0: # %entry 3135; CHECK-P10-NEXT: plwz r3, 99999000(r3), 0 3136; CHECK-P10-NEXT: clrldi r3, r3, 32 3137; CHECK-P10-NEXT: blr 3138; 3139; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint32_t: 3140; CHECK-PREP10: # %bb.0: # %entry 3141; CHECK-PREP10-NEXT: lis r4, 1525 3142; CHECK-PREP10-NEXT: ori r4, r4, 56600 3143; CHECK-PREP10-NEXT: lwzx r3, r3, r4 3144; CHECK-PREP10-NEXT: blr 3145entry: 3146 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3147 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 3148 %conv = zext i32 %0 to i64 3149 ret i64 %conv 3150} 3151 3152; Function Attrs: nofree norecurse nounwind uwtable willreturn 3153define dso_local i64 @ld_align64_uint64_t_uint32_t(ptr nocapture readonly %ptr) { 3154; CHECK-P10-LABEL: ld_align64_uint64_t_uint32_t: 3155; CHECK-P10: # %bb.0: # %entry 3156; CHECK-P10-NEXT: pli r4, 244140625 3157; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3158; CHECK-P10-NEXT: lwzx r3, r3, r4 3159; CHECK-P10-NEXT: blr 3160; 3161; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint32_t: 3162; CHECK-PREP10: # %bb.0: # %entry 3163; CHECK-PREP10-NEXT: lis r4, 3725 3164; CHECK-PREP10-NEXT: ori r4, r4, 19025 3165; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3166; CHECK-PREP10-NEXT: lwzx r3, r3, r4 3167; CHECK-PREP10-NEXT: blr 3168entry: 3169 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3170 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 3171 %conv = zext i32 %0 to i64 3172 ret i64 %conv 3173} 3174 3175; Function Attrs: nofree norecurse nounwind uwtable willreturn 3176define dso_local i64 @ld_reg_uint64_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) { 3177; CHECK-LABEL: ld_reg_uint64_t_uint32_t: 3178; CHECK: # %bb.0: # %entry 3179; CHECK-NEXT: lwzx r3, r3, r4 3180; CHECK-NEXT: blr 3181entry: 3182 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3183 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 3184 %conv = zext i32 %0 to i64 3185 ret i64 %conv 3186} 3187 3188; Function Attrs: nofree norecurse nounwind uwtable willreturn 3189define dso_local i64 @ld_or_uint64_t_uint32_t(i64 %ptr, i8 zeroext %off) { 3190; CHECK-LABEL: ld_or_uint64_t_uint32_t: 3191; CHECK: # %bb.0: # %entry 3192; CHECK-NEXT: or r3, r4, r3 3193; CHECK-NEXT: lwz r3, 0(r3) 3194; CHECK-NEXT: blr 3195entry: 3196 %conv = zext i8 %off to i64 3197 %or = or i64 %conv, %ptr 3198 %0 = inttoptr i64 %or to ptr 3199 %1 = load atomic i32, ptr %0 monotonic, align 4 3200 %conv1 = zext i32 %1 to i64 3201 ret i64 %conv1 3202} 3203 3204; Function Attrs: nofree norecurse nounwind uwtable willreturn 3205define dso_local i64 @ld_not_disjoint16_uint64_t_uint32_t(i64 %ptr) { 3206; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint32_t: 3207; CHECK: # %bb.0: # %entry 3208; CHECK-NEXT: ori r3, r3, 6 3209; CHECK-NEXT: lwz r3, 0(r3) 3210; CHECK-NEXT: blr 3211entry: 3212 %or = or i64 %ptr, 6 3213 %0 = inttoptr i64 %or to ptr 3214 %1 = load atomic i32, ptr %0 monotonic, align 4 3215 %conv = zext i32 %1 to i64 3216 ret i64 %conv 3217} 3218 3219; Function Attrs: nofree norecurse nounwind uwtable willreturn 3220define dso_local i64 @ld_disjoint_align16_uint64_t_uint32_t(i64 %ptr) { 3221; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint32_t: 3222; CHECK: # %bb.0: # %entry 3223; CHECK-NEXT: rldicr r3, r3, 0, 51 3224; CHECK-NEXT: lwz r3, 24(r3) 3225; CHECK-NEXT: blr 3226entry: 3227 %and = and i64 %ptr, -4096 3228 %or = or i64 %and, 24 3229 %0 = inttoptr i64 %or to ptr 3230 %1 = load atomic i32, ptr %0 monotonic, align 8 3231 %conv = zext i32 %1 to i64 3232 ret i64 %conv 3233} 3234 3235; Function Attrs: nofree norecurse nounwind uwtable willreturn 3236define dso_local i64 @ld_not_disjoint32_uint64_t_uint32_t(i64 %ptr) { 3237; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint32_t: 3238; CHECK: # %bb.0: # %entry 3239; CHECK-NEXT: ori r3, r3, 34463 3240; CHECK-NEXT: oris r3, r3, 1 3241; CHECK-NEXT: lwz r3, 0(r3) 3242; CHECK-NEXT: blr 3243entry: 3244 %or = or i64 %ptr, 99999 3245 %0 = inttoptr i64 %or to ptr 3246 %1 = load atomic i32, ptr %0 monotonic, align 4 3247 %conv = zext i32 %1 to i64 3248 ret i64 %conv 3249} 3250 3251; Function Attrs: nofree norecurse nounwind uwtable willreturn 3252define dso_local i64 @ld_disjoint_align32_uint64_t_uint32_t(i64 %ptr) { 3253; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_uint32_t: 3254; CHECK-P10: # %bb.0: # %entry 3255; CHECK-P10-NEXT: lis r4, -15264 3256; CHECK-P10-NEXT: and r3, r3, r4 3257; CHECK-P10-NEXT: plwz r3, 999990000(r3), 0 3258; CHECK-P10-NEXT: clrldi r3, r3, 32 3259; CHECK-P10-NEXT: blr 3260; 3261; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_uint32_t: 3262; CHECK-PREP10: # %bb.0: # %entry 3263; CHECK-PREP10-NEXT: lis r4, -15264 3264; CHECK-PREP10-NEXT: and r3, r3, r4 3265; CHECK-PREP10-NEXT: lis r4, 15258 3266; CHECK-PREP10-NEXT: ori r4, r4, 41712 3267; CHECK-PREP10-NEXT: lwzx r3, r3, r4 3268; CHECK-PREP10-NEXT: blr 3269entry: 3270 %and = and i64 %ptr, -1000341504 3271 %or = or i64 %and, 999990000 3272 %0 = inttoptr i64 %or to ptr 3273 %1 = load atomic i32, ptr %0 monotonic, align 16 3274 %conv = zext i32 %1 to i64 3275 ret i64 %conv 3276} 3277 3278; Function Attrs: nofree norecurse nounwind uwtable willreturn 3279define dso_local i64 @ld_not_disjoint64_uint64_t_uint32_t(i64 %ptr) { 3280; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_uint32_t: 3281; CHECK-P10: # %bb.0: # %entry 3282; CHECK-P10-NEXT: pli r4, 232 3283; CHECK-P10-NEXT: pli r5, 3567587329 3284; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 3285; CHECK-P10-NEXT: or r3, r3, r5 3286; CHECK-P10-NEXT: lwz r3, 0(r3) 3287; CHECK-P10-NEXT: blr 3288; 3289; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint32_t: 3290; CHECK-PREP10: # %bb.0: # %entry 3291; CHECK-PREP10-NEXT: li r4, 29 3292; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 3293; CHECK-PREP10-NEXT: oris r4, r4, 54437 3294; CHECK-PREP10-NEXT: ori r4, r4, 4097 3295; CHECK-PREP10-NEXT: or r3, r3, r4 3296; CHECK-PREP10-NEXT: lwz r3, 0(r3) 3297; CHECK-PREP10-NEXT: blr 3298entry: 3299 %or = or i64 %ptr, 1000000000001 3300 %0 = inttoptr i64 %or to ptr 3301 %1 = load atomic i32, ptr %0 monotonic, align 4 3302 %conv = zext i32 %1 to i64 3303 ret i64 %conv 3304} 3305 3306; Function Attrs: nofree norecurse nounwind uwtable willreturn 3307define dso_local i64 @ld_disjoint_align64_uint64_t_uint32_t(i64 %ptr) { 3308; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_uint32_t: 3309; CHECK-P10: # %bb.0: # %entry 3310; CHECK-P10-NEXT: pli r4, 244140625 3311; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3312; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3313; CHECK-P10-NEXT: lwzx r3, r3, r4 3314; CHECK-P10-NEXT: blr 3315; 3316; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint32_t: 3317; CHECK-PREP10: # %bb.0: # %entry 3318; CHECK-PREP10-NEXT: lis r4, 3725 3319; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3320; CHECK-PREP10-NEXT: ori r4, r4, 19025 3321; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3322; CHECK-PREP10-NEXT: lwzx r3, r3, r4 3323; CHECK-PREP10-NEXT: blr 3324entry: 3325 %and = and i64 %ptr, -1099511627776 3326 %or = or i64 %and, 1000000000000 3327 %0 = inttoptr i64 %or to ptr 3328 %1 = load atomic i32, ptr %0 monotonic, align 4096 3329 %conv = zext i32 %1 to i64 3330 ret i64 %conv 3331} 3332 3333; Function Attrs: nofree norecurse nounwind uwtable willreturn 3334define dso_local i64 @ld_cst_align16_uint64_t_uint32_t() { 3335; CHECK-LABEL: ld_cst_align16_uint64_t_uint32_t: 3336; CHECK: # %bb.0: # %entry 3337; CHECK-NEXT: lwz r3, 4080(0) 3338; CHECK-NEXT: blr 3339entry: 3340 %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3341 %conv = zext i32 %0 to i64 3342 ret i64 %conv 3343} 3344 3345; Function Attrs: nofree norecurse nounwind uwtable willreturn 3346define dso_local i64 @ld_cst_align32_uint64_t_uint32_t() { 3347; CHECK-LABEL: ld_cst_align32_uint64_t_uint32_t: 3348; CHECK: # %bb.0: # %entry 3349; CHECK-NEXT: lis r3, 153 3350; CHECK-NEXT: lwz r3, -27108(r3) 3351; CHECK-NEXT: blr 3352entry: 3353 %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 3354 %conv = zext i32 %0 to i64 3355 ret i64 %conv 3356} 3357 3358; Function Attrs: nofree norecurse nounwind uwtable willreturn 3359define dso_local i64 @ld_cst_align64_uint64_t_uint32_t() { 3360; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint32_t: 3361; CHECK-P10: # %bb.0: # %entry 3362; CHECK-P10-NEXT: pli r3, 244140625 3363; CHECK-P10-NEXT: rldic r3, r3, 12, 24 3364; CHECK-P10-NEXT: lwz r3, 0(r3) 3365; CHECK-P10-NEXT: blr 3366; 3367; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint32_t: 3368; CHECK-PREP10: # %bb.0: # %entry 3369; CHECK-PREP10-NEXT: lis r3, 3725 3370; CHECK-PREP10-NEXT: ori r3, r3, 19025 3371; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 3372; CHECK-PREP10-NEXT: lwz r3, 0(r3) 3373; CHECK-PREP10-NEXT: blr 3374entry: 3375 %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3376 %conv = zext i32 %0 to i64 3377 ret i64 %conv 3378} 3379 3380; Function Attrs: nofree norecurse nounwind uwtable willreturn 3381define dso_local i64 @ld_0_uint64_t_int32_t(i64 %ptr) { 3382; CHECK-LABEL: ld_0_uint64_t_int32_t: 3383; CHECK: # %bb.0: # %entry 3384; CHECK-NEXT: lwa r3, 0(r3) 3385; CHECK-NEXT: blr 3386entry: 3387 %0 = inttoptr i64 %ptr to ptr 3388 %1 = load atomic i32, ptr %0 monotonic, align 4 3389 %conv = sext i32 %1 to i64 3390 ret i64 %conv 3391} 3392 3393; Function Attrs: nofree norecurse nounwind uwtable willreturn 3394define dso_local i64 @ld_align16_uint64_t_int32_t(ptr nocapture readonly %ptr) { 3395; CHECK-LABEL: ld_align16_uint64_t_int32_t: 3396; CHECK: # %bb.0: # %entry 3397; CHECK-NEXT: lwa r3, 8(r3) 3398; CHECK-NEXT: blr 3399entry: 3400 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3401 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 3402 %conv = sext i32 %0 to i64 3403 ret i64 %conv 3404} 3405 3406; Function Attrs: nofree norecurse nounwind uwtable willreturn 3407define dso_local i64 @ld_align32_uint64_t_int32_t(ptr nocapture readonly %ptr) { 3408; CHECK-P10-LABEL: ld_align32_uint64_t_int32_t: 3409; CHECK-P10: # %bb.0: # %entry 3410; CHECK-P10-NEXT: plwz r3, 99999000(r3), 0 3411; CHECK-P10-NEXT: extsw r3, r3 3412; CHECK-P10-NEXT: blr 3413; 3414; CHECK-PREP10-LABEL: ld_align32_uint64_t_int32_t: 3415; CHECK-PREP10: # %bb.0: # %entry 3416; CHECK-PREP10-NEXT: lis r4, 1525 3417; CHECK-PREP10-NEXT: ori r4, r4, 56600 3418; CHECK-PREP10-NEXT: lwax r3, r3, r4 3419; CHECK-PREP10-NEXT: blr 3420entry: 3421 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3422 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 3423 %conv = sext i32 %0 to i64 3424 ret i64 %conv 3425} 3426 3427; Function Attrs: nofree norecurse nounwind uwtable willreturn 3428define dso_local i64 @ld_align64_uint64_t_int32_t(ptr nocapture readonly %ptr) { 3429; CHECK-P10-LABEL: ld_align64_uint64_t_int32_t: 3430; CHECK-P10: # %bb.0: # %entry 3431; CHECK-P10-NEXT: pli r4, 244140625 3432; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3433; CHECK-P10-NEXT: lwax r3, r3, r4 3434; CHECK-P10-NEXT: blr 3435; 3436; CHECK-PREP10-LABEL: ld_align64_uint64_t_int32_t: 3437; CHECK-PREP10: # %bb.0: # %entry 3438; CHECK-PREP10-NEXT: lis r4, 3725 3439; CHECK-PREP10-NEXT: ori r4, r4, 19025 3440; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3441; CHECK-PREP10-NEXT: lwax r3, r3, r4 3442; CHECK-PREP10-NEXT: blr 3443entry: 3444 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3445 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 3446 %conv = sext i32 %0 to i64 3447 ret i64 %conv 3448} 3449 3450; Function Attrs: nofree norecurse nounwind uwtable willreturn 3451define dso_local i64 @ld_reg_uint64_t_int32_t(ptr nocapture readonly %ptr, i64 %off) { 3452; CHECK-LABEL: ld_reg_uint64_t_int32_t: 3453; CHECK: # %bb.0: # %entry 3454; CHECK-NEXT: lwax r3, r3, r4 3455; CHECK-NEXT: blr 3456entry: 3457 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3458 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 3459 %conv = sext i32 %0 to i64 3460 ret i64 %conv 3461} 3462 3463; Function Attrs: nofree norecurse nounwind uwtable willreturn 3464define dso_local i64 @ld_or_uint64_t_int32_t(i64 %ptr, i8 zeroext %off) { 3465; CHECK-LABEL: ld_or_uint64_t_int32_t: 3466; CHECK: # %bb.0: # %entry 3467; CHECK-NEXT: or r3, r4, r3 3468; CHECK-NEXT: lwa r3, 0(r3) 3469; CHECK-NEXT: blr 3470entry: 3471 %conv = zext i8 %off to i64 3472 %or = or i64 %conv, %ptr 3473 %0 = inttoptr i64 %or to ptr 3474 %1 = load atomic i32, ptr %0 monotonic, align 4 3475 %conv1 = sext i32 %1 to i64 3476 ret i64 %conv1 3477} 3478 3479; Function Attrs: nofree norecurse nounwind uwtable willreturn 3480define dso_local i64 @ld_not_disjoint16_uint64_t_int32_t(i64 %ptr) { 3481; CHECK-LABEL: ld_not_disjoint16_uint64_t_int32_t: 3482; CHECK: # %bb.0: # %entry 3483; CHECK-NEXT: ori r3, r3, 6 3484; CHECK-NEXT: lwa r3, 0(r3) 3485; CHECK-NEXT: blr 3486entry: 3487 %or = or i64 %ptr, 6 3488 %0 = inttoptr i64 %or to ptr 3489 %1 = load atomic i32, ptr %0 monotonic, align 4 3490 %conv = sext i32 %1 to i64 3491 ret i64 %conv 3492} 3493 3494; Function Attrs: nofree norecurse nounwind uwtable willreturn 3495define dso_local i64 @ld_disjoint_align16_uint64_t_int32_t(i64 %ptr) { 3496; CHECK-LABEL: ld_disjoint_align16_uint64_t_int32_t: 3497; CHECK: # %bb.0: # %entry 3498; CHECK-NEXT: rldicr r3, r3, 0, 51 3499; CHECK-NEXT: lwa r3, 24(r3) 3500; CHECK-NEXT: blr 3501entry: 3502 %and = and i64 %ptr, -4096 3503 %or = or i64 %and, 24 3504 %0 = inttoptr i64 %or to ptr 3505 %1 = load atomic i32, ptr %0 monotonic, align 8 3506 %conv = sext i32 %1 to i64 3507 ret i64 %conv 3508} 3509 3510; Function Attrs: nofree norecurse nounwind uwtable willreturn 3511define dso_local i64 @ld_not_disjoint32_uint64_t_int32_t(i64 %ptr) { 3512; CHECK-LABEL: ld_not_disjoint32_uint64_t_int32_t: 3513; CHECK: # %bb.0: # %entry 3514; CHECK-NEXT: ori r3, r3, 34463 3515; CHECK-NEXT: oris r3, r3, 1 3516; CHECK-NEXT: lwa r3, 0(r3) 3517; CHECK-NEXT: blr 3518entry: 3519 %or = or i64 %ptr, 99999 3520 %0 = inttoptr i64 %or to ptr 3521 %1 = load atomic i32, ptr %0 monotonic, align 4 3522 %conv = sext i32 %1 to i64 3523 ret i64 %conv 3524} 3525 3526; Function Attrs: nofree norecurse nounwind uwtable willreturn 3527define dso_local i64 @ld_disjoint_align32_uint64_t_int32_t(i64 %ptr) { 3528; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_int32_t: 3529; CHECK-P10: # %bb.0: # %entry 3530; CHECK-P10-NEXT: lis r4, -15264 3531; CHECK-P10-NEXT: and r3, r3, r4 3532; CHECK-P10-NEXT: plwz r3, 999990000(r3), 0 3533; CHECK-P10-NEXT: extsw r3, r3 3534; CHECK-P10-NEXT: blr 3535; 3536; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_int32_t: 3537; CHECK-PREP10: # %bb.0: # %entry 3538; CHECK-PREP10-NEXT: lis r4, -15264 3539; CHECK-PREP10-NEXT: and r3, r3, r4 3540; CHECK-PREP10-NEXT: lis r4, 15258 3541; CHECK-PREP10-NEXT: ori r4, r4, 41712 3542; CHECK-PREP10-NEXT: lwax r3, r3, r4 3543; CHECK-PREP10-NEXT: blr 3544entry: 3545 %and = and i64 %ptr, -1000341504 3546 %or = or i64 %and, 999990000 3547 %0 = inttoptr i64 %or to ptr 3548 %1 = load atomic i32, ptr %0 monotonic, align 16 3549 %conv = sext i32 %1 to i64 3550 ret i64 %conv 3551} 3552 3553; Function Attrs: nofree norecurse nounwind uwtable willreturn 3554define dso_local i64 @ld_not_disjoint64_uint64_t_int32_t(i64 %ptr) { 3555; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_int32_t: 3556; CHECK-P10: # %bb.0: # %entry 3557; CHECK-P10-NEXT: pli r4, 232 3558; CHECK-P10-NEXT: pli r5, 3567587329 3559; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 3560; CHECK-P10-NEXT: or r3, r3, r5 3561; CHECK-P10-NEXT: lwa r3, 0(r3) 3562; CHECK-P10-NEXT: blr 3563; 3564; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_int32_t: 3565; CHECK-PREP10: # %bb.0: # %entry 3566; CHECK-PREP10-NEXT: li r4, 29 3567; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 3568; CHECK-PREP10-NEXT: oris r4, r4, 54437 3569; CHECK-PREP10-NEXT: ori r4, r4, 4097 3570; CHECK-PREP10-NEXT: or r3, r3, r4 3571; CHECK-PREP10-NEXT: lwa r3, 0(r3) 3572; CHECK-PREP10-NEXT: blr 3573entry: 3574 %or = or i64 %ptr, 1000000000001 3575 %0 = inttoptr i64 %or to ptr 3576 %1 = load atomic i32, ptr %0 monotonic, align 4 3577 %conv = sext i32 %1 to i64 3578 ret i64 %conv 3579} 3580 3581; Function Attrs: nofree norecurse nounwind uwtable willreturn 3582define dso_local i64 @ld_disjoint_align64_uint64_t_int32_t(i64 %ptr) { 3583; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_int32_t: 3584; CHECK-P10: # %bb.0: # %entry 3585; CHECK-P10-NEXT: pli r4, 244140625 3586; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3587; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3588; CHECK-P10-NEXT: lwax r3, r3, r4 3589; CHECK-P10-NEXT: blr 3590; 3591; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_int32_t: 3592; CHECK-PREP10: # %bb.0: # %entry 3593; CHECK-PREP10-NEXT: lis r4, 3725 3594; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3595; CHECK-PREP10-NEXT: ori r4, r4, 19025 3596; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3597; CHECK-PREP10-NEXT: lwax r3, r3, r4 3598; CHECK-PREP10-NEXT: blr 3599entry: 3600 %and = and i64 %ptr, -1099511627776 3601 %or = or i64 %and, 1000000000000 3602 %0 = inttoptr i64 %or to ptr 3603 %1 = load atomic i32, ptr %0 monotonic, align 4096 3604 %conv = sext i32 %1 to i64 3605 ret i64 %conv 3606} 3607 3608; Function Attrs: nofree norecurse nounwind uwtable willreturn 3609define dso_local i64 @ld_cst_align16_uint64_t_int32_t() { 3610; CHECK-LABEL: ld_cst_align16_uint64_t_int32_t: 3611; CHECK: # %bb.0: # %entry 3612; CHECK-NEXT: lwa r3, 4080(0) 3613; CHECK-NEXT: blr 3614entry: 3615 %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3616 %conv = sext i32 %0 to i64 3617 ret i64 %conv 3618} 3619 3620; Function Attrs: nofree norecurse nounwind uwtable willreturn 3621define dso_local i64 @ld_cst_align32_uint64_t_int32_t() { 3622; CHECK-LABEL: ld_cst_align32_uint64_t_int32_t: 3623; CHECK: # %bb.0: # %entry 3624; CHECK-NEXT: lis r3, 153 3625; CHECK-NEXT: lwa r3, -27108(r3) 3626; CHECK-NEXT: blr 3627entry: 3628 %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 3629 %conv = sext i32 %0 to i64 3630 ret i64 %conv 3631} 3632 3633; Function Attrs: nofree norecurse nounwind uwtable willreturn 3634define dso_local i64 @ld_cst_align64_uint64_t_int32_t() { 3635; CHECK-P10-LABEL: ld_cst_align64_uint64_t_int32_t: 3636; CHECK-P10: # %bb.0: # %entry 3637; CHECK-P10-NEXT: pli r3, 244140625 3638; CHECK-P10-NEXT: rldic r3, r3, 12, 24 3639; CHECK-P10-NEXT: lwa r3, 0(r3) 3640; CHECK-P10-NEXT: blr 3641; 3642; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_int32_t: 3643; CHECK-PREP10: # %bb.0: # %entry 3644; CHECK-PREP10-NEXT: lis r3, 3725 3645; CHECK-PREP10-NEXT: ori r3, r3, 19025 3646; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 3647; CHECK-PREP10-NEXT: lwa r3, 0(r3) 3648; CHECK-PREP10-NEXT: blr 3649entry: 3650 %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3651 %conv = sext i32 %0 to i64 3652 ret i64 %conv 3653} 3654 3655; Function Attrs: nofree norecurse nounwind uwtable willreturn 3656define dso_local i64 @ld_0_uint64_t_uint64_t(i64 %ptr) { 3657; CHECK-LABEL: ld_0_uint64_t_uint64_t: 3658; CHECK: # %bb.0: # %entry 3659; CHECK-NEXT: ld r3, 0(r3) 3660; CHECK-NEXT: blr 3661entry: 3662 %0 = inttoptr i64 %ptr to ptr 3663 %1 = load atomic i64, ptr %0 monotonic, align 8 3664 ret i64 %1 3665} 3666 3667; Function Attrs: nofree norecurse nounwind uwtable willreturn 3668define dso_local i64 @ld_align16_uint64_t_uint64_t(ptr nocapture readonly %ptr) { 3669; CHECK-LABEL: ld_align16_uint64_t_uint64_t: 3670; CHECK: # %bb.0: # %entry 3671; CHECK-NEXT: ld r3, 8(r3) 3672; CHECK-NEXT: blr 3673entry: 3674 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3675 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 3676 ret i64 %0 3677} 3678 3679; Function Attrs: nofree norecurse nounwind uwtable willreturn 3680define dso_local i64 @ld_align32_uint64_t_uint64_t(ptr nocapture readonly %ptr) { 3681; CHECK-P10-LABEL: ld_align32_uint64_t_uint64_t: 3682; CHECK-P10: # %bb.0: # %entry 3683; CHECK-P10-NEXT: pld r3, 99999000(r3), 0 3684; CHECK-P10-NEXT: blr 3685; 3686; CHECK-PREP10-LABEL: ld_align32_uint64_t_uint64_t: 3687; CHECK-PREP10: # %bb.0: # %entry 3688; CHECK-PREP10-NEXT: lis r4, 1525 3689; CHECK-PREP10-NEXT: ori r4, r4, 56600 3690; CHECK-PREP10-NEXT: ldx r3, r3, r4 3691; CHECK-PREP10-NEXT: blr 3692entry: 3693 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3694 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 3695 ret i64 %0 3696} 3697 3698; Function Attrs: nofree norecurse nounwind uwtable willreturn 3699define dso_local i64 @ld_align64_uint64_t_uint64_t(ptr nocapture readonly %ptr) { 3700; CHECK-P10-LABEL: ld_align64_uint64_t_uint64_t: 3701; CHECK-P10: # %bb.0: # %entry 3702; CHECK-P10-NEXT: pli r4, 244140625 3703; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3704; CHECK-P10-NEXT: ldx r3, r3, r4 3705; CHECK-P10-NEXT: blr 3706; 3707; CHECK-PREP10-LABEL: ld_align64_uint64_t_uint64_t: 3708; CHECK-PREP10: # %bb.0: # %entry 3709; CHECK-PREP10-NEXT: lis r4, 3725 3710; CHECK-PREP10-NEXT: ori r4, r4, 19025 3711; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3712; CHECK-PREP10-NEXT: ldx r3, r3, r4 3713; CHECK-PREP10-NEXT: blr 3714entry: 3715 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3716 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 3717 ret i64 %0 3718} 3719 3720; Function Attrs: nofree norecurse nounwind uwtable willreturn 3721define dso_local i64 @ld_reg_uint64_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) { 3722; CHECK-LABEL: ld_reg_uint64_t_uint64_t: 3723; CHECK: # %bb.0: # %entry 3724; CHECK-NEXT: ldx r3, r3, r4 3725; CHECK-NEXT: blr 3726entry: 3727 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3728 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 3729 ret i64 %0 3730} 3731 3732; Function Attrs: nofree norecurse nounwind uwtable willreturn 3733define dso_local i64 @ld_or_uint64_t_uint64_t(i64 %ptr, i8 zeroext %off) { 3734; CHECK-LABEL: ld_or_uint64_t_uint64_t: 3735; CHECK: # %bb.0: # %entry 3736; CHECK-NEXT: or r3, r4, r3 3737; CHECK-NEXT: ld r3, 0(r3) 3738; CHECK-NEXT: blr 3739entry: 3740 %conv = zext i8 %off to i64 3741 %or = or i64 %conv, %ptr 3742 %0 = inttoptr i64 %or to ptr 3743 %1 = load atomic i64, ptr %0 monotonic, align 8 3744 ret i64 %1 3745} 3746 3747; Function Attrs: nofree norecurse nounwind uwtable willreturn 3748define dso_local i64 @ld_not_disjoint16_uint64_t_uint64_t(i64 %ptr) { 3749; CHECK-LABEL: ld_not_disjoint16_uint64_t_uint64_t: 3750; CHECK: # %bb.0: # %entry 3751; CHECK-NEXT: ori r3, r3, 6 3752; CHECK-NEXT: ld r3, 0(r3) 3753; CHECK-NEXT: blr 3754entry: 3755 %or = or i64 %ptr, 6 3756 %0 = inttoptr i64 %or to ptr 3757 %1 = load atomic i64, ptr %0 monotonic, align 8 3758 ret i64 %1 3759} 3760 3761; Function Attrs: nofree norecurse nounwind uwtable willreturn 3762define dso_local i64 @ld_disjoint_align16_uint64_t_uint64_t(i64 %ptr) { 3763; CHECK-LABEL: ld_disjoint_align16_uint64_t_uint64_t: 3764; CHECK: # %bb.0: # %entry 3765; CHECK-NEXT: rldicr r3, r3, 0, 51 3766; CHECK-NEXT: ld r3, 24(r3) 3767; CHECK-NEXT: blr 3768entry: 3769 %and = and i64 %ptr, -4096 3770 %or = or i64 %and, 24 3771 %0 = inttoptr i64 %or to ptr 3772 %1 = load atomic i64, ptr %0 monotonic, align 8 3773 ret i64 %1 3774} 3775 3776; Function Attrs: nofree norecurse nounwind uwtable willreturn 3777define dso_local i64 @ld_not_disjoint32_uint64_t_uint64_t(i64 %ptr) { 3778; CHECK-LABEL: ld_not_disjoint32_uint64_t_uint64_t: 3779; CHECK: # %bb.0: # %entry 3780; CHECK-NEXT: ori r3, r3, 34463 3781; CHECK-NEXT: oris r3, r3, 1 3782; CHECK-NEXT: ld r3, 0(r3) 3783; CHECK-NEXT: blr 3784entry: 3785 %or = or i64 %ptr, 99999 3786 %0 = inttoptr i64 %or to ptr 3787 %1 = load atomic i64, ptr %0 monotonic, align 8 3788 ret i64 %1 3789} 3790 3791; Function Attrs: nofree norecurse nounwind uwtable willreturn 3792define dso_local i64 @ld_disjoint_align32_uint64_t_uint64_t(i64 %ptr) { 3793; CHECK-P10-LABEL: ld_disjoint_align32_uint64_t_uint64_t: 3794; CHECK-P10: # %bb.0: # %entry 3795; CHECK-P10-NEXT: lis r4, -15264 3796; CHECK-P10-NEXT: and r3, r3, r4 3797; CHECK-P10-NEXT: pld r3, 999990000(r3), 0 3798; CHECK-P10-NEXT: blr 3799; 3800; CHECK-PREP10-LABEL: ld_disjoint_align32_uint64_t_uint64_t: 3801; CHECK-PREP10: # %bb.0: # %entry 3802; CHECK-PREP10-NEXT: lis r4, -15264 3803; CHECK-PREP10-NEXT: and r3, r3, r4 3804; CHECK-PREP10-NEXT: lis r4, 15258 3805; CHECK-PREP10-NEXT: ori r4, r4, 41712 3806; CHECK-PREP10-NEXT: ldx r3, r3, r4 3807; CHECK-PREP10-NEXT: blr 3808entry: 3809 %and = and i64 %ptr, -1000341504 3810 %or = or i64 %and, 999990000 3811 %0 = inttoptr i64 %or to ptr 3812 %1 = load atomic i64, ptr %0 monotonic, align 16 3813 ret i64 %1 3814} 3815 3816; Function Attrs: nofree norecurse nounwind uwtable willreturn 3817define dso_local i64 @ld_not_disjoint64_uint64_t_uint64_t(i64 %ptr) { 3818; CHECK-P10-LABEL: ld_not_disjoint64_uint64_t_uint64_t: 3819; CHECK-P10: # %bb.0: # %entry 3820; CHECK-P10-NEXT: pli r4, 232 3821; CHECK-P10-NEXT: pli r5, 3567587329 3822; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 3823; CHECK-P10-NEXT: or r3, r3, r5 3824; CHECK-P10-NEXT: ld r3, 0(r3) 3825; CHECK-P10-NEXT: blr 3826; 3827; CHECK-PREP10-LABEL: ld_not_disjoint64_uint64_t_uint64_t: 3828; CHECK-PREP10: # %bb.0: # %entry 3829; CHECK-PREP10-NEXT: li r4, 29 3830; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 3831; CHECK-PREP10-NEXT: oris r4, r4, 54437 3832; CHECK-PREP10-NEXT: ori r4, r4, 4097 3833; CHECK-PREP10-NEXT: or r3, r3, r4 3834; CHECK-PREP10-NEXT: ld r3, 0(r3) 3835; CHECK-PREP10-NEXT: blr 3836entry: 3837 %or = or i64 %ptr, 1000000000001 3838 %0 = inttoptr i64 %or to ptr 3839 %1 = load atomic i64, ptr %0 monotonic, align 8 3840 ret i64 %1 3841} 3842 3843; Function Attrs: nofree norecurse nounwind uwtable willreturn 3844define dso_local i64 @ld_disjoint_align64_uint64_t_uint64_t(i64 %ptr) { 3845; CHECK-P10-LABEL: ld_disjoint_align64_uint64_t_uint64_t: 3846; CHECK-P10: # %bb.0: # %entry 3847; CHECK-P10-NEXT: pli r4, 244140625 3848; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3849; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3850; CHECK-P10-NEXT: ldx r3, r3, r4 3851; CHECK-P10-NEXT: blr 3852; 3853; CHECK-PREP10-LABEL: ld_disjoint_align64_uint64_t_uint64_t: 3854; CHECK-PREP10: # %bb.0: # %entry 3855; CHECK-PREP10-NEXT: lis r4, 3725 3856; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3857; CHECK-PREP10-NEXT: ori r4, r4, 19025 3858; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3859; CHECK-PREP10-NEXT: ldx r3, r3, r4 3860; CHECK-PREP10-NEXT: blr 3861entry: 3862 %and = and i64 %ptr, -1099511627776 3863 %or = or i64 %and, 1000000000000 3864 %0 = inttoptr i64 %or to ptr 3865 %1 = load atomic i64, ptr %0 monotonic, align 4096 3866 ret i64 %1 3867} 3868 3869; Function Attrs: nofree norecurse nounwind uwtable willreturn 3870define dso_local i64 @ld_cst_align16_uint64_t_uint64_t() { 3871; CHECK-LABEL: ld_cst_align16_uint64_t_uint64_t: 3872; CHECK: # %bb.0: # %entry 3873; CHECK-NEXT: ld r3, 4080(0) 3874; CHECK-NEXT: blr 3875entry: 3876 %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3877 ret i64 %0 3878} 3879 3880; Function Attrs: nofree norecurse nounwind uwtable willreturn 3881define dso_local i64 @ld_cst_align32_uint64_t_uint64_t() { 3882; CHECK-LABEL: ld_cst_align32_uint64_t_uint64_t: 3883; CHECK: # %bb.0: # %entry 3884; CHECK-NEXT: lis r3, 153 3885; CHECK-NEXT: ld r3, -27108(r3) 3886; CHECK-NEXT: blr 3887entry: 3888 %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 3889 ret i64 %0 3890} 3891 3892; Function Attrs: nofree norecurse nounwind uwtable willreturn 3893define dso_local i64 @ld_cst_align64_uint64_t_uint64_t() { 3894; CHECK-P10-LABEL: ld_cst_align64_uint64_t_uint64_t: 3895; CHECK-P10: # %bb.0: # %entry 3896; CHECK-P10-NEXT: pli r3, 244140625 3897; CHECK-P10-NEXT: rldic r3, r3, 12, 24 3898; CHECK-P10-NEXT: ld r3, 0(r3) 3899; CHECK-P10-NEXT: blr 3900; 3901; CHECK-PREP10-LABEL: ld_cst_align64_uint64_t_uint64_t: 3902; CHECK-PREP10: # %bb.0: # %entry 3903; CHECK-PREP10-NEXT: lis r3, 3725 3904; CHECK-PREP10-NEXT: ori r3, r3, 19025 3905; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 3906; CHECK-PREP10-NEXT: ld r3, 0(r3) 3907; CHECK-PREP10-NEXT: blr 3908entry: 3909 %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3910 ret i64 %0 3911} 3912 3913; Function Attrs: nofree norecurse nounwind uwtable willreturn 3914define dso_local void @st_0_uint64_t_uint8_t(i64 %ptr, i64 %str) { 3915; CHECK-LABEL: st_0_uint64_t_uint8_t: 3916; CHECK: # %bb.0: # %entry 3917; CHECK-NEXT: stb r4, 0(r3) 3918; CHECK-NEXT: blr 3919entry: 3920 %0 = inttoptr i64 %ptr to ptr 3921 %conv = trunc i64 %str to i8 3922 store atomic i8 %conv, ptr %0 monotonic, align 1 3923 ret void 3924} 3925 3926; Function Attrs: nofree norecurse nounwind uwtable willreturn 3927define dso_local void @st_align16_uint64_t_uint8_t(ptr nocapture %ptr, i64 %str) { 3928; CHECK-LABEL: st_align16_uint64_t_uint8_t: 3929; CHECK: # %bb.0: # %entry 3930; CHECK-NEXT: stb r4, 8(r3) 3931; CHECK-NEXT: blr 3932entry: 3933 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3934 %conv = trunc i64 %str to i8 3935 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 3936 ret void 3937} 3938 3939; Function Attrs: nofree norecurse nounwind uwtable willreturn 3940define dso_local void @st_align32_uint64_t_uint8_t(ptr nocapture %ptr, i64 %str) { 3941; CHECK-P10-LABEL: st_align32_uint64_t_uint8_t: 3942; CHECK-P10: # %bb.0: # %entry 3943; CHECK-P10-NEXT: pstb r4, 99999000(r3), 0 3944; CHECK-P10-NEXT: blr 3945; 3946; CHECK-PREP10-LABEL: st_align32_uint64_t_uint8_t: 3947; CHECK-PREP10: # %bb.0: # %entry 3948; CHECK-PREP10-NEXT: lis r5, 1525 3949; CHECK-PREP10-NEXT: ori r5, r5, 56600 3950; CHECK-PREP10-NEXT: stbx r4, r3, r5 3951; CHECK-PREP10-NEXT: blr 3952entry: 3953 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3954 %conv = trunc i64 %str to i8 3955 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 3956 ret void 3957} 3958 3959; Function Attrs: nofree norecurse nounwind uwtable willreturn 3960define dso_local void @st_align64_uint64_t_uint8_t(ptr nocapture %ptr, i64 %str) { 3961; CHECK-P10-LABEL: st_align64_uint64_t_uint8_t: 3962; CHECK-P10: # %bb.0: # %entry 3963; CHECK-P10-NEXT: pli r5, 244140625 3964; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3965; CHECK-P10-NEXT: stbx r4, r3, r5 3966; CHECK-P10-NEXT: blr 3967; 3968; CHECK-PREP10-LABEL: st_align64_uint64_t_uint8_t: 3969; CHECK-PREP10: # %bb.0: # %entry 3970; CHECK-PREP10-NEXT: lis r5, 3725 3971; CHECK-PREP10-NEXT: ori r5, r5, 19025 3972; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3973; CHECK-PREP10-NEXT: stbx r4, r3, r5 3974; CHECK-PREP10-NEXT: blr 3975entry: 3976 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3977 %conv = trunc i64 %str to i8 3978 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 3979 ret void 3980} 3981 3982; Function Attrs: nofree norecurse nounwind uwtable willreturn 3983define dso_local void @st_reg_uint64_t_uint8_t(ptr nocapture %ptr, i64 %off, i64 %str) { 3984; CHECK-LABEL: st_reg_uint64_t_uint8_t: 3985; CHECK: # %bb.0: # %entry 3986; CHECK-NEXT: stbx r5, r3, r4 3987; CHECK-NEXT: blr 3988entry: 3989 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3990 %conv = trunc i64 %str to i8 3991 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 3992 ret void 3993} 3994 3995; Function Attrs: nofree norecurse nounwind uwtable willreturn 3996define dso_local void @st_or1_uint64_t_uint8_t(i64 %ptr, i8 zeroext %off, i64 %str) { 3997; CHECK-LABEL: st_or1_uint64_t_uint8_t: 3998; CHECK: # %bb.0: # %entry 3999; CHECK-NEXT: or r3, r4, r3 4000; CHECK-NEXT: stb r5, 0(r3) 4001; CHECK-NEXT: blr 4002entry: 4003 %conv = zext i8 %off to i64 4004 %or = or i64 %conv, %ptr 4005 %0 = inttoptr i64 %or to ptr 4006 %conv1 = trunc i64 %str to i8 4007 store atomic i8 %conv1, ptr %0 monotonic, align 1 4008 ret void 4009} 4010 4011; Function Attrs: nofree norecurse nounwind uwtable willreturn 4012define dso_local void @st_not_disjoint16_uint64_t_uint8_t(i64 %ptr, i64 %str) { 4013; CHECK-LABEL: st_not_disjoint16_uint64_t_uint8_t: 4014; CHECK: # %bb.0: # %entry 4015; CHECK-NEXT: ori r3, r3, 6 4016; CHECK-NEXT: stb r4, 0(r3) 4017; CHECK-NEXT: blr 4018entry: 4019 %or = or i64 %ptr, 6 4020 %0 = inttoptr i64 %or to ptr 4021 %conv = trunc i64 %str to i8 4022 store atomic i8 %conv, ptr %0 monotonic, align 1 4023 ret void 4024} 4025 4026; Function Attrs: nofree norecurse nounwind uwtable willreturn 4027define dso_local void @st_disjoint_align16_uint64_t_uint8_t(i64 %ptr, i64 %str) { 4028; CHECK-LABEL: st_disjoint_align16_uint64_t_uint8_t: 4029; CHECK: # %bb.0: # %entry 4030; CHECK-NEXT: rldicr r3, r3, 0, 51 4031; CHECK-NEXT: stb r4, 24(r3) 4032; CHECK-NEXT: blr 4033entry: 4034 %and = and i64 %ptr, -4096 4035 %or = or i64 %and, 24 4036 %0 = inttoptr i64 %or to ptr 4037 %conv = trunc i64 %str to i8 4038 store atomic i8 %conv, ptr %0 monotonic, align 8 4039 ret void 4040} 4041 4042; Function Attrs: nofree norecurse nounwind uwtable willreturn 4043define dso_local void @st_not_disjoint32_uint64_t_uint8_t(i64 %ptr, i64 %str) { 4044; CHECK-LABEL: st_not_disjoint32_uint64_t_uint8_t: 4045; CHECK: # %bb.0: # %entry 4046; CHECK-NEXT: ori r3, r3, 34463 4047; CHECK-NEXT: oris r3, r3, 1 4048; CHECK-NEXT: stb r4, 0(r3) 4049; CHECK-NEXT: blr 4050entry: 4051 %or = or i64 %ptr, 99999 4052 %0 = inttoptr i64 %or to ptr 4053 %conv = trunc i64 %str to i8 4054 store atomic i8 %conv, ptr %0 monotonic, align 1 4055 ret void 4056} 4057 4058; Function Attrs: nofree norecurse nounwind uwtable willreturn 4059define dso_local void @st_disjoint_align32_uint64_t_uint8_t(i64 %ptr, i64 %str) { 4060; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint8_t: 4061; CHECK-P10: # %bb.0: # %entry 4062; CHECK-P10-NEXT: lis r5, -15264 4063; CHECK-P10-NEXT: and r3, r3, r5 4064; CHECK-P10-NEXT: pstb r4, 999990000(r3), 0 4065; CHECK-P10-NEXT: blr 4066; 4067; CHECK-PREP10-LABEL: st_disjoint_align32_uint64_t_uint8_t: 4068; CHECK-PREP10: # %bb.0: # %entry 4069; CHECK-PREP10-NEXT: lis r5, -15264 4070; CHECK-PREP10-NEXT: and r3, r3, r5 4071; CHECK-PREP10-NEXT: lis r5, 15258 4072; CHECK-PREP10-NEXT: ori r5, r5, 41712 4073; CHECK-PREP10-NEXT: stbx r4, r3, r5 4074; CHECK-PREP10-NEXT: blr 4075entry: 4076 %and = and i64 %ptr, -1000341504 4077 %or = or i64 %and, 999990000 4078 %0 = inttoptr i64 %or to ptr 4079 %conv = trunc i64 %str to i8 4080 store atomic i8 %conv, ptr %0 monotonic, align 16 4081 ret void 4082} 4083 4084; Function Attrs: nofree norecurse nounwind uwtable willreturn 4085define dso_local void @st_not_disjoint64_uint64_t_uint8_t(i64 %ptr, i64 %str) { 4086; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint8_t: 4087; CHECK-P10: # %bb.0: # %entry 4088; CHECK-P10-NEXT: pli r5, 232 4089; CHECK-P10-NEXT: pli r6, 3567587329 4090; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 4091; CHECK-P10-NEXT: or r3, r3, r6 4092; CHECK-P10-NEXT: stb r4, 0(r3) 4093; CHECK-P10-NEXT: blr 4094; 4095; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint8_t: 4096; CHECK-PREP10: # %bb.0: # %entry 4097; CHECK-PREP10-NEXT: li r5, 29 4098; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 4099; CHECK-PREP10-NEXT: oris r5, r5, 54437 4100; CHECK-PREP10-NEXT: ori r5, r5, 4097 4101; CHECK-PREP10-NEXT: or r3, r3, r5 4102; CHECK-PREP10-NEXT: stb r4, 0(r3) 4103; CHECK-PREP10-NEXT: blr 4104entry: 4105 %or = or i64 %ptr, 1000000000001 4106 %0 = inttoptr i64 %or to ptr 4107 %conv = trunc i64 %str to i8 4108 store atomic i8 %conv, ptr %0 monotonic, align 1 4109 ret void 4110} 4111 4112; Function Attrs: nofree norecurse nounwind uwtable willreturn 4113define dso_local void @st_disjoint_align64_uint64_t_uint8_t(i64 %ptr, i64 %str) { 4114; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint8_t: 4115; CHECK-P10: # %bb.0: # %entry 4116; CHECK-P10-NEXT: pli r5, 244140625 4117; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 4118; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4119; CHECK-P10-NEXT: stbx r4, r3, r5 4120; CHECK-P10-NEXT: blr 4121; 4122; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint8_t: 4123; CHECK-PREP10: # %bb.0: # %entry 4124; CHECK-PREP10-NEXT: lis r5, 3725 4125; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 4126; CHECK-PREP10-NEXT: ori r5, r5, 19025 4127; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4128; CHECK-PREP10-NEXT: stbx r4, r3, r5 4129; CHECK-PREP10-NEXT: blr 4130entry: 4131 %and = and i64 %ptr, -1099511627776 4132 %or = or i64 %and, 1000000000000 4133 %0 = inttoptr i64 %or to ptr 4134 %conv = trunc i64 %str to i8 4135 store atomic i8 %conv, ptr %0 monotonic, align 4096 4136 ret void 4137} 4138 4139; Function Attrs: nofree norecurse nounwind uwtable willreturn 4140define dso_local void @st_cst_align16_uint64_t_uint8_t(i64 %str) { 4141; CHECK-LABEL: st_cst_align16_uint64_t_uint8_t: 4142; CHECK: # %bb.0: # %entry 4143; CHECK-NEXT: stb r3, 4080(0) 4144; CHECK-NEXT: blr 4145entry: 4146 %conv = trunc i64 %str to i8 4147 store atomic i8 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 4148 ret void 4149} 4150 4151; Function Attrs: nofree norecurse nounwind uwtable willreturn 4152define dso_local void @st_cst_align32_uint64_t_uint8_t(i64 %str) { 4153; CHECK-LABEL: st_cst_align32_uint64_t_uint8_t: 4154; CHECK: # %bb.0: # %entry 4155; CHECK-NEXT: lis r4, 153 4156; CHECK-NEXT: stb r3, -27108(r4) 4157; CHECK-NEXT: blr 4158entry: 4159 %conv = trunc i64 %str to i8 4160 store atomic i8 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 4161 ret void 4162} 4163 4164; Function Attrs: nofree norecurse nounwind uwtable willreturn 4165define dso_local void @st_cst_align64_uint64_t_uint8_t(i64 %str) { 4166; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint8_t: 4167; CHECK-P10: # %bb.0: # %entry 4168; CHECK-P10-NEXT: pli r4, 244140625 4169; CHECK-P10-NEXT: rldic r4, r4, 12, 24 4170; CHECK-P10-NEXT: stb r3, 0(r4) 4171; CHECK-P10-NEXT: blr 4172; 4173; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint8_t: 4174; CHECK-PREP10: # %bb.0: # %entry 4175; CHECK-PREP10-NEXT: lis r4, 3725 4176; CHECK-PREP10-NEXT: ori r4, r4, 19025 4177; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 4178; CHECK-PREP10-NEXT: stb r3, 0(r4) 4179; CHECK-PREP10-NEXT: blr 4180entry: 4181 %conv = trunc i64 %str to i8 4182 store atomic i8 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 4183 ret void 4184} 4185 4186; Function Attrs: nofree norecurse nounwind uwtable willreturn 4187define dso_local void @st_0_uint64_t_uint16_t(i64 %ptr, i64 %str) { 4188; CHECK-LABEL: st_0_uint64_t_uint16_t: 4189; CHECK: # %bb.0: # %entry 4190; CHECK-NEXT: sth r4, 0(r3) 4191; CHECK-NEXT: blr 4192entry: 4193 %0 = inttoptr i64 %ptr to ptr 4194 %conv = trunc i64 %str to i16 4195 store atomic i16 %conv, ptr %0 monotonic, align 2 4196 ret void 4197} 4198 4199; Function Attrs: nofree norecurse nounwind uwtable willreturn 4200define dso_local void @st_align16_uint64_t_uint16_t(ptr nocapture %ptr, i64 %str) { 4201; CHECK-LABEL: st_align16_uint64_t_uint16_t: 4202; CHECK: # %bb.0: # %entry 4203; CHECK-NEXT: sth r4, 8(r3) 4204; CHECK-NEXT: blr 4205entry: 4206 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 4207 %conv = trunc i64 %str to i16 4208 store atomic i16 %conv, ptr %add.ptr monotonic, align 2 4209 ret void 4210} 4211 4212; Function Attrs: nofree norecurse nounwind uwtable willreturn 4213define dso_local void @st_align32_uint64_t_uint16_t(ptr nocapture %ptr, i64 %str) { 4214; CHECK-P10-LABEL: st_align32_uint64_t_uint16_t: 4215; CHECK-P10: # %bb.0: # %entry 4216; CHECK-P10-NEXT: psth r4, 99999000(r3), 0 4217; CHECK-P10-NEXT: blr 4218; 4219; CHECK-PREP10-LABEL: st_align32_uint64_t_uint16_t: 4220; CHECK-PREP10: # %bb.0: # %entry 4221; CHECK-PREP10-NEXT: lis r5, 1525 4222; CHECK-PREP10-NEXT: ori r5, r5, 56600 4223; CHECK-PREP10-NEXT: sthx r4, r3, r5 4224; CHECK-PREP10-NEXT: blr 4225entry: 4226 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 4227 %conv = trunc i64 %str to i16 4228 store atomic i16 %conv, ptr %add.ptr monotonic, align 2 4229 ret void 4230} 4231 4232; Function Attrs: nofree norecurse nounwind uwtable willreturn 4233define dso_local void @st_align64_uint64_t_uint16_t(ptr nocapture %ptr, i64 %str) { 4234; CHECK-P10-LABEL: st_align64_uint64_t_uint16_t: 4235; CHECK-P10: # %bb.0: # %entry 4236; CHECK-P10-NEXT: pli r5, 244140625 4237; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4238; CHECK-P10-NEXT: sthx r4, r3, r5 4239; CHECK-P10-NEXT: blr 4240; 4241; CHECK-PREP10-LABEL: st_align64_uint64_t_uint16_t: 4242; CHECK-PREP10: # %bb.0: # %entry 4243; CHECK-PREP10-NEXT: lis r5, 3725 4244; CHECK-PREP10-NEXT: ori r5, r5, 19025 4245; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4246; CHECK-PREP10-NEXT: sthx r4, r3, r5 4247; CHECK-PREP10-NEXT: blr 4248entry: 4249 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 4250 %conv = trunc i64 %str to i16 4251 store atomic i16 %conv, ptr %add.ptr monotonic, align 2 4252 ret void 4253} 4254 4255; Function Attrs: nofree norecurse nounwind uwtable willreturn 4256define dso_local void @st_reg_uint64_t_uint16_t(ptr nocapture %ptr, i64 %off, i64 %str) { 4257; CHECK-LABEL: st_reg_uint64_t_uint16_t: 4258; CHECK: # %bb.0: # %entry 4259; CHECK-NEXT: sthx r5, r3, r4 4260; CHECK-NEXT: blr 4261entry: 4262 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 4263 %conv = trunc i64 %str to i16 4264 store atomic i16 %conv, ptr %add.ptr monotonic, align 2 4265 ret void 4266} 4267 4268; Function Attrs: nofree norecurse nounwind uwtable willreturn 4269define dso_local void @st_or1_uint64_t_uint16_t(i64 %ptr, i8 zeroext %off, i64 %str) { 4270; CHECK-LABEL: st_or1_uint64_t_uint16_t: 4271; CHECK: # %bb.0: # %entry 4272; CHECK-NEXT: or r3, r4, r3 4273; CHECK-NEXT: sth r5, 0(r3) 4274; CHECK-NEXT: blr 4275entry: 4276 %conv = zext i8 %off to i64 4277 %or = or i64 %conv, %ptr 4278 %0 = inttoptr i64 %or to ptr 4279 %conv1 = trunc i64 %str to i16 4280 store atomic i16 %conv1, ptr %0 monotonic, align 2 4281 ret void 4282} 4283 4284; Function Attrs: nofree norecurse nounwind uwtable willreturn 4285define dso_local void @st_not_disjoint16_uint64_t_uint16_t(i64 %ptr, i64 %str) { 4286; CHECK-LABEL: st_not_disjoint16_uint64_t_uint16_t: 4287; CHECK: # %bb.0: # %entry 4288; CHECK-NEXT: ori r3, r3, 6 4289; CHECK-NEXT: sth r4, 0(r3) 4290; CHECK-NEXT: blr 4291entry: 4292 %or = or i64 %ptr, 6 4293 %0 = inttoptr i64 %or to ptr 4294 %conv = trunc i64 %str to i16 4295 store atomic i16 %conv, ptr %0 monotonic, align 2 4296 ret void 4297} 4298 4299; Function Attrs: nofree norecurse nounwind uwtable willreturn 4300define dso_local void @st_disjoint_align16_uint64_t_uint16_t(i64 %ptr, i64 %str) { 4301; CHECK-LABEL: st_disjoint_align16_uint64_t_uint16_t: 4302; CHECK: # %bb.0: # %entry 4303; CHECK-NEXT: rldicr r3, r3, 0, 51 4304; CHECK-NEXT: sth r4, 24(r3) 4305; CHECK-NEXT: blr 4306entry: 4307 %and = and i64 %ptr, -4096 4308 %or = or i64 %and, 24 4309 %0 = inttoptr i64 %or to ptr 4310 %conv = trunc i64 %str to i16 4311 store atomic i16 %conv, ptr %0 monotonic, align 8 4312 ret void 4313} 4314 4315; Function Attrs: nofree norecurse nounwind uwtable willreturn 4316define dso_local void @st_not_disjoint32_uint64_t_uint16_t(i64 %ptr, i64 %str) { 4317; CHECK-LABEL: st_not_disjoint32_uint64_t_uint16_t: 4318; CHECK: # %bb.0: # %entry 4319; CHECK-NEXT: ori r3, r3, 34463 4320; CHECK-NEXT: oris r3, r3, 1 4321; CHECK-NEXT: sth r4, 0(r3) 4322; CHECK-NEXT: blr 4323entry: 4324 %or = or i64 %ptr, 99999 4325 %0 = inttoptr i64 %or to ptr 4326 %conv = trunc i64 %str to i16 4327 store atomic i16 %conv, ptr %0 monotonic, align 2 4328 ret void 4329} 4330 4331; Function Attrs: nofree norecurse nounwind uwtable willreturn 4332define dso_local void @st_disjoint_align32_uint64_t_uint16_t(i64 %ptr, i64 %str) { 4333; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint16_t: 4334; CHECK-P10: # %bb.0: # %entry 4335; CHECK-P10-NEXT: lis r5, -15264 4336; CHECK-P10-NEXT: and r3, r3, r5 4337; CHECK-P10-NEXT: psth r4, 999990000(r3), 0 4338; CHECK-P10-NEXT: blr 4339; 4340; CHECK-PREP10-LABEL: st_disjoint_align32_uint64_t_uint16_t: 4341; CHECK-PREP10: # %bb.0: # %entry 4342; CHECK-PREP10-NEXT: lis r5, -15264 4343; CHECK-PREP10-NEXT: and r3, r3, r5 4344; CHECK-PREP10-NEXT: lis r5, 15258 4345; CHECK-PREP10-NEXT: ori r5, r5, 41712 4346; CHECK-PREP10-NEXT: sthx r4, r3, r5 4347; CHECK-PREP10-NEXT: blr 4348entry: 4349 %and = and i64 %ptr, -1000341504 4350 %or = or i64 %and, 999990000 4351 %0 = inttoptr i64 %or to ptr 4352 %conv = trunc i64 %str to i16 4353 store atomic i16 %conv, ptr %0 monotonic, align 16 4354 ret void 4355} 4356 4357; Function Attrs: nofree norecurse nounwind uwtable willreturn 4358define dso_local void @st_not_disjoint64_uint64_t_uint16_t(i64 %ptr, i64 %str) { 4359; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint16_t: 4360; CHECK-P10: # %bb.0: # %entry 4361; CHECK-P10-NEXT: pli r5, 232 4362; CHECK-P10-NEXT: pli r6, 3567587329 4363; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 4364; CHECK-P10-NEXT: or r3, r3, r6 4365; CHECK-P10-NEXT: sth r4, 0(r3) 4366; CHECK-P10-NEXT: blr 4367; 4368; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint16_t: 4369; CHECK-PREP10: # %bb.0: # %entry 4370; CHECK-PREP10-NEXT: li r5, 29 4371; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 4372; CHECK-PREP10-NEXT: oris r5, r5, 54437 4373; CHECK-PREP10-NEXT: ori r5, r5, 4097 4374; CHECK-PREP10-NEXT: or r3, r3, r5 4375; CHECK-PREP10-NEXT: sth r4, 0(r3) 4376; CHECK-PREP10-NEXT: blr 4377entry: 4378 %or = or i64 %ptr, 1000000000001 4379 %0 = inttoptr i64 %or to ptr 4380 %conv = trunc i64 %str to i16 4381 store atomic i16 %conv, ptr %0 monotonic, align 2 4382 ret void 4383} 4384 4385; Function Attrs: nofree norecurse nounwind uwtable willreturn 4386define dso_local void @st_disjoint_align64_uint64_t_uint16_t(i64 %ptr, i64 %str) { 4387; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint16_t: 4388; CHECK-P10: # %bb.0: # %entry 4389; CHECK-P10-NEXT: pli r5, 244140625 4390; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 4391; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4392; CHECK-P10-NEXT: sthx r4, r3, r5 4393; CHECK-P10-NEXT: blr 4394; 4395; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint16_t: 4396; CHECK-PREP10: # %bb.0: # %entry 4397; CHECK-PREP10-NEXT: lis r5, 3725 4398; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 4399; CHECK-PREP10-NEXT: ori r5, r5, 19025 4400; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4401; CHECK-PREP10-NEXT: sthx r4, r3, r5 4402; CHECK-PREP10-NEXT: blr 4403entry: 4404 %and = and i64 %ptr, -1099511627776 4405 %or = or i64 %and, 1000000000000 4406 %0 = inttoptr i64 %or to ptr 4407 %conv = trunc i64 %str to i16 4408 store atomic i16 %conv, ptr %0 monotonic, align 4096 4409 ret void 4410} 4411 4412; Function Attrs: nofree norecurse nounwind uwtable willreturn 4413define dso_local void @st_cst_align16_uint64_t_uint16_t(i64 %str) { 4414; CHECK-LABEL: st_cst_align16_uint64_t_uint16_t: 4415; CHECK: # %bb.0: # %entry 4416; CHECK-NEXT: sth r3, 4080(0) 4417; CHECK-NEXT: blr 4418entry: 4419 %conv = trunc i64 %str to i16 4420 store atomic i16 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 4421 ret void 4422} 4423 4424; Function Attrs: nofree norecurse nounwind uwtable willreturn 4425define dso_local void @st_cst_align32_uint64_t_uint16_t(i64 %str) { 4426; CHECK-LABEL: st_cst_align32_uint64_t_uint16_t: 4427; CHECK: # %bb.0: # %entry 4428; CHECK-NEXT: lis r4, 153 4429; CHECK-NEXT: sth r3, -27108(r4) 4430; CHECK-NEXT: blr 4431entry: 4432 %conv = trunc i64 %str to i16 4433 store atomic i16 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 4434 ret void 4435} 4436 4437; Function Attrs: nofree norecurse nounwind uwtable willreturn 4438define dso_local void @st_cst_align64_uint64_t_uint16_t(i64 %str) { 4439; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint16_t: 4440; CHECK-P10: # %bb.0: # %entry 4441; CHECK-P10-NEXT: pli r4, 244140625 4442; CHECK-P10-NEXT: rldic r4, r4, 12, 24 4443; CHECK-P10-NEXT: sth r3, 0(r4) 4444; CHECK-P10-NEXT: blr 4445; 4446; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint16_t: 4447; CHECK-PREP10: # %bb.0: # %entry 4448; CHECK-PREP10-NEXT: lis r4, 3725 4449; CHECK-PREP10-NEXT: ori r4, r4, 19025 4450; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 4451; CHECK-PREP10-NEXT: sth r3, 0(r4) 4452; CHECK-PREP10-NEXT: blr 4453entry: 4454 %conv = trunc i64 %str to i16 4455 store atomic i16 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 4456 ret void 4457} 4458 4459; Function Attrs: nofree norecurse nounwind uwtable willreturn 4460define dso_local void @st_0_uint64_t_uint32_t(i64 %ptr, i64 %str) { 4461; CHECK-LABEL: st_0_uint64_t_uint32_t: 4462; CHECK: # %bb.0: # %entry 4463; CHECK-NEXT: stw r4, 0(r3) 4464; CHECK-NEXT: blr 4465entry: 4466 %0 = inttoptr i64 %ptr to ptr 4467 %conv = trunc i64 %str to i32 4468 store atomic i32 %conv, ptr %0 monotonic, align 4 4469 ret void 4470} 4471 4472; Function Attrs: nofree norecurse nounwind uwtable willreturn 4473define dso_local void @st_align16_uint64_t_uint32_t(ptr nocapture %ptr, i64 %str) { 4474; CHECK-LABEL: st_align16_uint64_t_uint32_t: 4475; CHECK: # %bb.0: # %entry 4476; CHECK-NEXT: stw r4, 8(r3) 4477; CHECK-NEXT: blr 4478entry: 4479 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 4480 %conv = trunc i64 %str to i32 4481 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 4482 ret void 4483} 4484 4485; Function Attrs: nofree norecurse nounwind uwtable willreturn 4486define dso_local void @st_align32_uint64_t_uint32_t(ptr nocapture %ptr, i64 %str) { 4487; CHECK-P10-LABEL: st_align32_uint64_t_uint32_t: 4488; CHECK-P10: # %bb.0: # %entry 4489; CHECK-P10-NEXT: pstw r4, 99999000(r3), 0 4490; CHECK-P10-NEXT: blr 4491; 4492; CHECK-PREP10-LABEL: st_align32_uint64_t_uint32_t: 4493; CHECK-PREP10: # %bb.0: # %entry 4494; CHECK-PREP10-NEXT: lis r5, 1525 4495; CHECK-PREP10-NEXT: ori r5, r5, 56600 4496; CHECK-PREP10-NEXT: stwx r4, r3, r5 4497; CHECK-PREP10-NEXT: blr 4498entry: 4499 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 4500 %conv = trunc i64 %str to i32 4501 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 4502 ret void 4503} 4504 4505; Function Attrs: nofree norecurse nounwind uwtable willreturn 4506define dso_local void @st_align64_uint64_t_uint32_t(ptr nocapture %ptr, i64 %str) { 4507; CHECK-P10-LABEL: st_align64_uint64_t_uint32_t: 4508; CHECK-P10: # %bb.0: # %entry 4509; CHECK-P10-NEXT: pli r5, 244140625 4510; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4511; CHECK-P10-NEXT: stwx r4, r3, r5 4512; CHECK-P10-NEXT: blr 4513; 4514; CHECK-PREP10-LABEL: st_align64_uint64_t_uint32_t: 4515; CHECK-PREP10: # %bb.0: # %entry 4516; CHECK-PREP10-NEXT: lis r5, 3725 4517; CHECK-PREP10-NEXT: ori r5, r5, 19025 4518; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4519; CHECK-PREP10-NEXT: stwx r4, r3, r5 4520; CHECK-PREP10-NEXT: blr 4521entry: 4522 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 4523 %conv = trunc i64 %str to i32 4524 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 4525 ret void 4526} 4527 4528; Function Attrs: nofree norecurse nounwind uwtable willreturn 4529define dso_local void @st_reg_uint64_t_uint32_t(ptr nocapture %ptr, i64 %off, i64 %str) { 4530; CHECK-LABEL: st_reg_uint64_t_uint32_t: 4531; CHECK: # %bb.0: # %entry 4532; CHECK-NEXT: stwx r5, r3, r4 4533; CHECK-NEXT: blr 4534entry: 4535 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 4536 %conv = trunc i64 %str to i32 4537 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 4538 ret void 4539} 4540 4541; Function Attrs: nofree norecurse nounwind uwtable willreturn 4542define dso_local void @st_or1_uint64_t_uint32_t(i64 %ptr, i8 zeroext %off, i64 %str) { 4543; CHECK-LABEL: st_or1_uint64_t_uint32_t: 4544; CHECK: # %bb.0: # %entry 4545; CHECK-NEXT: or r3, r4, r3 4546; CHECK-NEXT: stw r5, 0(r3) 4547; CHECK-NEXT: blr 4548entry: 4549 %conv = zext i8 %off to i64 4550 %or = or i64 %conv, %ptr 4551 %0 = inttoptr i64 %or to ptr 4552 %conv1 = trunc i64 %str to i32 4553 store atomic i32 %conv1, ptr %0 monotonic, align 4 4554 ret void 4555} 4556 4557; Function Attrs: nofree norecurse nounwind uwtable willreturn 4558define dso_local void @st_not_disjoint16_uint64_t_uint32_t(i64 %ptr, i64 %str) { 4559; CHECK-LABEL: st_not_disjoint16_uint64_t_uint32_t: 4560; CHECK: # %bb.0: # %entry 4561; CHECK-NEXT: ori r3, r3, 6 4562; CHECK-NEXT: stw r4, 0(r3) 4563; CHECK-NEXT: blr 4564entry: 4565 %or = or i64 %ptr, 6 4566 %0 = inttoptr i64 %or to ptr 4567 %conv = trunc i64 %str to i32 4568 store atomic i32 %conv, ptr %0 monotonic, align 4 4569 ret void 4570} 4571 4572; Function Attrs: nofree norecurse nounwind uwtable willreturn 4573define dso_local void @st_disjoint_align16_uint64_t_uint32_t(i64 %ptr, i64 %str) { 4574; CHECK-LABEL: st_disjoint_align16_uint64_t_uint32_t: 4575; CHECK: # %bb.0: # %entry 4576; CHECK-NEXT: rldicr r3, r3, 0, 51 4577; CHECK-NEXT: stw r4, 24(r3) 4578; CHECK-NEXT: blr 4579entry: 4580 %and = and i64 %ptr, -4096 4581 %or = or i64 %and, 24 4582 %0 = inttoptr i64 %or to ptr 4583 %conv = trunc i64 %str to i32 4584 store atomic i32 %conv, ptr %0 monotonic, align 8 4585 ret void 4586} 4587 4588; Function Attrs: nofree norecurse nounwind uwtable willreturn 4589define dso_local void @st_not_disjoint32_uint64_t_uint32_t(i64 %ptr, i64 %str) { 4590; CHECK-LABEL: st_not_disjoint32_uint64_t_uint32_t: 4591; CHECK: # %bb.0: # %entry 4592; CHECK-NEXT: ori r3, r3, 34463 4593; CHECK-NEXT: oris r3, r3, 1 4594; CHECK-NEXT: stw r4, 0(r3) 4595; CHECK-NEXT: blr 4596entry: 4597 %or = or i64 %ptr, 99999 4598 %0 = inttoptr i64 %or to ptr 4599 %conv = trunc i64 %str to i32 4600 store atomic i32 %conv, ptr %0 monotonic, align 4 4601 ret void 4602} 4603 4604; Function Attrs: nofree norecurse nounwind uwtable willreturn 4605define dso_local void @st_disjoint_align32_uint64_t_uint32_t(i64 %ptr, i64 %str) { 4606; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint32_t: 4607; CHECK-P10: # %bb.0: # %entry 4608; CHECK-P10-NEXT: lis r5, -15264 4609; CHECK-P10-NEXT: and r3, r3, r5 4610; CHECK-P10-NEXT: pstw r4, 999990000(r3), 0 4611; CHECK-P10-NEXT: blr 4612; 4613; CHECK-PREP10-LABEL: st_disjoint_align32_uint64_t_uint32_t: 4614; CHECK-PREP10: # %bb.0: # %entry 4615; CHECK-PREP10-NEXT: lis r5, -15264 4616; CHECK-PREP10-NEXT: and r3, r3, r5 4617; CHECK-PREP10-NEXT: lis r5, 15258 4618; CHECK-PREP10-NEXT: ori r5, r5, 41712 4619; CHECK-PREP10-NEXT: stwx r4, r3, r5 4620; CHECK-PREP10-NEXT: blr 4621entry: 4622 %and = and i64 %ptr, -1000341504 4623 %or = or i64 %and, 999990000 4624 %0 = inttoptr i64 %or to ptr 4625 %conv = trunc i64 %str to i32 4626 store atomic i32 %conv, ptr %0 monotonic, align 16 4627 ret void 4628} 4629 4630; Function Attrs: nofree norecurse nounwind uwtable willreturn 4631define dso_local void @st_not_disjoint64_uint64_t_uint32_t(i64 %ptr, i64 %str) { 4632; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint32_t: 4633; CHECK-P10: # %bb.0: # %entry 4634; CHECK-P10-NEXT: pli r5, 232 4635; CHECK-P10-NEXT: pli r6, 3567587329 4636; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 4637; CHECK-P10-NEXT: or r3, r3, r6 4638; CHECK-P10-NEXT: stw r4, 0(r3) 4639; CHECK-P10-NEXT: blr 4640; 4641; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint32_t: 4642; CHECK-PREP10: # %bb.0: # %entry 4643; CHECK-PREP10-NEXT: li r5, 29 4644; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 4645; CHECK-PREP10-NEXT: oris r5, r5, 54437 4646; CHECK-PREP10-NEXT: ori r5, r5, 4097 4647; CHECK-PREP10-NEXT: or r3, r3, r5 4648; CHECK-PREP10-NEXT: stw r4, 0(r3) 4649; CHECK-PREP10-NEXT: blr 4650entry: 4651 %or = or i64 %ptr, 1000000000001 4652 %0 = inttoptr i64 %or to ptr 4653 %conv = trunc i64 %str to i32 4654 store atomic i32 %conv, ptr %0 monotonic, align 4 4655 ret void 4656} 4657 4658; Function Attrs: nofree norecurse nounwind uwtable willreturn 4659define dso_local void @st_disjoint_align64_uint64_t_uint32_t(i64 %ptr, i64 %str) { 4660; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint32_t: 4661; CHECK-P10: # %bb.0: # %entry 4662; CHECK-P10-NEXT: pli r5, 244140625 4663; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 4664; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4665; CHECK-P10-NEXT: stwx r4, r3, r5 4666; CHECK-P10-NEXT: blr 4667; 4668; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint32_t: 4669; CHECK-PREP10: # %bb.0: # %entry 4670; CHECK-PREP10-NEXT: lis r5, 3725 4671; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 4672; CHECK-PREP10-NEXT: ori r5, r5, 19025 4673; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4674; CHECK-PREP10-NEXT: stwx r4, r3, r5 4675; CHECK-PREP10-NEXT: blr 4676entry: 4677 %and = and i64 %ptr, -1099511627776 4678 %or = or i64 %and, 1000000000000 4679 %0 = inttoptr i64 %or to ptr 4680 %conv = trunc i64 %str to i32 4681 store atomic i32 %conv, ptr %0 monotonic, align 4096 4682 ret void 4683} 4684 4685; Function Attrs: nofree norecurse nounwind uwtable willreturn 4686define dso_local void @st_cst_align16_uint64_t_uint32_t(i64 %str) { 4687; CHECK-LABEL: st_cst_align16_uint64_t_uint32_t: 4688; CHECK: # %bb.0: # %entry 4689; CHECK-NEXT: stw r3, 4080(0) 4690; CHECK-NEXT: blr 4691entry: 4692 %conv = trunc i64 %str to i32 4693 store atomic i32 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 4694 ret void 4695} 4696 4697; Function Attrs: nofree norecurse nounwind uwtable willreturn 4698define dso_local void @st_cst_align32_uint64_t_uint32_t(i64 %str) { 4699; CHECK-LABEL: st_cst_align32_uint64_t_uint32_t: 4700; CHECK: # %bb.0: # %entry 4701; CHECK-NEXT: lis r4, 153 4702; CHECK-NEXT: stw r3, -27108(r4) 4703; CHECK-NEXT: blr 4704entry: 4705 %conv = trunc i64 %str to i32 4706 store atomic i32 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 4707 ret void 4708} 4709 4710; Function Attrs: nofree norecurse nounwind uwtable willreturn 4711define dso_local void @st_cst_align64_uint64_t_uint32_t(i64 %str) { 4712; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint32_t: 4713; CHECK-P10: # %bb.0: # %entry 4714; CHECK-P10-NEXT: pli r4, 244140625 4715; CHECK-P10-NEXT: rldic r4, r4, 12, 24 4716; CHECK-P10-NEXT: stw r3, 0(r4) 4717; CHECK-P10-NEXT: blr 4718; 4719; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint32_t: 4720; CHECK-PREP10: # %bb.0: # %entry 4721; CHECK-PREP10-NEXT: lis r4, 3725 4722; CHECK-PREP10-NEXT: ori r4, r4, 19025 4723; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 4724; CHECK-PREP10-NEXT: stw r3, 0(r4) 4725; CHECK-PREP10-NEXT: blr 4726entry: 4727 %conv = trunc i64 %str to i32 4728 store atomic i32 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 4729 ret void 4730} 4731 4732; Function Attrs: nofree norecurse nounwind uwtable willreturn 4733define dso_local void @st_0_uint64_t_uint64_t(i64 %ptr, i64 %str) { 4734; CHECK-LABEL: st_0_uint64_t_uint64_t: 4735; CHECK: # %bb.0: # %entry 4736; CHECK-NEXT: std r4, 0(r3) 4737; CHECK-NEXT: blr 4738entry: 4739 %0 = inttoptr i64 %ptr to ptr 4740 store atomic i64 %str, ptr %0 monotonic, align 8 4741 ret void 4742} 4743 4744; Function Attrs: nofree norecurse nounwind uwtable willreturn 4745define dso_local void @st_align16_uint64_t_uint64_t(ptr nocapture %ptr, i64 %str) { 4746; CHECK-LABEL: st_align16_uint64_t_uint64_t: 4747; CHECK: # %bb.0: # %entry 4748; CHECK-NEXT: std r4, 8(r3) 4749; CHECK-NEXT: blr 4750entry: 4751 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 4752 store atomic i64 %str, ptr %add.ptr monotonic, align 8 4753 ret void 4754} 4755 4756; Function Attrs: nofree norecurse nounwind uwtable willreturn 4757define dso_local void @st_align32_uint64_t_uint64_t(ptr nocapture %ptr, i64 %str) { 4758; CHECK-P10-LABEL: st_align32_uint64_t_uint64_t: 4759; CHECK-P10: # %bb.0: # %entry 4760; CHECK-P10-NEXT: pstd r4, 99999000(r3), 0 4761; CHECK-P10-NEXT: blr 4762; 4763; CHECK-PREP10-LABEL: st_align32_uint64_t_uint64_t: 4764; CHECK-PREP10: # %bb.0: # %entry 4765; CHECK-PREP10-NEXT: lis r5, 1525 4766; CHECK-PREP10-NEXT: ori r5, r5, 56600 4767; CHECK-PREP10-NEXT: stdx r4, r3, r5 4768; CHECK-PREP10-NEXT: blr 4769entry: 4770 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 4771 store atomic i64 %str, ptr %add.ptr monotonic, align 8 4772 ret void 4773} 4774 4775; Function Attrs: nofree norecurse nounwind uwtable willreturn 4776define dso_local void @st_align64_uint64_t_uint64_t(ptr nocapture %ptr, i64 %str) { 4777; CHECK-P10-LABEL: st_align64_uint64_t_uint64_t: 4778; CHECK-P10: # %bb.0: # %entry 4779; CHECK-P10-NEXT: pli r5, 244140625 4780; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4781; CHECK-P10-NEXT: stdx r4, r3, r5 4782; CHECK-P10-NEXT: blr 4783; 4784; CHECK-PREP10-LABEL: st_align64_uint64_t_uint64_t: 4785; CHECK-PREP10: # %bb.0: # %entry 4786; CHECK-PREP10-NEXT: lis r5, 3725 4787; CHECK-PREP10-NEXT: ori r5, r5, 19025 4788; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4789; CHECK-PREP10-NEXT: stdx r4, r3, r5 4790; CHECK-PREP10-NEXT: blr 4791entry: 4792 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 4793 store atomic i64 %str, ptr %add.ptr monotonic, align 8 4794 ret void 4795} 4796 4797; Function Attrs: nofree norecurse nounwind uwtable willreturn 4798define dso_local void @st_reg_uint64_t_uint64_t(ptr nocapture %ptr, i64 %off, i64 %str) { 4799; CHECK-LABEL: st_reg_uint64_t_uint64_t: 4800; CHECK: # %bb.0: # %entry 4801; CHECK-NEXT: stdx r5, r3, r4 4802; CHECK-NEXT: blr 4803entry: 4804 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 4805 store atomic i64 %str, ptr %add.ptr monotonic, align 8 4806 ret void 4807} 4808 4809; Function Attrs: nofree norecurse nounwind uwtable willreturn 4810define dso_local void @st_or1_uint64_t_uint64_t(i64 %ptr, i8 zeroext %off, i64 %str) { 4811; CHECK-LABEL: st_or1_uint64_t_uint64_t: 4812; CHECK: # %bb.0: # %entry 4813; CHECK-NEXT: or r3, r4, r3 4814; CHECK-NEXT: std r5, 0(r3) 4815; CHECK-NEXT: blr 4816entry: 4817 %conv = zext i8 %off to i64 4818 %or = or i64 %conv, %ptr 4819 %0 = inttoptr i64 %or to ptr 4820 store atomic i64 %str, ptr %0 monotonic, align 8 4821 ret void 4822} 4823 4824; Function Attrs: nofree norecurse nounwind uwtable willreturn 4825define dso_local void @st_not_disjoint16_uint64_t_uint64_t(i64 %ptr, i64 %str) { 4826; CHECK-LABEL: st_not_disjoint16_uint64_t_uint64_t: 4827; CHECK: # %bb.0: # %entry 4828; CHECK-NEXT: ori r3, r3, 6 4829; CHECK-NEXT: std r4, 0(r3) 4830; CHECK-NEXT: blr 4831entry: 4832 %or = or i64 %ptr, 6 4833 %0 = inttoptr i64 %or to ptr 4834 store atomic i64 %str, ptr %0 monotonic, align 8 4835 ret void 4836} 4837 4838; Function Attrs: nofree norecurse nounwind uwtable willreturn 4839define dso_local void @st_disjoint_align16_uint64_t_uint64_t(i64 %ptr, i64 %str) { 4840; CHECK-LABEL: st_disjoint_align16_uint64_t_uint64_t: 4841; CHECK: # %bb.0: # %entry 4842; CHECK-NEXT: rldicr r3, r3, 0, 51 4843; CHECK-NEXT: std r4, 24(r3) 4844; CHECK-NEXT: blr 4845entry: 4846 %and = and i64 %ptr, -4096 4847 %or = or i64 %and, 24 4848 %0 = inttoptr i64 %or to ptr 4849 store atomic i64 %str, ptr %0 monotonic, align 8 4850 ret void 4851} 4852 4853; Function Attrs: nofree norecurse nounwind uwtable willreturn 4854define dso_local void @st_not_disjoint32_uint64_t_uint64_t(i64 %ptr, i64 %str) { 4855; CHECK-LABEL: st_not_disjoint32_uint64_t_uint64_t: 4856; CHECK: # %bb.0: # %entry 4857; CHECK-NEXT: ori r3, r3, 34463 4858; CHECK-NEXT: oris r3, r3, 1 4859; CHECK-NEXT: std r4, 0(r3) 4860; CHECK-NEXT: blr 4861entry: 4862 %or = or i64 %ptr, 99999 4863 %0 = inttoptr i64 %or to ptr 4864 store atomic i64 %str, ptr %0 monotonic, align 8 4865 ret void 4866} 4867 4868; Function Attrs: nofree norecurse nounwind uwtable willreturn 4869define dso_local void @st_disjoint_align32_uint64_t_uint64_t(i64 %ptr, i64 %str) { 4870; CHECK-P10-LABEL: st_disjoint_align32_uint64_t_uint64_t: 4871; CHECK-P10: # %bb.0: # %entry 4872; CHECK-P10-NEXT: lis r5, -15264 4873; CHECK-P10-NEXT: and r3, r3, r5 4874; CHECK-P10-NEXT: pstd r4, 999990000(r3), 0 4875; CHECK-P10-NEXT: blr 4876; 4877; CHECK-PREP10-LABEL: st_disjoint_align32_uint64_t_uint64_t: 4878; CHECK-PREP10: # %bb.0: # %entry 4879; CHECK-PREP10-NEXT: lis r5, -15264 4880; CHECK-PREP10-NEXT: and r3, r3, r5 4881; CHECK-PREP10-NEXT: lis r5, 15258 4882; CHECK-PREP10-NEXT: ori r5, r5, 41712 4883; CHECK-PREP10-NEXT: stdx r4, r3, r5 4884; CHECK-PREP10-NEXT: blr 4885entry: 4886 %and = and i64 %ptr, -1000341504 4887 %or = or i64 %and, 999990000 4888 %0 = inttoptr i64 %or to ptr 4889 store atomic i64 %str, ptr %0 monotonic, align 16 4890 ret void 4891} 4892 4893; Function Attrs: nofree norecurse nounwind uwtable willreturn 4894define dso_local void @st_not_disjoint64_uint64_t_uint64_t(i64 %ptr, i64 %str) { 4895; CHECK-P10-LABEL: st_not_disjoint64_uint64_t_uint64_t: 4896; CHECK-P10: # %bb.0: # %entry 4897; CHECK-P10-NEXT: pli r5, 232 4898; CHECK-P10-NEXT: pli r6, 3567587329 4899; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 4900; CHECK-P10-NEXT: or r3, r3, r6 4901; CHECK-P10-NEXT: std r4, 0(r3) 4902; CHECK-P10-NEXT: blr 4903; 4904; CHECK-PREP10-LABEL: st_not_disjoint64_uint64_t_uint64_t: 4905; CHECK-PREP10: # %bb.0: # %entry 4906; CHECK-PREP10-NEXT: li r5, 29 4907; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 4908; CHECK-PREP10-NEXT: oris r5, r5, 54437 4909; CHECK-PREP10-NEXT: ori r5, r5, 4097 4910; CHECK-PREP10-NEXT: or r3, r3, r5 4911; CHECK-PREP10-NEXT: std r4, 0(r3) 4912; CHECK-PREP10-NEXT: blr 4913entry: 4914 %or = or i64 %ptr, 1000000000001 4915 %0 = inttoptr i64 %or to ptr 4916 store atomic i64 %str, ptr %0 monotonic, align 8 4917 ret void 4918} 4919 4920; Function Attrs: nofree norecurse nounwind uwtable willreturn 4921define dso_local void @st_disjoint_align64_uint64_t_uint64_t(i64 %ptr, i64 %str) { 4922; CHECK-P10-LABEL: st_disjoint_align64_uint64_t_uint64_t: 4923; CHECK-P10: # %bb.0: # %entry 4924; CHECK-P10-NEXT: pli r5, 244140625 4925; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 4926; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4927; CHECK-P10-NEXT: stdx r4, r3, r5 4928; CHECK-P10-NEXT: blr 4929; 4930; CHECK-PREP10-LABEL: st_disjoint_align64_uint64_t_uint64_t: 4931; CHECK-PREP10: # %bb.0: # %entry 4932; CHECK-PREP10-NEXT: lis r5, 3725 4933; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 4934; CHECK-PREP10-NEXT: ori r5, r5, 19025 4935; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4936; CHECK-PREP10-NEXT: stdx r4, r3, r5 4937; CHECK-PREP10-NEXT: blr 4938entry: 4939 %and = and i64 %ptr, -1099511627776 4940 %or = or i64 %and, 1000000000000 4941 %0 = inttoptr i64 %or to ptr 4942 store atomic i64 %str, ptr %0 monotonic, align 4096 4943 ret void 4944} 4945 4946; Function Attrs: nofree norecurse nounwind uwtable willreturn 4947define dso_local void @st_cst_align16_uint64_t_uint64_t(i64 %str) { 4948; CHECK-LABEL: st_cst_align16_uint64_t_uint64_t: 4949; CHECK: # %bb.0: # %entry 4950; CHECK-NEXT: std r3, 4080(0) 4951; CHECK-NEXT: blr 4952entry: 4953 store atomic i64 %str, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 4954 ret void 4955} 4956 4957; Function Attrs: nofree norecurse nounwind uwtable willreturn 4958define dso_local void @st_cst_align32_uint64_t_uint64_t(i64 %str) { 4959; CHECK-LABEL: st_cst_align32_uint64_t_uint64_t: 4960; CHECK: # %bb.0: # %entry 4961; CHECK-NEXT: lis r4, 153 4962; CHECK-NEXT: std r3, -27108(r4) 4963; CHECK-NEXT: blr 4964entry: 4965 store atomic i64 %str, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 4966 ret void 4967} 4968 4969; Function Attrs: nofree norecurse nounwind uwtable willreturn 4970define dso_local void @st_cst_align64_uint64_t_uint64_t(i64 %str) { 4971; CHECK-P10-LABEL: st_cst_align64_uint64_t_uint64_t: 4972; CHECK-P10: # %bb.0: # %entry 4973; CHECK-P10-NEXT: pli r4, 244140625 4974; CHECK-P10-NEXT: rldic r4, r4, 12, 24 4975; CHECK-P10-NEXT: std r3, 0(r4) 4976; CHECK-P10-NEXT: blr 4977; 4978; CHECK-PREP10-LABEL: st_cst_align64_uint64_t_uint64_t: 4979; CHECK-PREP10: # %bb.0: # %entry 4980; CHECK-PREP10-NEXT: lis r4, 3725 4981; CHECK-PREP10-NEXT: ori r4, r4, 19025 4982; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 4983; CHECK-PREP10-NEXT: std r3, 0(r4) 4984; CHECK-PREP10-NEXT: blr 4985entry: 4986 store atomic i64 %str, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 4987 ret void 4988} 4989;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: 4990; CHECK-P8: {{.*}} 4991; CHECK-P9: {{.*}} 4992