1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ 3; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 4; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10 5; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 6; RUN: -mcpu=pwr10 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 7; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-P10 8; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ 9; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 10; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10 11; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 12; RUN: -mcpu=pwr9 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 13; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10 14; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-linux-gnu \ 15; RUN: -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 16; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10 17; RUN: llc -verify-machineinstrs -mtriple=powerpc64-unknown-linux-gnu \ 18; RUN: -mcpu=pwr8 -ppc-asm-full-reg-names -ppc-vsr-nums-as-vr \ 19; RUN: < %s | FileCheck %s --check-prefixes=CHECK,CHECK-PREP10 20 21; Function Attrs: nofree norecurse nounwind uwtable willreturn 22define dso_local signext i16 @ld_0_int16_t_uint8_t(i64 %ptr) { 23; CHECK-LABEL: ld_0_int16_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 i16 31 ret i16 %conv 32} 33 34; Function Attrs: nofree norecurse nounwind uwtable willreturn 35define dso_local signext i16 @ld_align16_int16_t_uint8_t(ptr nocapture readonly %ptr) { 36; CHECK-LABEL: ld_align16_int16_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 i16 44 ret i16 %conv 45} 46 47; Function Attrs: nofree norecurse nounwind uwtable willreturn 48define dso_local signext i16 @ld_align32_int16_t_uint8_t(ptr nocapture readonly %ptr) { 49; CHECK-P10-LABEL: ld_align32_int16_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_int16_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 i16 65 ret i16 %conv 66} 67 68; Function Attrs: nofree norecurse nounwind uwtable willreturn 69define dso_local signext i16 @ld_align64_int16_t_uint8_t(ptr nocapture readonly %ptr) { 70; CHECK-P10-LABEL: ld_align64_int16_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_int16_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 i16 88 ret i16 %conv 89} 90 91; Function Attrs: nofree norecurse nounwind uwtable willreturn 92define dso_local signext i16 @ld_reg_int16_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) { 93; CHECK-LABEL: ld_reg_int16_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 i16 101 ret i16 %conv 102} 103 104; Function Attrs: nofree norecurse nounwind uwtable willreturn 105define dso_local signext i16 @ld_or_int16_t_uint8_t(i64 %ptr, i8 zeroext %off) { 106; CHECK-LABEL: ld_or_int16_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 i16 117 ret i16 %conv1 118} 119 120; Function Attrs: nofree norecurse nounwind uwtable willreturn 121define dso_local signext i16 @ld_not_disjoint16_int16_t_uint8_t(i64 %ptr) { 122; CHECK-LABEL: ld_not_disjoint16_int16_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 i16 132 ret i16 %conv 133} 134 135; Function Attrs: nofree norecurse nounwind uwtable willreturn 136define dso_local signext i16 @ld_disjoint_align16_int16_t_uint8_t(i64 %ptr) { 137; CHECK-LABEL: ld_disjoint_align16_int16_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 i16 148 ret i16 %conv 149} 150 151; Function Attrs: nofree norecurse nounwind uwtable willreturn 152define dso_local signext i16 @ld_not_disjoint32_int16_t_uint8_t(i64 %ptr) { 153; CHECK-LABEL: ld_not_disjoint32_int16_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 i16 164 ret i16 %conv 165} 166 167; Function Attrs: nofree norecurse nounwind uwtable willreturn 168define dso_local signext i16 @ld_disjoint_align32_int16_t_uint8_t(i64 %ptr) { 169; CHECK-P10-LABEL: ld_disjoint_align32_int16_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_int16_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 i16 191 ret i16 %conv 192} 193 194; Function Attrs: nofree norecurse nounwind uwtable willreturn 195define dso_local signext i16 @ld_not_disjoint64_int16_t_uint8_t(i64 %ptr) { 196; CHECK-P10-LABEL: ld_not_disjoint64_int16_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_int16_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 i16 219 ret i16 %conv 220} 221 222; Function Attrs: nofree norecurse nounwind uwtable willreturn 223define dso_local signext i16 @ld_disjoint_align64_int16_t_uint8_t(i64 %ptr) { 224; CHECK-P10-LABEL: ld_disjoint_align64_int16_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_int16_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 i16 246 ret i16 %conv 247} 248 249; Function Attrs: nofree norecurse nounwind uwtable willreturn 250define dso_local signext i16 @ld_cst_align16_int16_t_uint8_t() { 251; CHECK-LABEL: ld_cst_align16_int16_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 i16 258 ret i16 %conv 259} 260 261; Function Attrs: nofree norecurse nounwind uwtable willreturn 262define dso_local signext i16 @ld_cst_align32_int16_t_uint8_t() { 263; CHECK-LABEL: ld_cst_align32_int16_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 i16 271 ret i16 %conv 272} 273 274; Function Attrs: nofree norecurse nounwind uwtable willreturn 275define dso_local signext i16 @ld_cst_align64_int16_t_uint8_t() { 276; CHECK-P10-LABEL: ld_cst_align64_int16_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_int16_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 i16 293 ret i16 %conv 294} 295 296; Function Attrs: nofree norecurse nounwind uwtable willreturn 297define dso_local signext i16 @ld_0_int16_t_int8_t(i64 %ptr) { 298; CHECK-LABEL: ld_0_int16_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 i16 307 ret i16 %conv 308} 309 310; Function Attrs: nofree norecurse nounwind uwtable willreturn 311define dso_local signext i16 @ld_align16_int16_t_int8_t(ptr nocapture readonly %ptr) { 312; CHECK-LABEL: ld_align16_int16_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 i16 321 ret i16 %conv 322} 323 324; Function Attrs: nofree norecurse nounwind uwtable willreturn 325define dso_local signext i16 @ld_align32_int16_t_int8_t(ptr nocapture readonly %ptr) { 326; CHECK-P10-LABEL: ld_align32_int16_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_int16_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 i16 343 ret i16 %conv 344} 345 346; Function Attrs: nofree norecurse nounwind uwtable willreturn 347define dso_local signext i16 @ld_align64_int16_t_int8_t(ptr nocapture readonly %ptr) { 348; CHECK-P10-LABEL: ld_align64_int16_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_int16_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 i16 368 ret i16 %conv 369} 370 371; Function Attrs: nofree norecurse nounwind uwtable willreturn 372define dso_local signext i16 @ld_reg_int16_t_int8_t(ptr nocapture readonly %ptr, i64 %off) { 373; CHECK-LABEL: ld_reg_int16_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 i16 382 ret i16 %conv 383} 384 385; Function Attrs: nofree norecurse nounwind uwtable willreturn 386define dso_local signext i16 @ld_or_int16_t_int8_t(i64 %ptr, i8 zeroext %off) { 387; CHECK-LABEL: ld_or_int16_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 i16 399 ret i16 %conv1 400} 401 402; Function Attrs: nofree norecurse nounwind uwtable willreturn 403define dso_local signext i16 @ld_not_disjoint16_int16_t_int8_t(i64 %ptr) { 404; CHECK-LABEL: ld_not_disjoint16_int16_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 i16 415 ret i16 %conv 416} 417 418; Function Attrs: nofree norecurse nounwind uwtable willreturn 419define dso_local signext i16 @ld_disjoint_align16_int16_t_int8_t(i64 %ptr) { 420; CHECK-LABEL: ld_disjoint_align16_int16_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 i16 432 ret i16 %conv 433} 434 435; Function Attrs: nofree norecurse nounwind uwtable willreturn 436define dso_local signext i16 @ld_not_disjoint32_int16_t_int8_t(i64 %ptr) { 437; CHECK-LABEL: ld_not_disjoint32_int16_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 i16 449 ret i16 %conv 450} 451 452; Function Attrs: nofree norecurse nounwind uwtable willreturn 453define dso_local signext i16 @ld_disjoint_align32_int16_t_int8_t(i64 %ptr) { 454; CHECK-P10-LABEL: ld_disjoint_align32_int16_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_int16_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 i16 477 ret i16 %conv 478} 479 480; Function Attrs: nofree norecurse nounwind uwtable willreturn 481define dso_local signext i16 @ld_not_disjoint64_int16_t_int8_t(i64 %ptr) { 482; CHECK-P10-LABEL: ld_not_disjoint64_int16_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_int16_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 i16 507 ret i16 %conv 508} 509 510; Function Attrs: nofree norecurse nounwind uwtable willreturn 511define dso_local signext i16 @ld_disjoint_align64_int16_t_int8_t(i64 %ptr) { 512; CHECK-P10-LABEL: ld_disjoint_align64_int16_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_int16_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 i16 536 ret i16 %conv 537} 538 539; Function Attrs: nofree norecurse nounwind uwtable willreturn 540define dso_local signext i16 @ld_cst_align16_int16_t_int8_t() { 541; CHECK-LABEL: ld_cst_align16_int16_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 i16 549 ret i16 %conv 550} 551 552; Function Attrs: nofree norecurse nounwind uwtable willreturn 553define dso_local signext i16 @ld_cst_align32_int16_t_int8_t() { 554; CHECK-LABEL: ld_cst_align32_int16_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 i16 563 ret i16 %conv 564} 565 566; Function Attrs: nofree norecurse nounwind uwtable willreturn 567define dso_local signext i16 @ld_cst_align64_int16_t_int8_t() { 568; CHECK-P10-LABEL: ld_cst_align64_int16_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_int16_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 i16 587 ret i16 %conv 588} 589 590; Function Attrs: nofree norecurse nounwind uwtable willreturn 591define dso_local signext i16 @ld_0_int16_t_uint16_t(i64 %ptr) { 592; CHECK-LABEL: ld_0_int16_t_uint16_t: 593; CHECK: # %bb.0: # %entry 594; CHECK-NEXT: lhz r3, 0(r3) 595; CHECK-NEXT: extsh r3, r3 596; CHECK-NEXT: blr 597entry: 598 %0 = inttoptr i64 %ptr to ptr 599 %1 = load atomic i16, ptr %0 monotonic, align 2 600 ret i16 %1 601} 602 603; Function Attrs: nofree norecurse nounwind uwtable willreturn 604define dso_local signext i16 @ld_align16_int16_t_uint16_t(ptr nocapture readonly %ptr) { 605; CHECK-LABEL: ld_align16_int16_t_uint16_t: 606; CHECK: # %bb.0: # %entry 607; CHECK-NEXT: lhz r3, 8(r3) 608; CHECK-NEXT: extsh r3, r3 609; CHECK-NEXT: blr 610entry: 611 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 612 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 613 ret i16 %0 614} 615 616; Function Attrs: nofree norecurse nounwind uwtable willreturn 617define dso_local signext i16 @ld_align32_int16_t_uint16_t(ptr nocapture readonly %ptr) { 618; CHECK-P10-LABEL: ld_align32_int16_t_uint16_t: 619; CHECK-P10: # %bb.0: # %entry 620; CHECK-P10-NEXT: plhz r3, 99999000(r3), 0 621; CHECK-P10-NEXT: extsh r3, r3 622; CHECK-P10-NEXT: blr 623; 624; CHECK-PREP10-LABEL: ld_align32_int16_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: extsh r3, r3 630; CHECK-PREP10-NEXT: blr 631entry: 632 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 633 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 634 ret i16 %0 635} 636 637; Function Attrs: nofree norecurse nounwind uwtable willreturn 638define dso_local signext i16 @ld_align64_int16_t_uint16_t(ptr nocapture readonly %ptr) { 639; CHECK-P10-LABEL: ld_align64_int16_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: extsh r3, r3 645; CHECK-P10-NEXT: blr 646; 647; CHECK-PREP10-LABEL: ld_align64_int16_t_uint16_t: 648; CHECK-PREP10: # %bb.0: # %entry 649; CHECK-PREP10-NEXT: lis r4, 3725 650; CHECK-PREP10-NEXT: ori r4, r4, 19025 651; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 652; CHECK-PREP10-NEXT: lhzx r3, r3, r4 653; CHECK-PREP10-NEXT: extsh r3, r3 654; CHECK-PREP10-NEXT: blr 655entry: 656 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 657 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 658 ret i16 %0 659} 660 661; Function Attrs: nofree norecurse nounwind uwtable willreturn 662define dso_local signext i16 @ld_reg_int16_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) { 663; CHECK-LABEL: ld_reg_int16_t_uint16_t: 664; CHECK: # %bb.0: # %entry 665; CHECK-NEXT: lhzx r3, r3, r4 666; CHECK-NEXT: extsh r3, r3 667; CHECK-NEXT: blr 668entry: 669 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 670 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 671 ret i16 %0 672} 673 674; Function Attrs: nofree norecurse nounwind uwtable willreturn 675define dso_local signext i16 @ld_or_int16_t_uint16_t(i64 %ptr, i8 zeroext %off) { 676; CHECK-LABEL: ld_or_int16_t_uint16_t: 677; CHECK: # %bb.0: # %entry 678; CHECK-NEXT: or r3, r4, r3 679; CHECK-NEXT: lhz r3, 0(r3) 680; CHECK-NEXT: extsh r3, r3 681; CHECK-NEXT: blr 682entry: 683 %conv = zext i8 %off to i64 684 %or = or i64 %conv, %ptr 685 %0 = inttoptr i64 %or to ptr 686 %1 = load atomic i16, ptr %0 monotonic, align 2 687 ret i16 %1 688} 689 690; Function Attrs: nofree norecurse nounwind uwtable willreturn 691define dso_local signext i16 @ld_not_disjoint16_int16_t_uint16_t(i64 %ptr) { 692; CHECK-LABEL: ld_not_disjoint16_int16_t_uint16_t: 693; CHECK: # %bb.0: # %entry 694; CHECK-NEXT: ori r3, r3, 6 695; CHECK-NEXT: lhz r3, 0(r3) 696; CHECK-NEXT: extsh r3, r3 697; CHECK-NEXT: blr 698entry: 699 %or = or i64 %ptr, 6 700 %0 = inttoptr i64 %or to ptr 701 %1 = load atomic i16, ptr %0 monotonic, align 2 702 ret i16 %1 703} 704 705; Function Attrs: nofree norecurse nounwind uwtable willreturn 706define dso_local signext i16 @ld_disjoint_align16_int16_t_uint16_t(i64 %ptr) { 707; CHECK-LABEL: ld_disjoint_align16_int16_t_uint16_t: 708; CHECK: # %bb.0: # %entry 709; CHECK-NEXT: rldicr r3, r3, 0, 51 710; CHECK-NEXT: lhz r3, 24(r3) 711; CHECK-NEXT: extsh r3, r3 712; CHECK-NEXT: blr 713entry: 714 %and = and i64 %ptr, -4096 715 %or = or i64 %and, 24 716 %0 = inttoptr i64 %or to ptr 717 %1 = load atomic i16, ptr %0 monotonic, align 8 718 ret i16 %1 719} 720 721; Function Attrs: nofree norecurse nounwind uwtable willreturn 722define dso_local signext i16 @ld_not_disjoint32_int16_t_uint16_t(i64 %ptr) { 723; CHECK-LABEL: ld_not_disjoint32_int16_t_uint16_t: 724; CHECK: # %bb.0: # %entry 725; CHECK-NEXT: ori r3, r3, 34463 726; CHECK-NEXT: oris r3, r3, 1 727; CHECK-NEXT: lhz r3, 0(r3) 728; CHECK-NEXT: extsh r3, r3 729; CHECK-NEXT: blr 730entry: 731 %or = or i64 %ptr, 99999 732 %0 = inttoptr i64 %or to ptr 733 %1 = load atomic i16, ptr %0 monotonic, align 2 734 ret i16 %1 735} 736 737; Function Attrs: nofree norecurse nounwind uwtable willreturn 738define dso_local signext i16 @ld_disjoint_align32_int16_t_uint16_t(i64 %ptr) { 739; CHECK-P10-LABEL: ld_disjoint_align32_int16_t_uint16_t: 740; CHECK-P10: # %bb.0: # %entry 741; CHECK-P10-NEXT: lis r4, -15264 742; CHECK-P10-NEXT: and r3, r3, r4 743; CHECK-P10-NEXT: plhz r3, 999990000(r3), 0 744; CHECK-P10-NEXT: extsh r3, r3 745; CHECK-P10-NEXT: blr 746; 747; CHECK-PREP10-LABEL: ld_disjoint_align32_int16_t_uint16_t: 748; CHECK-PREP10: # %bb.0: # %entry 749; CHECK-PREP10-NEXT: lis r4, -15264 750; CHECK-PREP10-NEXT: and r3, r3, r4 751; CHECK-PREP10-NEXT: lis r4, 15258 752; CHECK-PREP10-NEXT: ori r4, r4, 41712 753; CHECK-PREP10-NEXT: lhzx r3, r3, r4 754; CHECK-PREP10-NEXT: extsh r3, r3 755; CHECK-PREP10-NEXT: blr 756entry: 757 %and = and i64 %ptr, -1000341504 758 %or = or i64 %and, 999990000 759 %0 = inttoptr i64 %or to ptr 760 %1 = load atomic i16, ptr %0 monotonic, align 16 761 ret i16 %1 762} 763 764; Function Attrs: nofree norecurse nounwind uwtable willreturn 765define dso_local signext i16 @ld_not_disjoint64_int16_t_uint16_t(i64 %ptr) { 766; CHECK-P10-LABEL: ld_not_disjoint64_int16_t_uint16_t: 767; CHECK-P10: # %bb.0: # %entry 768; CHECK-P10-NEXT: pli r4, 232 769; CHECK-P10-NEXT: pli r5, 3567587329 770; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 771; CHECK-P10-NEXT: or r3, r3, r5 772; CHECK-P10-NEXT: lhz r3, 0(r3) 773; CHECK-P10-NEXT: extsh r3, r3 774; CHECK-P10-NEXT: blr 775; 776; CHECK-PREP10-LABEL: ld_not_disjoint64_int16_t_uint16_t: 777; CHECK-PREP10: # %bb.0: # %entry 778; CHECK-PREP10-NEXT: li r4, 29 779; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 780; CHECK-PREP10-NEXT: oris r4, r4, 54437 781; CHECK-PREP10-NEXT: ori r4, r4, 4097 782; CHECK-PREP10-NEXT: or r3, r3, r4 783; CHECK-PREP10-NEXT: lhz r3, 0(r3) 784; CHECK-PREP10-NEXT: extsh r3, r3 785; CHECK-PREP10-NEXT: blr 786entry: 787 %or = or i64 %ptr, 1000000000001 788 %0 = inttoptr i64 %or to ptr 789 %1 = load atomic i16, ptr %0 monotonic, align 2 790 ret i16 %1 791} 792 793; Function Attrs: nofree norecurse nounwind uwtable willreturn 794define dso_local signext i16 @ld_disjoint_align64_int16_t_uint16_t(i64 %ptr) { 795; CHECK-P10-LABEL: ld_disjoint_align64_int16_t_uint16_t: 796; CHECK-P10: # %bb.0: # %entry 797; CHECK-P10-NEXT: pli r4, 244140625 798; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 799; CHECK-P10-NEXT: rldic r4, r4, 12, 24 800; CHECK-P10-NEXT: lhzx r3, r3, r4 801; CHECK-P10-NEXT: extsh r3, r3 802; CHECK-P10-NEXT: blr 803; 804; CHECK-PREP10-LABEL: ld_disjoint_align64_int16_t_uint16_t: 805; CHECK-PREP10: # %bb.0: # %entry 806; CHECK-PREP10-NEXT: lis r4, 3725 807; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 808; CHECK-PREP10-NEXT: ori r4, r4, 19025 809; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 810; CHECK-PREP10-NEXT: lhzx r3, r3, r4 811; CHECK-PREP10-NEXT: extsh r3, r3 812; CHECK-PREP10-NEXT: blr 813entry: 814 %and = and i64 %ptr, -1099511627776 815 %or = or i64 %and, 1000000000000 816 %0 = inttoptr i64 %or to ptr 817 %1 = load atomic i16, ptr %0 monotonic, align 4096 818 ret i16 %1 819} 820 821; Function Attrs: nofree norecurse nounwind uwtable willreturn 822define dso_local signext i16 @ld_cst_align16_int16_t_uint16_t() { 823; CHECK-LABEL: ld_cst_align16_int16_t_uint16_t: 824; CHECK: # %bb.0: # %entry 825; CHECK-NEXT: lhz r3, 4080(0) 826; CHECK-NEXT: extsh r3, r3 827; CHECK-NEXT: blr 828entry: 829 %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 830 ret i16 %0 831} 832 833; Function Attrs: nofree norecurse nounwind uwtable willreturn 834define dso_local signext i16 @ld_cst_align32_int16_t_uint16_t() { 835; CHECK-LABEL: ld_cst_align32_int16_t_uint16_t: 836; CHECK: # %bb.0: # %entry 837; CHECK-NEXT: lis r3, 153 838; CHECK-NEXT: lhz r3, -27108(r3) 839; CHECK-NEXT: extsh r3, r3 840; CHECK-NEXT: blr 841entry: 842 %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 843 ret i16 %0 844} 845 846; Function Attrs: nofree norecurse nounwind uwtable willreturn 847define dso_local signext i16 @ld_cst_align64_int16_t_uint16_t() { 848; CHECK-P10-LABEL: ld_cst_align64_int16_t_uint16_t: 849; CHECK-P10: # %bb.0: # %entry 850; CHECK-P10-NEXT: pli r3, 244140625 851; CHECK-P10-NEXT: rldic r3, r3, 12, 24 852; CHECK-P10-NEXT: lhz r3, 0(r3) 853; CHECK-P10-NEXT: extsh r3, r3 854; CHECK-P10-NEXT: blr 855; 856; CHECK-PREP10-LABEL: ld_cst_align64_int16_t_uint16_t: 857; CHECK-PREP10: # %bb.0: # %entry 858; CHECK-PREP10-NEXT: lis r3, 3725 859; CHECK-PREP10-NEXT: ori r3, r3, 19025 860; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 861; CHECK-PREP10-NEXT: lhz r3, 0(r3) 862; CHECK-PREP10-NEXT: extsh r3, r3 863; CHECK-PREP10-NEXT: blr 864entry: 865 %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 866 ret i16 %0 867} 868 869; Function Attrs: nofree norecurse nounwind uwtable willreturn 870define dso_local signext i16 @ld_0_int16_t_uint32_t(i64 %ptr) { 871; CHECK-LABEL: ld_0_int16_t_uint32_t: 872; CHECK: # %bb.0: # %entry 873; CHECK-NEXT: lwz r3, 0(r3) 874; CHECK-NEXT: extsh r3, r3 875; CHECK-NEXT: blr 876entry: 877 %0 = inttoptr i64 %ptr to ptr 878 %1 = load atomic i32, ptr %0 monotonic, align 4 879 %conv = trunc i32 %1 to i16 880 ret i16 %conv 881} 882 883; Function Attrs: nofree norecurse nounwind uwtable willreturn 884define dso_local signext i16 @ld_align16_int16_t_uint32_t(ptr nocapture readonly %ptr) { 885; CHECK-LABEL: ld_align16_int16_t_uint32_t: 886; CHECK: # %bb.0: # %entry 887; CHECK-NEXT: lwz r3, 8(r3) 888; CHECK-NEXT: extsh r3, r3 889; CHECK-NEXT: blr 890entry: 891 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 892 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 893 %conv = trunc i32 %0 to i16 894 ret i16 %conv 895} 896 897; Function Attrs: nofree norecurse nounwind uwtable willreturn 898define dso_local signext i16 @ld_align32_int16_t_uint32_t(ptr nocapture readonly %ptr) { 899; CHECK-P10-LABEL: ld_align32_int16_t_uint32_t: 900; CHECK-P10: # %bb.0: # %entry 901; CHECK-P10-NEXT: plwz r3, 99999000(r3), 0 902; CHECK-P10-NEXT: extsh r3, r3 903; CHECK-P10-NEXT: blr 904; 905; CHECK-PREP10-LABEL: ld_align32_int16_t_uint32_t: 906; CHECK-PREP10: # %bb.0: # %entry 907; CHECK-PREP10-NEXT: lis r4, 1525 908; CHECK-PREP10-NEXT: ori r4, r4, 56600 909; CHECK-PREP10-NEXT: lwzx r3, r3, r4 910; CHECK-PREP10-NEXT: extsh r3, r3 911; CHECK-PREP10-NEXT: blr 912entry: 913 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 914 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 915 %conv = trunc i32 %0 to i16 916 ret i16 %conv 917} 918 919; Function Attrs: nofree norecurse nounwind uwtable willreturn 920define dso_local signext i16 @ld_align64_int16_t_uint32_t(ptr nocapture readonly %ptr) { 921; CHECK-P10-LABEL: ld_align64_int16_t_uint32_t: 922; CHECK-P10: # %bb.0: # %entry 923; CHECK-P10-NEXT: pli r4, 244140625 924; CHECK-P10-NEXT: rldic r4, r4, 12, 24 925; CHECK-P10-NEXT: lwzx r3, r3, r4 926; CHECK-P10-NEXT: extsh r3, r3 927; CHECK-P10-NEXT: blr 928; 929; CHECK-PREP10-LABEL: ld_align64_int16_t_uint32_t: 930; CHECK-PREP10: # %bb.0: # %entry 931; CHECK-PREP10-NEXT: lis r4, 3725 932; CHECK-PREP10-NEXT: ori r4, r4, 19025 933; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 934; CHECK-PREP10-NEXT: lwzx r3, r3, r4 935; CHECK-PREP10-NEXT: extsh r3, r3 936; CHECK-PREP10-NEXT: blr 937entry: 938 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 939 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 940 %conv = trunc i32 %0 to i16 941 ret i16 %conv 942} 943 944; Function Attrs: nofree norecurse nounwind uwtable willreturn 945define dso_local signext i16 @ld_reg_int16_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) { 946; CHECK-LABEL: ld_reg_int16_t_uint32_t: 947; CHECK: # %bb.0: # %entry 948; CHECK-NEXT: lwzx r3, r3, r4 949; CHECK-NEXT: extsh r3, r3 950; CHECK-NEXT: blr 951entry: 952 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 953 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 954 %conv = trunc i32 %0 to i16 955 ret i16 %conv 956} 957 958; Function Attrs: nofree norecurse nounwind uwtable willreturn 959define dso_local signext i16 @ld_or_int16_t_uint32_t(i64 %ptr, i8 zeroext %off) { 960; CHECK-LABEL: ld_or_int16_t_uint32_t: 961; CHECK: # %bb.0: # %entry 962; CHECK-NEXT: or r3, r4, r3 963; CHECK-NEXT: lwz r3, 0(r3) 964; CHECK-NEXT: extsh r3, r3 965; CHECK-NEXT: blr 966entry: 967 %conv = zext i8 %off to i64 968 %or = or i64 %conv, %ptr 969 %0 = inttoptr i64 %or to ptr 970 %1 = load atomic i32, ptr %0 monotonic, align 4 971 %conv1 = trunc i32 %1 to i16 972 ret i16 %conv1 973} 974 975; Function Attrs: nofree norecurse nounwind uwtable willreturn 976define dso_local signext i16 @ld_not_disjoint16_int16_t_uint32_t(i64 %ptr) { 977; CHECK-LABEL: ld_not_disjoint16_int16_t_uint32_t: 978; CHECK: # %bb.0: # %entry 979; CHECK-NEXT: ori r3, r3, 6 980; CHECK-NEXT: lwz r3, 0(r3) 981; CHECK-NEXT: extsh r3, r3 982; CHECK-NEXT: blr 983entry: 984 %or = or i64 %ptr, 6 985 %0 = inttoptr i64 %or to ptr 986 %1 = load atomic i32, ptr %0 monotonic, align 4 987 %conv = trunc i32 %1 to i16 988 ret i16 %conv 989} 990 991; Function Attrs: nofree norecurse nounwind uwtable willreturn 992define dso_local signext i16 @ld_disjoint_align16_int16_t_uint32_t(i64 %ptr) { 993; CHECK-LABEL: ld_disjoint_align16_int16_t_uint32_t: 994; CHECK: # %bb.0: # %entry 995; CHECK-NEXT: rldicr r3, r3, 0, 51 996; CHECK-NEXT: lwz r3, 24(r3) 997; CHECK-NEXT: extsh r3, r3 998; CHECK-NEXT: blr 999entry: 1000 %and = and i64 %ptr, -4096 1001 %or = or i64 %and, 24 1002 %0 = inttoptr i64 %or to ptr 1003 %1 = load atomic i32, ptr %0 monotonic, align 8 1004 %conv = trunc i32 %1 to i16 1005 ret i16 %conv 1006} 1007 1008; Function Attrs: nofree norecurse nounwind uwtable willreturn 1009define dso_local signext i16 @ld_not_disjoint32_int16_t_uint32_t(i64 %ptr) { 1010; CHECK-LABEL: ld_not_disjoint32_int16_t_uint32_t: 1011; CHECK: # %bb.0: # %entry 1012; CHECK-NEXT: ori r3, r3, 34463 1013; CHECK-NEXT: oris r3, r3, 1 1014; CHECK-NEXT: lwz r3, 0(r3) 1015; CHECK-NEXT: extsh r3, r3 1016; CHECK-NEXT: blr 1017entry: 1018 %or = or i64 %ptr, 99999 1019 %0 = inttoptr i64 %or to ptr 1020 %1 = load atomic i32, ptr %0 monotonic, align 4 1021 %conv = trunc i32 %1 to i16 1022 ret i16 %conv 1023} 1024 1025; Function Attrs: nofree norecurse nounwind uwtable willreturn 1026define dso_local signext i16 @ld_disjoint_align32_int16_t_uint32_t(i64 %ptr) { 1027; CHECK-P10-LABEL: ld_disjoint_align32_int16_t_uint32_t: 1028; CHECK-P10: # %bb.0: # %entry 1029; CHECK-P10-NEXT: lis r4, -15264 1030; CHECK-P10-NEXT: and r3, r3, r4 1031; CHECK-P10-NEXT: plwz r3, 999990000(r3), 0 1032; CHECK-P10-NEXT: extsh r3, r3 1033; CHECK-P10-NEXT: blr 1034; 1035; CHECK-PREP10-LABEL: ld_disjoint_align32_int16_t_uint32_t: 1036; CHECK-PREP10: # %bb.0: # %entry 1037; CHECK-PREP10-NEXT: lis r4, -15264 1038; CHECK-PREP10-NEXT: and r3, r3, r4 1039; CHECK-PREP10-NEXT: lis r4, 15258 1040; CHECK-PREP10-NEXT: ori r4, r4, 41712 1041; CHECK-PREP10-NEXT: lwzx r3, r3, r4 1042; CHECK-PREP10-NEXT: extsh r3, r3 1043; CHECK-PREP10-NEXT: blr 1044entry: 1045 %and = and i64 %ptr, -1000341504 1046 %or = or i64 %and, 999990000 1047 %0 = inttoptr i64 %or to ptr 1048 %1 = load atomic i32, ptr %0 monotonic, align 16 1049 %conv = trunc i32 %1 to i16 1050 ret i16 %conv 1051} 1052 1053; Function Attrs: nofree norecurse nounwind uwtable willreturn 1054define dso_local signext i16 @ld_not_disjoint64_int16_t_uint32_t(i64 %ptr) { 1055; CHECK-P10-LABEL: ld_not_disjoint64_int16_t_uint32_t: 1056; CHECK-P10: # %bb.0: # %entry 1057; CHECK-P10-NEXT: pli r4, 232 1058; CHECK-P10-NEXT: pli r5, 3567587329 1059; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1060; CHECK-P10-NEXT: or r3, r3, r5 1061; CHECK-P10-NEXT: lwz r3, 0(r3) 1062; CHECK-P10-NEXT: extsh r3, r3 1063; CHECK-P10-NEXT: blr 1064; 1065; CHECK-PREP10-LABEL: ld_not_disjoint64_int16_t_uint32_t: 1066; CHECK-PREP10: # %bb.0: # %entry 1067; CHECK-PREP10-NEXT: li r4, 29 1068; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1069; CHECK-PREP10-NEXT: oris r4, r4, 54437 1070; CHECK-PREP10-NEXT: ori r4, r4, 4097 1071; CHECK-PREP10-NEXT: or r3, r3, r4 1072; CHECK-PREP10-NEXT: lwz r3, 0(r3) 1073; CHECK-PREP10-NEXT: extsh r3, r3 1074; CHECK-PREP10-NEXT: blr 1075entry: 1076 %or = or i64 %ptr, 1000000000001 1077 %0 = inttoptr i64 %or to ptr 1078 %1 = load atomic i32, ptr %0 monotonic, align 4 1079 %conv = trunc i32 %1 to i16 1080 ret i16 %conv 1081} 1082 1083; Function Attrs: nofree norecurse nounwind uwtable willreturn 1084define dso_local signext i16 @ld_disjoint_align64_int16_t_uint32_t(i64 %ptr) { 1085; CHECK-P10-LABEL: ld_disjoint_align64_int16_t_uint32_t: 1086; CHECK-P10: # %bb.0: # %entry 1087; CHECK-P10-NEXT: pli r4, 244140625 1088; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1089; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1090; CHECK-P10-NEXT: lwzx r3, r3, r4 1091; CHECK-P10-NEXT: extsh r3, r3 1092; CHECK-P10-NEXT: blr 1093; 1094; CHECK-PREP10-LABEL: ld_disjoint_align64_int16_t_uint32_t: 1095; CHECK-PREP10: # %bb.0: # %entry 1096; CHECK-PREP10-NEXT: lis r4, 3725 1097; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1098; CHECK-PREP10-NEXT: ori r4, r4, 19025 1099; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1100; CHECK-PREP10-NEXT: lwzx r3, r3, r4 1101; CHECK-PREP10-NEXT: extsh r3, r3 1102; CHECK-PREP10-NEXT: blr 1103entry: 1104 %and = and i64 %ptr, -1099511627776 1105 %or = or i64 %and, 1000000000000 1106 %0 = inttoptr i64 %or to ptr 1107 %1 = load atomic i32, ptr %0 monotonic, align 4096 1108 %conv = trunc i32 %1 to i16 1109 ret i16 %conv 1110} 1111 1112; Function Attrs: nofree norecurse nounwind uwtable willreturn 1113define dso_local signext i16 @ld_cst_align16_int16_t_uint32_t() { 1114; CHECK-LABEL: ld_cst_align16_int16_t_uint32_t: 1115; CHECK: # %bb.0: # %entry 1116; CHECK-NEXT: lwz r3, 4080(0) 1117; CHECK-NEXT: extsh r3, r3 1118; CHECK-NEXT: blr 1119entry: 1120 %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1121 %conv = trunc i32 %0 to i16 1122 ret i16 %conv 1123} 1124 1125; Function Attrs: nofree norecurse nounwind uwtable willreturn 1126define dso_local signext i16 @ld_cst_align32_int16_t_uint32_t() { 1127; CHECK-LABEL: ld_cst_align32_int16_t_uint32_t: 1128; CHECK: # %bb.0: # %entry 1129; CHECK-NEXT: lis r3, 153 1130; CHECK-NEXT: lwz r3, -27108(r3) 1131; CHECK-NEXT: extsh r3, r3 1132; CHECK-NEXT: blr 1133entry: 1134 %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 1135 %conv = trunc i32 %0 to i16 1136 ret i16 %conv 1137} 1138 1139; Function Attrs: nofree norecurse nounwind uwtable willreturn 1140define dso_local signext i16 @ld_cst_align64_int16_t_uint32_t() { 1141; CHECK-P10-LABEL: ld_cst_align64_int16_t_uint32_t: 1142; CHECK-P10: # %bb.0: # %entry 1143; CHECK-P10-NEXT: pli r3, 244140625 1144; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1145; CHECK-P10-NEXT: lwz r3, 0(r3) 1146; CHECK-P10-NEXT: extsh r3, r3 1147; CHECK-P10-NEXT: blr 1148; 1149; CHECK-PREP10-LABEL: ld_cst_align64_int16_t_uint32_t: 1150; CHECK-PREP10: # %bb.0: # %entry 1151; CHECK-PREP10-NEXT: lis r3, 3725 1152; CHECK-PREP10-NEXT: ori r3, r3, 19025 1153; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1154; CHECK-PREP10-NEXT: lwz r3, 0(r3) 1155; CHECK-PREP10-NEXT: extsh r3, r3 1156; CHECK-PREP10-NEXT: blr 1157entry: 1158 %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1159 %conv = trunc i32 %0 to i16 1160 ret i16 %conv 1161} 1162 1163; Function Attrs: nofree norecurse nounwind uwtable willreturn 1164define dso_local signext i16 @ld_0_int16_t_uint64_t(i64 %ptr) { 1165; CHECK-LABEL: ld_0_int16_t_uint64_t: 1166; CHECK: # %bb.0: # %entry 1167; CHECK-NEXT: ld r3, 0(r3) 1168; CHECK-NEXT: extsh r3, r3 1169; CHECK-NEXT: blr 1170entry: 1171 %0 = inttoptr i64 %ptr to ptr 1172 %1 = load atomic i64, ptr %0 monotonic, align 8 1173 %conv = trunc i64 %1 to i16 1174 ret i16 %conv 1175} 1176 1177; Function Attrs: nofree norecurse nounwind uwtable willreturn 1178define dso_local signext i16 @ld_align16_int16_t_uint64_t(ptr nocapture readonly %ptr) { 1179; CHECK-LABEL: ld_align16_int16_t_uint64_t: 1180; CHECK: # %bb.0: # %entry 1181; CHECK-NEXT: ld r3, 8(r3) 1182; CHECK-NEXT: extsh r3, r3 1183; CHECK-NEXT: blr 1184entry: 1185 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1186 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1187 %conv = trunc i64 %0 to i16 1188 ret i16 %conv 1189} 1190 1191; Function Attrs: nofree norecurse nounwind uwtable willreturn 1192define dso_local signext i16 @ld_align32_int16_t_uint64_t(ptr nocapture readonly %ptr) { 1193; CHECK-P10-LABEL: ld_align32_int16_t_uint64_t: 1194; CHECK-P10: # %bb.0: # %entry 1195; CHECK-P10-NEXT: pld r3, 99999000(r3), 0 1196; CHECK-P10-NEXT: extsh r3, r3 1197; CHECK-P10-NEXT: blr 1198; 1199; CHECK-PREP10-LABEL: ld_align32_int16_t_uint64_t: 1200; CHECK-PREP10: # %bb.0: # %entry 1201; CHECK-PREP10-NEXT: lis r4, 1525 1202; CHECK-PREP10-NEXT: ori r4, r4, 56600 1203; CHECK-PREP10-NEXT: ldx r3, r3, r4 1204; CHECK-PREP10-NEXT: extsh r3, r3 1205; CHECK-PREP10-NEXT: blr 1206entry: 1207 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 1208 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1209 %conv = trunc i64 %0 to i16 1210 ret i16 %conv 1211} 1212 1213; Function Attrs: nofree norecurse nounwind uwtable willreturn 1214define dso_local signext i16 @ld_align64_int16_t_uint64_t(ptr nocapture readonly %ptr) { 1215; CHECK-P10-LABEL: ld_align64_int16_t_uint64_t: 1216; CHECK-P10: # %bb.0: # %entry 1217; CHECK-P10-NEXT: pli r4, 244140625 1218; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1219; CHECK-P10-NEXT: ldx r3, r3, r4 1220; CHECK-P10-NEXT: extsh r3, r3 1221; CHECK-P10-NEXT: blr 1222; 1223; CHECK-PREP10-LABEL: ld_align64_int16_t_uint64_t: 1224; CHECK-PREP10: # %bb.0: # %entry 1225; CHECK-PREP10-NEXT: lis r4, 3725 1226; CHECK-PREP10-NEXT: ori r4, r4, 19025 1227; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1228; CHECK-PREP10-NEXT: ldx r3, r3, r4 1229; CHECK-PREP10-NEXT: extsh r3, r3 1230; CHECK-PREP10-NEXT: blr 1231entry: 1232 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 1233 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1234 %conv = trunc i64 %0 to i16 1235 ret i16 %conv 1236} 1237 1238; Function Attrs: nofree norecurse nounwind uwtable willreturn 1239define dso_local signext i16 @ld_reg_int16_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) { 1240; CHECK-LABEL: ld_reg_int16_t_uint64_t: 1241; CHECK: # %bb.0: # %entry 1242; CHECK-NEXT: ldx r3, r3, r4 1243; CHECK-NEXT: extsh r3, r3 1244; CHECK-NEXT: blr 1245entry: 1246 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 1247 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 1248 %conv = trunc i64 %0 to i16 1249 ret i16 %conv 1250} 1251 1252; Function Attrs: nofree norecurse nounwind uwtable willreturn 1253define dso_local signext i16 @ld_or_int16_t_uint64_t(i64 %ptr, i8 zeroext %off) { 1254; CHECK-LABEL: ld_or_int16_t_uint64_t: 1255; CHECK: # %bb.0: # %entry 1256; CHECK-NEXT: or r3, r4, r3 1257; CHECK-NEXT: ld r3, 0(r3) 1258; CHECK-NEXT: extsh r3, r3 1259; CHECK-NEXT: blr 1260entry: 1261 %conv = zext i8 %off to i64 1262 %or = or i64 %conv, %ptr 1263 %0 = inttoptr i64 %or to ptr 1264 %1 = load atomic i64, ptr %0 monotonic, align 8 1265 %conv1 = trunc i64 %1 to i16 1266 ret i16 %conv1 1267} 1268 1269; Function Attrs: nofree norecurse nounwind uwtable willreturn 1270define dso_local signext i16 @ld_not_disjoint16_int16_t_uint64_t(i64 %ptr) { 1271; CHECK-LABEL: ld_not_disjoint16_int16_t_uint64_t: 1272; CHECK: # %bb.0: # %entry 1273; CHECK-NEXT: ori r3, r3, 6 1274; CHECK-NEXT: ld r3, 0(r3) 1275; CHECK-NEXT: extsh r3, r3 1276; CHECK-NEXT: blr 1277entry: 1278 %or = or i64 %ptr, 6 1279 %0 = inttoptr i64 %or to ptr 1280 %1 = load atomic i64, ptr %0 monotonic, align 8 1281 %conv = trunc i64 %1 to i16 1282 ret i16 %conv 1283} 1284 1285; Function Attrs: nofree norecurse nounwind uwtable willreturn 1286define dso_local signext i16 @ld_disjoint_align16_int16_t_uint64_t(i64 %ptr) { 1287; CHECK-LABEL: ld_disjoint_align16_int16_t_uint64_t: 1288; CHECK: # %bb.0: # %entry 1289; CHECK-NEXT: rldicr r3, r3, 0, 51 1290; CHECK-NEXT: ld r3, 24(r3) 1291; CHECK-NEXT: extsh r3, r3 1292; CHECK-NEXT: blr 1293entry: 1294 %and = and i64 %ptr, -4096 1295 %or = or i64 %and, 24 1296 %0 = inttoptr i64 %or to ptr 1297 %1 = load atomic i64, ptr %0 monotonic, align 8 1298 %conv = trunc i64 %1 to i16 1299 ret i16 %conv 1300} 1301 1302; Function Attrs: nofree norecurse nounwind uwtable willreturn 1303define dso_local signext i16 @ld_not_disjoint32_int16_t_uint64_t(i64 %ptr) { 1304; CHECK-LABEL: ld_not_disjoint32_int16_t_uint64_t: 1305; CHECK: # %bb.0: # %entry 1306; CHECK-NEXT: ori r3, r3, 34463 1307; CHECK-NEXT: oris r3, r3, 1 1308; CHECK-NEXT: ld r3, 0(r3) 1309; CHECK-NEXT: extsh r3, r3 1310; CHECK-NEXT: blr 1311entry: 1312 %or = or i64 %ptr, 99999 1313 %0 = inttoptr i64 %or to ptr 1314 %1 = load atomic i64, ptr %0 monotonic, align 8 1315 %conv = trunc i64 %1 to i16 1316 ret i16 %conv 1317} 1318 1319; Function Attrs: nofree norecurse nounwind uwtable willreturn 1320define dso_local signext i16 @ld_disjoint_align32_int16_t_uint64_t(i64 %ptr) { 1321; CHECK-P10-LABEL: ld_disjoint_align32_int16_t_uint64_t: 1322; CHECK-P10: # %bb.0: # %entry 1323; CHECK-P10-NEXT: lis r4, -15264 1324; CHECK-P10-NEXT: and r3, r3, r4 1325; CHECK-P10-NEXT: pld r3, 999990000(r3), 0 1326; CHECK-P10-NEXT: extsh r3, r3 1327; CHECK-P10-NEXT: blr 1328; 1329; CHECK-PREP10-LABEL: ld_disjoint_align32_int16_t_uint64_t: 1330; CHECK-PREP10: # %bb.0: # %entry 1331; CHECK-PREP10-NEXT: lis r4, -15264 1332; CHECK-PREP10-NEXT: and r3, r3, r4 1333; CHECK-PREP10-NEXT: lis r4, 15258 1334; CHECK-PREP10-NEXT: ori r4, r4, 41712 1335; CHECK-PREP10-NEXT: ldx r3, r3, r4 1336; CHECK-PREP10-NEXT: extsh r3, r3 1337; CHECK-PREP10-NEXT: blr 1338entry: 1339 %and = and i64 %ptr, -1000341504 1340 %or = or i64 %and, 999990000 1341 %0 = inttoptr i64 %or to ptr 1342 %1 = load atomic i64, ptr %0 monotonic, align 16 1343 %conv = trunc i64 %1 to i16 1344 ret i16 %conv 1345} 1346 1347; Function Attrs: nofree norecurse nounwind uwtable willreturn 1348define dso_local signext i16 @ld_not_disjoint64_int16_t_uint64_t(i64 %ptr) { 1349; CHECK-P10-LABEL: ld_not_disjoint64_int16_t_uint64_t: 1350; CHECK-P10: # %bb.0: # %entry 1351; CHECK-P10-NEXT: pli r4, 232 1352; CHECK-P10-NEXT: pli r5, 3567587329 1353; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1354; CHECK-P10-NEXT: or r3, r3, r5 1355; CHECK-P10-NEXT: ld r3, 0(r3) 1356; CHECK-P10-NEXT: extsh r3, r3 1357; CHECK-P10-NEXT: blr 1358; 1359; CHECK-PREP10-LABEL: ld_not_disjoint64_int16_t_uint64_t: 1360; CHECK-PREP10: # %bb.0: # %entry 1361; CHECK-PREP10-NEXT: li r4, 29 1362; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1363; CHECK-PREP10-NEXT: oris r4, r4, 54437 1364; CHECK-PREP10-NEXT: ori r4, r4, 4097 1365; CHECK-PREP10-NEXT: or r3, r3, r4 1366; CHECK-PREP10-NEXT: ld r3, 0(r3) 1367; CHECK-PREP10-NEXT: extsh r3, r3 1368; CHECK-PREP10-NEXT: blr 1369entry: 1370 %or = or i64 %ptr, 1000000000001 1371 %0 = inttoptr i64 %or to ptr 1372 %1 = load atomic i64, ptr %0 monotonic, align 8 1373 %conv = trunc i64 %1 to i16 1374 ret i16 %conv 1375} 1376 1377; Function Attrs: nofree norecurse nounwind uwtable willreturn 1378define dso_local signext i16 @ld_disjoint_align64_int16_t_uint64_t(i64 %ptr) { 1379; CHECK-P10-LABEL: ld_disjoint_align64_int16_t_uint64_t: 1380; CHECK-P10: # %bb.0: # %entry 1381; CHECK-P10-NEXT: pli r4, 244140625 1382; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1383; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1384; CHECK-P10-NEXT: ldx r3, r3, r4 1385; CHECK-P10-NEXT: extsh r3, r3 1386; CHECK-P10-NEXT: blr 1387; 1388; CHECK-PREP10-LABEL: ld_disjoint_align64_int16_t_uint64_t: 1389; CHECK-PREP10: # %bb.0: # %entry 1390; CHECK-PREP10-NEXT: lis r4, 3725 1391; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1392; CHECK-PREP10-NEXT: ori r4, r4, 19025 1393; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1394; CHECK-PREP10-NEXT: ldx r3, r3, r4 1395; CHECK-PREP10-NEXT: extsh r3, r3 1396; CHECK-PREP10-NEXT: blr 1397entry: 1398 %and = and i64 %ptr, -1099511627776 1399 %or = or i64 %and, 1000000000000 1400 %0 = inttoptr i64 %or to ptr 1401 %1 = load atomic i64, ptr %0 monotonic, align 4096 1402 %conv = trunc i64 %1 to i16 1403 ret i16 %conv 1404} 1405 1406; Function Attrs: nofree norecurse nounwind uwtable willreturn 1407define dso_local signext i16 @ld_cst_align16_int16_t_uint64_t() { 1408; CHECK-LABEL: ld_cst_align16_int16_t_uint64_t: 1409; CHECK: # %bb.0: # %entry 1410; CHECK-NEXT: ld r3, 4080(0) 1411; CHECK-NEXT: extsh r3, r3 1412; CHECK-NEXT: blr 1413entry: 1414 %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1415 %conv = trunc i64 %0 to i16 1416 ret i16 %conv 1417} 1418 1419; Function Attrs: nofree norecurse nounwind uwtable willreturn 1420define dso_local signext i16 @ld_cst_align32_int16_t_uint64_t() { 1421; CHECK-LABEL: ld_cst_align32_int16_t_uint64_t: 1422; CHECK: # %bb.0: # %entry 1423; CHECK-NEXT: lis r3, 153 1424; CHECK-NEXT: ld r3, -27108(r3) 1425; CHECK-NEXT: extsh r3, r3 1426; CHECK-NEXT: blr 1427entry: 1428 %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 1429 %conv = trunc i64 %0 to i16 1430 ret i16 %conv 1431} 1432 1433; Function Attrs: nofree norecurse nounwind uwtable willreturn 1434define dso_local signext i16 @ld_cst_align64_int16_t_uint64_t() { 1435; CHECK-P10-LABEL: ld_cst_align64_int16_t_uint64_t: 1436; CHECK-P10: # %bb.0: # %entry 1437; CHECK-P10-NEXT: pli r3, 244140625 1438; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1439; CHECK-P10-NEXT: ld r3, 0(r3) 1440; CHECK-P10-NEXT: extsh r3, r3 1441; CHECK-P10-NEXT: blr 1442; 1443; CHECK-PREP10-LABEL: ld_cst_align64_int16_t_uint64_t: 1444; CHECK-PREP10: # %bb.0: # %entry 1445; CHECK-PREP10-NEXT: lis r3, 3725 1446; CHECK-PREP10-NEXT: ori r3, r3, 19025 1447; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1448; CHECK-PREP10-NEXT: ld r3, 0(r3) 1449; CHECK-PREP10-NEXT: extsh r3, r3 1450; CHECK-PREP10-NEXT: blr 1451entry: 1452 %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1453 %conv = trunc i64 %0 to i16 1454 ret i16 %conv 1455} 1456 1457; Function Attrs: nofree norecurse nounwind uwtable willreturn 1458define dso_local zeroext i16 @ld_0_uint16_t_uint8_t(i64 %ptr) { 1459; CHECK-LABEL: ld_0_uint16_t_uint8_t: 1460; CHECK: # %bb.0: # %entry 1461; CHECK-NEXT: lbz r3, 0(r3) 1462; CHECK-NEXT: blr 1463entry: 1464 %0 = inttoptr i64 %ptr to ptr 1465 %1 = load atomic i8, ptr %0 monotonic, align 1 1466 %conv = zext i8 %1 to i16 1467 ret i16 %conv 1468} 1469 1470; Function Attrs: nofree norecurse nounwind uwtable willreturn 1471define dso_local zeroext i16 @ld_align16_uint16_t_uint8_t(ptr nocapture readonly %ptr) { 1472; CHECK-LABEL: ld_align16_uint16_t_uint8_t: 1473; CHECK: # %bb.0: # %entry 1474; CHECK-NEXT: lbz r3, 8(r3) 1475; CHECK-NEXT: blr 1476entry: 1477 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1478 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1479 %conv = zext i8 %0 to i16 1480 ret i16 %conv 1481} 1482 1483; Function Attrs: nofree norecurse nounwind uwtable willreturn 1484define dso_local zeroext i16 @ld_align32_uint16_t_uint8_t(ptr nocapture readonly %ptr) { 1485; CHECK-P10-LABEL: ld_align32_uint16_t_uint8_t: 1486; CHECK-P10: # %bb.0: # %entry 1487; CHECK-P10-NEXT: plbz r3, 99999000(r3), 0 1488; CHECK-P10-NEXT: clrldi r3, r3, 32 1489; CHECK-P10-NEXT: blr 1490; 1491; CHECK-PREP10-LABEL: ld_align32_uint16_t_uint8_t: 1492; CHECK-PREP10: # %bb.0: # %entry 1493; CHECK-PREP10-NEXT: lis r4, 1525 1494; CHECK-PREP10-NEXT: ori r4, r4, 56600 1495; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1496; CHECK-PREP10-NEXT: blr 1497entry: 1498 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 1499 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1500 %conv = zext i8 %0 to i16 1501 ret i16 %conv 1502} 1503 1504; Function Attrs: nofree norecurse nounwind uwtable willreturn 1505define dso_local zeroext i16 @ld_align64_uint16_t_uint8_t(ptr nocapture readonly %ptr) { 1506; CHECK-P10-LABEL: ld_align64_uint16_t_uint8_t: 1507; CHECK-P10: # %bb.0: # %entry 1508; CHECK-P10-NEXT: pli r4, 244140625 1509; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1510; CHECK-P10-NEXT: lbzx r3, r3, r4 1511; CHECK-P10-NEXT: blr 1512; 1513; CHECK-PREP10-LABEL: ld_align64_uint16_t_uint8_t: 1514; CHECK-PREP10: # %bb.0: # %entry 1515; CHECK-PREP10-NEXT: lis r4, 3725 1516; CHECK-PREP10-NEXT: ori r4, r4, 19025 1517; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1518; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1519; CHECK-PREP10-NEXT: blr 1520entry: 1521 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 1522 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1523 %conv = zext i8 %0 to i16 1524 ret i16 %conv 1525} 1526 1527; Function Attrs: nofree norecurse nounwind uwtable willreturn 1528define dso_local zeroext i16 @ld_reg_uint16_t_uint8_t(ptr nocapture readonly %ptr, i64 %off) { 1529; CHECK-LABEL: ld_reg_uint16_t_uint8_t: 1530; CHECK: # %bb.0: # %entry 1531; CHECK-NEXT: lbzx r3, r3, r4 1532; CHECK-NEXT: blr 1533entry: 1534 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 1535 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1536 %conv = zext i8 %0 to i16 1537 ret i16 %conv 1538} 1539 1540; Function Attrs: nofree norecurse nounwind uwtable willreturn 1541define dso_local zeroext i16 @ld_or_uint16_t_uint8_t(i64 %ptr, i8 zeroext %off) { 1542; CHECK-LABEL: ld_or_uint16_t_uint8_t: 1543; CHECK: # %bb.0: # %entry 1544; CHECK-NEXT: or r3, r4, r3 1545; CHECK-NEXT: lbz r3, 0(r3) 1546; CHECK-NEXT: blr 1547entry: 1548 %conv = zext i8 %off to i64 1549 %or = or i64 %conv, %ptr 1550 %0 = inttoptr i64 %or to ptr 1551 %1 = load atomic i8, ptr %0 monotonic, align 1 1552 %conv1 = zext i8 %1 to i16 1553 ret i16 %conv1 1554} 1555 1556; Function Attrs: nofree norecurse nounwind uwtable willreturn 1557define dso_local zeroext i16 @ld_not_disjoint16_uint16_t_uint8_t(i64 %ptr) { 1558; CHECK-LABEL: ld_not_disjoint16_uint16_t_uint8_t: 1559; CHECK: # %bb.0: # %entry 1560; CHECK-NEXT: ori r3, r3, 6 1561; CHECK-NEXT: lbz r3, 0(r3) 1562; CHECK-NEXT: blr 1563entry: 1564 %or = or i64 %ptr, 6 1565 %0 = inttoptr i64 %or to ptr 1566 %1 = load atomic i8, ptr %0 monotonic, align 1 1567 %conv = zext i8 %1 to i16 1568 ret i16 %conv 1569} 1570 1571; Function Attrs: nofree norecurse nounwind uwtable willreturn 1572define dso_local zeroext i16 @ld_disjoint_align16_uint16_t_uint8_t(i64 %ptr) { 1573; CHECK-LABEL: ld_disjoint_align16_uint16_t_uint8_t: 1574; CHECK: # %bb.0: # %entry 1575; CHECK-NEXT: rldicr r3, r3, 0, 51 1576; CHECK-NEXT: lbz r3, 24(r3) 1577; CHECK-NEXT: blr 1578entry: 1579 %and = and i64 %ptr, -4096 1580 %or = or i64 %and, 24 1581 %0 = inttoptr i64 %or to ptr 1582 %1 = load atomic i8, ptr %0 monotonic, align 8 1583 %conv = zext i8 %1 to i16 1584 ret i16 %conv 1585} 1586 1587; Function Attrs: nofree norecurse nounwind uwtable willreturn 1588define dso_local zeroext i16 @ld_not_disjoint32_uint16_t_uint8_t(i64 %ptr) { 1589; CHECK-LABEL: ld_not_disjoint32_uint16_t_uint8_t: 1590; CHECK: # %bb.0: # %entry 1591; CHECK-NEXT: ori r3, r3, 34463 1592; CHECK-NEXT: oris r3, r3, 1 1593; CHECK-NEXT: lbz r3, 0(r3) 1594; CHECK-NEXT: blr 1595entry: 1596 %or = or i64 %ptr, 99999 1597 %0 = inttoptr i64 %or to ptr 1598 %1 = load atomic i8, ptr %0 monotonic, align 1 1599 %conv = zext i8 %1 to i16 1600 ret i16 %conv 1601} 1602 1603; Function Attrs: nofree norecurse nounwind uwtable willreturn 1604define dso_local zeroext i16 @ld_disjoint_align32_uint16_t_uint8_t(i64 %ptr) { 1605; CHECK-P10-LABEL: ld_disjoint_align32_uint16_t_uint8_t: 1606; CHECK-P10: # %bb.0: # %entry 1607; CHECK-P10-NEXT: lis r4, -15264 1608; CHECK-P10-NEXT: and r3, r3, r4 1609; CHECK-P10-NEXT: plbz r3, 999990000(r3), 0 1610; CHECK-P10-NEXT: clrldi r3, r3, 32 1611; CHECK-P10-NEXT: blr 1612; 1613; CHECK-PREP10-LABEL: ld_disjoint_align32_uint16_t_uint8_t: 1614; CHECK-PREP10: # %bb.0: # %entry 1615; CHECK-PREP10-NEXT: lis r4, -15264 1616; CHECK-PREP10-NEXT: and r3, r3, r4 1617; CHECK-PREP10-NEXT: lis r4, 15258 1618; CHECK-PREP10-NEXT: ori r4, r4, 41712 1619; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1620; CHECK-PREP10-NEXT: blr 1621entry: 1622 %and = and i64 %ptr, -1000341504 1623 %or = or i64 %and, 999990000 1624 %0 = inttoptr i64 %or to ptr 1625 %1 = load atomic i8, ptr %0 monotonic, align 16 1626 %conv = zext i8 %1 to i16 1627 ret i16 %conv 1628} 1629 1630; Function Attrs: nofree norecurse nounwind uwtable willreturn 1631define dso_local zeroext i16 @ld_not_disjoint64_uint16_t_uint8_t(i64 %ptr) { 1632; CHECK-P10-LABEL: ld_not_disjoint64_uint16_t_uint8_t: 1633; CHECK-P10: # %bb.0: # %entry 1634; CHECK-P10-NEXT: pli r4, 232 1635; CHECK-P10-NEXT: pli r5, 3567587329 1636; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1637; CHECK-P10-NEXT: or r3, r3, r5 1638; CHECK-P10-NEXT: lbz r3, 0(r3) 1639; CHECK-P10-NEXT: blr 1640; 1641; CHECK-PREP10-LABEL: ld_not_disjoint64_uint16_t_uint8_t: 1642; CHECK-PREP10: # %bb.0: # %entry 1643; CHECK-PREP10-NEXT: li r4, 29 1644; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1645; CHECK-PREP10-NEXT: oris r4, r4, 54437 1646; CHECK-PREP10-NEXT: ori r4, r4, 4097 1647; CHECK-PREP10-NEXT: or r3, r3, r4 1648; CHECK-PREP10-NEXT: lbz r3, 0(r3) 1649; CHECK-PREP10-NEXT: blr 1650entry: 1651 %or = or i64 %ptr, 1000000000001 1652 %0 = inttoptr i64 %or to ptr 1653 %1 = load atomic i8, ptr %0 monotonic, align 1 1654 %conv = zext i8 %1 to i16 1655 ret i16 %conv 1656} 1657 1658; Function Attrs: nofree norecurse nounwind uwtable willreturn 1659define dso_local zeroext i16 @ld_disjoint_align64_uint16_t_uint8_t(i64 %ptr) { 1660; CHECK-P10-LABEL: ld_disjoint_align64_uint16_t_uint8_t: 1661; CHECK-P10: # %bb.0: # %entry 1662; CHECK-P10-NEXT: pli r4, 244140625 1663; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1664; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1665; CHECK-P10-NEXT: lbzx r3, r3, r4 1666; CHECK-P10-NEXT: blr 1667; 1668; CHECK-PREP10-LABEL: ld_disjoint_align64_uint16_t_uint8_t: 1669; CHECK-PREP10: # %bb.0: # %entry 1670; CHECK-PREP10-NEXT: lis r4, 3725 1671; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1672; CHECK-PREP10-NEXT: ori r4, r4, 19025 1673; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1674; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1675; CHECK-PREP10-NEXT: blr 1676entry: 1677 %and = and i64 %ptr, -1099511627776 1678 %or = or i64 %and, 1000000000000 1679 %0 = inttoptr i64 %or to ptr 1680 %1 = load atomic i8, ptr %0 monotonic, align 4096 1681 %conv = zext i8 %1 to i16 1682 ret i16 %conv 1683} 1684 1685; Function Attrs: nofree norecurse nounwind uwtable willreturn 1686define dso_local zeroext i16 @ld_cst_align16_uint16_t_uint8_t() { 1687; CHECK-LABEL: ld_cst_align16_uint16_t_uint8_t: 1688; CHECK: # %bb.0: # %entry 1689; CHECK-NEXT: lbz r3, 4080(0) 1690; CHECK-NEXT: blr 1691entry: 1692 %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 1693 %conv = zext i8 %0 to i16 1694 ret i16 %conv 1695} 1696 1697; Function Attrs: nofree norecurse nounwind uwtable willreturn 1698define dso_local zeroext i16 @ld_cst_align32_uint16_t_uint8_t() { 1699; CHECK-LABEL: ld_cst_align32_uint16_t_uint8_t: 1700; CHECK: # %bb.0: # %entry 1701; CHECK-NEXT: lis r3, 153 1702; CHECK-NEXT: lbz r3, -27108(r3) 1703; CHECK-NEXT: blr 1704entry: 1705 %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 1706 %conv = zext i8 %0 to i16 1707 ret i16 %conv 1708} 1709 1710; Function Attrs: nofree norecurse nounwind uwtable willreturn 1711define dso_local zeroext i16 @ld_cst_align64_uint16_t_uint8_t() { 1712; CHECK-P10-LABEL: ld_cst_align64_uint16_t_uint8_t: 1713; CHECK-P10: # %bb.0: # %entry 1714; CHECK-P10-NEXT: pli r3, 244140625 1715; CHECK-P10-NEXT: rldic r3, r3, 12, 24 1716; CHECK-P10-NEXT: lbz r3, 0(r3) 1717; CHECK-P10-NEXT: blr 1718; 1719; CHECK-PREP10-LABEL: ld_cst_align64_uint16_t_uint8_t: 1720; CHECK-PREP10: # %bb.0: # %entry 1721; CHECK-PREP10-NEXT: lis r3, 3725 1722; CHECK-PREP10-NEXT: ori r3, r3, 19025 1723; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 1724; CHECK-PREP10-NEXT: lbz r3, 0(r3) 1725; CHECK-PREP10-NEXT: blr 1726entry: 1727 %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 1728 %conv = zext i8 %0 to i16 1729 ret i16 %conv 1730} 1731 1732; Function Attrs: nofree norecurse nounwind uwtable willreturn 1733define dso_local zeroext i16 @ld_0_uint16_t_int8_t(i64 %ptr) { 1734; CHECK-LABEL: ld_0_uint16_t_int8_t: 1735; CHECK: # %bb.0: # %entry 1736; CHECK-NEXT: lbz r3, 0(r3) 1737; CHECK-NEXT: extsb r3, r3 1738; CHECK-NEXT: clrldi r3, r3, 48 1739; CHECK-NEXT: blr 1740entry: 1741 %0 = inttoptr i64 %ptr to ptr 1742 %1 = load atomic i8, ptr %0 monotonic, align 1 1743 %conv = sext i8 %1 to i16 1744 ret i16 %conv 1745} 1746 1747; Function Attrs: nofree norecurse nounwind uwtable willreturn 1748define dso_local zeroext i16 @ld_align16_uint16_t_int8_t(ptr nocapture readonly %ptr) { 1749; CHECK-LABEL: ld_align16_uint16_t_int8_t: 1750; CHECK: # %bb.0: # %entry 1751; CHECK-NEXT: lbz r3, 8(r3) 1752; CHECK-NEXT: extsb r3, r3 1753; CHECK-NEXT: clrldi r3, r3, 48 1754; CHECK-NEXT: blr 1755entry: 1756 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 1757 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1758 %conv = sext i8 %0 to i16 1759 ret i16 %conv 1760} 1761 1762; Function Attrs: nofree norecurse nounwind uwtable willreturn 1763define dso_local zeroext i16 @ld_align32_uint16_t_int8_t(ptr nocapture readonly %ptr) { 1764; CHECK-P10-LABEL: ld_align32_uint16_t_int8_t: 1765; CHECK-P10: # %bb.0: # %entry 1766; CHECK-P10-NEXT: plbz r3, 99999000(r3), 0 1767; CHECK-P10-NEXT: extsb r3, r3 1768; CHECK-P10-NEXT: clrldi r3, r3, 48 1769; CHECK-P10-NEXT: blr 1770; 1771; CHECK-PREP10-LABEL: ld_align32_uint16_t_int8_t: 1772; CHECK-PREP10: # %bb.0: # %entry 1773; CHECK-PREP10-NEXT: lis r4, 1525 1774; CHECK-PREP10-NEXT: ori r4, r4, 56600 1775; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1776; CHECK-PREP10-NEXT: extsb r3, r3 1777; CHECK-PREP10-NEXT: clrldi r3, r3, 48 1778; CHECK-PREP10-NEXT: blr 1779entry: 1780 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 1781 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1782 %conv = sext i8 %0 to i16 1783 ret i16 %conv 1784} 1785 1786; Function Attrs: nofree norecurse nounwind uwtable willreturn 1787define dso_local zeroext i16 @ld_align64_uint16_t_int8_t(ptr nocapture readonly %ptr) { 1788; CHECK-P10-LABEL: ld_align64_uint16_t_int8_t: 1789; CHECK-P10: # %bb.0: # %entry 1790; CHECK-P10-NEXT: pli r4, 244140625 1791; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1792; CHECK-P10-NEXT: lbzx r3, r3, r4 1793; CHECK-P10-NEXT: extsb r3, r3 1794; CHECK-P10-NEXT: clrldi r3, r3, 48 1795; CHECK-P10-NEXT: blr 1796; 1797; CHECK-PREP10-LABEL: ld_align64_uint16_t_int8_t: 1798; CHECK-PREP10: # %bb.0: # %entry 1799; CHECK-PREP10-NEXT: lis r4, 3725 1800; CHECK-PREP10-NEXT: ori r4, r4, 19025 1801; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1802; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1803; CHECK-PREP10-NEXT: extsb r3, r3 1804; CHECK-PREP10-NEXT: clrldi r3, r3, 48 1805; CHECK-PREP10-NEXT: blr 1806entry: 1807 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 1808 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1809 %conv = sext i8 %0 to i16 1810 ret i16 %conv 1811} 1812 1813; Function Attrs: nofree norecurse nounwind uwtable willreturn 1814define dso_local zeroext i16 @ld_reg_uint16_t_int8_t(ptr nocapture readonly %ptr, i64 %off) { 1815; CHECK-LABEL: ld_reg_uint16_t_int8_t: 1816; CHECK: # %bb.0: # %entry 1817; CHECK-NEXT: lbzx r3, r3, r4 1818; CHECK-NEXT: extsb r3, r3 1819; CHECK-NEXT: clrldi r3, r3, 48 1820; CHECK-NEXT: blr 1821entry: 1822 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 1823 %0 = load atomic i8, ptr %add.ptr monotonic, align 1 1824 %conv = sext i8 %0 to i16 1825 ret i16 %conv 1826} 1827 1828; Function Attrs: nofree norecurse nounwind uwtable willreturn 1829define dso_local zeroext i16 @ld_or_uint16_t_int8_t(i64 %ptr, i8 zeroext %off) { 1830; CHECK-LABEL: ld_or_uint16_t_int8_t: 1831; CHECK: # %bb.0: # %entry 1832; CHECK-NEXT: or r3, r4, r3 1833; CHECK-NEXT: lbz r3, 0(r3) 1834; CHECK-NEXT: extsb r3, r3 1835; CHECK-NEXT: clrldi r3, r3, 48 1836; CHECK-NEXT: blr 1837entry: 1838 %conv = zext i8 %off to i64 1839 %or = or i64 %conv, %ptr 1840 %0 = inttoptr i64 %or to ptr 1841 %1 = load atomic i8, ptr %0 monotonic, align 1 1842 %conv1 = sext i8 %1 to i16 1843 ret i16 %conv1 1844} 1845 1846; Function Attrs: nofree norecurse nounwind uwtable willreturn 1847define dso_local zeroext i16 @ld_not_disjoint16_uint16_t_int8_t(i64 %ptr) { 1848; CHECK-LABEL: ld_not_disjoint16_uint16_t_int8_t: 1849; CHECK: # %bb.0: # %entry 1850; CHECK-NEXT: ori r3, r3, 6 1851; CHECK-NEXT: lbz r3, 0(r3) 1852; CHECK-NEXT: extsb r3, r3 1853; CHECK-NEXT: clrldi r3, r3, 48 1854; CHECK-NEXT: blr 1855entry: 1856 %or = or i64 %ptr, 6 1857 %0 = inttoptr i64 %or to ptr 1858 %1 = load atomic i8, ptr %0 monotonic, align 1 1859 %conv = sext i8 %1 to i16 1860 ret i16 %conv 1861} 1862 1863; Function Attrs: nofree norecurse nounwind uwtable willreturn 1864define dso_local zeroext i16 @ld_disjoint_align16_uint16_t_int8_t(i64 %ptr) { 1865; CHECK-LABEL: ld_disjoint_align16_uint16_t_int8_t: 1866; CHECK: # %bb.0: # %entry 1867; CHECK-NEXT: rldicr r3, r3, 0, 51 1868; CHECK-NEXT: lbz r3, 24(r3) 1869; CHECK-NEXT: extsb r3, r3 1870; CHECK-NEXT: clrldi r3, r3, 48 1871; CHECK-NEXT: blr 1872entry: 1873 %and = and i64 %ptr, -4096 1874 %or = or i64 %and, 24 1875 %0 = inttoptr i64 %or to ptr 1876 %1 = load atomic i8, ptr %0 monotonic, align 8 1877 %conv = sext i8 %1 to i16 1878 ret i16 %conv 1879} 1880 1881; Function Attrs: nofree norecurse nounwind uwtable willreturn 1882define dso_local zeroext i16 @ld_not_disjoint32_uint16_t_int8_t(i64 %ptr) { 1883; CHECK-LABEL: ld_not_disjoint32_uint16_t_int8_t: 1884; CHECK: # %bb.0: # %entry 1885; CHECK-NEXT: ori r3, r3, 34463 1886; CHECK-NEXT: oris r3, r3, 1 1887; CHECK-NEXT: lbz r3, 0(r3) 1888; CHECK-NEXT: extsb r3, r3 1889; CHECK-NEXT: clrldi r3, r3, 48 1890; CHECK-NEXT: blr 1891entry: 1892 %or = or i64 %ptr, 99999 1893 %0 = inttoptr i64 %or to ptr 1894 %1 = load atomic i8, ptr %0 monotonic, align 1 1895 %conv = sext i8 %1 to i16 1896 ret i16 %conv 1897} 1898 1899; Function Attrs: nofree norecurse nounwind uwtable willreturn 1900define dso_local zeroext i16 @ld_disjoint_align32_uint16_t_int8_t(i64 %ptr) { 1901; CHECK-P10-LABEL: ld_disjoint_align32_uint16_t_int8_t: 1902; CHECK-P10: # %bb.0: # %entry 1903; CHECK-P10-NEXT: lis r4, -15264 1904; CHECK-P10-NEXT: and r3, r3, r4 1905; CHECK-P10-NEXT: plbz r3, 999990000(r3), 0 1906; CHECK-P10-NEXT: extsb r3, r3 1907; CHECK-P10-NEXT: clrldi r3, r3, 48 1908; CHECK-P10-NEXT: blr 1909; 1910; CHECK-PREP10-LABEL: ld_disjoint_align32_uint16_t_int8_t: 1911; CHECK-PREP10: # %bb.0: # %entry 1912; CHECK-PREP10-NEXT: lis r4, -15264 1913; CHECK-PREP10-NEXT: and r3, r3, r4 1914; CHECK-PREP10-NEXT: lis r4, 15258 1915; CHECK-PREP10-NEXT: ori r4, r4, 41712 1916; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1917; CHECK-PREP10-NEXT: extsb r3, r3 1918; CHECK-PREP10-NEXT: clrldi r3, r3, 48 1919; CHECK-PREP10-NEXT: blr 1920entry: 1921 %and = and i64 %ptr, -1000341504 1922 %or = or i64 %and, 999990000 1923 %0 = inttoptr i64 %or to ptr 1924 %1 = load atomic i8, ptr %0 monotonic, align 16 1925 %conv = sext i8 %1 to i16 1926 ret i16 %conv 1927} 1928 1929; Function Attrs: nofree norecurse nounwind uwtable willreturn 1930define dso_local zeroext i16 @ld_not_disjoint64_uint16_t_int8_t(i64 %ptr) { 1931; CHECK-P10-LABEL: ld_not_disjoint64_uint16_t_int8_t: 1932; CHECK-P10: # %bb.0: # %entry 1933; CHECK-P10-NEXT: pli r4, 232 1934; CHECK-P10-NEXT: pli r5, 3567587329 1935; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 1936; CHECK-P10-NEXT: or r3, r3, r5 1937; CHECK-P10-NEXT: lbz r3, 0(r3) 1938; CHECK-P10-NEXT: extsb r3, r3 1939; CHECK-P10-NEXT: clrldi r3, r3, 48 1940; CHECK-P10-NEXT: blr 1941; 1942; CHECK-PREP10-LABEL: ld_not_disjoint64_uint16_t_int8_t: 1943; CHECK-PREP10: # %bb.0: # %entry 1944; CHECK-PREP10-NEXT: li r4, 29 1945; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 1946; CHECK-PREP10-NEXT: oris r4, r4, 54437 1947; CHECK-PREP10-NEXT: ori r4, r4, 4097 1948; CHECK-PREP10-NEXT: or r3, r3, r4 1949; CHECK-PREP10-NEXT: lbz r3, 0(r3) 1950; CHECK-PREP10-NEXT: extsb r3, r3 1951; CHECK-PREP10-NEXT: clrldi r3, r3, 48 1952; CHECK-PREP10-NEXT: blr 1953entry: 1954 %or = or i64 %ptr, 1000000000001 1955 %0 = inttoptr i64 %or to ptr 1956 %1 = load atomic i8, ptr %0 monotonic, align 1 1957 %conv = sext i8 %1 to i16 1958 ret i16 %conv 1959} 1960 1961; Function Attrs: nofree norecurse nounwind uwtable willreturn 1962define dso_local zeroext i16 @ld_disjoint_align64_uint16_t_int8_t(i64 %ptr) { 1963; CHECK-P10-LABEL: ld_disjoint_align64_uint16_t_int8_t: 1964; CHECK-P10: # %bb.0: # %entry 1965; CHECK-P10-NEXT: pli r4, 244140625 1966; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 1967; CHECK-P10-NEXT: rldic r4, r4, 12, 24 1968; CHECK-P10-NEXT: lbzx r3, r3, r4 1969; CHECK-P10-NEXT: extsb r3, r3 1970; CHECK-P10-NEXT: clrldi r3, r3, 48 1971; CHECK-P10-NEXT: blr 1972; 1973; CHECK-PREP10-LABEL: ld_disjoint_align64_uint16_t_int8_t: 1974; CHECK-PREP10: # %bb.0: # %entry 1975; CHECK-PREP10-NEXT: lis r4, 3725 1976; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 1977; CHECK-PREP10-NEXT: ori r4, r4, 19025 1978; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 1979; CHECK-PREP10-NEXT: lbzx r3, r3, r4 1980; CHECK-PREP10-NEXT: extsb r3, r3 1981; CHECK-PREP10-NEXT: clrldi r3, r3, 48 1982; CHECK-PREP10-NEXT: blr 1983entry: 1984 %and = and i64 %ptr, -1099511627776 1985 %or = or i64 %and, 1000000000000 1986 %0 = inttoptr i64 %or to ptr 1987 %1 = load atomic i8, ptr %0 monotonic, align 4096 1988 %conv = sext i8 %1 to i16 1989 ret i16 %conv 1990} 1991 1992; Function Attrs: nofree norecurse nounwind uwtable willreturn 1993define dso_local zeroext i16 @ld_cst_align16_uint16_t_int8_t() { 1994; CHECK-LABEL: ld_cst_align16_uint16_t_int8_t: 1995; CHECK: # %bb.0: # %entry 1996; CHECK-NEXT: lbz r3, 4080(0) 1997; CHECK-NEXT: extsb r3, r3 1998; CHECK-NEXT: clrldi r3, r3, 48 1999; CHECK-NEXT: blr 2000entry: 2001 %0 = load atomic i8, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2002 %conv = sext i8 %0 to i16 2003 ret i16 %conv 2004} 2005 2006; Function Attrs: nofree norecurse nounwind uwtable willreturn 2007define dso_local zeroext i16 @ld_cst_align32_uint16_t_int8_t() { 2008; CHECK-LABEL: ld_cst_align32_uint16_t_int8_t: 2009; CHECK: # %bb.0: # %entry 2010; CHECK-NEXT: lis r3, 153 2011; CHECK-NEXT: lbz r3, -27108(r3) 2012; CHECK-NEXT: extsb r3, r3 2013; CHECK-NEXT: clrldi r3, r3, 48 2014; CHECK-NEXT: blr 2015entry: 2016 %0 = load atomic i8, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 2017 %conv = sext i8 %0 to i16 2018 ret i16 %conv 2019} 2020 2021; Function Attrs: nofree norecurse nounwind uwtable willreturn 2022define dso_local zeroext i16 @ld_cst_align64_uint16_t_int8_t() { 2023; CHECK-P10-LABEL: ld_cst_align64_uint16_t_int8_t: 2024; CHECK-P10: # %bb.0: # %entry 2025; CHECK-P10-NEXT: pli r3, 244140625 2026; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2027; CHECK-P10-NEXT: lbz r3, 0(r3) 2028; CHECK-P10-NEXT: extsb r3, r3 2029; CHECK-P10-NEXT: clrldi r3, r3, 48 2030; CHECK-P10-NEXT: blr 2031; 2032; CHECK-PREP10-LABEL: ld_cst_align64_uint16_t_int8_t: 2033; CHECK-PREP10: # %bb.0: # %entry 2034; CHECK-PREP10-NEXT: lis r3, 3725 2035; CHECK-PREP10-NEXT: ori r3, r3, 19025 2036; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2037; CHECK-PREP10-NEXT: lbz r3, 0(r3) 2038; CHECK-PREP10-NEXT: extsb r3, r3 2039; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2040; CHECK-PREP10-NEXT: blr 2041entry: 2042 %0 = load atomic i8, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2043 %conv = sext i8 %0 to i16 2044 ret i16 %conv 2045} 2046 2047; Function Attrs: nofree norecurse nounwind uwtable willreturn 2048define dso_local zeroext i16 @ld_0_uint16_t_uint16_t(i64 %ptr) { 2049; CHECK-LABEL: ld_0_uint16_t_uint16_t: 2050; CHECK: # %bb.0: # %entry 2051; CHECK-NEXT: lhz r3, 0(r3) 2052; CHECK-NEXT: blr 2053entry: 2054 %0 = inttoptr i64 %ptr to ptr 2055 %1 = load atomic i16, ptr %0 monotonic, align 2 2056 ret i16 %1 2057} 2058 2059; Function Attrs: nofree norecurse nounwind uwtable willreturn 2060define dso_local zeroext i16 @ld_align16_uint16_t_uint16_t(ptr nocapture readonly %ptr) { 2061; CHECK-LABEL: ld_align16_uint16_t_uint16_t: 2062; CHECK: # %bb.0: # %entry 2063; CHECK-NEXT: lhz r3, 8(r3) 2064; CHECK-NEXT: blr 2065entry: 2066 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2067 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2068 ret i16 %0 2069} 2070 2071; Function Attrs: nofree norecurse nounwind uwtable willreturn 2072define dso_local zeroext i16 @ld_align32_uint16_t_uint16_t(ptr nocapture readonly %ptr) { 2073; CHECK-P10-LABEL: ld_align32_uint16_t_uint16_t: 2074; CHECK-P10: # %bb.0: # %entry 2075; CHECK-P10-NEXT: plhz r3, 99999000(r3), 0 2076; CHECK-P10-NEXT: clrldi r3, r3, 32 2077; CHECK-P10-NEXT: blr 2078; 2079; CHECK-PREP10-LABEL: ld_align32_uint16_t_uint16_t: 2080; CHECK-PREP10: # %bb.0: # %entry 2081; CHECK-PREP10-NEXT: lis r4, 1525 2082; CHECK-PREP10-NEXT: ori r4, r4, 56600 2083; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2084; CHECK-PREP10-NEXT: blr 2085entry: 2086 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2087 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2088 ret i16 %0 2089} 2090 2091; Function Attrs: nofree norecurse nounwind uwtable willreturn 2092define dso_local zeroext i16 @ld_align64_uint16_t_uint16_t(ptr nocapture readonly %ptr) { 2093; CHECK-P10-LABEL: ld_align64_uint16_t_uint16_t: 2094; CHECK-P10: # %bb.0: # %entry 2095; CHECK-P10-NEXT: pli r4, 244140625 2096; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2097; CHECK-P10-NEXT: lhzx r3, r3, r4 2098; CHECK-P10-NEXT: blr 2099; 2100; CHECK-PREP10-LABEL: ld_align64_uint16_t_uint16_t: 2101; CHECK-PREP10: # %bb.0: # %entry 2102; CHECK-PREP10-NEXT: lis r4, 3725 2103; CHECK-PREP10-NEXT: ori r4, r4, 19025 2104; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2105; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2106; CHECK-PREP10-NEXT: blr 2107entry: 2108 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2109 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2110 ret i16 %0 2111} 2112 2113; Function Attrs: nofree norecurse nounwind uwtable willreturn 2114define dso_local zeroext i16 @ld_reg_uint16_t_uint16_t(ptr nocapture readonly %ptr, i64 %off) { 2115; CHECK-LABEL: ld_reg_uint16_t_uint16_t: 2116; CHECK: # %bb.0: # %entry 2117; CHECK-NEXT: lhzx r3, r3, r4 2118; CHECK-NEXT: blr 2119entry: 2120 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2121 %0 = load atomic i16, ptr %add.ptr monotonic, align 2 2122 ret i16 %0 2123} 2124 2125; Function Attrs: nofree norecurse nounwind uwtable willreturn 2126define dso_local zeroext i16 @ld_or_uint16_t_uint16_t(i64 %ptr, i8 zeroext %off) { 2127; CHECK-LABEL: ld_or_uint16_t_uint16_t: 2128; CHECK: # %bb.0: # %entry 2129; CHECK-NEXT: or r3, r4, r3 2130; CHECK-NEXT: lhz r3, 0(r3) 2131; CHECK-NEXT: blr 2132entry: 2133 %conv = zext i8 %off to i64 2134 %or = or i64 %conv, %ptr 2135 %0 = inttoptr i64 %or to ptr 2136 %1 = load atomic i16, ptr %0 monotonic, align 2 2137 ret i16 %1 2138} 2139 2140; Function Attrs: nofree norecurse nounwind uwtable willreturn 2141define dso_local zeroext i16 @ld_not_disjoint16_uint16_t_uint16_t(i64 %ptr) { 2142; CHECK-LABEL: ld_not_disjoint16_uint16_t_uint16_t: 2143; CHECK: # %bb.0: # %entry 2144; CHECK-NEXT: ori r3, r3, 6 2145; CHECK-NEXT: lhz r3, 0(r3) 2146; CHECK-NEXT: blr 2147entry: 2148 %or = or i64 %ptr, 6 2149 %0 = inttoptr i64 %or to ptr 2150 %1 = load atomic i16, ptr %0 monotonic, align 2 2151 ret i16 %1 2152} 2153 2154; Function Attrs: nofree norecurse nounwind uwtable willreturn 2155define dso_local zeroext i16 @ld_disjoint_align16_uint16_t_uint16_t(i64 %ptr) { 2156; CHECK-LABEL: ld_disjoint_align16_uint16_t_uint16_t: 2157; CHECK: # %bb.0: # %entry 2158; CHECK-NEXT: rldicr r3, r3, 0, 51 2159; CHECK-NEXT: lhz r3, 24(r3) 2160; CHECK-NEXT: blr 2161entry: 2162 %and = and i64 %ptr, -4096 2163 %or = or i64 %and, 24 2164 %0 = inttoptr i64 %or to ptr 2165 %1 = load atomic i16, ptr %0 monotonic, align 8 2166 ret i16 %1 2167} 2168 2169; Function Attrs: nofree norecurse nounwind uwtable willreturn 2170define dso_local zeroext i16 @ld_not_disjoint32_uint16_t_uint16_t(i64 %ptr) { 2171; CHECK-LABEL: ld_not_disjoint32_uint16_t_uint16_t: 2172; CHECK: # %bb.0: # %entry 2173; CHECK-NEXT: ori r3, r3, 34463 2174; CHECK-NEXT: oris r3, r3, 1 2175; CHECK-NEXT: lhz r3, 0(r3) 2176; CHECK-NEXT: blr 2177entry: 2178 %or = or i64 %ptr, 99999 2179 %0 = inttoptr i64 %or to ptr 2180 %1 = load atomic i16, ptr %0 monotonic, align 2 2181 ret i16 %1 2182} 2183 2184; Function Attrs: nofree norecurse nounwind uwtable willreturn 2185define dso_local zeroext i16 @ld_disjoint_align32_uint16_t_uint16_t(i64 %ptr) { 2186; CHECK-P10-LABEL: ld_disjoint_align32_uint16_t_uint16_t: 2187; CHECK-P10: # %bb.0: # %entry 2188; CHECK-P10-NEXT: lis r4, -15264 2189; CHECK-P10-NEXT: and r3, r3, r4 2190; CHECK-P10-NEXT: plhz r3, 999990000(r3), 0 2191; CHECK-P10-NEXT: clrldi r3, r3, 32 2192; CHECK-P10-NEXT: blr 2193; 2194; CHECK-PREP10-LABEL: ld_disjoint_align32_uint16_t_uint16_t: 2195; CHECK-PREP10: # %bb.0: # %entry 2196; CHECK-PREP10-NEXT: lis r4, -15264 2197; CHECK-PREP10-NEXT: and r3, r3, r4 2198; CHECK-PREP10-NEXT: lis r4, 15258 2199; CHECK-PREP10-NEXT: ori r4, r4, 41712 2200; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2201; CHECK-PREP10-NEXT: blr 2202entry: 2203 %and = and i64 %ptr, -1000341504 2204 %or = or i64 %and, 999990000 2205 %0 = inttoptr i64 %or to ptr 2206 %1 = load atomic i16, ptr %0 monotonic, align 16 2207 ret i16 %1 2208} 2209 2210; Function Attrs: nofree norecurse nounwind uwtable willreturn 2211define dso_local zeroext i16 @ld_not_disjoint64_uint16_t_uint16_t(i64 %ptr) { 2212; CHECK-P10-LABEL: ld_not_disjoint64_uint16_t_uint16_t: 2213; CHECK-P10: # %bb.0: # %entry 2214; CHECK-P10-NEXT: pli r4, 232 2215; CHECK-P10-NEXT: pli r5, 3567587329 2216; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 2217; CHECK-P10-NEXT: or r3, r3, r5 2218; CHECK-P10-NEXT: lhz r3, 0(r3) 2219; CHECK-P10-NEXT: blr 2220; 2221; CHECK-PREP10-LABEL: ld_not_disjoint64_uint16_t_uint16_t: 2222; CHECK-PREP10: # %bb.0: # %entry 2223; CHECK-PREP10-NEXT: li r4, 29 2224; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 2225; CHECK-PREP10-NEXT: oris r4, r4, 54437 2226; CHECK-PREP10-NEXT: ori r4, r4, 4097 2227; CHECK-PREP10-NEXT: or r3, r3, r4 2228; CHECK-PREP10-NEXT: lhz r3, 0(r3) 2229; CHECK-PREP10-NEXT: blr 2230entry: 2231 %or = or i64 %ptr, 1000000000001 2232 %0 = inttoptr i64 %or to ptr 2233 %1 = load atomic i16, ptr %0 monotonic, align 2 2234 ret i16 %1 2235} 2236 2237; Function Attrs: nofree norecurse nounwind uwtable willreturn 2238define dso_local zeroext i16 @ld_disjoint_align64_uint16_t_uint16_t(i64 %ptr) { 2239; CHECK-P10-LABEL: ld_disjoint_align64_uint16_t_uint16_t: 2240; CHECK-P10: # %bb.0: # %entry 2241; CHECK-P10-NEXT: pli r4, 244140625 2242; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 2243; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2244; CHECK-P10-NEXT: lhzx r3, r3, r4 2245; CHECK-P10-NEXT: blr 2246; 2247; CHECK-PREP10-LABEL: ld_disjoint_align64_uint16_t_uint16_t: 2248; CHECK-PREP10: # %bb.0: # %entry 2249; CHECK-PREP10-NEXT: lis r4, 3725 2250; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 2251; CHECK-PREP10-NEXT: ori r4, r4, 19025 2252; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2253; CHECK-PREP10-NEXT: lhzx r3, r3, r4 2254; CHECK-PREP10-NEXT: blr 2255entry: 2256 %and = and i64 %ptr, -1099511627776 2257 %or = or i64 %and, 1000000000000 2258 %0 = inttoptr i64 %or to ptr 2259 %1 = load atomic i16, ptr %0 monotonic, align 4096 2260 ret i16 %1 2261} 2262 2263; Function Attrs: nofree norecurse nounwind uwtable willreturn 2264define dso_local zeroext i16 @ld_cst_align16_uint16_t_uint16_t() { 2265; CHECK-LABEL: ld_cst_align16_uint16_t_uint16_t: 2266; CHECK: # %bb.0: # %entry 2267; CHECK-NEXT: lhz r3, 4080(0) 2268; CHECK-NEXT: blr 2269entry: 2270 %0 = load atomic i16, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2271 ret i16 %0 2272} 2273 2274; Function Attrs: nofree norecurse nounwind uwtable willreturn 2275define dso_local zeroext i16 @ld_cst_align32_uint16_t_uint16_t() { 2276; CHECK-LABEL: ld_cst_align32_uint16_t_uint16_t: 2277; CHECK: # %bb.0: # %entry 2278; CHECK-NEXT: lis r3, 153 2279; CHECK-NEXT: lhz r3, -27108(r3) 2280; CHECK-NEXT: blr 2281entry: 2282 %0 = load atomic i16, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 2283 ret i16 %0 2284} 2285 2286; Function Attrs: nofree norecurse nounwind uwtable willreturn 2287define dso_local zeroext i16 @ld_cst_align64_uint16_t_uint16_t() { 2288; CHECK-P10-LABEL: ld_cst_align64_uint16_t_uint16_t: 2289; CHECK-P10: # %bb.0: # %entry 2290; CHECK-P10-NEXT: pli r3, 244140625 2291; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2292; CHECK-P10-NEXT: lhz r3, 0(r3) 2293; CHECK-P10-NEXT: blr 2294; 2295; CHECK-PREP10-LABEL: ld_cst_align64_uint16_t_uint16_t: 2296; CHECK-PREP10: # %bb.0: # %entry 2297; CHECK-PREP10-NEXT: lis r3, 3725 2298; CHECK-PREP10-NEXT: ori r3, r3, 19025 2299; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2300; CHECK-PREP10-NEXT: lhz r3, 0(r3) 2301; CHECK-PREP10-NEXT: blr 2302entry: 2303 %0 = load atomic i16, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2304 ret i16 %0 2305} 2306 2307; Function Attrs: nofree norecurse nounwind uwtable willreturn 2308define dso_local zeroext i16 @ld_0_uint16_t_uint32_t(i64 %ptr) { 2309; CHECK-LABEL: ld_0_uint16_t_uint32_t: 2310; CHECK: # %bb.0: # %entry 2311; CHECK-NEXT: lwz r3, 0(r3) 2312; CHECK-NEXT: clrldi r3, r3, 48 2313; CHECK-NEXT: blr 2314entry: 2315 %0 = inttoptr i64 %ptr to ptr 2316 %1 = load atomic i32, ptr %0 monotonic, align 4 2317 %conv = trunc i32 %1 to i16 2318 ret i16 %conv 2319} 2320 2321; Function Attrs: nofree norecurse nounwind uwtable willreturn 2322define dso_local zeroext i16 @ld_align16_uint16_t_uint32_t(ptr nocapture readonly %ptr) { 2323; CHECK-LABEL: ld_align16_uint16_t_uint32_t: 2324; CHECK: # %bb.0: # %entry 2325; CHECK-NEXT: lwz r3, 8(r3) 2326; CHECK-NEXT: clrldi r3, r3, 48 2327; CHECK-NEXT: blr 2328entry: 2329 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2330 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 2331 %conv = trunc i32 %0 to i16 2332 ret i16 %conv 2333} 2334 2335; Function Attrs: nofree norecurse nounwind uwtable willreturn 2336define dso_local zeroext i16 @ld_align32_uint16_t_uint32_t(ptr nocapture readonly %ptr) { 2337; CHECK-P10-LABEL: ld_align32_uint16_t_uint32_t: 2338; CHECK-P10: # %bb.0: # %entry 2339; CHECK-P10-NEXT: plwz r3, 99999000(r3), 0 2340; CHECK-P10-NEXT: clrldi r3, r3, 48 2341; CHECK-P10-NEXT: blr 2342; 2343; CHECK-PREP10-LABEL: ld_align32_uint16_t_uint32_t: 2344; CHECK-PREP10: # %bb.0: # %entry 2345; CHECK-PREP10-NEXT: lis r4, 1525 2346; CHECK-PREP10-NEXT: ori r4, r4, 56600 2347; CHECK-PREP10-NEXT: lwzx r3, r3, r4 2348; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2349; CHECK-PREP10-NEXT: blr 2350entry: 2351 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2352 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 2353 %conv = trunc i32 %0 to i16 2354 ret i16 %conv 2355} 2356 2357; Function Attrs: nofree norecurse nounwind uwtable willreturn 2358define dso_local zeroext i16 @ld_align64_uint16_t_uint32_t(ptr nocapture readonly %ptr) { 2359; CHECK-P10-LABEL: ld_align64_uint16_t_uint32_t: 2360; CHECK-P10: # %bb.0: # %entry 2361; CHECK-P10-NEXT: pli r4, 244140625 2362; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2363; CHECK-P10-NEXT: lwzx r3, r3, r4 2364; CHECK-P10-NEXT: clrldi r3, r3, 48 2365; CHECK-P10-NEXT: blr 2366; 2367; CHECK-PREP10-LABEL: ld_align64_uint16_t_uint32_t: 2368; CHECK-PREP10: # %bb.0: # %entry 2369; CHECK-PREP10-NEXT: lis r4, 3725 2370; CHECK-PREP10-NEXT: ori r4, r4, 19025 2371; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2372; CHECK-PREP10-NEXT: lwzx r3, r3, r4 2373; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2374; CHECK-PREP10-NEXT: blr 2375entry: 2376 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2377 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 2378 %conv = trunc i32 %0 to i16 2379 ret i16 %conv 2380} 2381 2382; Function Attrs: nofree norecurse nounwind uwtable willreturn 2383define dso_local zeroext i16 @ld_reg_uint16_t_uint32_t(ptr nocapture readonly %ptr, i64 %off) { 2384; CHECK-LABEL: ld_reg_uint16_t_uint32_t: 2385; CHECK: # %bb.0: # %entry 2386; CHECK-NEXT: lwzx r3, r3, r4 2387; CHECK-NEXT: clrldi r3, r3, 48 2388; CHECK-NEXT: blr 2389entry: 2390 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2391 %0 = load atomic i32, ptr %add.ptr monotonic, align 4 2392 %conv = trunc i32 %0 to i16 2393 ret i16 %conv 2394} 2395 2396; Function Attrs: nofree norecurse nounwind uwtable willreturn 2397define dso_local zeroext i16 @ld_or_uint16_t_uint32_t(i64 %ptr, i8 zeroext %off) { 2398; CHECK-LABEL: ld_or_uint16_t_uint32_t: 2399; CHECK: # %bb.0: # %entry 2400; CHECK-NEXT: or r3, r4, r3 2401; CHECK-NEXT: lwz r3, 0(r3) 2402; CHECK-NEXT: clrldi r3, r3, 48 2403; CHECK-NEXT: blr 2404entry: 2405 %conv = zext i8 %off to i64 2406 %or = or i64 %conv, %ptr 2407 %0 = inttoptr i64 %or to ptr 2408 %1 = load atomic i32, ptr %0 monotonic, align 4 2409 %conv1 = trunc i32 %1 to i16 2410 ret i16 %conv1 2411} 2412 2413; Function Attrs: nofree norecurse nounwind uwtable willreturn 2414define dso_local zeroext i16 @ld_not_disjoint16_uint16_t_uint32_t(i64 %ptr) { 2415; CHECK-LABEL: ld_not_disjoint16_uint16_t_uint32_t: 2416; CHECK: # %bb.0: # %entry 2417; CHECK-NEXT: ori r3, r3, 6 2418; CHECK-NEXT: lwz r3, 0(r3) 2419; CHECK-NEXT: clrldi r3, r3, 48 2420; CHECK-NEXT: blr 2421entry: 2422 %or = or i64 %ptr, 6 2423 %0 = inttoptr i64 %or to ptr 2424 %1 = load atomic i32, ptr %0 monotonic, align 4 2425 %conv = trunc i32 %1 to i16 2426 ret i16 %conv 2427} 2428 2429; Function Attrs: nofree norecurse nounwind uwtable willreturn 2430define dso_local zeroext i16 @ld_disjoint_align16_uint16_t_uint32_t(i64 %ptr) { 2431; CHECK-LABEL: ld_disjoint_align16_uint16_t_uint32_t: 2432; CHECK: # %bb.0: # %entry 2433; CHECK-NEXT: rldicr r3, r3, 0, 51 2434; CHECK-NEXT: lwz r3, 24(r3) 2435; CHECK-NEXT: clrldi r3, r3, 48 2436; CHECK-NEXT: blr 2437entry: 2438 %and = and i64 %ptr, -4096 2439 %or = or i64 %and, 24 2440 %0 = inttoptr i64 %or to ptr 2441 %1 = load atomic i32, ptr %0 monotonic, align 8 2442 %conv = trunc i32 %1 to i16 2443 ret i16 %conv 2444} 2445 2446; Function Attrs: nofree norecurse nounwind uwtable willreturn 2447define dso_local zeroext i16 @ld_not_disjoint32_uint16_t_uint32_t(i64 %ptr) { 2448; CHECK-LABEL: ld_not_disjoint32_uint16_t_uint32_t: 2449; CHECK: # %bb.0: # %entry 2450; CHECK-NEXT: ori r3, r3, 34463 2451; CHECK-NEXT: oris r3, r3, 1 2452; CHECK-NEXT: lwz r3, 0(r3) 2453; CHECK-NEXT: clrldi r3, r3, 48 2454; CHECK-NEXT: blr 2455entry: 2456 %or = or i64 %ptr, 99999 2457 %0 = inttoptr i64 %or to ptr 2458 %1 = load atomic i32, ptr %0 monotonic, align 4 2459 %conv = trunc i32 %1 to i16 2460 ret i16 %conv 2461} 2462 2463; Function Attrs: nofree norecurse nounwind uwtable willreturn 2464define dso_local zeroext i16 @ld_disjoint_align32_uint16_t_uint32_t(i64 %ptr) { 2465; CHECK-P10-LABEL: ld_disjoint_align32_uint16_t_uint32_t: 2466; CHECK-P10: # %bb.0: # %entry 2467; CHECK-P10-NEXT: lis r4, -15264 2468; CHECK-P10-NEXT: and r3, r3, r4 2469; CHECK-P10-NEXT: plwz r3, 999990000(r3), 0 2470; CHECK-P10-NEXT: clrldi r3, r3, 48 2471; CHECK-P10-NEXT: blr 2472; 2473; CHECK-PREP10-LABEL: ld_disjoint_align32_uint16_t_uint32_t: 2474; CHECK-PREP10: # %bb.0: # %entry 2475; CHECK-PREP10-NEXT: lis r4, -15264 2476; CHECK-PREP10-NEXT: and r3, r3, r4 2477; CHECK-PREP10-NEXT: lis r4, 15258 2478; CHECK-PREP10-NEXT: ori r4, r4, 41712 2479; CHECK-PREP10-NEXT: lwzx r3, r3, r4 2480; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2481; CHECK-PREP10-NEXT: blr 2482entry: 2483 %and = and i64 %ptr, -1000341504 2484 %or = or i64 %and, 999990000 2485 %0 = inttoptr i64 %or to ptr 2486 %1 = load atomic i32, ptr %0 monotonic, align 16 2487 %conv = trunc i32 %1 to i16 2488 ret i16 %conv 2489} 2490 2491; Function Attrs: nofree norecurse nounwind uwtable willreturn 2492define dso_local zeroext i16 @ld_not_disjoint64_uint16_t_uint32_t(i64 %ptr) { 2493; CHECK-P10-LABEL: ld_not_disjoint64_uint16_t_uint32_t: 2494; CHECK-P10: # %bb.0: # %entry 2495; CHECK-P10-NEXT: pli r4, 232 2496; CHECK-P10-NEXT: pli r5, 3567587329 2497; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 2498; CHECK-P10-NEXT: or r3, r3, r5 2499; CHECK-P10-NEXT: lwz r3, 0(r3) 2500; CHECK-P10-NEXT: clrldi r3, r3, 48 2501; CHECK-P10-NEXT: blr 2502; 2503; CHECK-PREP10-LABEL: ld_not_disjoint64_uint16_t_uint32_t: 2504; CHECK-PREP10: # %bb.0: # %entry 2505; CHECK-PREP10-NEXT: li r4, 29 2506; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 2507; CHECK-PREP10-NEXT: oris r4, r4, 54437 2508; CHECK-PREP10-NEXT: ori r4, r4, 4097 2509; CHECK-PREP10-NEXT: or r3, r3, r4 2510; CHECK-PREP10-NEXT: lwz r3, 0(r3) 2511; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2512; CHECK-PREP10-NEXT: blr 2513entry: 2514 %or = or i64 %ptr, 1000000000001 2515 %0 = inttoptr i64 %or to ptr 2516 %1 = load atomic i32, ptr %0 monotonic, align 4 2517 %conv = trunc i32 %1 to i16 2518 ret i16 %conv 2519} 2520 2521; Function Attrs: nofree norecurse nounwind uwtable willreturn 2522define dso_local zeroext i16 @ld_disjoint_align64_uint16_t_uint32_t(i64 %ptr) { 2523; CHECK-P10-LABEL: ld_disjoint_align64_uint16_t_uint32_t: 2524; CHECK-P10: # %bb.0: # %entry 2525; CHECK-P10-NEXT: pli r4, 244140625 2526; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 2527; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2528; CHECK-P10-NEXT: lwzx r3, r3, r4 2529; CHECK-P10-NEXT: clrldi r3, r3, 48 2530; CHECK-P10-NEXT: blr 2531; 2532; CHECK-PREP10-LABEL: ld_disjoint_align64_uint16_t_uint32_t: 2533; CHECK-PREP10: # %bb.0: # %entry 2534; CHECK-PREP10-NEXT: lis r4, 3725 2535; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 2536; CHECK-PREP10-NEXT: ori r4, r4, 19025 2537; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2538; CHECK-PREP10-NEXT: lwzx r3, r3, r4 2539; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2540; CHECK-PREP10-NEXT: blr 2541entry: 2542 %and = and i64 %ptr, -1099511627776 2543 %or = or i64 %and, 1000000000000 2544 %0 = inttoptr i64 %or to ptr 2545 %1 = load atomic i32, ptr %0 monotonic, align 4096 2546 %conv = trunc i32 %1 to i16 2547 ret i16 %conv 2548} 2549 2550; Function Attrs: nofree norecurse nounwind uwtable willreturn 2551define dso_local zeroext i16 @ld_cst_align16_uint16_t_uint32_t() { 2552; CHECK-LABEL: ld_cst_align16_uint16_t_uint32_t: 2553; CHECK: # %bb.0: # %entry 2554; CHECK-NEXT: lwz r3, 4080(0) 2555; CHECK-NEXT: clrldi r3, r3, 48 2556; CHECK-NEXT: blr 2557entry: 2558 %0 = load atomic i32, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2559 %conv = trunc i32 %0 to i16 2560 ret i16 %conv 2561} 2562 2563; Function Attrs: nofree norecurse nounwind uwtable willreturn 2564define dso_local zeroext i16 @ld_cst_align32_uint16_t_uint32_t() { 2565; CHECK-LABEL: ld_cst_align32_uint16_t_uint32_t: 2566; CHECK: # %bb.0: # %entry 2567; CHECK-NEXT: lis r3, 153 2568; CHECK-NEXT: lwz r3, -27108(r3) 2569; CHECK-NEXT: clrldi r3, r3, 48 2570; CHECK-NEXT: blr 2571entry: 2572 %0 = load atomic i32, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 2573 %conv = trunc i32 %0 to i16 2574 ret i16 %conv 2575} 2576 2577; Function Attrs: nofree norecurse nounwind uwtable willreturn 2578define dso_local zeroext i16 @ld_cst_align64_uint16_t_uint32_t() { 2579; CHECK-P10-LABEL: ld_cst_align64_uint16_t_uint32_t: 2580; CHECK-P10: # %bb.0: # %entry 2581; CHECK-P10-NEXT: pli r3, 244140625 2582; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2583; CHECK-P10-NEXT: lwz r3, 0(r3) 2584; CHECK-P10-NEXT: clrldi r3, r3, 48 2585; CHECK-P10-NEXT: blr 2586; 2587; CHECK-PREP10-LABEL: ld_cst_align64_uint16_t_uint32_t: 2588; CHECK-PREP10: # %bb.0: # %entry 2589; CHECK-PREP10-NEXT: lis r3, 3725 2590; CHECK-PREP10-NEXT: ori r3, r3, 19025 2591; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2592; CHECK-PREP10-NEXT: lwz r3, 0(r3) 2593; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2594; CHECK-PREP10-NEXT: blr 2595entry: 2596 %0 = load atomic i32, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2597 %conv = trunc i32 %0 to i16 2598 ret i16 %conv 2599} 2600 2601; Function Attrs: nofree norecurse nounwind uwtable willreturn 2602define dso_local zeroext i16 @ld_0_uint16_t_uint64_t(i64 %ptr) { 2603; CHECK-LABEL: ld_0_uint16_t_uint64_t: 2604; CHECK: # %bb.0: # %entry 2605; CHECK-NEXT: ld r3, 0(r3) 2606; CHECK-NEXT: clrldi r3, r3, 48 2607; CHECK-NEXT: blr 2608entry: 2609 %0 = inttoptr i64 %ptr to ptr 2610 %1 = load atomic i64, ptr %0 monotonic, align 8 2611 %conv = trunc i64 %1 to i16 2612 ret i16 %conv 2613} 2614 2615; Function Attrs: nofree norecurse nounwind uwtable willreturn 2616define dso_local zeroext i16 @ld_align16_uint16_t_uint64_t(ptr nocapture readonly %ptr) { 2617; CHECK-LABEL: ld_align16_uint16_t_uint64_t: 2618; CHECK: # %bb.0: # %entry 2619; CHECK-NEXT: ld r3, 8(r3) 2620; CHECK-NEXT: clrldi r3, r3, 48 2621; CHECK-NEXT: blr 2622entry: 2623 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2624 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 2625 %conv = trunc i64 %0 to i16 2626 ret i16 %conv 2627} 2628 2629; Function Attrs: nofree norecurse nounwind uwtable willreturn 2630define dso_local zeroext i16 @ld_align32_uint16_t_uint64_t(ptr nocapture readonly %ptr) { 2631; CHECK-P10-LABEL: ld_align32_uint16_t_uint64_t: 2632; CHECK-P10: # %bb.0: # %entry 2633; CHECK-P10-NEXT: pld r3, 99999000(r3), 0 2634; CHECK-P10-NEXT: clrldi r3, r3, 48 2635; CHECK-P10-NEXT: blr 2636; 2637; CHECK-PREP10-LABEL: ld_align32_uint16_t_uint64_t: 2638; CHECK-PREP10: # %bb.0: # %entry 2639; CHECK-PREP10-NEXT: lis r4, 1525 2640; CHECK-PREP10-NEXT: ori r4, r4, 56600 2641; CHECK-PREP10-NEXT: ldx r3, r3, r4 2642; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2643; CHECK-PREP10-NEXT: blr 2644entry: 2645 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2646 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 2647 %conv = trunc i64 %0 to i16 2648 ret i16 %conv 2649} 2650 2651; Function Attrs: nofree norecurse nounwind uwtable willreturn 2652define dso_local zeroext i16 @ld_align64_uint16_t_uint64_t(ptr nocapture readonly %ptr) { 2653; CHECK-P10-LABEL: ld_align64_uint16_t_uint64_t: 2654; CHECK-P10: # %bb.0: # %entry 2655; CHECK-P10-NEXT: pli r4, 244140625 2656; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2657; CHECK-P10-NEXT: ldx r3, r3, r4 2658; CHECK-P10-NEXT: clrldi r3, r3, 48 2659; CHECK-P10-NEXT: blr 2660; 2661; CHECK-PREP10-LABEL: ld_align64_uint16_t_uint64_t: 2662; CHECK-PREP10: # %bb.0: # %entry 2663; CHECK-PREP10-NEXT: lis r4, 3725 2664; CHECK-PREP10-NEXT: ori r4, r4, 19025 2665; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2666; CHECK-PREP10-NEXT: ldx r3, r3, r4 2667; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2668; CHECK-PREP10-NEXT: blr 2669entry: 2670 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2671 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 2672 %conv = trunc i64 %0 to i16 2673 ret i16 %conv 2674} 2675 2676; Function Attrs: nofree norecurse nounwind uwtable willreturn 2677define dso_local zeroext i16 @ld_reg_uint16_t_uint64_t(ptr nocapture readonly %ptr, i64 %off) { 2678; CHECK-LABEL: ld_reg_uint16_t_uint64_t: 2679; CHECK: # %bb.0: # %entry 2680; CHECK-NEXT: ldx r3, r3, r4 2681; CHECK-NEXT: clrldi r3, r3, 48 2682; CHECK-NEXT: blr 2683entry: 2684 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2685 %0 = load atomic i64, ptr %add.ptr monotonic, align 8 2686 %conv = trunc i64 %0 to i16 2687 ret i16 %conv 2688} 2689 2690; Function Attrs: nofree norecurse nounwind uwtable willreturn 2691define dso_local zeroext i16 @ld_or_uint16_t_uint64_t(i64 %ptr, i8 zeroext %off) { 2692; CHECK-LABEL: ld_or_uint16_t_uint64_t: 2693; CHECK: # %bb.0: # %entry 2694; CHECK-NEXT: or r3, r4, r3 2695; CHECK-NEXT: ld r3, 0(r3) 2696; CHECK-NEXT: clrldi r3, r3, 48 2697; CHECK-NEXT: blr 2698entry: 2699 %conv = zext i8 %off to i64 2700 %or = or i64 %conv, %ptr 2701 %0 = inttoptr i64 %or to ptr 2702 %1 = load atomic i64, ptr %0 monotonic, align 8 2703 %conv1 = trunc i64 %1 to i16 2704 ret i16 %conv1 2705} 2706 2707; Function Attrs: nofree norecurse nounwind uwtable willreturn 2708define dso_local zeroext i16 @ld_not_disjoint16_uint16_t_uint64_t(i64 %ptr) { 2709; CHECK-LABEL: ld_not_disjoint16_uint16_t_uint64_t: 2710; CHECK: # %bb.0: # %entry 2711; CHECK-NEXT: ori r3, r3, 6 2712; CHECK-NEXT: ld r3, 0(r3) 2713; CHECK-NEXT: clrldi r3, r3, 48 2714; CHECK-NEXT: blr 2715entry: 2716 %or = or i64 %ptr, 6 2717 %0 = inttoptr i64 %or to ptr 2718 %1 = load atomic i64, ptr %0 monotonic, align 8 2719 %conv = trunc i64 %1 to i16 2720 ret i16 %conv 2721} 2722 2723; Function Attrs: nofree norecurse nounwind uwtable willreturn 2724define dso_local zeroext i16 @ld_disjoint_align16_uint16_t_uint64_t(i64 %ptr) { 2725; CHECK-LABEL: ld_disjoint_align16_uint16_t_uint64_t: 2726; CHECK: # %bb.0: # %entry 2727; CHECK-NEXT: rldicr r3, r3, 0, 51 2728; CHECK-NEXT: ld r3, 24(r3) 2729; CHECK-NEXT: clrldi r3, r3, 48 2730; CHECK-NEXT: blr 2731entry: 2732 %and = and i64 %ptr, -4096 2733 %or = or i64 %and, 24 2734 %0 = inttoptr i64 %or to ptr 2735 %1 = load atomic i64, ptr %0 monotonic, align 8 2736 %conv = trunc i64 %1 to i16 2737 ret i16 %conv 2738} 2739 2740; Function Attrs: nofree norecurse nounwind uwtable willreturn 2741define dso_local zeroext i16 @ld_not_disjoint32_uint16_t_uint64_t(i64 %ptr) { 2742; CHECK-LABEL: ld_not_disjoint32_uint16_t_uint64_t: 2743; CHECK: # %bb.0: # %entry 2744; CHECK-NEXT: ori r3, r3, 34463 2745; CHECK-NEXT: oris r3, r3, 1 2746; CHECK-NEXT: ld r3, 0(r3) 2747; CHECK-NEXT: clrldi r3, r3, 48 2748; CHECK-NEXT: blr 2749entry: 2750 %or = or i64 %ptr, 99999 2751 %0 = inttoptr i64 %or to ptr 2752 %1 = load atomic i64, ptr %0 monotonic, align 8 2753 %conv = trunc i64 %1 to i16 2754 ret i16 %conv 2755} 2756 2757; Function Attrs: nofree norecurse nounwind uwtable willreturn 2758define dso_local zeroext i16 @ld_disjoint_align32_uint16_t_uint64_t(i64 %ptr) { 2759; CHECK-P10-LABEL: ld_disjoint_align32_uint16_t_uint64_t: 2760; CHECK-P10: # %bb.0: # %entry 2761; CHECK-P10-NEXT: lis r4, -15264 2762; CHECK-P10-NEXT: and r3, r3, r4 2763; CHECK-P10-NEXT: pld r3, 999990000(r3), 0 2764; CHECK-P10-NEXT: clrldi r3, r3, 48 2765; CHECK-P10-NEXT: blr 2766; 2767; CHECK-PREP10-LABEL: ld_disjoint_align32_uint16_t_uint64_t: 2768; CHECK-PREP10: # %bb.0: # %entry 2769; CHECK-PREP10-NEXT: lis r4, -15264 2770; CHECK-PREP10-NEXT: and r3, r3, r4 2771; CHECK-PREP10-NEXT: lis r4, 15258 2772; CHECK-PREP10-NEXT: ori r4, r4, 41712 2773; CHECK-PREP10-NEXT: ldx r3, r3, r4 2774; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2775; CHECK-PREP10-NEXT: blr 2776entry: 2777 %and = and i64 %ptr, -1000341504 2778 %or = or i64 %and, 999990000 2779 %0 = inttoptr i64 %or to ptr 2780 %1 = load atomic i64, ptr %0 monotonic, align 16 2781 %conv = trunc i64 %1 to i16 2782 ret i16 %conv 2783} 2784 2785; Function Attrs: nofree norecurse nounwind uwtable willreturn 2786define dso_local zeroext i16 @ld_not_disjoint64_uint16_t_uint64_t(i64 %ptr) { 2787; CHECK-P10-LABEL: ld_not_disjoint64_uint16_t_uint64_t: 2788; CHECK-P10: # %bb.0: # %entry 2789; CHECK-P10-NEXT: pli r4, 232 2790; CHECK-P10-NEXT: pli r5, 3567587329 2791; CHECK-P10-NEXT: rldimi r5, r4, 32, 0 2792; CHECK-P10-NEXT: or r3, r3, r5 2793; CHECK-P10-NEXT: ld r3, 0(r3) 2794; CHECK-P10-NEXT: clrldi r3, r3, 48 2795; CHECK-P10-NEXT: blr 2796; 2797; CHECK-PREP10-LABEL: ld_not_disjoint64_uint16_t_uint64_t: 2798; CHECK-PREP10: # %bb.0: # %entry 2799; CHECK-PREP10-NEXT: li r4, 29 2800; CHECK-PREP10-NEXT: rldic r4, r4, 35, 24 2801; CHECK-PREP10-NEXT: oris r4, r4, 54437 2802; CHECK-PREP10-NEXT: ori r4, r4, 4097 2803; CHECK-PREP10-NEXT: or r3, r3, r4 2804; CHECK-PREP10-NEXT: ld r3, 0(r3) 2805; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2806; CHECK-PREP10-NEXT: blr 2807entry: 2808 %or = or i64 %ptr, 1000000000001 2809 %0 = inttoptr i64 %or to ptr 2810 %1 = load atomic i64, ptr %0 monotonic, align 8 2811 %conv = trunc i64 %1 to i16 2812 ret i16 %conv 2813} 2814 2815; Function Attrs: nofree norecurse nounwind uwtable willreturn 2816define dso_local zeroext i16 @ld_disjoint_align64_uint16_t_uint64_t(i64 %ptr) { 2817; CHECK-P10-LABEL: ld_disjoint_align64_uint16_t_uint64_t: 2818; CHECK-P10: # %bb.0: # %entry 2819; CHECK-P10-NEXT: pli r4, 244140625 2820; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 2821; CHECK-P10-NEXT: rldic r4, r4, 12, 24 2822; CHECK-P10-NEXT: ldx r3, r3, r4 2823; CHECK-P10-NEXT: clrldi r3, r3, 48 2824; CHECK-P10-NEXT: blr 2825; 2826; CHECK-PREP10-LABEL: ld_disjoint_align64_uint16_t_uint64_t: 2827; CHECK-PREP10: # %bb.0: # %entry 2828; CHECK-PREP10-NEXT: lis r4, 3725 2829; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 2830; CHECK-PREP10-NEXT: ori r4, r4, 19025 2831; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 2832; CHECK-PREP10-NEXT: ldx r3, r3, r4 2833; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2834; CHECK-PREP10-NEXT: blr 2835entry: 2836 %and = and i64 %ptr, -1099511627776 2837 %or = or i64 %and, 1000000000000 2838 %0 = inttoptr i64 %or to ptr 2839 %1 = load atomic i64, ptr %0 monotonic, align 4096 2840 %conv = trunc i64 %1 to i16 2841 ret i16 %conv 2842} 2843 2844; Function Attrs: nofree norecurse nounwind uwtable willreturn 2845define dso_local zeroext i16 @ld_cst_align16_uint16_t_uint64_t() { 2846; CHECK-LABEL: ld_cst_align16_uint16_t_uint64_t: 2847; CHECK: # %bb.0: # %entry 2848; CHECK-NEXT: ld r3, 4080(0) 2849; CHECK-NEXT: clrldi r3, r3, 48 2850; CHECK-NEXT: blr 2851entry: 2852 %0 = load atomic i64, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 2853 %conv = trunc i64 %0 to i16 2854 ret i16 %conv 2855} 2856 2857; Function Attrs: nofree norecurse nounwind uwtable willreturn 2858define dso_local zeroext i16 @ld_cst_align32_uint16_t_uint64_t() { 2859; CHECK-LABEL: ld_cst_align32_uint16_t_uint64_t: 2860; CHECK: # %bb.0: # %entry 2861; CHECK-NEXT: lis r3, 153 2862; CHECK-NEXT: ld r3, -27108(r3) 2863; CHECK-NEXT: clrldi r3, r3, 48 2864; CHECK-NEXT: blr 2865entry: 2866 %0 = load atomic i64, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 2867 %conv = trunc i64 %0 to i16 2868 ret i16 %conv 2869} 2870 2871; Function Attrs: nofree norecurse nounwind uwtable willreturn 2872define dso_local zeroext i16 @ld_cst_align64_uint16_t_uint64_t() { 2873; CHECK-P10-LABEL: ld_cst_align64_uint16_t_uint64_t: 2874; CHECK-P10: # %bb.0: # %entry 2875; CHECK-P10-NEXT: pli r3, 244140625 2876; CHECK-P10-NEXT: rldic r3, r3, 12, 24 2877; CHECK-P10-NEXT: ld r3, 0(r3) 2878; CHECK-P10-NEXT: clrldi r3, r3, 48 2879; CHECK-P10-NEXT: blr 2880; 2881; CHECK-PREP10-LABEL: ld_cst_align64_uint16_t_uint64_t: 2882; CHECK-PREP10: # %bb.0: # %entry 2883; CHECK-PREP10-NEXT: lis r3, 3725 2884; CHECK-PREP10-NEXT: ori r3, r3, 19025 2885; CHECK-PREP10-NEXT: rldic r3, r3, 12, 24 2886; CHECK-PREP10-NEXT: ld r3, 0(r3) 2887; CHECK-PREP10-NEXT: clrldi r3, r3, 48 2888; CHECK-PREP10-NEXT: blr 2889entry: 2890 %0 = load atomic i64, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 2891 %conv = trunc i64 %0 to i16 2892 ret i16 %conv 2893} 2894 2895; Function Attrs: nofree norecurse nounwind uwtable willreturn 2896define dso_local void @st_0_uint16_t_uint8_t(i64 %ptr, i16 zeroext %str) { 2897; CHECK-LABEL: st_0_uint16_t_uint8_t: 2898; CHECK: # %bb.0: # %entry 2899; CHECK-NEXT: stb r4, 0(r3) 2900; CHECK-NEXT: blr 2901entry: 2902 %0 = inttoptr i64 %ptr to ptr 2903 %conv = trunc i16 %str to i8 2904 store atomic i8 %conv, ptr %0 monotonic, align 1 2905 ret void 2906} 2907 2908; Function Attrs: nofree norecurse nounwind uwtable willreturn 2909define dso_local void @st_align16_uint16_t_uint8_t(ptr nocapture %ptr, i16 zeroext %str) { 2910; CHECK-LABEL: st_align16_uint16_t_uint8_t: 2911; CHECK: # %bb.0: # %entry 2912; CHECK-NEXT: stb r4, 8(r3) 2913; CHECK-NEXT: blr 2914entry: 2915 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 2916 %conv = trunc i16 %str to i8 2917 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 2918 ret void 2919} 2920 2921; Function Attrs: nofree norecurse nounwind uwtable willreturn 2922define dso_local void @st_align32_uint16_t_uint8_t(ptr nocapture %ptr, i16 zeroext %str) { 2923; CHECK-P10-LABEL: st_align32_uint16_t_uint8_t: 2924; CHECK-P10: # %bb.0: # %entry 2925; CHECK-P10-NEXT: pstb r4, 99999000(r3), 0 2926; CHECK-P10-NEXT: blr 2927; 2928; CHECK-PREP10-LABEL: st_align32_uint16_t_uint8_t: 2929; CHECK-PREP10: # %bb.0: # %entry 2930; CHECK-PREP10-NEXT: lis r5, 1525 2931; CHECK-PREP10-NEXT: ori r5, r5, 56600 2932; CHECK-PREP10-NEXT: stbx r4, r3, r5 2933; CHECK-PREP10-NEXT: blr 2934entry: 2935 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 2936 %conv = trunc i16 %str to i8 2937 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 2938 ret void 2939} 2940 2941; Function Attrs: nofree norecurse nounwind uwtable willreturn 2942define dso_local void @st_align64_uint16_t_uint8_t(ptr nocapture %ptr, i16 zeroext %str) { 2943; CHECK-P10-LABEL: st_align64_uint16_t_uint8_t: 2944; CHECK-P10: # %bb.0: # %entry 2945; CHECK-P10-NEXT: pli r5, 244140625 2946; CHECK-P10-NEXT: rldic r5, r5, 12, 24 2947; CHECK-P10-NEXT: stbx r4, r3, r5 2948; CHECK-P10-NEXT: blr 2949; 2950; CHECK-PREP10-LABEL: st_align64_uint16_t_uint8_t: 2951; CHECK-PREP10: # %bb.0: # %entry 2952; CHECK-PREP10-NEXT: lis r5, 3725 2953; CHECK-PREP10-NEXT: ori r5, r5, 19025 2954; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 2955; CHECK-PREP10-NEXT: stbx r4, r3, r5 2956; CHECK-PREP10-NEXT: blr 2957entry: 2958 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 2959 %conv = trunc i16 %str to i8 2960 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 2961 ret void 2962} 2963 2964; Function Attrs: nofree norecurse nounwind uwtable willreturn 2965define dso_local void @st_reg_uint16_t_uint8_t(ptr nocapture %ptr, i64 %off, i16 zeroext %str) { 2966; CHECK-LABEL: st_reg_uint16_t_uint8_t: 2967; CHECK: # %bb.0: # %entry 2968; CHECK-NEXT: stbx r5, r3, r4 2969; CHECK-NEXT: blr 2970entry: 2971 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 2972 %conv = trunc i16 %str to i8 2973 store atomic i8 %conv, ptr %add.ptr monotonic, align 1 2974 ret void 2975} 2976 2977; Function Attrs: nofree norecurse nounwind uwtable willreturn 2978define dso_local void @st_or1_uint16_t_uint8_t(i64 %ptr, i8 zeroext %off, i16 zeroext %str) { 2979; CHECK-LABEL: st_or1_uint16_t_uint8_t: 2980; CHECK: # %bb.0: # %entry 2981; CHECK-NEXT: or r3, r4, r3 2982; CHECK-NEXT: stb r5, 0(r3) 2983; CHECK-NEXT: blr 2984entry: 2985 %conv = zext i8 %off to i64 2986 %or = or i64 %conv, %ptr 2987 %0 = inttoptr i64 %or to ptr 2988 %conv1 = trunc i16 %str to i8 2989 store atomic i8 %conv1, ptr %0 monotonic, align 1 2990 ret void 2991} 2992 2993; Function Attrs: nofree norecurse nounwind uwtable willreturn 2994define dso_local void @st_not_disjoint16_uint16_t_uint8_t(i64 %ptr, i16 zeroext %str) { 2995; CHECK-LABEL: st_not_disjoint16_uint16_t_uint8_t: 2996; CHECK: # %bb.0: # %entry 2997; CHECK-NEXT: ori r3, r3, 6 2998; CHECK-NEXT: stb r4, 0(r3) 2999; CHECK-NEXT: blr 3000entry: 3001 %or = or i64 %ptr, 6 3002 %0 = inttoptr i64 %or to ptr 3003 %conv = trunc i16 %str to i8 3004 store atomic i8 %conv, ptr %0 monotonic, align 1 3005 ret void 3006} 3007 3008; Function Attrs: nofree norecurse nounwind uwtable willreturn 3009define dso_local void @st_disjoint_align16_uint16_t_uint8_t(i64 %ptr, i16 zeroext %str) { 3010; CHECK-LABEL: st_disjoint_align16_uint16_t_uint8_t: 3011; CHECK: # %bb.0: # %entry 3012; CHECK-NEXT: rldicr r3, r3, 0, 51 3013; CHECK-NEXT: stb r4, 24(r3) 3014; CHECK-NEXT: blr 3015entry: 3016 %and = and i64 %ptr, -4096 3017 %or = or i64 %and, 24 3018 %0 = inttoptr i64 %or to ptr 3019 %conv = trunc i16 %str to i8 3020 store atomic i8 %conv, ptr %0 monotonic, align 8 3021 ret void 3022} 3023 3024; Function Attrs: nofree norecurse nounwind uwtable willreturn 3025define dso_local void @st_not_disjoint32_uint16_t_uint8_t(i64 %ptr, i16 zeroext %str) { 3026; CHECK-LABEL: st_not_disjoint32_uint16_t_uint8_t: 3027; CHECK: # %bb.0: # %entry 3028; CHECK-NEXT: ori r3, r3, 34463 3029; CHECK-NEXT: oris r3, r3, 1 3030; CHECK-NEXT: stb r4, 0(r3) 3031; CHECK-NEXT: blr 3032entry: 3033 %or = or i64 %ptr, 99999 3034 %0 = inttoptr i64 %or to ptr 3035 %conv = trunc i16 %str to i8 3036 store atomic i8 %conv, ptr %0 monotonic, align 1 3037 ret void 3038} 3039 3040; Function Attrs: nofree norecurse nounwind uwtable willreturn 3041define dso_local void @st_disjoint_align32_uint16_t_uint8_t(i64 %ptr, i16 zeroext %str) { 3042; CHECK-P10-LABEL: st_disjoint_align32_uint16_t_uint8_t: 3043; CHECK-P10: # %bb.0: # %entry 3044; CHECK-P10-NEXT: lis r5, -15264 3045; CHECK-P10-NEXT: and r3, r3, r5 3046; CHECK-P10-NEXT: pstb r4, 999990000(r3), 0 3047; CHECK-P10-NEXT: blr 3048; 3049; CHECK-PREP10-LABEL: st_disjoint_align32_uint16_t_uint8_t: 3050; CHECK-PREP10: # %bb.0: # %entry 3051; CHECK-PREP10-NEXT: lis r5, -15264 3052; CHECK-PREP10-NEXT: and r3, r3, r5 3053; CHECK-PREP10-NEXT: lis r5, 15258 3054; CHECK-PREP10-NEXT: ori r5, r5, 41712 3055; CHECK-PREP10-NEXT: stbx r4, r3, r5 3056; CHECK-PREP10-NEXT: blr 3057entry: 3058 %and = and i64 %ptr, -1000341504 3059 %or = or i64 %and, 999990000 3060 %0 = inttoptr i64 %or to ptr 3061 %conv = trunc i16 %str to i8 3062 store atomic i8 %conv, ptr %0 monotonic, align 16 3063 ret void 3064} 3065 3066; Function Attrs: nofree norecurse nounwind uwtable willreturn 3067define dso_local void @st_not_disjoint64_uint16_t_uint8_t(i64 %ptr, i16 zeroext %str) { 3068; CHECK-P10-LABEL: st_not_disjoint64_uint16_t_uint8_t: 3069; CHECK-P10: # %bb.0: # %entry 3070; CHECK-P10-NEXT: pli r5, 232 3071; CHECK-P10-NEXT: pli r6, 3567587329 3072; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 3073; CHECK-P10-NEXT: or r3, r3, r6 3074; CHECK-P10-NEXT: stb r4, 0(r3) 3075; CHECK-P10-NEXT: blr 3076; 3077; CHECK-PREP10-LABEL: st_not_disjoint64_uint16_t_uint8_t: 3078; CHECK-PREP10: # %bb.0: # %entry 3079; CHECK-PREP10-NEXT: li r5, 29 3080; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 3081; CHECK-PREP10-NEXT: oris r5, r5, 54437 3082; CHECK-PREP10-NEXT: ori r5, r5, 4097 3083; CHECK-PREP10-NEXT: or r3, r3, r5 3084; CHECK-PREP10-NEXT: stb r4, 0(r3) 3085; CHECK-PREP10-NEXT: blr 3086entry: 3087 %or = or i64 %ptr, 1000000000001 3088 %0 = inttoptr i64 %or to ptr 3089 %conv = trunc i16 %str to i8 3090 store atomic i8 %conv, ptr %0 monotonic, align 1 3091 ret void 3092} 3093 3094; Function Attrs: nofree norecurse nounwind uwtable willreturn 3095define dso_local void @st_disjoint_align64_uint16_t_uint8_t(i64 %ptr, i16 zeroext %str) { 3096; CHECK-P10-LABEL: st_disjoint_align64_uint16_t_uint8_t: 3097; CHECK-P10: # %bb.0: # %entry 3098; CHECK-P10-NEXT: pli r5, 244140625 3099; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3100; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3101; CHECK-P10-NEXT: stbx r4, r3, r5 3102; CHECK-P10-NEXT: blr 3103; 3104; CHECK-PREP10-LABEL: st_disjoint_align64_uint16_t_uint8_t: 3105; CHECK-PREP10: # %bb.0: # %entry 3106; CHECK-PREP10-NEXT: lis r5, 3725 3107; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3108; CHECK-PREP10-NEXT: ori r5, r5, 19025 3109; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3110; CHECK-PREP10-NEXT: stbx r4, r3, r5 3111; CHECK-PREP10-NEXT: blr 3112entry: 3113 %and = and i64 %ptr, -1099511627776 3114 %or = or i64 %and, 1000000000000 3115 %0 = inttoptr i64 %or to ptr 3116 %conv = trunc i16 %str to i8 3117 store atomic i8 %conv, ptr %0 monotonic, align 4096 3118 ret void 3119} 3120 3121; Function Attrs: nofree norecurse nounwind uwtable willreturn 3122define dso_local void @st_cst_align16_uint16_t_uint8_t(i16 zeroext %str) { 3123; CHECK-LABEL: st_cst_align16_uint16_t_uint8_t: 3124; CHECK: # %bb.0: # %entry 3125; CHECK-NEXT: stb r3, 4080(0) 3126; CHECK-NEXT: blr 3127entry: 3128 %conv = trunc i16 %str to i8 3129 store atomic i8 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3130 ret void 3131} 3132 3133; Function Attrs: nofree norecurse nounwind uwtable willreturn 3134define dso_local void @st_cst_align32_uint16_t_uint8_t(i16 zeroext %str) { 3135; CHECK-LABEL: st_cst_align32_uint16_t_uint8_t: 3136; CHECK: # %bb.0: # %entry 3137; CHECK-NEXT: lis r4, 153 3138; CHECK-NEXT: stb r3, -27108(r4) 3139; CHECK-NEXT: blr 3140entry: 3141 %conv = trunc i16 %str to i8 3142 store atomic i8 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 3143 ret void 3144} 3145 3146; Function Attrs: nofree norecurse nounwind uwtable willreturn 3147define dso_local void @st_cst_align64_uint16_t_uint8_t(i16 zeroext %str) { 3148; CHECK-P10-LABEL: st_cst_align64_uint16_t_uint8_t: 3149; CHECK-P10: # %bb.0: # %entry 3150; CHECK-P10-NEXT: pli r4, 244140625 3151; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3152; CHECK-P10-NEXT: stb r3, 0(r4) 3153; CHECK-P10-NEXT: blr 3154; 3155; CHECK-PREP10-LABEL: st_cst_align64_uint16_t_uint8_t: 3156; CHECK-PREP10: # %bb.0: # %entry 3157; CHECK-PREP10-NEXT: lis r4, 3725 3158; CHECK-PREP10-NEXT: ori r4, r4, 19025 3159; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3160; CHECK-PREP10-NEXT: stb r3, 0(r4) 3161; CHECK-PREP10-NEXT: blr 3162entry: 3163 %conv = trunc i16 %str to i8 3164 store atomic i8 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3165 ret void 3166} 3167 3168; Function Attrs: nofree norecurse nounwind uwtable willreturn 3169define dso_local void @st_0_uint16_t_uint16_t(i64 %ptr, i16 zeroext %str) { 3170; CHECK-LABEL: st_0_uint16_t_uint16_t: 3171; CHECK: # %bb.0: # %entry 3172; CHECK-NEXT: sth r4, 0(r3) 3173; CHECK-NEXT: blr 3174entry: 3175 %0 = inttoptr i64 %ptr to ptr 3176 store atomic i16 %str, ptr %0 monotonic, align 2 3177 ret void 3178} 3179 3180; Function Attrs: nofree norecurse nounwind uwtable willreturn 3181define dso_local void @st_align16_uint16_t_uint16_t(ptr nocapture %ptr, i16 zeroext %str) { 3182; CHECK-LABEL: st_align16_uint16_t_uint16_t: 3183; CHECK: # %bb.0: # %entry 3184; CHECK-NEXT: sth r4, 8(r3) 3185; CHECK-NEXT: blr 3186entry: 3187 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3188 store atomic i16 %str, ptr %add.ptr monotonic, align 2 3189 ret void 3190} 3191 3192; Function Attrs: nofree norecurse nounwind uwtable willreturn 3193define dso_local void @st_align32_uint16_t_uint16_t(ptr nocapture %ptr, i16 zeroext %str) { 3194; CHECK-P10-LABEL: st_align32_uint16_t_uint16_t: 3195; CHECK-P10: # %bb.0: # %entry 3196; CHECK-P10-NEXT: psth r4, 99999000(r3), 0 3197; CHECK-P10-NEXT: blr 3198; 3199; CHECK-PREP10-LABEL: st_align32_uint16_t_uint16_t: 3200; CHECK-PREP10: # %bb.0: # %entry 3201; CHECK-PREP10-NEXT: lis r5, 1525 3202; CHECK-PREP10-NEXT: ori r5, r5, 56600 3203; CHECK-PREP10-NEXT: sthx r4, r3, r5 3204; CHECK-PREP10-NEXT: blr 3205entry: 3206 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3207 store atomic i16 %str, ptr %add.ptr monotonic, align 2 3208 ret void 3209} 3210 3211; Function Attrs: nofree norecurse nounwind uwtable willreturn 3212define dso_local void @st_align64_uint16_t_uint16_t(ptr nocapture %ptr, i16 zeroext %str) { 3213; CHECK-P10-LABEL: st_align64_uint16_t_uint16_t: 3214; CHECK-P10: # %bb.0: # %entry 3215; CHECK-P10-NEXT: pli r5, 244140625 3216; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3217; CHECK-P10-NEXT: sthx r4, r3, r5 3218; CHECK-P10-NEXT: blr 3219; 3220; CHECK-PREP10-LABEL: st_align64_uint16_t_uint16_t: 3221; CHECK-PREP10: # %bb.0: # %entry 3222; CHECK-PREP10-NEXT: lis r5, 3725 3223; CHECK-PREP10-NEXT: ori r5, r5, 19025 3224; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3225; CHECK-PREP10-NEXT: sthx r4, r3, r5 3226; CHECK-PREP10-NEXT: blr 3227entry: 3228 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3229 store atomic i16 %str, ptr %add.ptr monotonic, align 2 3230 ret void 3231} 3232 3233; Function Attrs: nofree norecurse nounwind uwtable willreturn 3234define dso_local void @st_reg_uint16_t_uint16_t(ptr nocapture %ptr, i64 %off, i16 zeroext %str) { 3235; CHECK-LABEL: st_reg_uint16_t_uint16_t: 3236; CHECK: # %bb.0: # %entry 3237; CHECK-NEXT: sthx r5, r3, r4 3238; CHECK-NEXT: blr 3239entry: 3240 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3241 store atomic i16 %str, ptr %add.ptr monotonic, align 2 3242 ret void 3243} 3244 3245; Function Attrs: nofree norecurse nounwind uwtable willreturn 3246define dso_local void @st_or1_uint16_t_uint16_t(i64 %ptr, i8 zeroext %off, i16 zeroext %str) { 3247; CHECK-LABEL: st_or1_uint16_t_uint16_t: 3248; CHECK: # %bb.0: # %entry 3249; CHECK-NEXT: or r3, r4, r3 3250; CHECK-NEXT: sth r5, 0(r3) 3251; CHECK-NEXT: blr 3252entry: 3253 %conv = zext i8 %off to i64 3254 %or = or i64 %conv, %ptr 3255 %0 = inttoptr i64 %or to ptr 3256 store atomic i16 %str, ptr %0 monotonic, align 2 3257 ret void 3258} 3259 3260; Function Attrs: nofree norecurse nounwind uwtable willreturn 3261define dso_local void @st_not_disjoint16_uint16_t_uint16_t(i64 %ptr, i16 zeroext %str) { 3262; CHECK-LABEL: st_not_disjoint16_uint16_t_uint16_t: 3263; CHECK: # %bb.0: # %entry 3264; CHECK-NEXT: ori r3, r3, 6 3265; CHECK-NEXT: sth r4, 0(r3) 3266; CHECK-NEXT: blr 3267entry: 3268 %or = or i64 %ptr, 6 3269 %0 = inttoptr i64 %or to ptr 3270 store atomic i16 %str, ptr %0 monotonic, align 2 3271 ret void 3272} 3273 3274; Function Attrs: nofree norecurse nounwind uwtable willreturn 3275define dso_local void @st_disjoint_align16_uint16_t_uint16_t(i64 %ptr, i16 zeroext %str) { 3276; CHECK-LABEL: st_disjoint_align16_uint16_t_uint16_t: 3277; CHECK: # %bb.0: # %entry 3278; CHECK-NEXT: rldicr r3, r3, 0, 51 3279; CHECK-NEXT: sth r4, 24(r3) 3280; CHECK-NEXT: blr 3281entry: 3282 %and = and i64 %ptr, -4096 3283 %or = or i64 %and, 24 3284 %0 = inttoptr i64 %or to ptr 3285 store atomic i16 %str, ptr %0 monotonic, align 8 3286 ret void 3287} 3288 3289; Function Attrs: nofree norecurse nounwind uwtable willreturn 3290define dso_local void @st_not_disjoint32_uint16_t_uint16_t(i64 %ptr, i16 zeroext %str) { 3291; CHECK-LABEL: st_not_disjoint32_uint16_t_uint16_t: 3292; CHECK: # %bb.0: # %entry 3293; CHECK-NEXT: ori r3, r3, 34463 3294; CHECK-NEXT: oris r3, r3, 1 3295; CHECK-NEXT: sth r4, 0(r3) 3296; CHECK-NEXT: blr 3297entry: 3298 %or = or i64 %ptr, 99999 3299 %0 = inttoptr i64 %or to ptr 3300 store atomic i16 %str, ptr %0 monotonic, align 2 3301 ret void 3302} 3303 3304; Function Attrs: nofree norecurse nounwind uwtable willreturn 3305define dso_local void @st_disjoint_align32_uint16_t_uint16_t(i64 %ptr, i16 zeroext %str) { 3306; CHECK-P10-LABEL: st_disjoint_align32_uint16_t_uint16_t: 3307; CHECK-P10: # %bb.0: # %entry 3308; CHECK-P10-NEXT: lis r5, -15264 3309; CHECK-P10-NEXT: and r3, r3, r5 3310; CHECK-P10-NEXT: psth r4, 999990000(r3), 0 3311; CHECK-P10-NEXT: blr 3312; 3313; CHECK-PREP10-LABEL: st_disjoint_align32_uint16_t_uint16_t: 3314; CHECK-PREP10: # %bb.0: # %entry 3315; CHECK-PREP10-NEXT: lis r5, -15264 3316; CHECK-PREP10-NEXT: and r3, r3, r5 3317; CHECK-PREP10-NEXT: lis r5, 15258 3318; CHECK-PREP10-NEXT: ori r5, r5, 41712 3319; CHECK-PREP10-NEXT: sthx r4, r3, r5 3320; CHECK-PREP10-NEXT: blr 3321entry: 3322 %and = and i64 %ptr, -1000341504 3323 %or = or i64 %and, 999990000 3324 %0 = inttoptr i64 %or to ptr 3325 store atomic i16 %str, ptr %0 monotonic, align 16 3326 ret void 3327} 3328 3329; Function Attrs: nofree norecurse nounwind uwtable willreturn 3330define dso_local void @st_not_disjoint64_uint16_t_uint16_t(i64 %ptr, i16 zeroext %str) { 3331; CHECK-P10-LABEL: st_not_disjoint64_uint16_t_uint16_t: 3332; CHECK-P10: # %bb.0: # %entry 3333; CHECK-P10-NEXT: pli r5, 232 3334; CHECK-P10-NEXT: pli r6, 3567587329 3335; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 3336; CHECK-P10-NEXT: or r3, r3, r6 3337; CHECK-P10-NEXT: sth r4, 0(r3) 3338; CHECK-P10-NEXT: blr 3339; 3340; CHECK-PREP10-LABEL: st_not_disjoint64_uint16_t_uint16_t: 3341; CHECK-PREP10: # %bb.0: # %entry 3342; CHECK-PREP10-NEXT: li r5, 29 3343; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 3344; CHECK-PREP10-NEXT: oris r5, r5, 54437 3345; CHECK-PREP10-NEXT: ori r5, r5, 4097 3346; CHECK-PREP10-NEXT: or r3, r3, r5 3347; CHECK-PREP10-NEXT: sth r4, 0(r3) 3348; CHECK-PREP10-NEXT: blr 3349entry: 3350 %or = or i64 %ptr, 1000000000001 3351 %0 = inttoptr i64 %or to ptr 3352 store atomic i16 %str, ptr %0 monotonic, align 2 3353 ret void 3354} 3355 3356; Function Attrs: nofree norecurse nounwind uwtable willreturn 3357define dso_local void @st_disjoint_align64_uint16_t_uint16_t(i64 %ptr, i16 zeroext %str) { 3358; CHECK-P10-LABEL: st_disjoint_align64_uint16_t_uint16_t: 3359; CHECK-P10: # %bb.0: # %entry 3360; CHECK-P10-NEXT: pli r5, 244140625 3361; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3362; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3363; CHECK-P10-NEXT: sthx r4, r3, r5 3364; CHECK-P10-NEXT: blr 3365; 3366; CHECK-PREP10-LABEL: st_disjoint_align64_uint16_t_uint16_t: 3367; CHECK-PREP10: # %bb.0: # %entry 3368; CHECK-PREP10-NEXT: lis r5, 3725 3369; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3370; CHECK-PREP10-NEXT: ori r5, r5, 19025 3371; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3372; CHECK-PREP10-NEXT: sthx r4, r3, r5 3373; CHECK-PREP10-NEXT: blr 3374entry: 3375 %and = and i64 %ptr, -1099511627776 3376 %or = or i64 %and, 1000000000000 3377 %0 = inttoptr i64 %or to ptr 3378 store atomic i16 %str, ptr %0 monotonic, align 4096 3379 ret void 3380} 3381 3382; Function Attrs: nofree norecurse nounwind uwtable willreturn 3383define dso_local void @st_cst_align16_uint16_t_uint16_t(i16 zeroext %str) { 3384; CHECK-LABEL: st_cst_align16_uint16_t_uint16_t: 3385; CHECK: # %bb.0: # %entry 3386; CHECK-NEXT: sth r3, 4080(0) 3387; CHECK-NEXT: blr 3388entry: 3389 store atomic i16 %str, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3390 ret void 3391} 3392 3393; Function Attrs: nofree norecurse nounwind uwtable willreturn 3394define dso_local void @st_cst_align32_uint16_t_uint16_t(i16 zeroext %str) { 3395; CHECK-LABEL: st_cst_align32_uint16_t_uint16_t: 3396; CHECK: # %bb.0: # %entry 3397; CHECK-NEXT: lis r4, 153 3398; CHECK-NEXT: sth r3, -27108(r4) 3399; CHECK-NEXT: blr 3400entry: 3401 store atomic i16 %str, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 3402 ret void 3403} 3404 3405; Function Attrs: nofree norecurse nounwind uwtable willreturn 3406define dso_local void @st_cst_align64_uint16_t_uint16_t(i16 zeroext %str) { 3407; CHECK-P10-LABEL: st_cst_align64_uint16_t_uint16_t: 3408; CHECK-P10: # %bb.0: # %entry 3409; CHECK-P10-NEXT: pli r4, 244140625 3410; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3411; CHECK-P10-NEXT: sth r3, 0(r4) 3412; CHECK-P10-NEXT: blr 3413; 3414; CHECK-PREP10-LABEL: st_cst_align64_uint16_t_uint16_t: 3415; CHECK-PREP10: # %bb.0: # %entry 3416; CHECK-PREP10-NEXT: lis r4, 3725 3417; CHECK-PREP10-NEXT: ori r4, r4, 19025 3418; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3419; CHECK-PREP10-NEXT: sth r3, 0(r4) 3420; CHECK-PREP10-NEXT: blr 3421entry: 3422 store atomic i16 %str, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3423 ret void 3424} 3425 3426; Function Attrs: nofree norecurse nounwind uwtable willreturn 3427define dso_local void @st_0_uint16_t_uint32_t(i64 %ptr, i16 zeroext %str) { 3428; CHECK-LABEL: st_0_uint16_t_uint32_t: 3429; CHECK: # %bb.0: # %entry 3430; CHECK-NEXT: stw r4, 0(r3) 3431; CHECK-NEXT: blr 3432entry: 3433 %0 = inttoptr i64 %ptr to ptr 3434 %conv = zext i16 %str to i32 3435 store atomic i32 %conv, ptr %0 monotonic, align 4 3436 ret void 3437} 3438 3439; Function Attrs: nofree norecurse nounwind uwtable willreturn 3440define dso_local void @st_align16_uint16_t_uint32_t(ptr nocapture %ptr, i16 zeroext %str) { 3441; CHECK-LABEL: st_align16_uint16_t_uint32_t: 3442; CHECK: # %bb.0: # %entry 3443; CHECK-NEXT: stw r4, 8(r3) 3444; CHECK-NEXT: blr 3445entry: 3446 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3447 %conv = zext i16 %str to i32 3448 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 3449 ret void 3450} 3451 3452; Function Attrs: nofree norecurse nounwind uwtable willreturn 3453define dso_local void @st_align32_uint16_t_uint32_t(ptr nocapture %ptr, i16 zeroext %str) { 3454; CHECK-P10-LABEL: st_align32_uint16_t_uint32_t: 3455; CHECK-P10: # %bb.0: # %entry 3456; CHECK-P10-NEXT: pstw r4, 99999000(r3), 0 3457; CHECK-P10-NEXT: blr 3458; 3459; CHECK-PREP10-LABEL: st_align32_uint16_t_uint32_t: 3460; CHECK-PREP10: # %bb.0: # %entry 3461; CHECK-PREP10-NEXT: lis r5, 1525 3462; CHECK-PREP10-NEXT: ori r5, r5, 56600 3463; CHECK-PREP10-NEXT: stwx r4, r3, r5 3464; CHECK-PREP10-NEXT: blr 3465entry: 3466 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3467 %conv = zext i16 %str to i32 3468 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 3469 ret void 3470} 3471 3472; Function Attrs: nofree norecurse nounwind uwtable willreturn 3473define dso_local void @st_align64_uint16_t_uint32_t(ptr nocapture %ptr, i16 zeroext %str) { 3474; CHECK-P10-LABEL: st_align64_uint16_t_uint32_t: 3475; CHECK-P10: # %bb.0: # %entry 3476; CHECK-P10-NEXT: pli r5, 244140625 3477; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3478; CHECK-P10-NEXT: stwx r4, r3, r5 3479; CHECK-P10-NEXT: blr 3480; 3481; CHECK-PREP10-LABEL: st_align64_uint16_t_uint32_t: 3482; CHECK-PREP10: # %bb.0: # %entry 3483; CHECK-PREP10-NEXT: lis r5, 3725 3484; CHECK-PREP10-NEXT: ori r5, r5, 19025 3485; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3486; CHECK-PREP10-NEXT: stwx r4, r3, r5 3487; CHECK-PREP10-NEXT: blr 3488entry: 3489 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3490 %conv = zext i16 %str to i32 3491 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 3492 ret void 3493} 3494 3495; Function Attrs: nofree norecurse nounwind uwtable willreturn 3496define dso_local void @st_reg_uint16_t_uint32_t(ptr nocapture %ptr, i64 %off, i16 zeroext %str) { 3497; CHECK-LABEL: st_reg_uint16_t_uint32_t: 3498; CHECK: # %bb.0: # %entry 3499; CHECK-NEXT: stwx r5, r3, r4 3500; CHECK-NEXT: blr 3501entry: 3502 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3503 %conv = zext i16 %str to i32 3504 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 3505 ret void 3506} 3507 3508; Function Attrs: nofree norecurse nounwind uwtable willreturn 3509define dso_local void @st_or1_uint16_t_uint32_t(i64 %ptr, i8 zeroext %off, i16 zeroext %str) { 3510; CHECK-LABEL: st_or1_uint16_t_uint32_t: 3511; CHECK: # %bb.0: # %entry 3512; CHECK-NEXT: or r3, r4, r3 3513; CHECK-NEXT: stw r5, 0(r3) 3514; CHECK-NEXT: blr 3515entry: 3516 %conv = zext i8 %off to i64 3517 %or = or i64 %conv, %ptr 3518 %0 = inttoptr i64 %or to ptr 3519 %conv1 = zext i16 %str to i32 3520 store atomic i32 %conv1, ptr %0 monotonic, align 4 3521 ret void 3522} 3523 3524; Function Attrs: nofree norecurse nounwind uwtable willreturn 3525define dso_local void @st_not_disjoint16_uint16_t_uint32_t(i64 %ptr, i16 zeroext %str) { 3526; CHECK-LABEL: st_not_disjoint16_uint16_t_uint32_t: 3527; CHECK: # %bb.0: # %entry 3528; CHECK-NEXT: ori r3, r3, 6 3529; CHECK-NEXT: stw r4, 0(r3) 3530; CHECK-NEXT: blr 3531entry: 3532 %or = or i64 %ptr, 6 3533 %0 = inttoptr i64 %or to ptr 3534 %conv = zext i16 %str to i32 3535 store atomic i32 %conv, ptr %0 monotonic, align 4 3536 ret void 3537} 3538 3539; Function Attrs: nofree norecurse nounwind uwtable willreturn 3540define dso_local void @st_disjoint_align16_uint16_t_uint32_t(i64 %ptr, i16 zeroext %str) { 3541; CHECK-LABEL: st_disjoint_align16_uint16_t_uint32_t: 3542; CHECK: # %bb.0: # %entry 3543; CHECK-NEXT: rldicr r3, r3, 0, 51 3544; CHECK-NEXT: stw r4, 24(r3) 3545; CHECK-NEXT: blr 3546entry: 3547 %and = and i64 %ptr, -4096 3548 %or = or i64 %and, 24 3549 %0 = inttoptr i64 %or to ptr 3550 %conv = zext i16 %str to i32 3551 store atomic i32 %conv, ptr %0 monotonic, align 8 3552 ret void 3553} 3554 3555; Function Attrs: nofree norecurse nounwind uwtable willreturn 3556define dso_local void @st_not_disjoint32_uint16_t_uint32_t(i64 %ptr, i16 zeroext %str) { 3557; CHECK-LABEL: st_not_disjoint32_uint16_t_uint32_t: 3558; CHECK: # %bb.0: # %entry 3559; CHECK-NEXT: ori r3, r3, 34463 3560; CHECK-NEXT: oris r3, r3, 1 3561; CHECK-NEXT: stw r4, 0(r3) 3562; CHECK-NEXT: blr 3563entry: 3564 %or = or i64 %ptr, 99999 3565 %0 = inttoptr i64 %or to ptr 3566 %conv = zext i16 %str to i32 3567 store atomic i32 %conv, ptr %0 monotonic, align 4 3568 ret void 3569} 3570 3571; Function Attrs: nofree norecurse nounwind uwtable willreturn 3572define dso_local void @st_disjoint_align32_uint16_t_uint32_t(i64 %ptr, i16 zeroext %str) { 3573; CHECK-P10-LABEL: st_disjoint_align32_uint16_t_uint32_t: 3574; CHECK-P10: # %bb.0: # %entry 3575; CHECK-P10-NEXT: lis r5, -15264 3576; CHECK-P10-NEXT: and r3, r3, r5 3577; CHECK-P10-NEXT: pstw r4, 999990000(r3), 0 3578; CHECK-P10-NEXT: blr 3579; 3580; CHECK-PREP10-LABEL: st_disjoint_align32_uint16_t_uint32_t: 3581; CHECK-PREP10: # %bb.0: # %entry 3582; CHECK-PREP10-NEXT: lis r5, -15264 3583; CHECK-PREP10-NEXT: and r3, r3, r5 3584; CHECK-PREP10-NEXT: lis r5, 15258 3585; CHECK-PREP10-NEXT: ori r5, r5, 41712 3586; CHECK-PREP10-NEXT: stwx r4, r3, r5 3587; CHECK-PREP10-NEXT: blr 3588entry: 3589 %and = and i64 %ptr, -1000341504 3590 %or = or i64 %and, 999990000 3591 %0 = inttoptr i64 %or to ptr 3592 %conv = zext i16 %str to i32 3593 store atomic i32 %conv, ptr %0 monotonic, align 16 3594 ret void 3595} 3596 3597; Function Attrs: nofree norecurse nounwind uwtable willreturn 3598define dso_local void @st_not_disjoint64_uint16_t_uint32_t(i64 %ptr, i16 zeroext %str) { 3599; CHECK-P10-LABEL: st_not_disjoint64_uint16_t_uint32_t: 3600; CHECK-P10: # %bb.0: # %entry 3601; CHECK-P10-NEXT: pli r5, 232 3602; CHECK-P10-NEXT: pli r6, 3567587329 3603; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 3604; CHECK-P10-NEXT: or r3, r3, r6 3605; CHECK-P10-NEXT: stw r4, 0(r3) 3606; CHECK-P10-NEXT: blr 3607; 3608; CHECK-PREP10-LABEL: st_not_disjoint64_uint16_t_uint32_t: 3609; CHECK-PREP10: # %bb.0: # %entry 3610; CHECK-PREP10-NEXT: li r5, 29 3611; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 3612; CHECK-PREP10-NEXT: oris r5, r5, 54437 3613; CHECK-PREP10-NEXT: ori r5, r5, 4097 3614; CHECK-PREP10-NEXT: or r3, r3, r5 3615; CHECK-PREP10-NEXT: stw r4, 0(r3) 3616; CHECK-PREP10-NEXT: blr 3617entry: 3618 %or = or i64 %ptr, 1000000000001 3619 %0 = inttoptr i64 %or to ptr 3620 %conv = zext i16 %str to i32 3621 store atomic i32 %conv, ptr %0 monotonic, align 4 3622 ret void 3623} 3624 3625; Function Attrs: nofree norecurse nounwind uwtable willreturn 3626define dso_local void @st_disjoint_align64_uint16_t_uint32_t(i64 %ptr, i16 zeroext %str) { 3627; CHECK-P10-LABEL: st_disjoint_align64_uint16_t_uint32_t: 3628; CHECK-P10: # %bb.0: # %entry 3629; CHECK-P10-NEXT: pli r5, 244140625 3630; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3631; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3632; CHECK-P10-NEXT: stwx r4, r3, r5 3633; CHECK-P10-NEXT: blr 3634; 3635; CHECK-PREP10-LABEL: st_disjoint_align64_uint16_t_uint32_t: 3636; CHECK-PREP10: # %bb.0: # %entry 3637; CHECK-PREP10-NEXT: lis r5, 3725 3638; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3639; CHECK-PREP10-NEXT: ori r5, r5, 19025 3640; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3641; CHECK-PREP10-NEXT: stwx r4, r3, r5 3642; CHECK-PREP10-NEXT: blr 3643entry: 3644 %and = and i64 %ptr, -1099511627776 3645 %or = or i64 %and, 1000000000000 3646 %0 = inttoptr i64 %or to ptr 3647 %conv = zext i16 %str to i32 3648 store atomic i32 %conv, ptr %0 monotonic, align 4096 3649 ret void 3650} 3651 3652; Function Attrs: nofree norecurse nounwind uwtable willreturn 3653define dso_local void @st_cst_align16_uint16_t_uint32_t(i16 zeroext %str) { 3654; CHECK-LABEL: st_cst_align16_uint16_t_uint32_t: 3655; CHECK: # %bb.0: # %entry 3656; CHECK-NEXT: stw r3, 4080(0) 3657; CHECK-NEXT: blr 3658entry: 3659 %conv = zext i16 %str to i32 3660 store atomic i32 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3661 ret void 3662} 3663 3664; Function Attrs: nofree norecurse nounwind uwtable willreturn 3665define dso_local void @st_cst_align32_uint16_t_uint32_t(i16 zeroext %str) { 3666; CHECK-LABEL: st_cst_align32_uint16_t_uint32_t: 3667; CHECK: # %bb.0: # %entry 3668; CHECK-NEXT: lis r4, 153 3669; CHECK-NEXT: stw r3, -27108(r4) 3670; CHECK-NEXT: blr 3671entry: 3672 %conv = zext i16 %str to i32 3673 store atomic i32 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 3674 ret void 3675} 3676 3677; Function Attrs: nofree norecurse nounwind uwtable willreturn 3678define dso_local void @st_cst_align64_uint16_t_uint32_t(i16 zeroext %str) { 3679; CHECK-P10-LABEL: st_cst_align64_uint16_t_uint32_t: 3680; CHECK-P10: # %bb.0: # %entry 3681; CHECK-P10-NEXT: pli r4, 244140625 3682; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3683; CHECK-P10-NEXT: stw r3, 0(r4) 3684; CHECK-P10-NEXT: blr 3685; 3686; CHECK-PREP10-LABEL: st_cst_align64_uint16_t_uint32_t: 3687; CHECK-PREP10: # %bb.0: # %entry 3688; CHECK-PREP10-NEXT: lis r4, 3725 3689; CHECK-PREP10-NEXT: ori r4, r4, 19025 3690; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3691; CHECK-PREP10-NEXT: stw r3, 0(r4) 3692; CHECK-PREP10-NEXT: blr 3693entry: 3694 %conv = zext i16 %str to i32 3695 store atomic i32 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3696 ret void 3697} 3698 3699; Function Attrs: nofree norecurse nounwind uwtable willreturn 3700define dso_local void @st_0_uint16_t_uint64_t(i64 %ptr, i16 zeroext %str) { 3701; CHECK-LABEL: st_0_uint16_t_uint64_t: 3702; CHECK: # %bb.0: # %entry 3703; CHECK-NEXT: std r4, 0(r3) 3704; CHECK-NEXT: blr 3705entry: 3706 %0 = inttoptr i64 %ptr to ptr 3707 %conv = zext i16 %str to i64 3708 store atomic i64 %conv, ptr %0 monotonic, align 8 3709 ret void 3710} 3711 3712; Function Attrs: nofree norecurse nounwind uwtable willreturn 3713define dso_local void @st_align16_uint16_t_uint64_t(ptr nocapture %ptr, i16 zeroext %str) { 3714; CHECK-LABEL: st_align16_uint16_t_uint64_t: 3715; CHECK: # %bb.0: # %entry 3716; CHECK-NEXT: std r4, 8(r3) 3717; CHECK-NEXT: blr 3718entry: 3719 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3720 %conv = zext i16 %str to i64 3721 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 3722 ret void 3723} 3724 3725; Function Attrs: nofree norecurse nounwind uwtable willreturn 3726define dso_local void @st_align32_uint16_t_uint64_t(ptr nocapture %ptr, i16 zeroext %str) { 3727; CHECK-P10-LABEL: st_align32_uint16_t_uint64_t: 3728; CHECK-P10: # %bb.0: # %entry 3729; CHECK-P10-NEXT: pstd r4, 99999000(r3), 0 3730; CHECK-P10-NEXT: blr 3731; 3732; CHECK-PREP10-LABEL: st_align32_uint16_t_uint64_t: 3733; CHECK-PREP10: # %bb.0: # %entry 3734; CHECK-PREP10-NEXT: lis r5, 1525 3735; CHECK-PREP10-NEXT: ori r5, r5, 56600 3736; CHECK-PREP10-NEXT: stdx r4, r3, r5 3737; CHECK-PREP10-NEXT: blr 3738entry: 3739 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 3740 %conv = zext i16 %str to i64 3741 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 3742 ret void 3743} 3744 3745; Function Attrs: nofree norecurse nounwind uwtable willreturn 3746define dso_local void @st_align64_uint16_t_uint64_t(ptr nocapture %ptr, i16 zeroext %str) { 3747; CHECK-P10-LABEL: st_align64_uint16_t_uint64_t: 3748; CHECK-P10: # %bb.0: # %entry 3749; CHECK-P10-NEXT: pli r5, 244140625 3750; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3751; CHECK-P10-NEXT: stdx r4, r3, r5 3752; CHECK-P10-NEXT: blr 3753; 3754; CHECK-PREP10-LABEL: st_align64_uint16_t_uint64_t: 3755; CHECK-PREP10: # %bb.0: # %entry 3756; CHECK-PREP10-NEXT: lis r5, 3725 3757; CHECK-PREP10-NEXT: ori r5, r5, 19025 3758; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3759; CHECK-PREP10-NEXT: stdx r4, r3, r5 3760; CHECK-PREP10-NEXT: blr 3761entry: 3762 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 3763 %conv = zext i16 %str to i64 3764 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 3765 ret void 3766} 3767 3768; Function Attrs: nofree norecurse nounwind uwtable willreturn 3769define dso_local void @st_reg_uint16_t_uint64_t(ptr nocapture %ptr, i64 %off, i16 zeroext %str) { 3770; CHECK-LABEL: st_reg_uint16_t_uint64_t: 3771; CHECK: # %bb.0: # %entry 3772; CHECK-NEXT: stdx r5, r3, r4 3773; CHECK-NEXT: blr 3774entry: 3775 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 3776 %conv = zext i16 %str to i64 3777 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 3778 ret void 3779} 3780 3781; Function Attrs: nofree norecurse nounwind uwtable willreturn 3782define dso_local void @st_or1_uint16_t_uint64_t(i64 %ptr, i8 zeroext %off, i16 zeroext %str) { 3783; CHECK-LABEL: st_or1_uint16_t_uint64_t: 3784; CHECK: # %bb.0: # %entry 3785; CHECK-NEXT: or r3, r4, r3 3786; CHECK-NEXT: std r5, 0(r3) 3787; CHECK-NEXT: blr 3788entry: 3789 %conv = zext i8 %off to i64 3790 %or = or i64 %conv, %ptr 3791 %0 = inttoptr i64 %or to ptr 3792 %conv1 = zext i16 %str to i64 3793 store atomic i64 %conv1, ptr %0 monotonic, align 8 3794 ret void 3795} 3796 3797; Function Attrs: nofree norecurse nounwind uwtable willreturn 3798define dso_local void @st_not_disjoint16_uint16_t_uint64_t(i64 %ptr, i16 zeroext %str) { 3799; CHECK-LABEL: st_not_disjoint16_uint16_t_uint64_t: 3800; CHECK: # %bb.0: # %entry 3801; CHECK-NEXT: ori r3, r3, 6 3802; CHECK-NEXT: std r4, 0(r3) 3803; CHECK-NEXT: blr 3804entry: 3805 %or = or i64 %ptr, 6 3806 %0 = inttoptr i64 %or to ptr 3807 %conv = zext i16 %str to i64 3808 store atomic i64 %conv, ptr %0 monotonic, align 8 3809 ret void 3810} 3811 3812; Function Attrs: nofree norecurse nounwind uwtable willreturn 3813define dso_local void @st_disjoint_align16_uint16_t_uint64_t(i64 %ptr, i16 zeroext %str) { 3814; CHECK-LABEL: st_disjoint_align16_uint16_t_uint64_t: 3815; CHECK: # %bb.0: # %entry 3816; CHECK-NEXT: rldicr r3, r3, 0, 51 3817; CHECK-NEXT: std r4, 24(r3) 3818; CHECK-NEXT: blr 3819entry: 3820 %and = and i64 %ptr, -4096 3821 %or = or i64 %and, 24 3822 %0 = inttoptr i64 %or to ptr 3823 %conv = zext i16 %str to i64 3824 store atomic i64 %conv, ptr %0 monotonic, align 8 3825 ret void 3826} 3827 3828; Function Attrs: nofree norecurse nounwind uwtable willreturn 3829define dso_local void @st_not_disjoint32_uint16_t_uint64_t(i64 %ptr, i16 zeroext %str) { 3830; CHECK-LABEL: st_not_disjoint32_uint16_t_uint64_t: 3831; CHECK: # %bb.0: # %entry 3832; CHECK-NEXT: ori r3, r3, 34463 3833; CHECK-NEXT: oris r3, r3, 1 3834; CHECK-NEXT: std r4, 0(r3) 3835; CHECK-NEXT: blr 3836entry: 3837 %or = or i64 %ptr, 99999 3838 %0 = inttoptr i64 %or to ptr 3839 %conv = zext i16 %str to i64 3840 store atomic i64 %conv, ptr %0 monotonic, align 8 3841 ret void 3842} 3843 3844; Function Attrs: nofree norecurse nounwind uwtable willreturn 3845define dso_local void @st_disjoint_align32_uint16_t_uint64_t(i64 %ptr, i16 zeroext %str) { 3846; CHECK-P10-LABEL: st_disjoint_align32_uint16_t_uint64_t: 3847; CHECK-P10: # %bb.0: # %entry 3848; CHECK-P10-NEXT: lis r5, -15264 3849; CHECK-P10-NEXT: and r3, r3, r5 3850; CHECK-P10-NEXT: pstd r4, 999990000(r3), 0 3851; CHECK-P10-NEXT: blr 3852; 3853; CHECK-PREP10-LABEL: st_disjoint_align32_uint16_t_uint64_t: 3854; CHECK-PREP10: # %bb.0: # %entry 3855; CHECK-PREP10-NEXT: lis r5, -15264 3856; CHECK-PREP10-NEXT: and r3, r3, r5 3857; CHECK-PREP10-NEXT: lis r5, 15258 3858; CHECK-PREP10-NEXT: ori r5, r5, 41712 3859; CHECK-PREP10-NEXT: stdx r4, r3, r5 3860; CHECK-PREP10-NEXT: blr 3861entry: 3862 %and = and i64 %ptr, -1000341504 3863 %or = or i64 %and, 999990000 3864 %0 = inttoptr i64 %or to ptr 3865 %conv = zext i16 %str to i64 3866 store atomic i64 %conv, ptr %0 monotonic, align 16 3867 ret void 3868} 3869 3870; Function Attrs: nofree norecurse nounwind uwtable willreturn 3871define dso_local void @st_not_disjoint64_uint16_t_uint64_t(i64 %ptr, i16 zeroext %str) { 3872; CHECK-P10-LABEL: st_not_disjoint64_uint16_t_uint64_t: 3873; CHECK-P10: # %bb.0: # %entry 3874; CHECK-P10-NEXT: pli r5, 232 3875; CHECK-P10-NEXT: pli r6, 3567587329 3876; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 3877; CHECK-P10-NEXT: or r3, r3, r6 3878; CHECK-P10-NEXT: std r4, 0(r3) 3879; CHECK-P10-NEXT: blr 3880; 3881; CHECK-PREP10-LABEL: st_not_disjoint64_uint16_t_uint64_t: 3882; CHECK-PREP10: # %bb.0: # %entry 3883; CHECK-PREP10-NEXT: li r5, 29 3884; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 3885; CHECK-PREP10-NEXT: oris r5, r5, 54437 3886; CHECK-PREP10-NEXT: ori r5, r5, 4097 3887; CHECK-PREP10-NEXT: or r3, r3, r5 3888; CHECK-PREP10-NEXT: std r4, 0(r3) 3889; CHECK-PREP10-NEXT: blr 3890entry: 3891 %or = or i64 %ptr, 1000000000001 3892 %0 = inttoptr i64 %or to ptr 3893 %conv = zext i16 %str to i64 3894 store atomic i64 %conv, ptr %0 monotonic, align 8 3895 ret void 3896} 3897 3898; Function Attrs: nofree norecurse nounwind uwtable willreturn 3899define dso_local void @st_disjoint_align64_uint16_t_uint64_t(i64 %ptr, i16 zeroext %str) { 3900; CHECK-P10-LABEL: st_disjoint_align64_uint16_t_uint64_t: 3901; CHECK-P10: # %bb.0: # %entry 3902; CHECK-P10-NEXT: pli r5, 244140625 3903; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 3904; CHECK-P10-NEXT: rldic r5, r5, 12, 24 3905; CHECK-P10-NEXT: stdx r4, r3, r5 3906; CHECK-P10-NEXT: blr 3907; 3908; CHECK-PREP10-LABEL: st_disjoint_align64_uint16_t_uint64_t: 3909; CHECK-PREP10: # %bb.0: # %entry 3910; CHECK-PREP10-NEXT: lis r5, 3725 3911; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 3912; CHECK-PREP10-NEXT: ori r5, r5, 19025 3913; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 3914; CHECK-PREP10-NEXT: stdx r4, r3, r5 3915; CHECK-PREP10-NEXT: blr 3916entry: 3917 %and = and i64 %ptr, -1099511627776 3918 %or = or i64 %and, 1000000000000 3919 %0 = inttoptr i64 %or to ptr 3920 %conv = zext i16 %str to i64 3921 store atomic i64 %conv, ptr %0 monotonic, align 4096 3922 ret void 3923} 3924 3925; Function Attrs: nofree norecurse nounwind uwtable willreturn 3926define dso_local void @st_cst_align16_uint16_t_uint64_t(i16 zeroext %str) { 3927; CHECK-LABEL: st_cst_align16_uint16_t_uint64_t: 3928; CHECK: # %bb.0: # %entry 3929; CHECK-NEXT: std r3, 4080(0) 3930; CHECK-NEXT: blr 3931entry: 3932 %conv = zext i16 %str to i64 3933 store atomic i64 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 3934 ret void 3935} 3936 3937; Function Attrs: nofree norecurse nounwind uwtable willreturn 3938define dso_local void @st_cst_align32_uint16_t_uint64_t(i16 zeroext %str) { 3939; CHECK-LABEL: st_cst_align32_uint16_t_uint64_t: 3940; CHECK: # %bb.0: # %entry 3941; CHECK-NEXT: lis r4, 153 3942; CHECK-NEXT: std r3, -27108(r4) 3943; CHECK-NEXT: blr 3944entry: 3945 %conv = zext i16 %str to i64 3946 store atomic i64 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 3947 ret void 3948} 3949 3950; Function Attrs: nofree norecurse nounwind uwtable willreturn 3951define dso_local void @st_cst_align64_uint16_t_uint64_t(i16 zeroext %str) { 3952; CHECK-P10-LABEL: st_cst_align64_uint16_t_uint64_t: 3953; CHECK-P10: # %bb.0: # %entry 3954; CHECK-P10-NEXT: pli r4, 244140625 3955; CHECK-P10-NEXT: rldic r4, r4, 12, 24 3956; CHECK-P10-NEXT: std r3, 0(r4) 3957; CHECK-P10-NEXT: blr 3958; 3959; CHECK-PREP10-LABEL: st_cst_align64_uint16_t_uint64_t: 3960; CHECK-PREP10: # %bb.0: # %entry 3961; CHECK-PREP10-NEXT: lis r4, 3725 3962; CHECK-PREP10-NEXT: ori r4, r4, 19025 3963; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 3964; CHECK-PREP10-NEXT: std r3, 0(r4) 3965; CHECK-PREP10-NEXT: blr 3966entry: 3967 %conv = zext i16 %str to i64 3968 store atomic i64 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 3969 ret void 3970} 3971 3972; Function Attrs: nofree norecurse nounwind uwtable willreturn 3973define dso_local void @st_0_int16_t_uint32_t(i64 %ptr, i16 signext %str) { 3974; CHECK-LABEL: st_0_int16_t_uint32_t: 3975; CHECK: # %bb.0: # %entry 3976; CHECK-NEXT: stw r4, 0(r3) 3977; CHECK-NEXT: blr 3978entry: 3979 %0 = inttoptr i64 %ptr to ptr 3980 %conv = sext i16 %str to i32 3981 store atomic i32 %conv, ptr %0 monotonic, align 4 3982 ret void 3983} 3984 3985; Function Attrs: nofree norecurse nounwind uwtable willreturn 3986define dso_local void @st_align16_int16_t_uint32_t(ptr nocapture %ptr, i16 signext %str) { 3987; CHECK-LABEL: st_align16_int16_t_uint32_t: 3988; CHECK: # %bb.0: # %entry 3989; CHECK-NEXT: stw r4, 8(r3) 3990; CHECK-NEXT: blr 3991entry: 3992 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 3993 %conv = sext i16 %str to i32 3994 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 3995 ret void 3996} 3997 3998; Function Attrs: nofree norecurse nounwind uwtable willreturn 3999define dso_local void @st_align32_int16_t_uint32_t(ptr nocapture %ptr, i16 signext %str) { 4000; CHECK-P10-LABEL: st_align32_int16_t_uint32_t: 4001; CHECK-P10: # %bb.0: # %entry 4002; CHECK-P10-NEXT: pstw r4, 99999000(r3), 0 4003; CHECK-P10-NEXT: blr 4004; 4005; CHECK-PREP10-LABEL: st_align32_int16_t_uint32_t: 4006; CHECK-PREP10: # %bb.0: # %entry 4007; CHECK-PREP10-NEXT: lis r5, 1525 4008; CHECK-PREP10-NEXT: ori r5, r5, 56600 4009; CHECK-PREP10-NEXT: stwx r4, r3, r5 4010; CHECK-PREP10-NEXT: blr 4011entry: 4012 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 4013 %conv = sext i16 %str to i32 4014 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 4015 ret void 4016} 4017 4018; Function Attrs: nofree norecurse nounwind uwtable willreturn 4019define dso_local void @st_align64_int16_t_uint32_t(ptr nocapture %ptr, i16 signext %str) { 4020; CHECK-P10-LABEL: st_align64_int16_t_uint32_t: 4021; CHECK-P10: # %bb.0: # %entry 4022; CHECK-P10-NEXT: pli r5, 244140625 4023; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4024; CHECK-P10-NEXT: stwx r4, r3, r5 4025; CHECK-P10-NEXT: blr 4026; 4027; CHECK-PREP10-LABEL: st_align64_int16_t_uint32_t: 4028; CHECK-PREP10: # %bb.0: # %entry 4029; CHECK-PREP10-NEXT: lis r5, 3725 4030; CHECK-PREP10-NEXT: ori r5, r5, 19025 4031; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4032; CHECK-PREP10-NEXT: stwx r4, r3, r5 4033; CHECK-PREP10-NEXT: blr 4034entry: 4035 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 4036 %conv = sext i16 %str to i32 4037 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 4038 ret void 4039} 4040 4041; Function Attrs: nofree norecurse nounwind uwtable willreturn 4042define dso_local void @st_reg_int16_t_uint32_t(ptr nocapture %ptr, i64 %off, i16 signext %str) { 4043; CHECK-LABEL: st_reg_int16_t_uint32_t: 4044; CHECK: # %bb.0: # %entry 4045; CHECK-NEXT: stwx r5, r3, r4 4046; CHECK-NEXT: blr 4047entry: 4048 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 4049 %conv = sext i16 %str to i32 4050 store atomic i32 %conv, ptr %add.ptr monotonic, align 4 4051 ret void 4052} 4053 4054; Function Attrs: nofree norecurse nounwind uwtable willreturn 4055define dso_local void @st_or1_int16_t_uint32_t(i64 %ptr, i8 zeroext %off, i16 signext %str) { 4056; CHECK-LABEL: st_or1_int16_t_uint32_t: 4057; CHECK: # %bb.0: # %entry 4058; CHECK-NEXT: or r3, r4, r3 4059; CHECK-NEXT: stw r5, 0(r3) 4060; CHECK-NEXT: blr 4061entry: 4062 %conv = zext i8 %off to i64 4063 %or = or i64 %conv, %ptr 4064 %0 = inttoptr i64 %or to ptr 4065 %conv1 = sext i16 %str to i32 4066 store atomic i32 %conv1, ptr %0 monotonic, align 4 4067 ret void 4068} 4069 4070; Function Attrs: nofree norecurse nounwind uwtable willreturn 4071define dso_local void @st_not_disjoint16_int16_t_uint32_t(i64 %ptr, i16 signext %str) { 4072; CHECK-LABEL: st_not_disjoint16_int16_t_uint32_t: 4073; CHECK: # %bb.0: # %entry 4074; CHECK-NEXT: ori r3, r3, 6 4075; CHECK-NEXT: stw r4, 0(r3) 4076; CHECK-NEXT: blr 4077entry: 4078 %or = or i64 %ptr, 6 4079 %0 = inttoptr i64 %or to ptr 4080 %conv = sext i16 %str to i32 4081 store atomic i32 %conv, ptr %0 monotonic, align 4 4082 ret void 4083} 4084 4085; Function Attrs: nofree norecurse nounwind uwtable willreturn 4086define dso_local void @st_disjoint_align16_int16_t_uint32_t(i64 %ptr, i16 signext %str) { 4087; CHECK-LABEL: st_disjoint_align16_int16_t_uint32_t: 4088; CHECK: # %bb.0: # %entry 4089; CHECK-NEXT: rldicr r3, r3, 0, 51 4090; CHECK-NEXT: stw r4, 24(r3) 4091; CHECK-NEXT: blr 4092entry: 4093 %and = and i64 %ptr, -4096 4094 %or = or i64 %and, 24 4095 %0 = inttoptr i64 %or to ptr 4096 %conv = sext i16 %str to i32 4097 store atomic i32 %conv, ptr %0 monotonic, align 8 4098 ret void 4099} 4100 4101; Function Attrs: nofree norecurse nounwind uwtable willreturn 4102define dso_local void @st_not_disjoint32_int16_t_uint32_t(i64 %ptr, i16 signext %str) { 4103; CHECK-LABEL: st_not_disjoint32_int16_t_uint32_t: 4104; CHECK: # %bb.0: # %entry 4105; CHECK-NEXT: ori r3, r3, 34463 4106; CHECK-NEXT: oris r3, r3, 1 4107; CHECK-NEXT: stw r4, 0(r3) 4108; CHECK-NEXT: blr 4109entry: 4110 %or = or i64 %ptr, 99999 4111 %0 = inttoptr i64 %or to ptr 4112 %conv = sext i16 %str to i32 4113 store atomic i32 %conv, ptr %0 monotonic, align 4 4114 ret void 4115} 4116 4117; Function Attrs: nofree norecurse nounwind uwtable willreturn 4118define dso_local void @st_disjoint_align32_int16_t_uint32_t(i64 %ptr, i16 signext %str) { 4119; CHECK-P10-LABEL: st_disjoint_align32_int16_t_uint32_t: 4120; CHECK-P10: # %bb.0: # %entry 4121; CHECK-P10-NEXT: lis r5, -15264 4122; CHECK-P10-NEXT: and r3, r3, r5 4123; CHECK-P10-NEXT: pstw r4, 999990000(r3), 0 4124; CHECK-P10-NEXT: blr 4125; 4126; CHECK-PREP10-LABEL: st_disjoint_align32_int16_t_uint32_t: 4127; CHECK-PREP10: # %bb.0: # %entry 4128; CHECK-PREP10-NEXT: lis r5, -15264 4129; CHECK-PREP10-NEXT: and r3, r3, r5 4130; CHECK-PREP10-NEXT: lis r5, 15258 4131; CHECK-PREP10-NEXT: ori r5, r5, 41712 4132; CHECK-PREP10-NEXT: stwx r4, r3, r5 4133; CHECK-PREP10-NEXT: blr 4134entry: 4135 %and = and i64 %ptr, -1000341504 4136 %or = or i64 %and, 999990000 4137 %0 = inttoptr i64 %or to ptr 4138 %conv = sext i16 %str to i32 4139 store atomic i32 %conv, ptr %0 monotonic, align 16 4140 ret void 4141} 4142 4143; Function Attrs: nofree norecurse nounwind uwtable willreturn 4144define dso_local void @st_not_disjoint64_int16_t_uint32_t(i64 %ptr, i16 signext %str) { 4145; CHECK-P10-LABEL: st_not_disjoint64_int16_t_uint32_t: 4146; CHECK-P10: # %bb.0: # %entry 4147; CHECK-P10-NEXT: pli r5, 232 4148; CHECK-P10-NEXT: pli r6, 3567587329 4149; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 4150; CHECK-P10-NEXT: or r3, r3, r6 4151; CHECK-P10-NEXT: stw r4, 0(r3) 4152; CHECK-P10-NEXT: blr 4153; 4154; CHECK-PREP10-LABEL: st_not_disjoint64_int16_t_uint32_t: 4155; CHECK-PREP10: # %bb.0: # %entry 4156; CHECK-PREP10-NEXT: li r5, 29 4157; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 4158; CHECK-PREP10-NEXT: oris r5, r5, 54437 4159; CHECK-PREP10-NEXT: ori r5, r5, 4097 4160; CHECK-PREP10-NEXT: or r3, r3, r5 4161; CHECK-PREP10-NEXT: stw r4, 0(r3) 4162; CHECK-PREP10-NEXT: blr 4163entry: 4164 %or = or i64 %ptr, 1000000000001 4165 %0 = inttoptr i64 %or to ptr 4166 %conv = sext i16 %str to i32 4167 store atomic i32 %conv, ptr %0 monotonic, align 4 4168 ret void 4169} 4170 4171; Function Attrs: nofree norecurse nounwind uwtable willreturn 4172define dso_local void @st_disjoint_align64_int16_t_uint32_t(i64 %ptr, i16 signext %str) { 4173; CHECK-P10-LABEL: st_disjoint_align64_int16_t_uint32_t: 4174; CHECK-P10: # %bb.0: # %entry 4175; CHECK-P10-NEXT: pli r5, 244140625 4176; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 4177; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4178; CHECK-P10-NEXT: stwx r4, r3, r5 4179; CHECK-P10-NEXT: blr 4180; 4181; CHECK-PREP10-LABEL: st_disjoint_align64_int16_t_uint32_t: 4182; CHECK-PREP10: # %bb.0: # %entry 4183; CHECK-PREP10-NEXT: lis r5, 3725 4184; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 4185; CHECK-PREP10-NEXT: ori r5, r5, 19025 4186; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4187; CHECK-PREP10-NEXT: stwx r4, r3, r5 4188; CHECK-PREP10-NEXT: blr 4189entry: 4190 %and = and i64 %ptr, -1099511627776 4191 %or = or i64 %and, 1000000000000 4192 %0 = inttoptr i64 %or to ptr 4193 %conv = sext i16 %str to i32 4194 store atomic i32 %conv, ptr %0 monotonic, align 4096 4195 ret void 4196} 4197 4198; Function Attrs: nofree norecurse nounwind uwtable willreturn 4199define dso_local void @st_cst_align16_int16_t_uint32_t(i16 signext %str) { 4200; CHECK-LABEL: st_cst_align16_int16_t_uint32_t: 4201; CHECK: # %bb.0: # %entry 4202; CHECK-NEXT: stw r3, 4080(0) 4203; CHECK-NEXT: blr 4204entry: 4205 %conv = sext i16 %str to i32 4206 store atomic i32 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 4207 ret void 4208} 4209 4210; Function Attrs: nofree norecurse nounwind uwtable willreturn 4211define dso_local void @st_cst_align32_int16_t_uint32_t(i16 signext %str) { 4212; CHECK-LABEL: st_cst_align32_int16_t_uint32_t: 4213; CHECK: # %bb.0: # %entry 4214; CHECK-NEXT: lis r4, 153 4215; CHECK-NEXT: stw r3, -27108(r4) 4216; CHECK-NEXT: blr 4217entry: 4218 %conv = sext i16 %str to i32 4219 store atomic i32 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 4 4220 ret void 4221} 4222 4223; Function Attrs: nofree norecurse nounwind uwtable willreturn 4224define dso_local void @st_cst_align64_int16_t_uint32_t(i16 signext %str) { 4225; CHECK-P10-LABEL: st_cst_align64_int16_t_uint32_t: 4226; CHECK-P10: # %bb.0: # %entry 4227; CHECK-P10-NEXT: pli r4, 244140625 4228; CHECK-P10-NEXT: rldic r4, r4, 12, 24 4229; CHECK-P10-NEXT: stw r3, 0(r4) 4230; CHECK-P10-NEXT: blr 4231; 4232; CHECK-PREP10-LABEL: st_cst_align64_int16_t_uint32_t: 4233; CHECK-PREP10: # %bb.0: # %entry 4234; CHECK-PREP10-NEXT: lis r4, 3725 4235; CHECK-PREP10-NEXT: ori r4, r4, 19025 4236; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 4237; CHECK-PREP10-NEXT: stw r3, 0(r4) 4238; CHECK-PREP10-NEXT: blr 4239entry: 4240 %conv = sext i16 %str to i32 4241 store atomic i32 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 4242 ret void 4243} 4244 4245; Function Attrs: nofree norecurse nounwind uwtable willreturn 4246define dso_local void @st_0_int16_t_uint64_t(i64 %ptr, i16 signext %str) { 4247; CHECK-LABEL: st_0_int16_t_uint64_t: 4248; CHECK: # %bb.0: # %entry 4249; CHECK-NEXT: std r4, 0(r3) 4250; CHECK-NEXT: blr 4251entry: 4252 %0 = inttoptr i64 %ptr to ptr 4253 %conv = sext i16 %str to i64 4254 store atomic i64 %conv, ptr %0 monotonic, align 8 4255 ret void 4256} 4257 4258; Function Attrs: nofree norecurse nounwind uwtable willreturn 4259define dso_local void @st_align16_int16_t_uint64_t(ptr nocapture %ptr, i16 signext %str) { 4260; CHECK-LABEL: st_align16_int16_t_uint64_t: 4261; CHECK: # %bb.0: # %entry 4262; CHECK-NEXT: std r4, 8(r3) 4263; CHECK-NEXT: blr 4264entry: 4265 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 8 4266 %conv = sext i16 %str to i64 4267 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4268 ret void 4269} 4270 4271; Function Attrs: nofree norecurse nounwind uwtable willreturn 4272define dso_local void @st_align32_int16_t_uint64_t(ptr nocapture %ptr, i16 signext %str) { 4273; CHECK-P10-LABEL: st_align32_int16_t_uint64_t: 4274; CHECK-P10: # %bb.0: # %entry 4275; CHECK-P10-NEXT: pstd r4, 99999000(r3), 0 4276; CHECK-P10-NEXT: blr 4277; 4278; CHECK-PREP10-LABEL: st_align32_int16_t_uint64_t: 4279; CHECK-PREP10: # %bb.0: # %entry 4280; CHECK-PREP10-NEXT: lis r5, 1525 4281; CHECK-PREP10-NEXT: ori r5, r5, 56600 4282; CHECK-PREP10-NEXT: stdx r4, r3, r5 4283; CHECK-PREP10-NEXT: blr 4284entry: 4285 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 99999000 4286 %conv = sext i16 %str to i64 4287 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4288 ret void 4289} 4290 4291; Function Attrs: nofree norecurse nounwind uwtable willreturn 4292define dso_local void @st_align64_int16_t_uint64_t(ptr nocapture %ptr, i16 signext %str) { 4293; CHECK-P10-LABEL: st_align64_int16_t_uint64_t: 4294; CHECK-P10: # %bb.0: # %entry 4295; CHECK-P10-NEXT: pli r5, 244140625 4296; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4297; CHECK-P10-NEXT: stdx r4, r3, r5 4298; CHECK-P10-NEXT: blr 4299; 4300; CHECK-PREP10-LABEL: st_align64_int16_t_uint64_t: 4301; CHECK-PREP10: # %bb.0: # %entry 4302; CHECK-PREP10-NEXT: lis r5, 3725 4303; CHECK-PREP10-NEXT: ori r5, r5, 19025 4304; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4305; CHECK-PREP10-NEXT: stdx r4, r3, r5 4306; CHECK-PREP10-NEXT: blr 4307entry: 4308 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 1000000000000 4309 %conv = sext i16 %str to i64 4310 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4311 ret void 4312} 4313 4314; Function Attrs: nofree norecurse nounwind uwtable willreturn 4315define dso_local void @st_reg_int16_t_uint64_t(ptr nocapture %ptr, i64 %off, i16 signext %str) { 4316; CHECK-LABEL: st_reg_int16_t_uint64_t: 4317; CHECK: # %bb.0: # %entry 4318; CHECK-NEXT: stdx r5, r3, r4 4319; CHECK-NEXT: blr 4320entry: 4321 %add.ptr = getelementptr inbounds i8, ptr %ptr, i64 %off 4322 %conv = sext i16 %str to i64 4323 store atomic i64 %conv, ptr %add.ptr monotonic, align 8 4324 ret void 4325} 4326 4327; Function Attrs: nofree norecurse nounwind uwtable willreturn 4328define dso_local void @st_or1_int16_t_uint64_t(i64 %ptr, i8 zeroext %off, i16 signext %str) { 4329; CHECK-LABEL: st_or1_int16_t_uint64_t: 4330; CHECK: # %bb.0: # %entry 4331; CHECK-NEXT: or r3, r4, r3 4332; CHECK-NEXT: std r5, 0(r3) 4333; CHECK-NEXT: blr 4334entry: 4335 %conv = zext i8 %off to i64 4336 %or = or i64 %conv, %ptr 4337 %0 = inttoptr i64 %or to ptr 4338 %conv1 = sext i16 %str to i64 4339 store atomic i64 %conv1, ptr %0 monotonic, align 8 4340 ret void 4341} 4342 4343; Function Attrs: nofree norecurse nounwind uwtable willreturn 4344define dso_local void @st_not_disjoint16_int16_t_uint64_t(i64 %ptr, i16 signext %str) { 4345; CHECK-LABEL: st_not_disjoint16_int16_t_uint64_t: 4346; CHECK: # %bb.0: # %entry 4347; CHECK-NEXT: ori r3, r3, 6 4348; CHECK-NEXT: std r4, 0(r3) 4349; CHECK-NEXT: blr 4350entry: 4351 %or = or i64 %ptr, 6 4352 %0 = inttoptr i64 %or to ptr 4353 %conv = sext i16 %str to i64 4354 store atomic i64 %conv, ptr %0 monotonic, align 8 4355 ret void 4356} 4357 4358; Function Attrs: nofree norecurse nounwind uwtable willreturn 4359define dso_local void @st_disjoint_align16_int16_t_uint64_t(i64 %ptr, i16 signext %str) { 4360; CHECK-LABEL: st_disjoint_align16_int16_t_uint64_t: 4361; CHECK: # %bb.0: # %entry 4362; CHECK-NEXT: rldicr r3, r3, 0, 51 4363; CHECK-NEXT: std r4, 24(r3) 4364; CHECK-NEXT: blr 4365entry: 4366 %and = and i64 %ptr, -4096 4367 %or = or i64 %and, 24 4368 %0 = inttoptr i64 %or to ptr 4369 %conv = sext i16 %str to i64 4370 store atomic i64 %conv, ptr %0 monotonic, align 8 4371 ret void 4372} 4373 4374; Function Attrs: nofree norecurse nounwind uwtable willreturn 4375define dso_local void @st_not_disjoint32_int16_t_uint64_t(i64 %ptr, i16 signext %str) { 4376; CHECK-LABEL: st_not_disjoint32_int16_t_uint64_t: 4377; CHECK: # %bb.0: # %entry 4378; CHECK-NEXT: ori r3, r3, 34463 4379; CHECK-NEXT: oris r3, r3, 1 4380; CHECK-NEXT: std r4, 0(r3) 4381; CHECK-NEXT: blr 4382entry: 4383 %or = or i64 %ptr, 99999 4384 %0 = inttoptr i64 %or to ptr 4385 %conv = sext i16 %str to i64 4386 store atomic i64 %conv, ptr %0 monotonic, align 8 4387 ret void 4388} 4389 4390; Function Attrs: nofree norecurse nounwind uwtable willreturn 4391define dso_local void @st_disjoint_align32_int16_t_uint64_t(i64 %ptr, i16 signext %str) { 4392; CHECK-P10-LABEL: st_disjoint_align32_int16_t_uint64_t: 4393; CHECK-P10: # %bb.0: # %entry 4394; CHECK-P10-NEXT: lis r5, -15264 4395; CHECK-P10-NEXT: and r3, r3, r5 4396; CHECK-P10-NEXT: pstd r4, 999990000(r3), 0 4397; CHECK-P10-NEXT: blr 4398; 4399; CHECK-PREP10-LABEL: st_disjoint_align32_int16_t_uint64_t: 4400; CHECK-PREP10: # %bb.0: # %entry 4401; CHECK-PREP10-NEXT: lis r5, -15264 4402; CHECK-PREP10-NEXT: and r3, r3, r5 4403; CHECK-PREP10-NEXT: lis r5, 15258 4404; CHECK-PREP10-NEXT: ori r5, r5, 41712 4405; CHECK-PREP10-NEXT: stdx r4, r3, r5 4406; CHECK-PREP10-NEXT: blr 4407entry: 4408 %and = and i64 %ptr, -1000341504 4409 %or = or i64 %and, 999990000 4410 %0 = inttoptr i64 %or to ptr 4411 %conv = sext i16 %str to i64 4412 store atomic i64 %conv, ptr %0 monotonic, align 16 4413 ret void 4414} 4415 4416; Function Attrs: nofree norecurse nounwind uwtable willreturn 4417define dso_local void @st_not_disjoint64_int16_t_uint64_t(i64 %ptr, i16 signext %str) { 4418; CHECK-P10-LABEL: st_not_disjoint64_int16_t_uint64_t: 4419; CHECK-P10: # %bb.0: # %entry 4420; CHECK-P10-NEXT: pli r5, 232 4421; CHECK-P10-NEXT: pli r6, 3567587329 4422; CHECK-P10-NEXT: rldimi r6, r5, 32, 0 4423; CHECK-P10-NEXT: or r3, r3, r6 4424; CHECK-P10-NEXT: std r4, 0(r3) 4425; CHECK-P10-NEXT: blr 4426; 4427; CHECK-PREP10-LABEL: st_not_disjoint64_int16_t_uint64_t: 4428; CHECK-PREP10: # %bb.0: # %entry 4429; CHECK-PREP10-NEXT: li r5, 29 4430; CHECK-PREP10-NEXT: rldic r5, r5, 35, 24 4431; CHECK-PREP10-NEXT: oris r5, r5, 54437 4432; CHECK-PREP10-NEXT: ori r5, r5, 4097 4433; CHECK-PREP10-NEXT: or r3, r3, r5 4434; CHECK-PREP10-NEXT: std r4, 0(r3) 4435; CHECK-PREP10-NEXT: blr 4436entry: 4437 %or = or i64 %ptr, 1000000000001 4438 %0 = inttoptr i64 %or to ptr 4439 %conv = sext i16 %str to i64 4440 store atomic i64 %conv, ptr %0 monotonic, align 8 4441 ret void 4442} 4443 4444; Function Attrs: nofree norecurse nounwind uwtable willreturn 4445define dso_local void @st_disjoint_align64_int16_t_uint64_t(i64 %ptr, i16 signext %str) { 4446; CHECK-P10-LABEL: st_disjoint_align64_int16_t_uint64_t: 4447; CHECK-P10: # %bb.0: # %entry 4448; CHECK-P10-NEXT: pli r5, 244140625 4449; CHECK-P10-NEXT: rldicr r3, r3, 0, 23 4450; CHECK-P10-NEXT: rldic r5, r5, 12, 24 4451; CHECK-P10-NEXT: stdx r4, r3, r5 4452; CHECK-P10-NEXT: blr 4453; 4454; CHECK-PREP10-LABEL: st_disjoint_align64_int16_t_uint64_t: 4455; CHECK-PREP10: # %bb.0: # %entry 4456; CHECK-PREP10-NEXT: lis r5, 3725 4457; CHECK-PREP10-NEXT: rldicr r3, r3, 0, 23 4458; CHECK-PREP10-NEXT: ori r5, r5, 19025 4459; CHECK-PREP10-NEXT: rldic r5, r5, 12, 24 4460; CHECK-PREP10-NEXT: stdx r4, r3, r5 4461; CHECK-PREP10-NEXT: blr 4462entry: 4463 %and = and i64 %ptr, -1099511627776 4464 %or = or i64 %and, 1000000000000 4465 %0 = inttoptr i64 %or to ptr 4466 %conv = sext i16 %str to i64 4467 store atomic i64 %conv, ptr %0 monotonic, align 4096 4468 ret void 4469} 4470 4471; Function Attrs: nofree norecurse nounwind uwtable willreturn 4472define dso_local void @st_cst_align16_int16_t_uint64_t(i16 signext %str) { 4473; CHECK-LABEL: st_cst_align16_int16_t_uint64_t: 4474; CHECK: # %bb.0: # %entry 4475; CHECK-NEXT: std r3, 4080(0) 4476; CHECK-NEXT: blr 4477entry: 4478 %conv = sext i16 %str to i64 4479 store atomic i64 %conv, ptr inttoptr (i64 4080 to ptr) monotonic, align 16 4480 ret void 4481} 4482 4483; Function Attrs: nofree norecurse nounwind uwtable willreturn 4484define dso_local void @st_cst_align32_int16_t_uint64_t(i16 signext %str) { 4485; CHECK-LABEL: st_cst_align32_int16_t_uint64_t: 4486; CHECK: # %bb.0: # %entry 4487; CHECK-NEXT: lis r4, 153 4488; CHECK-NEXT: std r3, -27108(r4) 4489; CHECK-NEXT: blr 4490entry: 4491 %conv = sext i16 %str to i64 4492 store atomic i64 %conv, ptr inttoptr (i64 9999900 to ptr) monotonic, align 8 4493 ret void 4494} 4495 4496; Function Attrs: nofree norecurse nounwind uwtable willreturn 4497define dso_local void @st_cst_align64_int16_t_uint64_t(i16 signext %str) { 4498; CHECK-P10-LABEL: st_cst_align64_int16_t_uint64_t: 4499; CHECK-P10: # %bb.0: # %entry 4500; CHECK-P10-NEXT: pli r4, 244140625 4501; CHECK-P10-NEXT: rldic r4, r4, 12, 24 4502; CHECK-P10-NEXT: std r3, 0(r4) 4503; CHECK-P10-NEXT: blr 4504; 4505; CHECK-PREP10-LABEL: st_cst_align64_int16_t_uint64_t: 4506; CHECK-PREP10: # %bb.0: # %entry 4507; CHECK-PREP10-NEXT: lis r4, 3725 4508; CHECK-PREP10-NEXT: ori r4, r4, 19025 4509; CHECK-PREP10-NEXT: rldic r4, r4, 12, 24 4510; CHECK-PREP10-NEXT: std r3, 0(r4) 4511; CHECK-PREP10-NEXT: blr 4512entry: 4513 %conv = sext i16 %str to i64 4514 store atomic i64 %conv, ptr inttoptr (i64 1000000000000 to ptr) monotonic, align 4096 4515 ret void 4516} 4517