1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2 2; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \ 3; RUN: -mtriple powerpc64-ibm-aix-xcoff -code-model=large < %s | \ 4; RUN: FileCheck %s -check-prefix=LARGE64 5; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \ 6; RUN: -mtriple powerpc64-ibm-aix-xcoff -code-model=small < %s | \ 7; RUN: FileCheck %s -check-prefix=SMALL64 8; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \ 9; RUN: -mtriple powerpc-ibm-aix-xcoff -code-model=large < %s | \ 10; RUN: FileCheck %s -check-prefix=LARGE32 11; RUN: llc -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \ 12; RUN: -mtriple powerpc-ibm-aix-xcoff -code-model=small < %s | \ 13; RUN: FileCheck %s -check-prefix=SMALL32 14 15@global_int_zero = thread_local(initialexec) global i32 0, align 4 16@global_int_nonzero = thread_local(initialexec) global i32 1, align 4 17@intern_int_zero = internal thread_local(initialexec) global i32 0, align 4 18@intern_int_nonzero = internal thread_local(initialexec) global i32 1, align 4 19 20@global_long_zero = thread_local(initialexec) global i64 0, align 8 21@global_long_nonzero = thread_local(initialexec) global i64 1, align 8 22@intern_long_zero = internal thread_local(initialexec) global i64 0, align 8 23@intern_long_nonzero = internal thread_local(initialexec) global i64 1, align 8 24 25@global_float_zero = thread_local(initialexec) global float 0.000000, align 4 26@global_float_nonzero = thread_local(initialexec) global float 1.000000, align 4 27@intern_float_zero = internal thread_local(initialexec) global float 0.000000, align 4 28@intern_float_nonzero = internal thread_local(initialexec) global float 1.000000, align 4 29 30@global_double_zero = thread_local(initialexec) global double 0.000000, align 8 31@global_double_nonzero = thread_local(initialexec) global double 1.000000, align 8 32@intern_double_zero = internal thread_local(initialexec) global double 0.000000, align 8 33@intern_double_nonzero = internal thread_local(initialexec) global double 1.000000, align 8 34 35define void @store_global_int_zero(i32 noundef signext %i) { 36; LARGE64-LABEL: store_global_int_zero: 37; LARGE64: # %bb.0: # %entry 38; LARGE64-NEXT: addis r4, L..C0@u(r2) 39; LARGE64-NEXT: ld r4, L..C0@l(r4) 40; LARGE64-NEXT: stwx r3, r13, r4 41; LARGE64-NEXT: blr 42; 43; SMALL64-LABEL: store_global_int_zero: 44; SMALL64: # %bb.0: # %entry 45; SMALL64-NEXT: ld r4, L..C0(r2) # target-flags(ppc-tprel) @global_int_zero 46; SMALL64-NEXT: stwx r3, r13, r4 47; SMALL64-NEXT: blr 48; 49; LARGE32-LABEL: store_global_int_zero: 50; LARGE32: # %bb.0: # %entry 51; LARGE32-NEXT: mflr r0 52; LARGE32-NEXT: stwu r1, -32(r1) 53; LARGE32-NEXT: stw r0, 40(r1) 54; LARGE32-NEXT: mr r4, r3 55; LARGE32-NEXT: addis r3, L..C0@u(r2) 56; LARGE32-NEXT: lwz r5, L..C0@l(r3) 57; LARGE32-NEXT: bla .__get_tpointer[PR] 58; LARGE32-NEXT: stwx r4, r3, r5 59; LARGE32-NEXT: addi r1, r1, 32 60; LARGE32-NEXT: lwz r0, 8(r1) 61; LARGE32-NEXT: mtlr r0 62; LARGE32-NEXT: blr 63; 64; SMALL32-LABEL: store_global_int_zero: 65; SMALL32: # %bb.0: # %entry 66; SMALL32-NEXT: mflr r0 67; SMALL32-NEXT: stwu r1, -32(r1) 68; SMALL32-NEXT: lwz r5, L..C0(r2) # target-flags(ppc-tprel) @global_int_zero 69; SMALL32-NEXT: mr r4, r3 70; SMALL32-NEXT: bla .__get_tpointer[PR] 71; SMALL32-NEXT: stw r0, 40(r1) 72; SMALL32-NEXT: stwx r4, r3, r5 73; SMALL32-NEXT: addi r1, r1, 32 74; SMALL32-NEXT: lwz r0, 8(r1) 75; SMALL32-NEXT: mtlr r0 76; SMALL32-NEXT: blr 77entry: 78 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_int_zero) 79 store i32 %i, ptr %addr, align 4 80 ret void 81} 82 83define void @store_global_int_nonzero(i32 noundef signext %i) { 84; LARGE64-LABEL: store_global_int_nonzero: 85; LARGE64: # %bb.0: # %entry 86; LARGE64-NEXT: addis r4, L..C1@u(r2) 87; LARGE64-NEXT: ld r4, L..C1@l(r4) 88; LARGE64-NEXT: stwx r3, r13, r4 89; LARGE64-NEXT: blr 90; 91; SMALL64-LABEL: store_global_int_nonzero: 92; SMALL64: # %bb.0: # %entry 93; SMALL64-NEXT: ld r4, L..C1(r2) # target-flags(ppc-tprel) @global_int_nonzero 94; SMALL64-NEXT: stwx r3, r13, r4 95; SMALL64-NEXT: blr 96; 97; LARGE32-LABEL: store_global_int_nonzero: 98; LARGE32: # %bb.0: # %entry 99; LARGE32-NEXT: mflr r0 100; LARGE32-NEXT: stwu r1, -32(r1) 101; LARGE32-NEXT: stw r0, 40(r1) 102; LARGE32-NEXT: mr r4, r3 103; LARGE32-NEXT: addis r3, L..C1@u(r2) 104; LARGE32-NEXT: lwz r5, L..C1@l(r3) 105; LARGE32-NEXT: bla .__get_tpointer[PR] 106; LARGE32-NEXT: stwx r4, r3, r5 107; LARGE32-NEXT: addi r1, r1, 32 108; LARGE32-NEXT: lwz r0, 8(r1) 109; LARGE32-NEXT: mtlr r0 110; LARGE32-NEXT: blr 111; 112; SMALL32-LABEL: store_global_int_nonzero: 113; SMALL32: # %bb.0: # %entry 114; SMALL32-NEXT: mflr r0 115; SMALL32-NEXT: stwu r1, -32(r1) 116; SMALL32-NEXT: lwz r5, L..C1(r2) # target-flags(ppc-tprel) @global_int_nonzero 117; SMALL32-NEXT: mr r4, r3 118; SMALL32-NEXT: bla .__get_tpointer[PR] 119; SMALL32-NEXT: stw r0, 40(r1) 120; SMALL32-NEXT: stwx r4, r3, r5 121; SMALL32-NEXT: addi r1, r1, 32 122; SMALL32-NEXT: lwz r0, 8(r1) 123; SMALL32-NEXT: mtlr r0 124; SMALL32-NEXT: blr 125entry: 126 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_int_nonzero) 127 store i32 %i, ptr %addr, align 4 128 ret void 129} 130 131define void @store_intern_int_zero(i32 noundef signext %i) { 132; LARGE64-LABEL: store_intern_int_zero: 133; LARGE64: # %bb.0: # %entry 134; LARGE64-NEXT: addis r4, L..C2@u(r2) 135; LARGE64-NEXT: ld r4, L..C2@l(r4) 136; LARGE64-NEXT: stwx r3, r13, r4 137; LARGE64-NEXT: blr 138; 139; SMALL64-LABEL: store_intern_int_zero: 140; SMALL64: # %bb.0: # %entry 141; SMALL64-NEXT: ld r4, L..C2(r2) # target-flags(ppc-tprel) @intern_int_zero 142; SMALL64-NEXT: stwx r3, r13, r4 143; SMALL64-NEXT: blr 144; 145; LARGE32-LABEL: store_intern_int_zero: 146; LARGE32: # %bb.0: # %entry 147; LARGE32-NEXT: mflr r0 148; LARGE32-NEXT: stwu r1, -32(r1) 149; LARGE32-NEXT: stw r0, 40(r1) 150; LARGE32-NEXT: mr r4, r3 151; LARGE32-NEXT: addis r3, L..C2@u(r2) 152; LARGE32-NEXT: lwz r5, L..C2@l(r3) 153; LARGE32-NEXT: bla .__get_tpointer[PR] 154; LARGE32-NEXT: stwx r4, r3, r5 155; LARGE32-NEXT: addi r1, r1, 32 156; LARGE32-NEXT: lwz r0, 8(r1) 157; LARGE32-NEXT: mtlr r0 158; LARGE32-NEXT: blr 159; 160; SMALL32-LABEL: store_intern_int_zero: 161; SMALL32: # %bb.0: # %entry 162; SMALL32-NEXT: mflr r0 163; SMALL32-NEXT: stwu r1, -32(r1) 164; SMALL32-NEXT: lwz r5, L..C2(r2) # target-flags(ppc-tprel) @intern_int_zero 165; SMALL32-NEXT: mr r4, r3 166; SMALL32-NEXT: bla .__get_tpointer[PR] 167; SMALL32-NEXT: stw r0, 40(r1) 168; SMALL32-NEXT: stwx r4, r3, r5 169; SMALL32-NEXT: addi r1, r1, 32 170; SMALL32-NEXT: lwz r0, 8(r1) 171; SMALL32-NEXT: mtlr r0 172; SMALL32-NEXT: blr 173entry: 174 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_zero) 175 store i32 %i, ptr %addr, align 4 176 ret void 177} 178 179define void @store_intern_int_nonzero(i32 noundef signext %i) { 180; LARGE64-LABEL: store_intern_int_nonzero: 181; LARGE64: # %bb.0: # %entry 182; LARGE64-NEXT: addis r4, L..C3@u(r2) 183; LARGE64-NEXT: ld r4, L..C3@l(r4) 184; LARGE64-NEXT: stwx r3, r13, r4 185; LARGE64-NEXT: blr 186; 187; SMALL64-LABEL: store_intern_int_nonzero: 188; SMALL64: # %bb.0: # %entry 189; SMALL64-NEXT: ld r4, L..C3(r2) # target-flags(ppc-tprel) @intern_int_nonzero 190; SMALL64-NEXT: stwx r3, r13, r4 191; SMALL64-NEXT: blr 192; 193; LARGE32-LABEL: store_intern_int_nonzero: 194; LARGE32: # %bb.0: # %entry 195; LARGE32-NEXT: mflr r0 196; LARGE32-NEXT: stwu r1, -32(r1) 197; LARGE32-NEXT: stw r0, 40(r1) 198; LARGE32-NEXT: mr r4, r3 199; LARGE32-NEXT: addis r3, L..C3@u(r2) 200; LARGE32-NEXT: lwz r5, L..C3@l(r3) 201; LARGE32-NEXT: bla .__get_tpointer[PR] 202; LARGE32-NEXT: stwx r4, r3, r5 203; LARGE32-NEXT: addi r1, r1, 32 204; LARGE32-NEXT: lwz r0, 8(r1) 205; LARGE32-NEXT: mtlr r0 206; LARGE32-NEXT: blr 207; 208; SMALL32-LABEL: store_intern_int_nonzero: 209; SMALL32: # %bb.0: # %entry 210; SMALL32-NEXT: mflr r0 211; SMALL32-NEXT: stwu r1, -32(r1) 212; SMALL32-NEXT: lwz r5, L..C3(r2) # target-flags(ppc-tprel) @intern_int_nonzero 213; SMALL32-NEXT: mr r4, r3 214; SMALL32-NEXT: bla .__get_tpointer[PR] 215; SMALL32-NEXT: stw r0, 40(r1) 216; SMALL32-NEXT: stwx r4, r3, r5 217; SMALL32-NEXT: addi r1, r1, 32 218; SMALL32-NEXT: lwz r0, 8(r1) 219; SMALL32-NEXT: mtlr r0 220; SMALL32-NEXT: blr 221entry: 222 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_nonzero) 223 store i32 %i, ptr %addr, align 4 224 ret void 225} 226 227define signext i32 @load_global_int_zero() { 228; LARGE64-LABEL: load_global_int_zero: 229; LARGE64: # %bb.0: # %entry 230; LARGE64-NEXT: addis r3, L..C0@u(r2) 231; LARGE64-NEXT: ld r3, L..C0@l(r3) 232; LARGE64-NEXT: lwax r3, r13, r3 233; LARGE64-NEXT: blr 234; 235; SMALL64-LABEL: load_global_int_zero: 236; SMALL64: # %bb.0: # %entry 237; SMALL64-NEXT: ld r3, L..C0(r2) # target-flags(ppc-tprel) @global_int_zero 238; SMALL64-NEXT: lwax r3, r13, r3 239; SMALL64-NEXT: blr 240; 241; LARGE32-LABEL: load_global_int_zero: 242; LARGE32: # %bb.0: # %entry 243; LARGE32-NEXT: mflr r0 244; LARGE32-NEXT: stwu r1, -32(r1) 245; LARGE32-NEXT: stw r0, 40(r1) 246; LARGE32-NEXT: addis r3, L..C0@u(r2) 247; LARGE32-NEXT: lwz r4, L..C0@l(r3) 248; LARGE32-NEXT: bla .__get_tpointer[PR] 249; LARGE32-NEXT: lwzx r3, r3, r4 250; LARGE32-NEXT: addi r1, r1, 32 251; LARGE32-NEXT: lwz r0, 8(r1) 252; LARGE32-NEXT: mtlr r0 253; LARGE32-NEXT: blr 254; 255; SMALL32-LABEL: load_global_int_zero: 256; SMALL32: # %bb.0: # %entry 257; SMALL32-NEXT: mflr r0 258; SMALL32-NEXT: stwu r1, -32(r1) 259; SMALL32-NEXT: lwz r4, L..C0(r2) # target-flags(ppc-tprel) @global_int_zero 260; SMALL32-NEXT: stw r0, 40(r1) 261; SMALL32-NEXT: bla .__get_tpointer[PR] 262; SMALL32-NEXT: lwzx r3, r3, r4 263; SMALL32-NEXT: addi r1, r1, 32 264; SMALL32-NEXT: lwz r0, 8(r1) 265; SMALL32-NEXT: mtlr r0 266; SMALL32-NEXT: blr 267entry: 268 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_int_zero) 269 %val = load i32, ptr %addr, align 4 270 ret i32 %val 271} 272 273define signext i32 @load_global_int_nonzero() { 274; LARGE64-LABEL: load_global_int_nonzero: 275; LARGE64: # %bb.0: # %entry 276; LARGE64-NEXT: addis r3, L..C1@u(r2) 277; LARGE64-NEXT: ld r3, L..C1@l(r3) 278; LARGE64-NEXT: lwax r3, r13, r3 279; LARGE64-NEXT: blr 280; 281; SMALL64-LABEL: load_global_int_nonzero: 282; SMALL64: # %bb.0: # %entry 283; SMALL64-NEXT: ld r3, L..C1(r2) # target-flags(ppc-tprel) @global_int_nonzero 284; SMALL64-NEXT: lwax r3, r13, r3 285; SMALL64-NEXT: blr 286; 287; LARGE32-LABEL: load_global_int_nonzero: 288; LARGE32: # %bb.0: # %entry 289; LARGE32-NEXT: mflr r0 290; LARGE32-NEXT: stwu r1, -32(r1) 291; LARGE32-NEXT: stw r0, 40(r1) 292; LARGE32-NEXT: addis r3, L..C1@u(r2) 293; LARGE32-NEXT: lwz r4, L..C1@l(r3) 294; LARGE32-NEXT: bla .__get_tpointer[PR] 295; LARGE32-NEXT: lwzx r3, r3, r4 296; LARGE32-NEXT: addi r1, r1, 32 297; LARGE32-NEXT: lwz r0, 8(r1) 298; LARGE32-NEXT: mtlr r0 299; LARGE32-NEXT: blr 300; 301; SMALL32-LABEL: load_global_int_nonzero: 302; SMALL32: # %bb.0: # %entry 303; SMALL32-NEXT: mflr r0 304; SMALL32-NEXT: stwu r1, -32(r1) 305; SMALL32-NEXT: lwz r4, L..C1(r2) # target-flags(ppc-tprel) @global_int_nonzero 306; SMALL32-NEXT: stw r0, 40(r1) 307; SMALL32-NEXT: bla .__get_tpointer[PR] 308; SMALL32-NEXT: lwzx r3, r3, r4 309; SMALL32-NEXT: addi r1, r1, 32 310; SMALL32-NEXT: lwz r0, 8(r1) 311; SMALL32-NEXT: mtlr r0 312; SMALL32-NEXT: blr 313entry: 314 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_int_nonzero) 315 %val = load i32, ptr %addr, align 4 316 ret i32 %val 317} 318 319define signext i32 @load_intern_int_zero() { 320; LARGE64-LABEL: load_intern_int_zero: 321; LARGE64: # %bb.0: # %entry 322; LARGE64-NEXT: addis r3, L..C2@u(r2) 323; LARGE64-NEXT: ld r3, L..C2@l(r3) 324; LARGE64-NEXT: lwax r3, r13, r3 325; LARGE64-NEXT: blr 326; 327; SMALL64-LABEL: load_intern_int_zero: 328; SMALL64: # %bb.0: # %entry 329; SMALL64-NEXT: ld r3, L..C2(r2) # target-flags(ppc-tprel) @intern_int_zero 330; SMALL64-NEXT: lwax r3, r13, r3 331; SMALL64-NEXT: blr 332; 333; LARGE32-LABEL: load_intern_int_zero: 334; LARGE32: # %bb.0: # %entry 335; LARGE32-NEXT: mflr r0 336; LARGE32-NEXT: stwu r1, -32(r1) 337; LARGE32-NEXT: stw r0, 40(r1) 338; LARGE32-NEXT: addis r3, L..C2@u(r2) 339; LARGE32-NEXT: lwz r4, L..C2@l(r3) 340; LARGE32-NEXT: bla .__get_tpointer[PR] 341; LARGE32-NEXT: lwzx r3, r3, r4 342; LARGE32-NEXT: addi r1, r1, 32 343; LARGE32-NEXT: lwz r0, 8(r1) 344; LARGE32-NEXT: mtlr r0 345; LARGE32-NEXT: blr 346; 347; SMALL32-LABEL: load_intern_int_zero: 348; SMALL32: # %bb.0: # %entry 349; SMALL32-NEXT: mflr r0 350; SMALL32-NEXT: stwu r1, -32(r1) 351; SMALL32-NEXT: lwz r4, L..C2(r2) # target-flags(ppc-tprel) @intern_int_zero 352; SMALL32-NEXT: stw r0, 40(r1) 353; SMALL32-NEXT: bla .__get_tpointer[PR] 354; SMALL32-NEXT: lwzx r3, r3, r4 355; SMALL32-NEXT: addi r1, r1, 32 356; SMALL32-NEXT: lwz r0, 8(r1) 357; SMALL32-NEXT: mtlr r0 358; SMALL32-NEXT: blr 359entry: 360 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_zero) 361 %val = load i32, ptr %addr, align 4 362 ret i32 %val 363} 364 365define signext i32 @load_intern_int_nonzero() { 366; LARGE64-LABEL: load_intern_int_nonzero: 367; LARGE64: # %bb.0: # %entry 368; LARGE64-NEXT: addis r3, L..C3@u(r2) 369; LARGE64-NEXT: ld r3, L..C3@l(r3) 370; LARGE64-NEXT: lwax r3, r13, r3 371; LARGE64-NEXT: blr 372; 373; SMALL64-LABEL: load_intern_int_nonzero: 374; SMALL64: # %bb.0: # %entry 375; SMALL64-NEXT: ld r3, L..C3(r2) # target-flags(ppc-tprel) @intern_int_nonzero 376; SMALL64-NEXT: lwax r3, r13, r3 377; SMALL64-NEXT: blr 378; 379; LARGE32-LABEL: load_intern_int_nonzero: 380; LARGE32: # %bb.0: # %entry 381; LARGE32-NEXT: mflr r0 382; LARGE32-NEXT: stwu r1, -32(r1) 383; LARGE32-NEXT: stw r0, 40(r1) 384; LARGE32-NEXT: addis r3, L..C3@u(r2) 385; LARGE32-NEXT: lwz r4, L..C3@l(r3) 386; LARGE32-NEXT: bla .__get_tpointer[PR] 387; LARGE32-NEXT: lwzx r3, r3, r4 388; LARGE32-NEXT: addi r1, r1, 32 389; LARGE32-NEXT: lwz r0, 8(r1) 390; LARGE32-NEXT: mtlr r0 391; LARGE32-NEXT: blr 392; 393; SMALL32-LABEL: load_intern_int_nonzero: 394; SMALL32: # %bb.0: # %entry 395; SMALL32-NEXT: mflr r0 396; SMALL32-NEXT: stwu r1, -32(r1) 397; SMALL32-NEXT: lwz r4, L..C3(r2) # target-flags(ppc-tprel) @intern_int_nonzero 398; SMALL32-NEXT: stw r0, 40(r1) 399; SMALL32-NEXT: bla .__get_tpointer[PR] 400; SMALL32-NEXT: lwzx r3, r3, r4 401; SMALL32-NEXT: addi r1, r1, 32 402; SMALL32-NEXT: lwz r0, 8(r1) 403; SMALL32-NEXT: mtlr r0 404; SMALL32-NEXT: blr 405entry: 406 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_int_nonzero) 407 %val = load i32, ptr %addr, align 4 408 ret i32 %val 409} 410 411define void @store_global_long_zero(i64 noundef %i) { 412; LARGE64-LABEL: store_global_long_zero: 413; LARGE64: # %bb.0: # %entry 414; LARGE64-NEXT: addis r4, L..C4@u(r2) 415; LARGE64-NEXT: ld r4, L..C4@l(r4) 416; LARGE64-NEXT: stdx r3, r13, r4 417; LARGE64-NEXT: blr 418; 419; SMALL64-LABEL: store_global_long_zero: 420; SMALL64: # %bb.0: # %entry 421; SMALL64-NEXT: ld r4, L..C4(r2) # target-flags(ppc-tprel) @global_long_zero 422; SMALL64-NEXT: stdx r3, r13, r4 423; SMALL64-NEXT: blr 424; 425; LARGE32-LABEL: store_global_long_zero: 426; LARGE32: # %bb.0: # %entry 427; LARGE32-NEXT: mflr r0 428; LARGE32-NEXT: stwu r1, -32(r1) 429; LARGE32-NEXT: stw r0, 40(r1) 430; LARGE32-NEXT: mr r5, r3 431; LARGE32-NEXT: addis r3, L..C4@u(r2) 432; LARGE32-NEXT: lwz r6, L..C4@l(r3) 433; LARGE32-NEXT: bla .__get_tpointer[PR] 434; LARGE32-NEXT: add r3, r3, r6 435; LARGE32-NEXT: stw r4, 4(r3) 436; LARGE32-NEXT: stw r5, 0(r3) 437; LARGE32-NEXT: addi r1, r1, 32 438; LARGE32-NEXT: lwz r0, 8(r1) 439; LARGE32-NEXT: mtlr r0 440; LARGE32-NEXT: blr 441; 442; SMALL32-LABEL: store_global_long_zero: 443; SMALL32: # %bb.0: # %entry 444; SMALL32-NEXT: mflr r0 445; SMALL32-NEXT: stwu r1, -32(r1) 446; SMALL32-NEXT: lwz r6, L..C4(r2) # target-flags(ppc-tprel) @global_long_zero 447; SMALL32-NEXT: mr r5, r3 448; SMALL32-NEXT: bla .__get_tpointer[PR] 449; SMALL32-NEXT: stw r0, 40(r1) 450; SMALL32-NEXT: add r3, r3, r6 451; SMALL32-NEXT: stw r4, 4(r3) 452; SMALL32-NEXT: stw r5, 0(r3) 453; SMALL32-NEXT: addi r1, r1, 32 454; SMALL32-NEXT: lwz r0, 8(r1) 455; SMALL32-NEXT: mtlr r0 456; SMALL32-NEXT: blr 457entry: 458 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @global_long_zero) 459 store i64 %i, ptr %addr, align 8 460 ret void 461} 462 463define void @store_global_long_nonzero(i64 noundef %i) { 464; LARGE64-LABEL: store_global_long_nonzero: 465; LARGE64: # %bb.0: # %entry 466; LARGE64-NEXT: addis r4, L..C5@u(r2) 467; LARGE64-NEXT: ld r4, L..C5@l(r4) 468; LARGE64-NEXT: stdx r3, r13, r4 469; LARGE64-NEXT: blr 470; 471; SMALL64-LABEL: store_global_long_nonzero: 472; SMALL64: # %bb.0: # %entry 473; SMALL64-NEXT: ld r4, L..C5(r2) # target-flags(ppc-tprel) @global_long_nonzero 474; SMALL64-NEXT: stdx r3, r13, r4 475; SMALL64-NEXT: blr 476; 477; LARGE32-LABEL: store_global_long_nonzero: 478; LARGE32: # %bb.0: # %entry 479; LARGE32-NEXT: mflr r0 480; LARGE32-NEXT: stwu r1, -32(r1) 481; LARGE32-NEXT: stw r0, 40(r1) 482; LARGE32-NEXT: mr r5, r3 483; LARGE32-NEXT: addis r3, L..C5@u(r2) 484; LARGE32-NEXT: lwz r6, L..C5@l(r3) 485; LARGE32-NEXT: bla .__get_tpointer[PR] 486; LARGE32-NEXT: add r3, r3, r6 487; LARGE32-NEXT: stw r4, 4(r3) 488; LARGE32-NEXT: stw r5, 0(r3) 489; LARGE32-NEXT: addi r1, r1, 32 490; LARGE32-NEXT: lwz r0, 8(r1) 491; LARGE32-NEXT: mtlr r0 492; LARGE32-NEXT: blr 493; 494; SMALL32-LABEL: store_global_long_nonzero: 495; SMALL32: # %bb.0: # %entry 496; SMALL32-NEXT: mflr r0 497; SMALL32-NEXT: stwu r1, -32(r1) 498; SMALL32-NEXT: lwz r6, L..C5(r2) # target-flags(ppc-tprel) @global_long_nonzero 499; SMALL32-NEXT: mr r5, r3 500; SMALL32-NEXT: bla .__get_tpointer[PR] 501; SMALL32-NEXT: stw r0, 40(r1) 502; SMALL32-NEXT: add r3, r3, r6 503; SMALL32-NEXT: stw r4, 4(r3) 504; SMALL32-NEXT: stw r5, 0(r3) 505; SMALL32-NEXT: addi r1, r1, 32 506; SMALL32-NEXT: lwz r0, 8(r1) 507; SMALL32-NEXT: mtlr r0 508; SMALL32-NEXT: blr 509entry: 510 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @global_long_nonzero) 511 store i64 %i, ptr %addr, align 8 512 ret void 513} 514 515define void @store_intern_long_zero(i64 noundef %i) { 516; LARGE64-LABEL: store_intern_long_zero: 517; LARGE64: # %bb.0: # %entry 518; LARGE64-NEXT: addis r4, L..C6@u(r2) 519; LARGE64-NEXT: ld r4, L..C6@l(r4) 520; LARGE64-NEXT: stdx r3, r13, r4 521; LARGE64-NEXT: blr 522; 523; SMALL64-LABEL: store_intern_long_zero: 524; SMALL64: # %bb.0: # %entry 525; SMALL64-NEXT: ld r4, L..C6(r2) # target-flags(ppc-tprel) @intern_long_zero 526; SMALL64-NEXT: stdx r3, r13, r4 527; SMALL64-NEXT: blr 528; 529; LARGE32-LABEL: store_intern_long_zero: 530; LARGE32: # %bb.0: # %entry 531; LARGE32-NEXT: mflr r0 532; LARGE32-NEXT: stwu r1, -32(r1) 533; LARGE32-NEXT: stw r0, 40(r1) 534; LARGE32-NEXT: mr r5, r3 535; LARGE32-NEXT: addis r3, L..C6@u(r2) 536; LARGE32-NEXT: lwz r6, L..C6@l(r3) 537; LARGE32-NEXT: bla .__get_tpointer[PR] 538; LARGE32-NEXT: add r3, r3, r6 539; LARGE32-NEXT: stw r4, 4(r3) 540; LARGE32-NEXT: stw r5, 0(r3) 541; LARGE32-NEXT: addi r1, r1, 32 542; LARGE32-NEXT: lwz r0, 8(r1) 543; LARGE32-NEXT: mtlr r0 544; LARGE32-NEXT: blr 545; 546; SMALL32-LABEL: store_intern_long_zero: 547; SMALL32: # %bb.0: # %entry 548; SMALL32-NEXT: mflr r0 549; SMALL32-NEXT: stwu r1, -32(r1) 550; SMALL32-NEXT: lwz r6, L..C6(r2) # target-flags(ppc-tprel) @intern_long_zero 551; SMALL32-NEXT: mr r5, r3 552; SMALL32-NEXT: bla .__get_tpointer[PR] 553; SMALL32-NEXT: stw r0, 40(r1) 554; SMALL32-NEXT: add r3, r3, r6 555; SMALL32-NEXT: stw r4, 4(r3) 556; SMALL32-NEXT: stw r5, 0(r3) 557; SMALL32-NEXT: addi r1, r1, 32 558; SMALL32-NEXT: lwz r0, 8(r1) 559; SMALL32-NEXT: mtlr r0 560; SMALL32-NEXT: blr 561entry: 562 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @intern_long_zero) 563 store i64 %i, ptr %addr, align 8 564 ret void 565} 566 567define void @store_intern_long_nonzero(i64 noundef %i) { 568; LARGE64-LABEL: store_intern_long_nonzero: 569; LARGE64: # %bb.0: # %entry 570; LARGE64-NEXT: addis r4, L..C7@u(r2) 571; LARGE64-NEXT: ld r4, L..C7@l(r4) 572; LARGE64-NEXT: stdx r3, r13, r4 573; LARGE64-NEXT: blr 574; 575; SMALL64-LABEL: store_intern_long_nonzero: 576; SMALL64: # %bb.0: # %entry 577; SMALL64-NEXT: ld r4, L..C7(r2) # target-flags(ppc-tprel) @intern_long_nonzero 578; SMALL64-NEXT: stdx r3, r13, r4 579; SMALL64-NEXT: blr 580; 581; LARGE32-LABEL: store_intern_long_nonzero: 582; LARGE32: # %bb.0: # %entry 583; LARGE32-NEXT: mflr r0 584; LARGE32-NEXT: stwu r1, -32(r1) 585; LARGE32-NEXT: stw r0, 40(r1) 586; LARGE32-NEXT: mr r5, r3 587; LARGE32-NEXT: addis r3, L..C7@u(r2) 588; LARGE32-NEXT: lwz r6, L..C7@l(r3) 589; LARGE32-NEXT: bla .__get_tpointer[PR] 590; LARGE32-NEXT: add r3, r3, r6 591; LARGE32-NEXT: stw r4, 4(r3) 592; LARGE32-NEXT: stw r5, 0(r3) 593; LARGE32-NEXT: addi r1, r1, 32 594; LARGE32-NEXT: lwz r0, 8(r1) 595; LARGE32-NEXT: mtlr r0 596; LARGE32-NEXT: blr 597; 598; SMALL32-LABEL: store_intern_long_nonzero: 599; SMALL32: # %bb.0: # %entry 600; SMALL32-NEXT: mflr r0 601; SMALL32-NEXT: stwu r1, -32(r1) 602; SMALL32-NEXT: lwz r6, L..C7(r2) # target-flags(ppc-tprel) @intern_long_nonzero 603; SMALL32-NEXT: mr r5, r3 604; SMALL32-NEXT: bla .__get_tpointer[PR] 605; SMALL32-NEXT: stw r0, 40(r1) 606; SMALL32-NEXT: add r3, r3, r6 607; SMALL32-NEXT: stw r4, 4(r3) 608; SMALL32-NEXT: stw r5, 0(r3) 609; SMALL32-NEXT: addi r1, r1, 32 610; SMALL32-NEXT: lwz r0, 8(r1) 611; SMALL32-NEXT: mtlr r0 612; SMALL32-NEXT: blr 613entry: 614 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @intern_long_nonzero) 615 store i64 %i, ptr %addr, align 8 616 ret void 617} 618 619define i64 @load_global_long_zero() { 620; LARGE64-LABEL: load_global_long_zero: 621; LARGE64: # %bb.0: # %entry 622; LARGE64-NEXT: addis r3, L..C4@u(r2) 623; LARGE64-NEXT: ld r3, L..C4@l(r3) 624; LARGE64-NEXT: ldx r3, r13, r3 625; LARGE64-NEXT: blr 626; 627; SMALL64-LABEL: load_global_long_zero: 628; SMALL64: # %bb.0: # %entry 629; SMALL64-NEXT: ld r3, L..C4(r2) # target-flags(ppc-tprel) @global_long_zero 630; SMALL64-NEXT: ldx r3, r13, r3 631; SMALL64-NEXT: blr 632; 633; LARGE32-LABEL: load_global_long_zero: 634; LARGE32: # %bb.0: # %entry 635; LARGE32-NEXT: mflr r0 636; LARGE32-NEXT: stwu r1, -32(r1) 637; LARGE32-NEXT: stw r0, 40(r1) 638; LARGE32-NEXT: addis r3, L..C4@u(r2) 639; LARGE32-NEXT: lwz r4, L..C4@l(r3) 640; LARGE32-NEXT: bla .__get_tpointer[PR] 641; LARGE32-NEXT: add r4, r3, r4 642; LARGE32-NEXT: lwz r3, 0(r4) 643; LARGE32-NEXT: lwz r4, 4(r4) 644; LARGE32-NEXT: addi r1, r1, 32 645; LARGE32-NEXT: lwz r0, 8(r1) 646; LARGE32-NEXT: mtlr r0 647; LARGE32-NEXT: blr 648; 649; SMALL32-LABEL: load_global_long_zero: 650; SMALL32: # %bb.0: # %entry 651; SMALL32-NEXT: mflr r0 652; SMALL32-NEXT: stwu r1, -32(r1) 653; SMALL32-NEXT: lwz r4, L..C4(r2) # target-flags(ppc-tprel) @global_long_zero 654; SMALL32-NEXT: bla .__get_tpointer[PR] 655; SMALL32-NEXT: stw r0, 40(r1) 656; SMALL32-NEXT: add r4, r3, r4 657; SMALL32-NEXT: lwz r3, 0(r4) 658; SMALL32-NEXT: lwz r4, 4(r4) 659; SMALL32-NEXT: addi r1, r1, 32 660; SMALL32-NEXT: lwz r0, 8(r1) 661; SMALL32-NEXT: mtlr r0 662; SMALL32-NEXT: blr 663entry: 664 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @global_long_zero) 665 %val = load i64, ptr %addr, align 8 666 ret i64 %val 667} 668 669define i64 @load_global_long_nonzero() { 670; LARGE64-LABEL: load_global_long_nonzero: 671; LARGE64: # %bb.0: # %entry 672; LARGE64-NEXT: addis r3, L..C5@u(r2) 673; LARGE64-NEXT: ld r3, L..C5@l(r3) 674; LARGE64-NEXT: ldx r3, r13, r3 675; LARGE64-NEXT: blr 676; 677; SMALL64-LABEL: load_global_long_nonzero: 678; SMALL64: # %bb.0: # %entry 679; SMALL64-NEXT: ld r3, L..C5(r2) # target-flags(ppc-tprel) @global_long_nonzero 680; SMALL64-NEXT: ldx r3, r13, r3 681; SMALL64-NEXT: blr 682; 683; LARGE32-LABEL: load_global_long_nonzero: 684; LARGE32: # %bb.0: # %entry 685; LARGE32-NEXT: mflr r0 686; LARGE32-NEXT: stwu r1, -32(r1) 687; LARGE32-NEXT: stw r0, 40(r1) 688; LARGE32-NEXT: addis r3, L..C5@u(r2) 689; LARGE32-NEXT: lwz r4, L..C5@l(r3) 690; LARGE32-NEXT: bla .__get_tpointer[PR] 691; LARGE32-NEXT: add r4, r3, r4 692; LARGE32-NEXT: lwz r3, 0(r4) 693; LARGE32-NEXT: lwz r4, 4(r4) 694; LARGE32-NEXT: addi r1, r1, 32 695; LARGE32-NEXT: lwz r0, 8(r1) 696; LARGE32-NEXT: mtlr r0 697; LARGE32-NEXT: blr 698; 699; SMALL32-LABEL: load_global_long_nonzero: 700; SMALL32: # %bb.0: # %entry 701; SMALL32-NEXT: mflr r0 702; SMALL32-NEXT: stwu r1, -32(r1) 703; SMALL32-NEXT: lwz r4, L..C5(r2) # target-flags(ppc-tprel) @global_long_nonzero 704; SMALL32-NEXT: bla .__get_tpointer[PR] 705; SMALL32-NEXT: stw r0, 40(r1) 706; SMALL32-NEXT: add r4, r3, r4 707; SMALL32-NEXT: lwz r3, 0(r4) 708; SMALL32-NEXT: lwz r4, 4(r4) 709; SMALL32-NEXT: addi r1, r1, 32 710; SMALL32-NEXT: lwz r0, 8(r1) 711; SMALL32-NEXT: mtlr r0 712; SMALL32-NEXT: blr 713entry: 714 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @global_long_nonzero) 715 %val = load i64, ptr %addr, align 8 716 ret i64 %val 717} 718 719define i64 @load_intern_long_zero() { 720; LARGE64-LABEL: load_intern_long_zero: 721; LARGE64: # %bb.0: # %entry 722; LARGE64-NEXT: addis r3, L..C6@u(r2) 723; LARGE64-NEXT: ld r3, L..C6@l(r3) 724; LARGE64-NEXT: ldx r3, r13, r3 725; LARGE64-NEXT: blr 726; 727; SMALL64-LABEL: load_intern_long_zero: 728; SMALL64: # %bb.0: # %entry 729; SMALL64-NEXT: ld r3, L..C6(r2) # target-flags(ppc-tprel) @intern_long_zero 730; SMALL64-NEXT: ldx r3, r13, r3 731; SMALL64-NEXT: blr 732; 733; LARGE32-LABEL: load_intern_long_zero: 734; LARGE32: # %bb.0: # %entry 735; LARGE32-NEXT: mflr r0 736; LARGE32-NEXT: stwu r1, -32(r1) 737; LARGE32-NEXT: stw r0, 40(r1) 738; LARGE32-NEXT: addis r3, L..C6@u(r2) 739; LARGE32-NEXT: lwz r4, L..C6@l(r3) 740; LARGE32-NEXT: bla .__get_tpointer[PR] 741; LARGE32-NEXT: add r4, r3, r4 742; LARGE32-NEXT: lwz r3, 0(r4) 743; LARGE32-NEXT: lwz r4, 4(r4) 744; LARGE32-NEXT: addi r1, r1, 32 745; LARGE32-NEXT: lwz r0, 8(r1) 746; LARGE32-NEXT: mtlr r0 747; LARGE32-NEXT: blr 748; 749; SMALL32-LABEL: load_intern_long_zero: 750; SMALL32: # %bb.0: # %entry 751; SMALL32-NEXT: mflr r0 752; SMALL32-NEXT: stwu r1, -32(r1) 753; SMALL32-NEXT: lwz r4, L..C6(r2) # target-flags(ppc-tprel) @intern_long_zero 754; SMALL32-NEXT: bla .__get_tpointer[PR] 755; SMALL32-NEXT: stw r0, 40(r1) 756; SMALL32-NEXT: add r4, r3, r4 757; SMALL32-NEXT: lwz r3, 0(r4) 758; SMALL32-NEXT: lwz r4, 4(r4) 759; SMALL32-NEXT: addi r1, r1, 32 760; SMALL32-NEXT: lwz r0, 8(r1) 761; SMALL32-NEXT: mtlr r0 762; SMALL32-NEXT: blr 763entry: 764 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @intern_long_zero) 765 %val = load i64, ptr %addr, align 8 766 ret i64 %val 767} 768 769define i64 @load_intern_long_nonzero() { 770; LARGE64-LABEL: load_intern_long_nonzero: 771; LARGE64: # %bb.0: # %entry 772; LARGE64-NEXT: addis r3, L..C7@u(r2) 773; LARGE64-NEXT: ld r3, L..C7@l(r3) 774; LARGE64-NEXT: ldx r3, r13, r3 775; LARGE64-NEXT: blr 776; 777; SMALL64-LABEL: load_intern_long_nonzero: 778; SMALL64: # %bb.0: # %entry 779; SMALL64-NEXT: ld r3, L..C7(r2) # target-flags(ppc-tprel) @intern_long_nonzero 780; SMALL64-NEXT: ldx r3, r13, r3 781; SMALL64-NEXT: blr 782; 783; LARGE32-LABEL: load_intern_long_nonzero: 784; LARGE32: # %bb.0: # %entry 785; LARGE32-NEXT: mflr r0 786; LARGE32-NEXT: stwu r1, -32(r1) 787; LARGE32-NEXT: stw r0, 40(r1) 788; LARGE32-NEXT: addis r3, L..C7@u(r2) 789; LARGE32-NEXT: lwz r4, L..C7@l(r3) 790; LARGE32-NEXT: bla .__get_tpointer[PR] 791; LARGE32-NEXT: add r4, r3, r4 792; LARGE32-NEXT: lwz r3, 0(r4) 793; LARGE32-NEXT: lwz r4, 4(r4) 794; LARGE32-NEXT: addi r1, r1, 32 795; LARGE32-NEXT: lwz r0, 8(r1) 796; LARGE32-NEXT: mtlr r0 797; LARGE32-NEXT: blr 798; 799; SMALL32-LABEL: load_intern_long_nonzero: 800; SMALL32: # %bb.0: # %entry 801; SMALL32-NEXT: mflr r0 802; SMALL32-NEXT: stwu r1, -32(r1) 803; SMALL32-NEXT: lwz r4, L..C7(r2) # target-flags(ppc-tprel) @intern_long_nonzero 804; SMALL32-NEXT: bla .__get_tpointer[PR] 805; SMALL32-NEXT: stw r0, 40(r1) 806; SMALL32-NEXT: add r4, r3, r4 807; SMALL32-NEXT: lwz r3, 0(r4) 808; SMALL32-NEXT: lwz r4, 4(r4) 809; SMALL32-NEXT: addi r1, r1, 32 810; SMALL32-NEXT: lwz r0, 8(r1) 811; SMALL32-NEXT: mtlr r0 812; SMALL32-NEXT: blr 813entry: 814 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @intern_long_nonzero) 815 %val = load i64, ptr %addr, align 8 816 ret i64 %val 817} 818 819define void @store_global_float_zero(float noundef %i) { 820; LARGE64-LABEL: store_global_float_zero: 821; LARGE64: # %bb.0: # %entry 822; LARGE64-NEXT: addis r3, L..C8@u(r2) 823; LARGE64-NEXT: ld r3, L..C8@l(r3) 824; LARGE64-NEXT: stfsx f1, r13, r3 825; LARGE64-NEXT: blr 826; 827; SMALL64-LABEL: store_global_float_zero: 828; SMALL64: # %bb.0: # %entry 829; SMALL64-NEXT: ld r3, L..C8(r2) # target-flags(ppc-tprel) @global_float_zero 830; SMALL64-NEXT: stfsx f1, r13, r3 831; SMALL64-NEXT: blr 832; 833; LARGE32-LABEL: store_global_float_zero: 834; LARGE32: # %bb.0: # %entry 835; LARGE32-NEXT: mflr r0 836; LARGE32-NEXT: stwu r1, -32(r1) 837; LARGE32-NEXT: stw r0, 40(r1) 838; LARGE32-NEXT: addis r3, L..C8@u(r2) 839; LARGE32-NEXT: lwz r4, L..C8@l(r3) 840; LARGE32-NEXT: bla .__get_tpointer[PR] 841; LARGE32-NEXT: stfsx f1, r3, r4 842; LARGE32-NEXT: addi r1, r1, 32 843; LARGE32-NEXT: lwz r0, 8(r1) 844; LARGE32-NEXT: mtlr r0 845; LARGE32-NEXT: blr 846; 847; SMALL32-LABEL: store_global_float_zero: 848; SMALL32: # %bb.0: # %entry 849; SMALL32-NEXT: mflr r0 850; SMALL32-NEXT: stwu r1, -32(r1) 851; SMALL32-NEXT: lwz r4, L..C8(r2) # target-flags(ppc-tprel) @global_float_zero 852; SMALL32-NEXT: bla .__get_tpointer[PR] 853; SMALL32-NEXT: stw r0, 40(r1) 854; SMALL32-NEXT: stfsx f1, r3, r4 855; SMALL32-NEXT: addi r1, r1, 32 856; SMALL32-NEXT: lwz r0, 8(r1) 857; SMALL32-NEXT: mtlr r0 858; SMALL32-NEXT: blr 859entry: 860 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_float_zero) 861 store float %i, ptr %addr, align 4 862 ret void 863} 864 865define void @store_global_float_nonzero(float noundef %i) { 866; LARGE64-LABEL: store_global_float_nonzero: 867; LARGE64: # %bb.0: # %entry 868; LARGE64-NEXT: addis r3, L..C9@u(r2) 869; LARGE64-NEXT: ld r3, L..C9@l(r3) 870; LARGE64-NEXT: stfsx f1, r13, r3 871; LARGE64-NEXT: blr 872; 873; SMALL64-LABEL: store_global_float_nonzero: 874; SMALL64: # %bb.0: # %entry 875; SMALL64-NEXT: ld r3, L..C9(r2) # target-flags(ppc-tprel) @global_float_nonzero 876; SMALL64-NEXT: stfsx f1, r13, r3 877; SMALL64-NEXT: blr 878; 879; LARGE32-LABEL: store_global_float_nonzero: 880; LARGE32: # %bb.0: # %entry 881; LARGE32-NEXT: mflr r0 882; LARGE32-NEXT: stwu r1, -32(r1) 883; LARGE32-NEXT: stw r0, 40(r1) 884; LARGE32-NEXT: addis r3, L..C9@u(r2) 885; LARGE32-NEXT: lwz r4, L..C9@l(r3) 886; LARGE32-NEXT: bla .__get_tpointer[PR] 887; LARGE32-NEXT: stfsx f1, r3, r4 888; LARGE32-NEXT: addi r1, r1, 32 889; LARGE32-NEXT: lwz r0, 8(r1) 890; LARGE32-NEXT: mtlr r0 891; LARGE32-NEXT: blr 892; 893; SMALL32-LABEL: store_global_float_nonzero: 894; SMALL32: # %bb.0: # %entry 895; SMALL32-NEXT: mflr r0 896; SMALL32-NEXT: stwu r1, -32(r1) 897; SMALL32-NEXT: lwz r4, L..C9(r2) # target-flags(ppc-tprel) @global_float_nonzero 898; SMALL32-NEXT: bla .__get_tpointer[PR] 899; SMALL32-NEXT: stw r0, 40(r1) 900; SMALL32-NEXT: stfsx f1, r3, r4 901; SMALL32-NEXT: addi r1, r1, 32 902; SMALL32-NEXT: lwz r0, 8(r1) 903; SMALL32-NEXT: mtlr r0 904; SMALL32-NEXT: blr 905entry: 906 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_float_nonzero) 907 store float %i, ptr %addr, align 4 908 ret void 909} 910 911define void @store_intern_float_zero(float noundef %i) { 912; LARGE64-LABEL: store_intern_float_zero: 913; LARGE64: # %bb.0: # %entry 914; LARGE64-NEXT: addis r3, L..C10@u(r2) 915; LARGE64-NEXT: ld r3, L..C10@l(r3) 916; LARGE64-NEXT: stfsx f1, r13, r3 917; LARGE64-NEXT: blr 918; 919; SMALL64-LABEL: store_intern_float_zero: 920; SMALL64: # %bb.0: # %entry 921; SMALL64-NEXT: ld r3, L..C10(r2) # target-flags(ppc-tprel) @intern_float_zero 922; SMALL64-NEXT: stfsx f1, r13, r3 923; SMALL64-NEXT: blr 924; 925; LARGE32-LABEL: store_intern_float_zero: 926; LARGE32: # %bb.0: # %entry 927; LARGE32-NEXT: mflr r0 928; LARGE32-NEXT: stwu r1, -32(r1) 929; LARGE32-NEXT: stw r0, 40(r1) 930; LARGE32-NEXT: addis r3, L..C10@u(r2) 931; LARGE32-NEXT: lwz r4, L..C10@l(r3) 932; LARGE32-NEXT: bla .__get_tpointer[PR] 933; LARGE32-NEXT: stfsx f1, r3, r4 934; LARGE32-NEXT: addi r1, r1, 32 935; LARGE32-NEXT: lwz r0, 8(r1) 936; LARGE32-NEXT: mtlr r0 937; LARGE32-NEXT: blr 938; 939; SMALL32-LABEL: store_intern_float_zero: 940; SMALL32: # %bb.0: # %entry 941; SMALL32-NEXT: mflr r0 942; SMALL32-NEXT: stwu r1, -32(r1) 943; SMALL32-NEXT: lwz r4, L..C10(r2) # target-flags(ppc-tprel) @intern_float_zero 944; SMALL32-NEXT: bla .__get_tpointer[PR] 945; SMALL32-NEXT: stw r0, 40(r1) 946; SMALL32-NEXT: stfsx f1, r3, r4 947; SMALL32-NEXT: addi r1, r1, 32 948; SMALL32-NEXT: lwz r0, 8(r1) 949; SMALL32-NEXT: mtlr r0 950; SMALL32-NEXT: blr 951entry: 952 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_float_zero) 953 store float %i, ptr %addr, align 4 954 ret void 955} 956 957define void @store_intern_float_nonzero(float noundef %i) { 958; LARGE64-LABEL: store_intern_float_nonzero: 959; LARGE64: # %bb.0: # %entry 960; LARGE64-NEXT: addis r3, L..C11@u(r2) 961; LARGE64-NEXT: ld r3, L..C11@l(r3) 962; LARGE64-NEXT: stfsx f1, r13, r3 963; LARGE64-NEXT: blr 964; 965; SMALL64-LABEL: store_intern_float_nonzero: 966; SMALL64: # %bb.0: # %entry 967; SMALL64-NEXT: ld r3, L..C11(r2) # target-flags(ppc-tprel) @intern_float_nonzero 968; SMALL64-NEXT: stfsx f1, r13, r3 969; SMALL64-NEXT: blr 970; 971; LARGE32-LABEL: store_intern_float_nonzero: 972; LARGE32: # %bb.0: # %entry 973; LARGE32-NEXT: mflr r0 974; LARGE32-NEXT: stwu r1, -32(r1) 975; LARGE32-NEXT: stw r0, 40(r1) 976; LARGE32-NEXT: addis r3, L..C11@u(r2) 977; LARGE32-NEXT: lwz r4, L..C11@l(r3) 978; LARGE32-NEXT: bla .__get_tpointer[PR] 979; LARGE32-NEXT: stfsx f1, r3, r4 980; LARGE32-NEXT: addi r1, r1, 32 981; LARGE32-NEXT: lwz r0, 8(r1) 982; LARGE32-NEXT: mtlr r0 983; LARGE32-NEXT: blr 984; 985; SMALL32-LABEL: store_intern_float_nonzero: 986; SMALL32: # %bb.0: # %entry 987; SMALL32-NEXT: mflr r0 988; SMALL32-NEXT: stwu r1, -32(r1) 989; SMALL32-NEXT: lwz r4, L..C11(r2) # target-flags(ppc-tprel) @intern_float_nonzero 990; SMALL32-NEXT: bla .__get_tpointer[PR] 991; SMALL32-NEXT: stw r0, 40(r1) 992; SMALL32-NEXT: stfsx f1, r3, r4 993; SMALL32-NEXT: addi r1, r1, 32 994; SMALL32-NEXT: lwz r0, 8(r1) 995; SMALL32-NEXT: mtlr r0 996; SMALL32-NEXT: blr 997entry: 998 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_float_nonzero) 999 store float %i, ptr %addr, align 4 1000 ret void 1001} 1002 1003define float @load_global_float_zero() { 1004; LARGE64-LABEL: load_global_float_zero: 1005; LARGE64: # %bb.0: # %entry 1006; LARGE64-NEXT: addis r3, L..C8@u(r2) 1007; LARGE64-NEXT: ld r3, L..C8@l(r3) 1008; LARGE64-NEXT: lfsx f1, r13, r3 1009; LARGE64-NEXT: blr 1010; 1011; SMALL64-LABEL: load_global_float_zero: 1012; SMALL64: # %bb.0: # %entry 1013; SMALL64-NEXT: ld r3, L..C8(r2) # target-flags(ppc-tprel) @global_float_zero 1014; SMALL64-NEXT: lfsx f1, r13, r3 1015; SMALL64-NEXT: blr 1016; 1017; LARGE32-LABEL: load_global_float_zero: 1018; LARGE32: # %bb.0: # %entry 1019; LARGE32-NEXT: mflr r0 1020; LARGE32-NEXT: stwu r1, -32(r1) 1021; LARGE32-NEXT: stw r0, 40(r1) 1022; LARGE32-NEXT: addis r3, L..C8@u(r2) 1023; LARGE32-NEXT: lwz r4, L..C8@l(r3) 1024; LARGE32-NEXT: bla .__get_tpointer[PR] 1025; LARGE32-NEXT: lfsx f1, r3, r4 1026; LARGE32-NEXT: addi r1, r1, 32 1027; LARGE32-NEXT: lwz r0, 8(r1) 1028; LARGE32-NEXT: mtlr r0 1029; LARGE32-NEXT: blr 1030; 1031; SMALL32-LABEL: load_global_float_zero: 1032; SMALL32: # %bb.0: # %entry 1033; SMALL32-NEXT: mflr r0 1034; SMALL32-NEXT: stwu r1, -32(r1) 1035; SMALL32-NEXT: lwz r4, L..C8(r2) # target-flags(ppc-tprel) @global_float_zero 1036; SMALL32-NEXT: stw r0, 40(r1) 1037; SMALL32-NEXT: bla .__get_tpointer[PR] 1038; SMALL32-NEXT: lfsx f1, r3, r4 1039; SMALL32-NEXT: addi r1, r1, 32 1040; SMALL32-NEXT: lwz r0, 8(r1) 1041; SMALL32-NEXT: mtlr r0 1042; SMALL32-NEXT: blr 1043entry: 1044 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_float_zero) 1045 %val = load float, ptr %addr, align 4 1046 ret float %val 1047} 1048 1049define float @load_global_float_nonzero() { 1050; LARGE64-LABEL: load_global_float_nonzero: 1051; LARGE64: # %bb.0: # %entry 1052; LARGE64-NEXT: addis r3, L..C9@u(r2) 1053; LARGE64-NEXT: ld r3, L..C9@l(r3) 1054; LARGE64-NEXT: lfsx f1, r13, r3 1055; LARGE64-NEXT: blr 1056; 1057; SMALL64-LABEL: load_global_float_nonzero: 1058; SMALL64: # %bb.0: # %entry 1059; SMALL64-NEXT: ld r3, L..C9(r2) # target-flags(ppc-tprel) @global_float_nonzero 1060; SMALL64-NEXT: lfsx f1, r13, r3 1061; SMALL64-NEXT: blr 1062; 1063; LARGE32-LABEL: load_global_float_nonzero: 1064; LARGE32: # %bb.0: # %entry 1065; LARGE32-NEXT: mflr r0 1066; LARGE32-NEXT: stwu r1, -32(r1) 1067; LARGE32-NEXT: stw r0, 40(r1) 1068; LARGE32-NEXT: addis r3, L..C9@u(r2) 1069; LARGE32-NEXT: lwz r4, L..C9@l(r3) 1070; LARGE32-NEXT: bla .__get_tpointer[PR] 1071; LARGE32-NEXT: lfsx f1, r3, r4 1072; LARGE32-NEXT: addi r1, r1, 32 1073; LARGE32-NEXT: lwz r0, 8(r1) 1074; LARGE32-NEXT: mtlr r0 1075; LARGE32-NEXT: blr 1076; 1077; SMALL32-LABEL: load_global_float_nonzero: 1078; SMALL32: # %bb.0: # %entry 1079; SMALL32-NEXT: mflr r0 1080; SMALL32-NEXT: stwu r1, -32(r1) 1081; SMALL32-NEXT: lwz r4, L..C9(r2) # target-flags(ppc-tprel) @global_float_nonzero 1082; SMALL32-NEXT: stw r0, 40(r1) 1083; SMALL32-NEXT: bla .__get_tpointer[PR] 1084; SMALL32-NEXT: lfsx f1, r3, r4 1085; SMALL32-NEXT: addi r1, r1, 32 1086; SMALL32-NEXT: lwz r0, 8(r1) 1087; SMALL32-NEXT: mtlr r0 1088; SMALL32-NEXT: blr 1089entry: 1090 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @global_float_nonzero) 1091 %val = load float, ptr %addr, align 4 1092 ret float %val 1093} 1094 1095define float @load_intern_float_zero() { 1096; LARGE64-LABEL: load_intern_float_zero: 1097; LARGE64: # %bb.0: # %entry 1098; LARGE64-NEXT: addis r3, L..C10@u(r2) 1099; LARGE64-NEXT: ld r3, L..C10@l(r3) 1100; LARGE64-NEXT: lfsx f1, r13, r3 1101; LARGE64-NEXT: blr 1102; 1103; SMALL64-LABEL: load_intern_float_zero: 1104; SMALL64: # %bb.0: # %entry 1105; SMALL64-NEXT: ld r3, L..C10(r2) # target-flags(ppc-tprel) @intern_float_zero 1106; SMALL64-NEXT: lfsx f1, r13, r3 1107; SMALL64-NEXT: blr 1108; 1109; LARGE32-LABEL: load_intern_float_zero: 1110; LARGE32: # %bb.0: # %entry 1111; LARGE32-NEXT: mflr r0 1112; LARGE32-NEXT: stwu r1, -32(r1) 1113; LARGE32-NEXT: stw r0, 40(r1) 1114; LARGE32-NEXT: addis r3, L..C10@u(r2) 1115; LARGE32-NEXT: lwz r4, L..C10@l(r3) 1116; LARGE32-NEXT: bla .__get_tpointer[PR] 1117; LARGE32-NEXT: lfsx f1, r3, r4 1118; LARGE32-NEXT: addi r1, r1, 32 1119; LARGE32-NEXT: lwz r0, 8(r1) 1120; LARGE32-NEXT: mtlr r0 1121; LARGE32-NEXT: blr 1122; 1123; SMALL32-LABEL: load_intern_float_zero: 1124; SMALL32: # %bb.0: # %entry 1125; SMALL32-NEXT: mflr r0 1126; SMALL32-NEXT: stwu r1, -32(r1) 1127; SMALL32-NEXT: lwz r4, L..C10(r2) # target-flags(ppc-tprel) @intern_float_zero 1128; SMALL32-NEXT: stw r0, 40(r1) 1129; SMALL32-NEXT: bla .__get_tpointer[PR] 1130; SMALL32-NEXT: lfsx f1, r3, r4 1131; SMALL32-NEXT: addi r1, r1, 32 1132; SMALL32-NEXT: lwz r0, 8(r1) 1133; SMALL32-NEXT: mtlr r0 1134; SMALL32-NEXT: blr 1135entry: 1136 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_float_zero) 1137 %val = load float, ptr %addr, align 4 1138 ret float %val 1139} 1140 1141define float @load_intern_float_nonzero() { 1142; LARGE64-LABEL: load_intern_float_nonzero: 1143; LARGE64: # %bb.0: # %entry 1144; LARGE64-NEXT: addis r3, L..C11@u(r2) 1145; LARGE64-NEXT: ld r3, L..C11@l(r3) 1146; LARGE64-NEXT: lfsx f1, r13, r3 1147; LARGE64-NEXT: blr 1148; 1149; SMALL64-LABEL: load_intern_float_nonzero: 1150; SMALL64: # %bb.0: # %entry 1151; SMALL64-NEXT: ld r3, L..C11(r2) # target-flags(ppc-tprel) @intern_float_nonzero 1152; SMALL64-NEXT: lfsx f1, r13, r3 1153; SMALL64-NEXT: blr 1154; 1155; LARGE32-LABEL: load_intern_float_nonzero: 1156; LARGE32: # %bb.0: # %entry 1157; LARGE32-NEXT: mflr r0 1158; LARGE32-NEXT: stwu r1, -32(r1) 1159; LARGE32-NEXT: stw r0, 40(r1) 1160; LARGE32-NEXT: addis r3, L..C11@u(r2) 1161; LARGE32-NEXT: lwz r4, L..C11@l(r3) 1162; LARGE32-NEXT: bla .__get_tpointer[PR] 1163; LARGE32-NEXT: lfsx f1, r3, r4 1164; LARGE32-NEXT: addi r1, r1, 32 1165; LARGE32-NEXT: lwz r0, 8(r1) 1166; LARGE32-NEXT: mtlr r0 1167; LARGE32-NEXT: blr 1168; 1169; SMALL32-LABEL: load_intern_float_nonzero: 1170; SMALL32: # %bb.0: # %entry 1171; SMALL32-NEXT: mflr r0 1172; SMALL32-NEXT: stwu r1, -32(r1) 1173; SMALL32-NEXT: lwz r4, L..C11(r2) # target-flags(ppc-tprel) @intern_float_nonzero 1174; SMALL32-NEXT: stw r0, 40(r1) 1175; SMALL32-NEXT: bla .__get_tpointer[PR] 1176; SMALL32-NEXT: lfsx f1, r3, r4 1177; SMALL32-NEXT: addi r1, r1, 32 1178; SMALL32-NEXT: lwz r0, 8(r1) 1179; SMALL32-NEXT: mtlr r0 1180; SMALL32-NEXT: blr 1181entry: 1182 %addr = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @intern_float_nonzero) 1183 %val = load float, ptr %addr, align 4 1184 ret float %val 1185} 1186 1187define void @store_global_double_zero(double noundef %i) { 1188; LARGE64-LABEL: store_global_double_zero: 1189; LARGE64: # %bb.0: # %entry 1190; LARGE64-NEXT: addis r3, L..C12@u(r2) 1191; LARGE64-NEXT: ld r3, L..C12@l(r3) 1192; LARGE64-NEXT: stfdx f1, r13, r3 1193; LARGE64-NEXT: blr 1194; 1195; SMALL64-LABEL: store_global_double_zero: 1196; SMALL64: # %bb.0: # %entry 1197; SMALL64-NEXT: ld r3, L..C12(r2) # target-flags(ppc-tprel) @global_double_zero 1198; SMALL64-NEXT: stfdx f1, r13, r3 1199; SMALL64-NEXT: blr 1200; 1201; LARGE32-LABEL: store_global_double_zero: 1202; LARGE32: # %bb.0: # %entry 1203; LARGE32-NEXT: mflr r0 1204; LARGE32-NEXT: stwu r1, -32(r1) 1205; LARGE32-NEXT: stw r0, 40(r1) 1206; LARGE32-NEXT: addis r3, L..C12@u(r2) 1207; LARGE32-NEXT: lwz r4, L..C12@l(r3) 1208; LARGE32-NEXT: bla .__get_tpointer[PR] 1209; LARGE32-NEXT: stfdx f1, r3, r4 1210; LARGE32-NEXT: addi r1, r1, 32 1211; LARGE32-NEXT: lwz r0, 8(r1) 1212; LARGE32-NEXT: mtlr r0 1213; LARGE32-NEXT: blr 1214; 1215; SMALL32-LABEL: store_global_double_zero: 1216; SMALL32: # %bb.0: # %entry 1217; SMALL32-NEXT: mflr r0 1218; SMALL32-NEXT: stwu r1, -32(r1) 1219; SMALL32-NEXT: lwz r4, L..C12(r2) # target-flags(ppc-tprel) @global_double_zero 1220; SMALL32-NEXT: bla .__get_tpointer[PR] 1221; SMALL32-NEXT: stw r0, 40(r1) 1222; SMALL32-NEXT: stfdx f1, r3, r4 1223; SMALL32-NEXT: addi r1, r1, 32 1224; SMALL32-NEXT: lwz r0, 8(r1) 1225; SMALL32-NEXT: mtlr r0 1226; SMALL32-NEXT: blr 1227entry: 1228 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @global_double_zero) 1229 store double %i, ptr %addr, align 8 1230 ret void 1231} 1232 1233define void @store_global_double_nonzero(double noundef %i) { 1234; LARGE64-LABEL: store_global_double_nonzero: 1235; LARGE64: # %bb.0: # %entry 1236; LARGE64-NEXT: addis r3, L..C13@u(r2) 1237; LARGE64-NEXT: ld r3, L..C13@l(r3) 1238; LARGE64-NEXT: stfdx f1, r13, r3 1239; LARGE64-NEXT: blr 1240; 1241; SMALL64-LABEL: store_global_double_nonzero: 1242; SMALL64: # %bb.0: # %entry 1243; SMALL64-NEXT: ld r3, L..C13(r2) # target-flags(ppc-tprel) @global_double_nonzero 1244; SMALL64-NEXT: stfdx f1, r13, r3 1245; SMALL64-NEXT: blr 1246; 1247; LARGE32-LABEL: store_global_double_nonzero: 1248; LARGE32: # %bb.0: # %entry 1249; LARGE32-NEXT: mflr r0 1250; LARGE32-NEXT: stwu r1, -32(r1) 1251; LARGE32-NEXT: stw r0, 40(r1) 1252; LARGE32-NEXT: addis r3, L..C13@u(r2) 1253; LARGE32-NEXT: lwz r4, L..C13@l(r3) 1254; LARGE32-NEXT: bla .__get_tpointer[PR] 1255; LARGE32-NEXT: stfdx f1, r3, r4 1256; LARGE32-NEXT: addi r1, r1, 32 1257; LARGE32-NEXT: lwz r0, 8(r1) 1258; LARGE32-NEXT: mtlr r0 1259; LARGE32-NEXT: blr 1260; 1261; SMALL32-LABEL: store_global_double_nonzero: 1262; SMALL32: # %bb.0: # %entry 1263; SMALL32-NEXT: mflr r0 1264; SMALL32-NEXT: stwu r1, -32(r1) 1265; SMALL32-NEXT: lwz r4, L..C13(r2) # target-flags(ppc-tprel) @global_double_nonzero 1266; SMALL32-NEXT: bla .__get_tpointer[PR] 1267; SMALL32-NEXT: stw r0, 40(r1) 1268; SMALL32-NEXT: stfdx f1, r3, r4 1269; SMALL32-NEXT: addi r1, r1, 32 1270; SMALL32-NEXT: lwz r0, 8(r1) 1271; SMALL32-NEXT: mtlr r0 1272; SMALL32-NEXT: blr 1273entry: 1274 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @global_double_nonzero) 1275 store double %i, ptr %addr, align 8 1276 ret void 1277} 1278 1279define void @store_intern_double_zero(double noundef %i) { 1280; LARGE64-LABEL: store_intern_double_zero: 1281; LARGE64: # %bb.0: # %entry 1282; LARGE64-NEXT: addis r3, L..C14@u(r2) 1283; LARGE64-NEXT: ld r3, L..C14@l(r3) 1284; LARGE64-NEXT: stfdx f1, r13, r3 1285; LARGE64-NEXT: blr 1286; 1287; SMALL64-LABEL: store_intern_double_zero: 1288; SMALL64: # %bb.0: # %entry 1289; SMALL64-NEXT: ld r3, L..C14(r2) # target-flags(ppc-tprel) @intern_double_zero 1290; SMALL64-NEXT: stfdx f1, r13, r3 1291; SMALL64-NEXT: blr 1292; 1293; LARGE32-LABEL: store_intern_double_zero: 1294; LARGE32: # %bb.0: # %entry 1295; LARGE32-NEXT: mflr r0 1296; LARGE32-NEXT: stwu r1, -32(r1) 1297; LARGE32-NEXT: stw r0, 40(r1) 1298; LARGE32-NEXT: addis r3, L..C14@u(r2) 1299; LARGE32-NEXT: lwz r4, L..C14@l(r3) 1300; LARGE32-NEXT: bla .__get_tpointer[PR] 1301; LARGE32-NEXT: stfdx f1, r3, r4 1302; LARGE32-NEXT: addi r1, r1, 32 1303; LARGE32-NEXT: lwz r0, 8(r1) 1304; LARGE32-NEXT: mtlr r0 1305; LARGE32-NEXT: blr 1306; 1307; SMALL32-LABEL: store_intern_double_zero: 1308; SMALL32: # %bb.0: # %entry 1309; SMALL32-NEXT: mflr r0 1310; SMALL32-NEXT: stwu r1, -32(r1) 1311; SMALL32-NEXT: lwz r4, L..C14(r2) # target-flags(ppc-tprel) @intern_double_zero 1312; SMALL32-NEXT: bla .__get_tpointer[PR] 1313; SMALL32-NEXT: stw r0, 40(r1) 1314; SMALL32-NEXT: stfdx f1, r3, r4 1315; SMALL32-NEXT: addi r1, r1, 32 1316; SMALL32-NEXT: lwz r0, 8(r1) 1317; SMALL32-NEXT: mtlr r0 1318; SMALL32-NEXT: blr 1319entry: 1320 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @intern_double_zero) 1321 store double %i, ptr %addr, align 8 1322 ret void 1323} 1324 1325define void @store_intern_double_nonzero(double noundef %i) { 1326; LARGE64-LABEL: store_intern_double_nonzero: 1327; LARGE64: # %bb.0: # %entry 1328; LARGE64-NEXT: addis r3, L..C15@u(r2) 1329; LARGE64-NEXT: ld r3, L..C15@l(r3) 1330; LARGE64-NEXT: stfdx f1, r13, r3 1331; LARGE64-NEXT: blr 1332; 1333; SMALL64-LABEL: store_intern_double_nonzero: 1334; SMALL64: # %bb.0: # %entry 1335; SMALL64-NEXT: ld r3, L..C15(r2) # target-flags(ppc-tprel) @intern_double_nonzero 1336; SMALL64-NEXT: stfdx f1, r13, r3 1337; SMALL64-NEXT: blr 1338; 1339; LARGE32-LABEL: store_intern_double_nonzero: 1340; LARGE32: # %bb.0: # %entry 1341; LARGE32-NEXT: mflr r0 1342; LARGE32-NEXT: stwu r1, -32(r1) 1343; LARGE32-NEXT: stw r0, 40(r1) 1344; LARGE32-NEXT: addis r3, L..C15@u(r2) 1345; LARGE32-NEXT: lwz r4, L..C15@l(r3) 1346; LARGE32-NEXT: bla .__get_tpointer[PR] 1347; LARGE32-NEXT: stfdx f1, r3, r4 1348; LARGE32-NEXT: addi r1, r1, 32 1349; LARGE32-NEXT: lwz r0, 8(r1) 1350; LARGE32-NEXT: mtlr r0 1351; LARGE32-NEXT: blr 1352; 1353; SMALL32-LABEL: store_intern_double_nonzero: 1354; SMALL32: # %bb.0: # %entry 1355; SMALL32-NEXT: mflr r0 1356; SMALL32-NEXT: stwu r1, -32(r1) 1357; SMALL32-NEXT: lwz r4, L..C15(r2) # target-flags(ppc-tprel) @intern_double_nonzero 1358; SMALL32-NEXT: bla .__get_tpointer[PR] 1359; SMALL32-NEXT: stw r0, 40(r1) 1360; SMALL32-NEXT: stfdx f1, r3, r4 1361; SMALL32-NEXT: addi r1, r1, 32 1362; SMALL32-NEXT: lwz r0, 8(r1) 1363; SMALL32-NEXT: mtlr r0 1364; SMALL32-NEXT: blr 1365entry: 1366 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @intern_double_nonzero) 1367 store double %i, ptr %addr, align 8 1368 ret void 1369} 1370 1371define double @load_global_double_zero() { 1372; LARGE64-LABEL: load_global_double_zero: 1373; LARGE64: # %bb.0: # %entry 1374; LARGE64-NEXT: addis r3, L..C12@u(r2) 1375; LARGE64-NEXT: ld r3, L..C12@l(r3) 1376; LARGE64-NEXT: lfdx f1, r13, r3 1377; LARGE64-NEXT: blr 1378; 1379; SMALL64-LABEL: load_global_double_zero: 1380; SMALL64: # %bb.0: # %entry 1381; SMALL64-NEXT: ld r3, L..C12(r2) # target-flags(ppc-tprel) @global_double_zero 1382; SMALL64-NEXT: lfdx f1, r13, r3 1383; SMALL64-NEXT: blr 1384; 1385; LARGE32-LABEL: load_global_double_zero: 1386; LARGE32: # %bb.0: # %entry 1387; LARGE32-NEXT: mflr r0 1388; LARGE32-NEXT: stwu r1, -32(r1) 1389; LARGE32-NEXT: stw r0, 40(r1) 1390; LARGE32-NEXT: addis r3, L..C12@u(r2) 1391; LARGE32-NEXT: lwz r4, L..C12@l(r3) 1392; LARGE32-NEXT: bla .__get_tpointer[PR] 1393; LARGE32-NEXT: lfdx f1, r3, r4 1394; LARGE32-NEXT: addi r1, r1, 32 1395; LARGE32-NEXT: lwz r0, 8(r1) 1396; LARGE32-NEXT: mtlr r0 1397; LARGE32-NEXT: blr 1398; 1399; SMALL32-LABEL: load_global_double_zero: 1400; SMALL32: # %bb.0: # %entry 1401; SMALL32-NEXT: mflr r0 1402; SMALL32-NEXT: stwu r1, -32(r1) 1403; SMALL32-NEXT: lwz r4, L..C12(r2) # target-flags(ppc-tprel) @global_double_zero 1404; SMALL32-NEXT: stw r0, 40(r1) 1405; SMALL32-NEXT: bla .__get_tpointer[PR] 1406; SMALL32-NEXT: lfdx f1, r3, r4 1407; SMALL32-NEXT: addi r1, r1, 32 1408; SMALL32-NEXT: lwz r0, 8(r1) 1409; SMALL32-NEXT: mtlr r0 1410; SMALL32-NEXT: blr 1411entry: 1412 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @global_double_zero) 1413 %val = load double, ptr %addr, align 8 1414 ret double %val 1415} 1416 1417define double @load_global_double_nonzero() { 1418; LARGE64-LABEL: load_global_double_nonzero: 1419; LARGE64: # %bb.0: # %entry 1420; LARGE64-NEXT: addis r3, L..C13@u(r2) 1421; LARGE64-NEXT: ld r3, L..C13@l(r3) 1422; LARGE64-NEXT: lfdx f1, r13, r3 1423; LARGE64-NEXT: blr 1424; 1425; SMALL64-LABEL: load_global_double_nonzero: 1426; SMALL64: # %bb.0: # %entry 1427; SMALL64-NEXT: ld r3, L..C13(r2) # target-flags(ppc-tprel) @global_double_nonzero 1428; SMALL64-NEXT: lfdx f1, r13, r3 1429; SMALL64-NEXT: blr 1430; 1431; LARGE32-LABEL: load_global_double_nonzero: 1432; LARGE32: # %bb.0: # %entry 1433; LARGE32-NEXT: mflr r0 1434; LARGE32-NEXT: stwu r1, -32(r1) 1435; LARGE32-NEXT: stw r0, 40(r1) 1436; LARGE32-NEXT: addis r3, L..C13@u(r2) 1437; LARGE32-NEXT: lwz r4, L..C13@l(r3) 1438; LARGE32-NEXT: bla .__get_tpointer[PR] 1439; LARGE32-NEXT: lfdx f1, r3, r4 1440; LARGE32-NEXT: addi r1, r1, 32 1441; LARGE32-NEXT: lwz r0, 8(r1) 1442; LARGE32-NEXT: mtlr r0 1443; LARGE32-NEXT: blr 1444; 1445; SMALL32-LABEL: load_global_double_nonzero: 1446; SMALL32: # %bb.0: # %entry 1447; SMALL32-NEXT: mflr r0 1448; SMALL32-NEXT: stwu r1, -32(r1) 1449; SMALL32-NEXT: lwz r4, L..C13(r2) # target-flags(ppc-tprel) @global_double_nonzero 1450; SMALL32-NEXT: stw r0, 40(r1) 1451; SMALL32-NEXT: bla .__get_tpointer[PR] 1452; SMALL32-NEXT: lfdx f1, r3, r4 1453; SMALL32-NEXT: addi r1, r1, 32 1454; SMALL32-NEXT: lwz r0, 8(r1) 1455; SMALL32-NEXT: mtlr r0 1456; SMALL32-NEXT: blr 1457entry: 1458 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @global_double_nonzero) 1459 %val = load double, ptr %addr, align 8 1460 ret double %val 1461} 1462 1463define double @load_intern_double_zero() { 1464; LARGE64-LABEL: load_intern_double_zero: 1465; LARGE64: # %bb.0: # %entry 1466; LARGE64-NEXT: addis r3, L..C14@u(r2) 1467; LARGE64-NEXT: ld r3, L..C14@l(r3) 1468; LARGE64-NEXT: lfdx f1, r13, r3 1469; LARGE64-NEXT: blr 1470; 1471; SMALL64-LABEL: load_intern_double_zero: 1472; SMALL64: # %bb.0: # %entry 1473; SMALL64-NEXT: ld r3, L..C14(r2) # target-flags(ppc-tprel) @intern_double_zero 1474; SMALL64-NEXT: lfdx f1, r13, r3 1475; SMALL64-NEXT: blr 1476; 1477; LARGE32-LABEL: load_intern_double_zero: 1478; LARGE32: # %bb.0: # %entry 1479; LARGE32-NEXT: mflr r0 1480; LARGE32-NEXT: stwu r1, -32(r1) 1481; LARGE32-NEXT: stw r0, 40(r1) 1482; LARGE32-NEXT: addis r3, L..C14@u(r2) 1483; LARGE32-NEXT: lwz r4, L..C14@l(r3) 1484; LARGE32-NEXT: bla .__get_tpointer[PR] 1485; LARGE32-NEXT: lfdx f1, r3, r4 1486; LARGE32-NEXT: addi r1, r1, 32 1487; LARGE32-NEXT: lwz r0, 8(r1) 1488; LARGE32-NEXT: mtlr r0 1489; LARGE32-NEXT: blr 1490; 1491; SMALL32-LABEL: load_intern_double_zero: 1492; SMALL32: # %bb.0: # %entry 1493; SMALL32-NEXT: mflr r0 1494; SMALL32-NEXT: stwu r1, -32(r1) 1495; SMALL32-NEXT: lwz r4, L..C14(r2) # target-flags(ppc-tprel) @intern_double_zero 1496; SMALL32-NEXT: stw r0, 40(r1) 1497; SMALL32-NEXT: bla .__get_tpointer[PR] 1498; SMALL32-NEXT: lfdx f1, r3, r4 1499; SMALL32-NEXT: addi r1, r1, 32 1500; SMALL32-NEXT: lwz r0, 8(r1) 1501; SMALL32-NEXT: mtlr r0 1502; SMALL32-NEXT: blr 1503entry: 1504 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @intern_double_zero) 1505 %val = load double, ptr %addr, align 8 1506 ret double %val 1507} 1508 1509define double @load_intern_double_nonzero() { 1510; LARGE64-LABEL: load_intern_double_nonzero: 1511; LARGE64: # %bb.0: # %entry 1512; LARGE64-NEXT: addis r3, L..C15@u(r2) 1513; LARGE64-NEXT: ld r3, L..C15@l(r3) 1514; LARGE64-NEXT: lfdx f1, r13, r3 1515; LARGE64-NEXT: blr 1516; 1517; SMALL64-LABEL: load_intern_double_nonzero: 1518; SMALL64: # %bb.0: # %entry 1519; SMALL64-NEXT: ld r3, L..C15(r2) # target-flags(ppc-tprel) @intern_double_nonzero 1520; SMALL64-NEXT: lfdx f1, r13, r3 1521; SMALL64-NEXT: blr 1522; 1523; LARGE32-LABEL: load_intern_double_nonzero: 1524; LARGE32: # %bb.0: # %entry 1525; LARGE32-NEXT: mflr r0 1526; LARGE32-NEXT: stwu r1, -32(r1) 1527; LARGE32-NEXT: stw r0, 40(r1) 1528; LARGE32-NEXT: addis r3, L..C15@u(r2) 1529; LARGE32-NEXT: lwz r4, L..C15@l(r3) 1530; LARGE32-NEXT: bla .__get_tpointer[PR] 1531; LARGE32-NEXT: lfdx f1, r3, r4 1532; LARGE32-NEXT: addi r1, r1, 32 1533; LARGE32-NEXT: lwz r0, 8(r1) 1534; LARGE32-NEXT: mtlr r0 1535; LARGE32-NEXT: blr 1536; 1537; SMALL32-LABEL: load_intern_double_nonzero: 1538; SMALL32: # %bb.0: # %entry 1539; SMALL32-NEXT: mflr r0 1540; SMALL32-NEXT: stwu r1, -32(r1) 1541; SMALL32-NEXT: lwz r4, L..C15(r2) # target-flags(ppc-tprel) @intern_double_nonzero 1542; SMALL32-NEXT: stw r0, 40(r1) 1543; SMALL32-NEXT: bla .__get_tpointer[PR] 1544; SMALL32-NEXT: lfdx f1, r3, r4 1545; SMALL32-NEXT: addi r1, r1, 32 1546; SMALL32-NEXT: lwz r0, 8(r1) 1547; SMALL32-NEXT: mtlr r0 1548; SMALL32-NEXT: blr 1549entry: 1550 %addr = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @intern_double_nonzero) 1551 %val = load double, ptr %addr, align 8 1552 ret double %val 1553} 1554 1555declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) 1556 1557; Lines below check if the symbols have correct suffix for TLS model, not 1558; generated by test update script, but kept well after updates. 1559 1560; LARGE64: L..C0: 1561; LARGE64-NEXT: .tc global_int_zero[TE],global_int_zero[TL]@ie 1562; LARGE64-NEXT: L..C1: 1563; LARGE64-NEXT: .tc global_int_nonzero[TE],global_int_nonzero[TL]@ie 1564; LARGE64-NEXT: L..C2: 1565; LARGE64-NEXT: .tc intern_int_zero[TE],intern_int_zero[UL]@ie 1566; LARGE64-NEXT: L..C3: 1567; LARGE64-NEXT: .tc intern_int_nonzero[TE],intern_int_nonzero[TL]@ie 1568; LARGE64-NEXT: L..C4: 1569; LARGE64-NEXT: .tc global_long_zero[TE],global_long_zero[TL]@ie 1570; LARGE64-NEXT: L..C5: 1571; LARGE64-NEXT: .tc global_long_nonzero[TE],global_long_nonzero[TL]@ie 1572; LARGE64-NEXT: L..C6: 1573; LARGE64-NEXT: .tc intern_long_zero[TE],intern_long_zero[UL]@ie 1574; LARGE64-NEXT: L..C7: 1575; LARGE64-NEXT: .tc intern_long_nonzero[TE],intern_long_nonzero[TL]@ie 1576; LARGE64-NEXT: L..C8: 1577; LARGE64-NEXT: .tc global_float_zero[TE],global_float_zero[TL]@ie 1578; LARGE64-NEXT: L..C9: 1579; LARGE64-NEXT: .tc global_float_nonzero[TE],global_float_nonzero[TL]@ie 1580; LARGE64-NEXT: L..C10: 1581; LARGE64-NEXT: .tc intern_float_zero[TE],intern_float_zero[UL]@ie 1582; LARGE64-NEXT: L..C11: 1583; LARGE64-NEXT: .tc intern_float_nonzero[TE],intern_float_nonzero[TL]@ie 1584; LARGE64-NEXT: L..C12: 1585; LARGE64-NEXT: .tc global_double_zero[TE],global_double_zero[TL]@ie 1586; LARGE64-NEXT: L..C13: 1587; LARGE64-NEXT: .tc global_double_nonzero[TE],global_double_nonzero[TL]@ie 1588; LARGE64-NEXT: L..C14: 1589; LARGE64-NEXT: .tc intern_double_zero[TE],intern_double_zero[UL]@ie 1590; LARGE64-NEXT: L..C15: 1591; LARGE64-NEXT: .tc intern_double_nonzero[TE],intern_double_nonzero[TL]@ie 1592 1593; SMALL64: L..C0: 1594; SMALL64-NEXT: .tc global_int_zero[TC],global_int_zero[TL]@ie 1595; SMALL64-NEXT: L..C1: 1596; SMALL64-NEXT: .tc global_int_nonzero[TC],global_int_nonzero[TL]@ie 1597; SMALL64-NEXT: L..C2: 1598; SMALL64-NEXT: .tc intern_int_zero[TC],intern_int_zero[UL]@ie 1599; SMALL64-NEXT: L..C3: 1600; SMALL64-NEXT: .tc intern_int_nonzero[TC],intern_int_nonzero[TL]@ie 1601; SMALL64-NEXT: L..C4: 1602; SMALL64-NEXT: .tc global_long_zero[TC],global_long_zero[TL]@ie 1603; SMALL64-NEXT: L..C5: 1604; SMALL64-NEXT: .tc global_long_nonzero[TC],global_long_nonzero[TL]@ie 1605; SMALL64-NEXT: L..C6: 1606; SMALL64-NEXT: .tc intern_long_zero[TC],intern_long_zero[UL]@ie 1607; SMALL64-NEXT: L..C7: 1608; SMALL64-NEXT: .tc intern_long_nonzero[TC],intern_long_nonzero[TL]@ie 1609; SMALL64-NEXT: L..C8: 1610; SMALL64-NEXT: .tc global_float_zero[TC],global_float_zero[TL]@ie 1611; SMALL64-NEXT: L..C9: 1612; SMALL64-NEXT: .tc global_float_nonzero[TC],global_float_nonzero[TL]@ie 1613; SMALL64-NEXT: L..C10: 1614; SMALL64-NEXT: .tc intern_float_zero[TC],intern_float_zero[UL]@ie 1615; SMALL64-NEXT: L..C11: 1616; SMALL64-NEXT: .tc intern_float_nonzero[TC],intern_float_nonzero[TL]@ie 1617; SMALL64-NEXT: L..C12: 1618; SMALL64-NEXT: .tc global_double_zero[TC],global_double_zero[TL]@ie 1619; SMALL64-NEXT: L..C13: 1620; SMALL64-NEXT: .tc global_double_nonzero[TC],global_double_nonzero[TL]@ie 1621; SMALL64-NEXT: L..C14: 1622; SMALL64-NEXT: .tc intern_double_zero[TC],intern_double_zero[UL]@ie 1623; SMALL64-NEXT: L..C15: 1624; SMALL64-NEXT: .tc intern_double_nonzero[TC],intern_double_nonzero[TL]@ie 1625 1626; LARGE32: L..C0: 1627; LARGE32-NEXT: .tc global_int_zero[TE],global_int_zero[TL]@ie 1628; LARGE32-NEXT: L..C1: 1629; LARGE32-NEXT: .tc global_int_nonzero[TE],global_int_nonzero[TL]@ie 1630; LARGE32-NEXT: L..C2: 1631; LARGE32-NEXT: .tc intern_int_zero[TE],intern_int_zero[UL]@ie 1632; LARGE32-NEXT: L..C3: 1633; LARGE32-NEXT: .tc intern_int_nonzero[TE],intern_int_nonzero[TL]@ie 1634; LARGE32-NEXT: L..C4: 1635; LARGE32-NEXT: .tc global_long_zero[TE],global_long_zero[TL]@ie 1636; LARGE32-NEXT: L..C5: 1637; LARGE32-NEXT: .tc global_long_nonzero[TE],global_long_nonzero[TL]@ie 1638; LARGE32-NEXT: L..C6: 1639; LARGE32-NEXT: .tc intern_long_zero[TE],intern_long_zero[UL]@ie 1640; LARGE32-NEXT: L..C7: 1641; LARGE32-NEXT: .tc intern_long_nonzero[TE],intern_long_nonzero[TL]@ie 1642; LARGE32-NEXT: L..C8: 1643; LARGE32-NEXT: .tc global_float_zero[TE],global_float_zero[TL]@ie 1644; LARGE32-NEXT: L..C9: 1645; LARGE32-NEXT: .tc global_float_nonzero[TE],global_float_nonzero[TL]@ie 1646; LARGE32-NEXT: L..C10: 1647; LARGE32-NEXT: .tc intern_float_zero[TE],intern_float_zero[UL]@ie 1648; LARGE32-NEXT: L..C11: 1649; LARGE32-NEXT: .tc intern_float_nonzero[TE],intern_float_nonzero[TL]@ie 1650; LARGE32-NEXT: L..C12: 1651; LARGE32-NEXT: .tc global_double_zero[TE],global_double_zero[TL]@ie 1652; LARGE32-NEXT: L..C13: 1653; LARGE32-NEXT: .tc global_double_nonzero[TE],global_double_nonzero[TL]@ie 1654; LARGE32-NEXT: L..C14: 1655; LARGE32-NEXT: .tc intern_double_zero[TE],intern_double_zero[UL]@ie 1656; LARGE32-NEXT: L..C15: 1657; LARGE32-NEXT: .tc intern_double_nonzero[TE],intern_double_nonzero[TL]@ie 1658 1659; SMALL32: L..C0: 1660; SMALL32-NEXT: .tc global_int_zero[TC],global_int_zero[TL]@ie 1661; SMALL32-NEXT: L..C1: 1662; SMALL32-NEXT: .tc global_int_nonzero[TC],global_int_nonzero[TL]@ie 1663; SMALL32-NEXT: L..C2: 1664; SMALL32-NEXT: .tc intern_int_zero[TC],intern_int_zero[UL]@ie 1665; SMALL32-NEXT: L..C3: 1666; SMALL32-NEXT: .tc intern_int_nonzero[TC],intern_int_nonzero[TL]@ie 1667; SMALL32-NEXT: L..C4: 1668; SMALL32-NEXT: .tc global_long_zero[TC],global_long_zero[TL]@ie 1669; SMALL32-NEXT: L..C5: 1670; SMALL32-NEXT: .tc global_long_nonzero[TC],global_long_nonzero[TL]@ie 1671; SMALL32-NEXT: L..C6: 1672; SMALL32-NEXT: .tc intern_long_zero[TC],intern_long_zero[UL]@ie 1673; SMALL32-NEXT: L..C7: 1674; SMALL32-NEXT: .tc intern_long_nonzero[TC],intern_long_nonzero[TL]@ie 1675; SMALL32-NEXT: L..C8: 1676; SMALL32-NEXT: .tc global_float_zero[TC],global_float_zero[TL]@ie 1677; SMALL32-NEXT: L..C9: 1678; SMALL32-NEXT: .tc global_float_nonzero[TC],global_float_nonzero[TL]@ie 1679; SMALL32-NEXT: L..C10: 1680; SMALL32-NEXT: .tc intern_float_zero[TC],intern_float_zero[UL]@ie 1681; SMALL32-NEXT: L..C11: 1682; SMALL32-NEXT: .tc intern_float_nonzero[TC],intern_float_nonzero[TL]@ie 1683; SMALL32-NEXT: L..C12: 1684; SMALL32-NEXT: .tc global_double_zero[TC],global_double_zero[TL]@ie 1685; SMALL32-NEXT: L..C13: 1686; SMALL32-NEXT: .tc global_double_nonzero[TC],global_double_nonzero[TL]@ie 1687; SMALL32-NEXT: L..C14: 1688; SMALL32-NEXT: .tc intern_double_zero[TC],intern_double_zero[UL]@ie 1689; SMALL32-NEXT: L..C15: 1690; SMALL32-NEXT: .tc intern_double_nonzero[TC],intern_double_nonzero[TL]@ie 1691