655 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -O0 -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \3; RUN: -mtriple powerpc64-ibm-aix-xcoff < %s | FileCheck %s \4; RUN: --check-prefix=SMALL64-O05; RUN: llc -O0 -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \6; RUN: -mtriple powerpc64-ibm-aix-xcoff --code-model=large < %s \7; RUN: | FileCheck %s --check-prefix=LARGE64-O08; RUN: llc -O0 -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \9; RUN: -mtriple powerpc-ibm-aix-xcoff < %s | FileCheck %s \10; RUN: --check-prefix=SMALL32-O011; RUN: llc -O0 -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \12; RUN: -mtriple powerpc-ibm-aix-xcoff --code-model=large < %s \13; RUN: | FileCheck %s --check-prefix=LARGE32-O014; RUN: llc -O0 -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \15; RUN: -mtriple powerpc64-ibm-aix-xcoff -mattr=+aix-small-local-exec-tls < %s \16; RUN: | FileCheck %s --check-prefix=SMALL-LOCAL-EXEC-SMALLCM6417; RUN: llc -O0 -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \18; RUN: -mtriple powerpc64-ibm-aix-xcoff --code-model=large \19; RUN: -mattr=+aix-small-local-exec-tls < %s | FileCheck %s \20; RUN: --check-prefix=SMALL-LOCAL-EXEC-LARGECM6421 22@TLInt = internal thread_local(localexec) global i32 0, align 423@TLLongLong = internal thread_local(localexec) global i64 0, align 824@TLDouble = internal thread_local(localexec) global double 0.000000e+00, align 825@TLFloat = internal thread_local(localexec) global float 0.000000e+00, align 426declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #127 28define void @storeInt(i32 noundef %x) {29; SMALL64-O0-LABEL: storeInt:30; SMALL64-O0: # %bb.0: # %entry31; SMALL64-O0-NEXT: # kill: def $r3 killed $r3 killed $x332; SMALL64-O0-NEXT: ld r4, L..C0(r2) # target-flags(ppc-tprel) @TLInt33; SMALL64-O0-NEXT: add r4, r13, r434; SMALL64-O0-NEXT: stw r3, 0(r4)35; SMALL64-O0-NEXT: blr36;37; LARGE64-O0-LABEL: storeInt:38; LARGE64-O0: # %bb.0: # %entry39; LARGE64-O0-NEXT: # kill: def $r3 killed $r3 killed $x340; LARGE64-O0-NEXT: addis r4, L..C0@u(r2)41; LARGE64-O0-NEXT: ld r4, L..C0@l(r4)42; LARGE64-O0-NEXT: add r4, r13, r443; LARGE64-O0-NEXT: stw r3, 0(r4)44; LARGE64-O0-NEXT: blr45;46; SMALL32-O0-LABEL: storeInt:47; SMALL32-O0: # %bb.0: # %entry48; SMALL32-O0-NEXT: mflr r049; SMALL32-O0-NEXT: stwu r1, -32(r1)50; SMALL32-O0-NEXT: stw r0, 40(r1)51; SMALL32-O0-NEXT: stw r3, 28(r1) # 4-byte Folded Spill52; SMALL32-O0-NEXT: lwz r5, L..C0(r2) # target-flags(ppc-tprel) @TLInt53; SMALL32-O0-NEXT: bla .__get_tpointer[PR]54; SMALL32-O0-NEXT: mr r4, r355; SMALL32-O0-NEXT: lwz r3, 28(r1) # 4-byte Folded Reload56; SMALL32-O0-NEXT: add r4, r4, r557; SMALL32-O0-NEXT: stw r3, 0(r4)58; SMALL32-O0-NEXT: addi r1, r1, 3259; SMALL32-O0-NEXT: lwz r0, 8(r1)60; SMALL32-O0-NEXT: mtlr r061; SMALL32-O0-NEXT: blr62;63; LARGE32-O0-LABEL: storeInt:64; LARGE32-O0: # %bb.0: # %entry65; LARGE32-O0-NEXT: mflr r066; LARGE32-O0-NEXT: stwu r1, -32(r1)67; LARGE32-O0-NEXT: stw r0, 40(r1)68; LARGE32-O0-NEXT: stw r3, 28(r1) # 4-byte Folded Spill69; LARGE32-O0-NEXT: addis r3, L..C0@u(r2)70; LARGE32-O0-NEXT: lwz r5, L..C0@l(r3)71; LARGE32-O0-NEXT: bla .__get_tpointer[PR]72; LARGE32-O0-NEXT: mr r4, r373; LARGE32-O0-NEXT: lwz r3, 28(r1) # 4-byte Folded Reload74; LARGE32-O0-NEXT: add r4, r4, r575; LARGE32-O0-NEXT: stw r3, 0(r4)76; LARGE32-O0-NEXT: addi r1, r1, 3277; LARGE32-O0-NEXT: lwz r0, 8(r1)78; LARGE32-O0-NEXT: mtlr r079; LARGE32-O0-NEXT: blr80;81; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeInt:82; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry83; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: # kill: def $r3 killed $r3 killed $x384; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r4, TLInt[UL]@le(r13)85; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stw r3, 0(r4)86; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr87;88; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeInt:89; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry90; SMALL-LOCAL-EXEC-LARGECM64-NEXT: # kill: def $r3 killed $r3 killed $x391; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r4, TLInt[UL]@le(r13)92; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stw r3, 0(r4)93; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr94entry:95 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TLInt)96 store i32 %x, ptr %0, align 497 ret void98}99 100define void @storeLongLong(i64 noundef %x) {101; SMALL64-O0-LABEL: storeLongLong:102; SMALL64-O0: # %bb.0: # %entry103; SMALL64-O0-NEXT: ld r4, L..C1(r2) # target-flags(ppc-tprel) @TLLongLong104; SMALL64-O0-NEXT: add r4, r13, r4105; SMALL64-O0-NEXT: std r3, 0(r4)106; SMALL64-O0-NEXT: blr107;108; LARGE64-O0-LABEL: storeLongLong:109; LARGE64-O0: # %bb.0: # %entry110; LARGE64-O0-NEXT: addis r4, L..C1@u(r2)111; LARGE64-O0-NEXT: ld r4, L..C1@l(r4)112; LARGE64-O0-NEXT: add r4, r13, r4113; LARGE64-O0-NEXT: std r3, 0(r4)114; LARGE64-O0-NEXT: blr115;116; SMALL32-O0-LABEL: storeLongLong:117; SMALL32-O0: # %bb.0: # %entry118; SMALL32-O0-NEXT: mflr r0119; SMALL32-O0-NEXT: stwu r1, -32(r1)120; SMALL32-O0-NEXT: stw r0, 40(r1)121; SMALL32-O0-NEXT: mr r5, r4122; SMALL32-O0-NEXT: stw r3, 28(r1) # 4-byte Folded Spill123; SMALL32-O0-NEXT: # kill: def $r4 killed $r5124; SMALL32-O0-NEXT: lwz r6, L..C1(r2) # target-flags(ppc-tprel) @TLLongLong125; SMALL32-O0-NEXT: bla .__get_tpointer[PR]126; SMALL32-O0-NEXT: mr r4, r3127; SMALL32-O0-NEXT: lwz r3, 28(r1) # 4-byte Folded Reload128; SMALL32-O0-NEXT: add r4, r4, r6129; SMALL32-O0-NEXT: stw r5, 4(r4)130; SMALL32-O0-NEXT: stw r3, 0(r4)131; SMALL32-O0-NEXT: addi r1, r1, 32132; SMALL32-O0-NEXT: lwz r0, 8(r1)133; SMALL32-O0-NEXT: mtlr r0134; SMALL32-O0-NEXT: blr135;136; LARGE32-O0-LABEL: storeLongLong:137; LARGE32-O0: # %bb.0: # %entry138; LARGE32-O0-NEXT: mflr r0139; LARGE32-O0-NEXT: stwu r1, -32(r1)140; LARGE32-O0-NEXT: stw r0, 40(r1)141; LARGE32-O0-NEXT: mr r5, r4142; LARGE32-O0-NEXT: stw r3, 28(r1) # 4-byte Folded Spill143; LARGE32-O0-NEXT: # kill: def $r4 killed $r5144; LARGE32-O0-NEXT: addis r3, L..C1@u(r2)145; LARGE32-O0-NEXT: lwz r6, L..C1@l(r3)146; LARGE32-O0-NEXT: bla .__get_tpointer[PR]147; LARGE32-O0-NEXT: mr r4, r3148; LARGE32-O0-NEXT: lwz r3, 28(r1) # 4-byte Folded Reload149; LARGE32-O0-NEXT: add r4, r4, r6150; LARGE32-O0-NEXT: stw r5, 4(r4)151; LARGE32-O0-NEXT: stw r3, 0(r4)152; LARGE32-O0-NEXT: addi r1, r1, 32153; LARGE32-O0-NEXT: lwz r0, 8(r1)154; LARGE32-O0-NEXT: mtlr r0155; LARGE32-O0-NEXT: blr156;157; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeLongLong:158; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry159; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r4, TLLongLong[UL]@le(r13)160; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: std r3, 0(r4)161; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr162;163; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeLongLong:164; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry165; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r4, TLLongLong[UL]@le(r13)166; SMALL-LOCAL-EXEC-LARGECM64-NEXT: std r3, 0(r4)167; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr168entry:169 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @TLLongLong)170 store i64 %x, ptr %0, align 8171 ret void172}173 174define void @storeDouble(double noundef %x) {175; SMALL64-O0-LABEL: storeDouble:176; SMALL64-O0: # %bb.0: # %entry177; SMALL64-O0-NEXT: ld r3, L..C2(r2) # target-flags(ppc-tprel) @TLDouble178; SMALL64-O0-NEXT: add r3, r13, r3179; SMALL64-O0-NEXT: stxsdx f1, 0, r3180; SMALL64-O0-NEXT: blr181;182; LARGE64-O0-LABEL: storeDouble:183; LARGE64-O0: # %bb.0: # %entry184; LARGE64-O0-NEXT: addis r3, L..C2@u(r2)185; LARGE64-O0-NEXT: ld r3, L..C2@l(r3)186; LARGE64-O0-NEXT: add r3, r13, r3187; LARGE64-O0-NEXT: stxsdx f1, 0, r3188; LARGE64-O0-NEXT: blr189;190; SMALL32-O0-LABEL: storeDouble:191; SMALL32-O0: # %bb.0: # %entry192; SMALL32-O0-NEXT: mflr r0193; SMALL32-O0-NEXT: stwu r1, -32(r1)194; SMALL32-O0-NEXT: stw r0, 40(r1)195; SMALL32-O0-NEXT: lwz r4, L..C2(r2) # target-flags(ppc-tprel) @TLDouble196; SMALL32-O0-NEXT: bla .__get_tpointer[PR]197; SMALL32-O0-NEXT: add r3, r3, r4198; SMALL32-O0-NEXT: stfd f1, 0(r3)199; SMALL32-O0-NEXT: addi r1, r1, 32200; SMALL32-O0-NEXT: lwz r0, 8(r1)201; SMALL32-O0-NEXT: mtlr r0202; SMALL32-O0-NEXT: blr203;204; LARGE32-O0-LABEL: storeDouble:205; LARGE32-O0: # %bb.0: # %entry206; LARGE32-O0-NEXT: mflr r0207; LARGE32-O0-NEXT: stwu r1, -32(r1)208; LARGE32-O0-NEXT: stw r0, 40(r1)209; LARGE32-O0-NEXT: addis r3, L..C2@u(r2)210; LARGE32-O0-NEXT: lwz r4, L..C2@l(r3)211; LARGE32-O0-NEXT: bla .__get_tpointer[PR]212; LARGE32-O0-NEXT: add r3, r3, r4213; LARGE32-O0-NEXT: stfd f1, 0(r3)214; LARGE32-O0-NEXT: addi r1, r1, 32215; LARGE32-O0-NEXT: lwz r0, 8(r1)216; LARGE32-O0-NEXT: mtlr r0217; LARGE32-O0-NEXT: blr218;219; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeDouble:220; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry221; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r3, TLDouble[UL]@le(r13)222; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stxsdx f1, 0, r3223; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr224;225; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeDouble:226; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry227; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r3, TLDouble[UL]@le(r13)228; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stxsdx f1, 0, r3229; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr230entry:231 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @TLDouble)232 store double %x, ptr %0, align 8233 ret void234}235 236define void @storeFloat(float noundef %x) {237; SMALL64-O0-LABEL: storeFloat:238; SMALL64-O0: # %bb.0: # %entry239; SMALL64-O0-NEXT: ld r3, L..C3(r2) # target-flags(ppc-tprel) @TLFloat240; SMALL64-O0-NEXT: add r3, r13, r3241; SMALL64-O0-NEXT: stfs f1, 0(r3)242; SMALL64-O0-NEXT: blr243;244; LARGE64-O0-LABEL: storeFloat:245; LARGE64-O0: # %bb.0: # %entry246; LARGE64-O0-NEXT: addis r3, L..C3@u(r2)247; LARGE64-O0-NEXT: ld r3, L..C3@l(r3)248; LARGE64-O0-NEXT: add r3, r13, r3249; LARGE64-O0-NEXT: stfs f1, 0(r3)250; LARGE64-O0-NEXT: blr251;252; SMALL32-O0-LABEL: storeFloat:253; SMALL32-O0: # %bb.0: # %entry254; SMALL32-O0-NEXT: mflr r0255; SMALL32-O0-NEXT: stwu r1, -32(r1)256; SMALL32-O0-NEXT: stw r0, 40(r1)257; SMALL32-O0-NEXT: lwz r4, L..C3(r2) # target-flags(ppc-tprel) @TLFloat258; SMALL32-O0-NEXT: bla .__get_tpointer[PR]259; SMALL32-O0-NEXT: add r3, r3, r4260; SMALL32-O0-NEXT: stfs f1, 0(r3)261; SMALL32-O0-NEXT: addi r1, r1, 32262; SMALL32-O0-NEXT: lwz r0, 8(r1)263; SMALL32-O0-NEXT: mtlr r0264; SMALL32-O0-NEXT: blr265;266; LARGE32-O0-LABEL: storeFloat:267; LARGE32-O0: # %bb.0: # %entry268; LARGE32-O0-NEXT: mflr r0269; LARGE32-O0-NEXT: stwu r1, -32(r1)270; LARGE32-O0-NEXT: stw r0, 40(r1)271; LARGE32-O0-NEXT: addis r3, L..C3@u(r2)272; LARGE32-O0-NEXT: lwz r4, L..C3@l(r3)273; LARGE32-O0-NEXT: bla .__get_tpointer[PR]274; LARGE32-O0-NEXT: add r3, r3, r4275; LARGE32-O0-NEXT: stfs f1, 0(r3)276; LARGE32-O0-NEXT: addi r1, r1, 32277; LARGE32-O0-NEXT: lwz r0, 8(r1)278; LARGE32-O0-NEXT: mtlr r0279; LARGE32-O0-NEXT: blr280;281; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeFloat:282; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry283; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r3, TLFloat[UL]@le(r13)284; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stfs f1, 0(r3)285; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr286;287; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeFloat:288; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry289; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r3, TLFloat[UL]@le(r13)290; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stfs f1, 0(r3)291; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr292entry:293 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TLFloat)294 store float %x, ptr %0, align 4295 ret void296}297 298define i32 @loadInt() {299; SMALL64-O0-LABEL: loadInt:300; SMALL64-O0: # %bb.0: # %entry301; SMALL64-O0-NEXT: ld r3, L..C0(r2) # target-flags(ppc-tprel) @TLInt302; SMALL64-O0-NEXT: add r3, r13, r3303; SMALL64-O0-NEXT: lwz r3, 0(r3)304; SMALL64-O0-NEXT: blr305;306; LARGE64-O0-LABEL: loadInt:307; LARGE64-O0: # %bb.0: # %entry308; LARGE64-O0-NEXT: addis r3, L..C0@u(r2)309; LARGE64-O0-NEXT: ld r3, L..C0@l(r3)310; LARGE64-O0-NEXT: add r3, r13, r3311; LARGE64-O0-NEXT: lwz r3, 0(r3)312; LARGE64-O0-NEXT: blr313;314; SMALL32-O0-LABEL: loadInt:315; SMALL32-O0: # %bb.0: # %entry316; SMALL32-O0-NEXT: mflr r0317; SMALL32-O0-NEXT: stwu r1, -32(r1)318; SMALL32-O0-NEXT: stw r0, 40(r1)319; SMALL32-O0-NEXT: lwz r4, L..C0(r2) # target-flags(ppc-tprel) @TLInt320; SMALL32-O0-NEXT: bla .__get_tpointer[PR]321; SMALL32-O0-NEXT: add r3, r3, r4322; SMALL32-O0-NEXT: lwz r3, 0(r3)323; SMALL32-O0-NEXT: addi r1, r1, 32324; SMALL32-O0-NEXT: lwz r0, 8(r1)325; SMALL32-O0-NEXT: mtlr r0326; SMALL32-O0-NEXT: blr327;328; LARGE32-O0-LABEL: loadInt:329; LARGE32-O0: # %bb.0: # %entry330; LARGE32-O0-NEXT: mflr r0331; LARGE32-O0-NEXT: stwu r1, -32(r1)332; LARGE32-O0-NEXT: stw r0, 40(r1)333; LARGE32-O0-NEXT: addis r3, L..C0@u(r2)334; LARGE32-O0-NEXT: lwz r4, L..C0@l(r3)335; LARGE32-O0-NEXT: bla .__get_tpointer[PR]336; LARGE32-O0-NEXT: add r3, r3, r4337; LARGE32-O0-NEXT: lwz r3, 0(r3)338; LARGE32-O0-NEXT: addi r1, r1, 32339; LARGE32-O0-NEXT: lwz r0, 8(r1)340; LARGE32-O0-NEXT: mtlr r0341; LARGE32-O0-NEXT: blr342;343; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadInt:344; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry345; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r3, TLInt[UL]@le(r13)346; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwz r3, 0(r3)347; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr348;349; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadInt:350; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry351; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r3, TLInt[UL]@le(r13)352; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwz r3, 0(r3)353; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr354entry:355 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TLInt)356 %1 = load i32, ptr %0, align 4357 ret i32 %1358}359 360define i32 @loadLongLong() {361; SMALL64-O0-LABEL: loadLongLong:362; SMALL64-O0: # %bb.0: # %entry363; SMALL64-O0-NEXT: ld r3, L..C1(r2) # target-flags(ppc-tprel) @TLLongLong364; SMALL64-O0-NEXT: add r3, r13, r3365; SMALL64-O0-NEXT: ld r3, 0(r3)366; SMALL64-O0-NEXT: # kill: def $r3 killed $r3 killed $x3367; SMALL64-O0-NEXT: clrldi r3, r3, 32368; SMALL64-O0-NEXT: blr369;370; LARGE64-O0-LABEL: loadLongLong:371; LARGE64-O0: # %bb.0: # %entry372; LARGE64-O0-NEXT: addis r3, L..C1@u(r2)373; LARGE64-O0-NEXT: ld r3, L..C1@l(r3)374; LARGE64-O0-NEXT: add r3, r13, r3375; LARGE64-O0-NEXT: ld r3, 0(r3)376; LARGE64-O0-NEXT: # kill: def $r3 killed $r3 killed $x3377; LARGE64-O0-NEXT: clrldi r3, r3, 32378; LARGE64-O0-NEXT: blr379;380; SMALL32-O0-LABEL: loadLongLong:381; SMALL32-O0: # %bb.0: # %entry382; SMALL32-O0-NEXT: mflr r0383; SMALL32-O0-NEXT: stwu r1, -32(r1)384; SMALL32-O0-NEXT: stw r0, 40(r1)385; SMALL32-O0-NEXT: lwz r4, L..C1(r2) # target-flags(ppc-tprel) @TLLongLong386; SMALL32-O0-NEXT: bla .__get_tpointer[PR]387; SMALL32-O0-NEXT: add r3, r3, r4388; SMALL32-O0-NEXT: lwz r3, 4(r3)389; SMALL32-O0-NEXT: addi r1, r1, 32390; SMALL32-O0-NEXT: lwz r0, 8(r1)391; SMALL32-O0-NEXT: mtlr r0392; SMALL32-O0-NEXT: blr393;394; LARGE32-O0-LABEL: loadLongLong:395; LARGE32-O0: # %bb.0: # %entry396; LARGE32-O0-NEXT: mflr r0397; LARGE32-O0-NEXT: stwu r1, -32(r1)398; LARGE32-O0-NEXT: stw r0, 40(r1)399; LARGE32-O0-NEXT: addis r3, L..C1@u(r2)400; LARGE32-O0-NEXT: lwz r4, L..C1@l(r3)401; LARGE32-O0-NEXT: bla .__get_tpointer[PR]402; LARGE32-O0-NEXT: add r3, r3, r4403; LARGE32-O0-NEXT: lwz r3, 4(r3)404; LARGE32-O0-NEXT: addi r1, r1, 32405; LARGE32-O0-NEXT: lwz r0, 8(r1)406; LARGE32-O0-NEXT: mtlr r0407; LARGE32-O0-NEXT: blr408;409; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadLongLong:410; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry411; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r3, TLLongLong[UL]@le(r13)412; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: ld r3, 0(r3)413; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: # kill: def $r3 killed $r3 killed $x3414; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: clrldi r3, r3, 32415; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr416;417; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadLongLong:418; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry419; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r3, TLLongLong[UL]@le(r13)420; SMALL-LOCAL-EXEC-LARGECM64-NEXT: ld r3, 0(r3)421; SMALL-LOCAL-EXEC-LARGECM64-NEXT: # kill: def $r3 killed $r3 killed $x3422; SMALL-LOCAL-EXEC-LARGECM64-NEXT: clrldi r3, r3, 32423; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr424entry:425 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @TLLongLong)426 %1 = load i64, ptr %0, align 8427 %conv = trunc i64 %1 to i32428 ret i32 %conv429}430 431define i32 @loadDouble() {432; SMALL64-O0-LABEL: loadDouble:433; SMALL64-O0: # %bb.0: # %entry434; SMALL64-O0-NEXT: ld r3, L..C2(r2) # target-flags(ppc-tprel) @TLDouble435; SMALL64-O0-NEXT: add r3, r13, r3436; SMALL64-O0-NEXT: lfd f0, 0(r3)437; SMALL64-O0-NEXT: # kill: def $f1 killed $f0438; SMALL64-O0-NEXT: xscvdpsxws f0, f0439; SMALL64-O0-NEXT: addi r3, r1, -12440; SMALL64-O0-NEXT: stfiwx f0, 0, r3441; SMALL64-O0-NEXT: lwz r3, -12(r1)442; SMALL64-O0-NEXT: clrldi r3, r3, 32443; SMALL64-O0-NEXT: blr444;445; LARGE64-O0-LABEL: loadDouble:446; LARGE64-O0: # %bb.0: # %entry447; LARGE64-O0-NEXT: addis r3, L..C2@u(r2)448; LARGE64-O0-NEXT: ld r3, L..C2@l(r3)449; LARGE64-O0-NEXT: add r3, r13, r3450; LARGE64-O0-NEXT: lfd f0, 0(r3)451; LARGE64-O0-NEXT: # kill: def $f1 killed $f0452; LARGE64-O0-NEXT: xscvdpsxws f0, f0453; LARGE64-O0-NEXT: addi r3, r1, -12454; LARGE64-O0-NEXT: stfiwx f0, 0, r3455; LARGE64-O0-NEXT: lwz r3, -12(r1)456; LARGE64-O0-NEXT: clrldi r3, r3, 32457; LARGE64-O0-NEXT: blr458;459; SMALL32-O0-LABEL: loadDouble:460; SMALL32-O0: # %bb.0: # %entry461; SMALL32-O0-NEXT: mflr r0462; SMALL32-O0-NEXT: stwu r1, -32(r1)463; SMALL32-O0-NEXT: stw r0, 40(r1)464; SMALL32-O0-NEXT: lwz r4, L..C2(r2) # target-flags(ppc-tprel) @TLDouble465; SMALL32-O0-NEXT: bla .__get_tpointer[PR]466; SMALL32-O0-NEXT: add r3, r3, r4467; SMALL32-O0-NEXT: lfd f0, 0(r3)468; SMALL32-O0-NEXT: xscvdpsxws f0, f0469; SMALL32-O0-NEXT: addi r3, r1, 28470; SMALL32-O0-NEXT: stfiwx f0, 0, r3471; SMALL32-O0-NEXT: lwz r3, 28(r1)472; SMALL32-O0-NEXT: addi r1, r1, 32473; SMALL32-O0-NEXT: lwz r0, 8(r1)474; SMALL32-O0-NEXT: mtlr r0475; SMALL32-O0-NEXT: blr476;477; LARGE32-O0-LABEL: loadDouble:478; LARGE32-O0: # %bb.0: # %entry479; LARGE32-O0-NEXT: mflr r0480; LARGE32-O0-NEXT: stwu r1, -32(r1)481; LARGE32-O0-NEXT: stw r0, 40(r1)482; LARGE32-O0-NEXT: addis r3, L..C2@u(r2)483; LARGE32-O0-NEXT: lwz r4, L..C2@l(r3)484; LARGE32-O0-NEXT: bla .__get_tpointer[PR]485; LARGE32-O0-NEXT: add r3, r3, r4486; LARGE32-O0-NEXT: lfd f0, 0(r3)487; LARGE32-O0-NEXT: xscvdpsxws f0, f0488; LARGE32-O0-NEXT: addi r3, r1, 28489; LARGE32-O0-NEXT: stfiwx f0, 0, r3490; LARGE32-O0-NEXT: lwz r3, 28(r1)491; LARGE32-O0-NEXT: addi r1, r1, 32492; LARGE32-O0-NEXT: lwz r0, 8(r1)493; LARGE32-O0-NEXT: mtlr r0494; LARGE32-O0-NEXT: blr495;496; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadDouble:497; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry498; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r3, TLDouble[UL]@le(r13)499; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lfd f0, 0(r3)500; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: # kill: def $f1 killed $f0501; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: xscvdpsxws f0, f0502; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: addi r3, r1, -12503; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stfiwx f0, 0, r3504; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwz r3, -12(r1)505; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: clrldi r3, r3, 32506; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr507;508; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadDouble:509; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry510; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r3, TLDouble[UL]@le(r13)511; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lfd f0, 0(r3)512; SMALL-LOCAL-EXEC-LARGECM64-NEXT: # kill: def $f1 killed $f0513; SMALL-LOCAL-EXEC-LARGECM64-NEXT: xscvdpsxws f0, f0514; SMALL-LOCAL-EXEC-LARGECM64-NEXT: addi r3, r1, -12515; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stfiwx f0, 0, r3516; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwz r3, -12(r1)517; SMALL-LOCAL-EXEC-LARGECM64-NEXT: clrldi r3, r3, 32518; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr519entry:520 %0 = tail call align 8 ptr @llvm.threadlocal.address.p0(ptr align 8 @TLDouble)521 %1 = load double, ptr %0, align 8522 %conv = fptosi double %1 to i32523 ret i32 %conv524}525 526define i32 @loadFloat() {527; SMALL64-O0-LABEL: loadFloat:528; SMALL64-O0: # %bb.0: # %entry529; SMALL64-O0-NEXT: ld r3, L..C3(r2) # target-flags(ppc-tprel) @TLFloat530; SMALL64-O0-NEXT: add r3, r13, r3531; SMALL64-O0-NEXT: lfs f0, 0(r3)532; SMALL64-O0-NEXT: fctiwz f0, f0533; SMALL64-O0-NEXT: stfd f0, -8(r1)534; SMALL64-O0-NEXT: lwa r3, -4(r1)535; SMALL64-O0-NEXT: clrldi r3, r3, 32536; SMALL64-O0-NEXT: blr537;538; LARGE64-O0-LABEL: loadFloat:539; LARGE64-O0: # %bb.0: # %entry540; LARGE64-O0-NEXT: addis r3, L..C3@u(r2)541; LARGE64-O0-NEXT: ld r3, L..C3@l(r3)542; LARGE64-O0-NEXT: add r3, r13, r3543; LARGE64-O0-NEXT: lfs f0, 0(r3)544; LARGE64-O0-NEXT: fctiwz f0, f0545; LARGE64-O0-NEXT: stfd f0, -8(r1)546; LARGE64-O0-NEXT: lwa r3, -4(r1)547; LARGE64-O0-NEXT: clrldi r3, r3, 32548; LARGE64-O0-NEXT: blr549;550; SMALL32-O0-LABEL: loadFloat:551; SMALL32-O0: # %bb.0: # %entry552; SMALL32-O0-NEXT: mflr r0553; SMALL32-O0-NEXT: stwu r1, -32(r1)554; SMALL32-O0-NEXT: stw r0, 40(r1)555; SMALL32-O0-NEXT: lwz r4, L..C3(r2) # target-flags(ppc-tprel) @TLFloat556; SMALL32-O0-NEXT: bla .__get_tpointer[PR]557; SMALL32-O0-NEXT: add r3, r3, r4558; SMALL32-O0-NEXT: lfs f0, 0(r3)559; SMALL32-O0-NEXT: xscvdpsxws f0, f0560; SMALL32-O0-NEXT: addi r3, r1, 28561; SMALL32-O0-NEXT: stfiwx f0, 0, r3562; SMALL32-O0-NEXT: lwz r3, 28(r1)563; SMALL32-O0-NEXT: addi r1, r1, 32564; SMALL32-O0-NEXT: lwz r0, 8(r1)565; SMALL32-O0-NEXT: mtlr r0566; SMALL32-O0-NEXT: blr567;568; LARGE32-O0-LABEL: loadFloat:569; LARGE32-O0: # %bb.0: # %entry570; LARGE32-O0-NEXT: mflr r0571; LARGE32-O0-NEXT: stwu r1, -32(r1)572; LARGE32-O0-NEXT: stw r0, 40(r1)573; LARGE32-O0-NEXT: addis r3, L..C3@u(r2)574; LARGE32-O0-NEXT: lwz r4, L..C3@l(r3)575; LARGE32-O0-NEXT: bla .__get_tpointer[PR]576; LARGE32-O0-NEXT: add r3, r3, r4577; LARGE32-O0-NEXT: lfs f0, 0(r3)578; LARGE32-O0-NEXT: xscvdpsxws f0, f0579; LARGE32-O0-NEXT: addi r3, r1, 28580; LARGE32-O0-NEXT: stfiwx f0, 0, r3581; LARGE32-O0-NEXT: lwz r3, 28(r1)582; LARGE32-O0-NEXT: addi r1, r1, 32583; LARGE32-O0-NEXT: lwz r0, 8(r1)584; LARGE32-O0-NEXT: mtlr r0585; LARGE32-O0-NEXT: blr586;587; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadFloat:588; SMALL-LOCAL-EXEC-SMALLCM64: # %bb.0: # %entry589; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: la r3, TLFloat[UL]@le(r13)590; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lfs f0, 0(r3)591; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: fctiwz f0, f0592; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: stfd f0, -8(r1)593; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: lwa r3, -4(r1)594; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: clrldi r3, r3, 32595; SMALL-LOCAL-EXEC-SMALLCM64-NEXT: blr596;597; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadFloat:598; SMALL-LOCAL-EXEC-LARGECM64: # %bb.0: # %entry599; SMALL-LOCAL-EXEC-LARGECM64-NEXT: la r3, TLFloat[UL]@le(r13)600; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lfs f0, 0(r3)601; SMALL-LOCAL-EXEC-LARGECM64-NEXT: fctiwz f0, f0602; SMALL-LOCAL-EXEC-LARGECM64-NEXT: stfd f0, -8(r1)603; SMALL-LOCAL-EXEC-LARGECM64-NEXT: lwa r3, -4(r1)604; SMALL-LOCAL-EXEC-LARGECM64-NEXT: clrldi r3, r3, 32605; SMALL-LOCAL-EXEC-LARGECM64-NEXT: blr606entry:607 %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @TLFloat)608 %1 = load float, ptr %0, align 4609 %conv = fptosi float %1 to i32610 ret i32 %conv611}612 613; TOC Entry Checks.614 615; SMALL64-O0-LABEL: .toc616; SMALL64-O0-LABEL:L..C0:617; SMALL64-O0-NEXT: .tc TLInt[TC],TLInt[UL]@le618; SMALL64-O0-LABEL:L..C1:619; SMALL64-O0-NEXT: .tc TLLongLong[TC],TLLongLong[UL]@le620; SMALL64-O0-LABEL:L..C2:621; SMALL64-O0-NEXT: .tc TLDouble[TC],TLDouble[UL]@le622; SMALL64-O0-LABEL:L..C3:623; SMALL64-O0-NEXT: .tc TLFloat[TC],TLFloat[UL]@le624 625; LARGE64-O0-LABEL: .toc626; LARGE64-O0-LABEL:L..C0:627; LARGE64-O0-NEXT: .tc TLInt[TE],TLInt[UL]@le628; LARGE64-O0-LABEL:L..C1:629; LARGE64-O0-NEXT: .tc TLLongLong[TE],TLLongLong[UL]@le630; LARGE64-O0-LABEL:L..C2:631; LARGE64-O0-NEXT: .tc TLDouble[TE],TLDouble[UL]@le632; LARGE64-O0-LABEL:L..C3:633; LARGE64-O0-NEXT: .tc TLFloat[TE],TLFloat[UL]@le634 635; SMALL32-O0-LABEL: .toc636; SMALL32-O0-LABEL:L..C0:637; SMALL32-O0-NEXT: .tc TLInt[TC],TLInt[UL]@le638; SMALL32-O0-LABEL:L..C1:639; SMALL32-O0-NEXT: .tc TLLongLong[TC],TLLongLong[UL]@le640; SMALL32-O0-LABEL:L..C2:641; SMALL32-O0-NEXT: .tc TLDouble[TC],TLDouble[UL]@le642; SMALL32-O0-LABEL:L..C3:643; SMALL32-O0-NEXT: .tc TLFloat[TC],TLFloat[UL]@le644 645; LARGE32-O0-LABEL: .toc646; LARGE32-O0-LABEL:L..C0:647; LARGE32-O0-NEXT: .tc TLInt[TE],TLInt[UL]@le648; LARGE32-O0-LABEL:L..C1:649; LARGE32-O0-NEXT: .tc TLLongLong[TE],TLLongLong[UL]@le650; LARGE32-O0-LABEL:L..C2:651; LARGE32-O0-NEXT: .tc TLDouble[TE],TLDouble[UL]@le652; LARGE32-O0-LABEL:L..C3:653; LARGE32-O0-NEXT: .tc TLFloat[TE],TLFloat[UL]@le654 655