1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -verify-machineinstrs -mtriple=powerpc64le-unknown-gnu-linux < %s | FileCheck %s -check-prefix=CHECK 3 4@var_char = external thread_local local_unnamed_addr global i8, align 1 5@var_short = external thread_local local_unnamed_addr global i16, align 2 6@var_int = external thread_local local_unnamed_addr global i32, align 4 7@var_long_long = external thread_local local_unnamed_addr global i64, align 8 8 9define dso_local zeroext i8 @test_char_one() { 10; CHECK-LABEL: test_char_one: 11; CHECK: # %bb.0: # %entry 12; CHECK-NEXT: addis 3, 2, var_char@got@tprel@ha 13; CHECK-NEXT: ld 3, var_char@got@tprel@l(3) 14; CHECK-NEXT: lbzx 3, 3, var_char@tls 15; CHECK-NEXT: blr 16entry: 17 %0 = load i8, i8* @var_char, align 1, !tbaa !4 18 ret i8 %0 19} 20 21define dso_local void @test_char_two(i32 signext %a) { 22; CHECK-LABEL: test_char_two: 23; CHECK: # %bb.0: # %entry 24; CHECK-NEXT: addis 4, 2, var_char@got@tprel@ha 25; CHECK-NEXT: ld 4, var_char@got@tprel@l(4) 26; CHECK-NEXT: stbx 3, 4, var_char@tls 27; CHECK-NEXT: blr 28entry: 29 %conv = trunc i32 %a to i8 30 store i8 %conv, i8* @var_char, align 1, !tbaa !4 31 ret void 32} 33 34define dso_local zeroext i8 @test_char_three(i8 zeroext %a) { 35; CHECK-LABEL: test_char_three: 36; CHECK: # %bb.0: # %entry 37; CHECK-NEXT: addis 4, 2, var_char@got@tprel@ha 38; CHECK-NEXT: ld 4, var_char@got@tprel@l(4) 39; CHECK-NEXT: lbzx 5, 4, var_char@tls 40; CHECK-NEXT: add 5, 5, 3 41; CHECK-NEXT: clrldi 3, 5, 56 42; CHECK-NEXT: stbx 5, 4, var_char@tls 43; CHECK-NEXT: blr 44entry: 45 %0 = load i8, i8* @var_char, align 1, !tbaa !4 46 %add = add i8 %0, %a 47 store i8 %add, i8* @var_char, align 1, !tbaa !4 48 ret i8 %add 49} 50 51define dso_local signext i16 @test_short_one() { 52; CHECK-LABEL: test_short_one: 53; CHECK: # %bb.0: # %entry 54; CHECK-NEXT: addis 3, 2, var_short@got@tprel@ha 55; CHECK-NEXT: ld 3, var_short@got@tprel@l(3) 56; CHECK-NEXT: lhzx 3, 3, var_short@tls 57; CHECK-NEXT: blr 58entry: 59 %0 = load i16, i16* @var_short, align 2, !tbaa !7 60 ret i16 %0 61} 62 63define dso_local void @test_short_two(i32 signext %a) { 64; CHECK-LABEL: test_short_two: 65; CHECK: # %bb.0: # %entry 66; CHECK-NEXT: addis 4, 2, var_short@got@tprel@ha 67; CHECK-NEXT: ld 4, var_short@got@tprel@l(4) 68; CHECK-NEXT: sthx 3, 4, var_short@tls 69; CHECK-NEXT: blr 70entry: 71 %conv = trunc i32 %a to i16 72 store i16 %conv, i16* @var_short, align 2, !tbaa !7 73 ret void 74} 75 76define dso_local signext i16 @test_short_three(i16 signext %a) { 77; CHECK-LABEL: test_short_three: 78; CHECK: # %bb.0: # %entry 79; CHECK-NEXT: addis 4, 2, var_short@got@tprel@ha 80; CHECK-NEXT: ld 4, var_short@got@tprel@l(4) 81; CHECK-NEXT: lhzx 5, 4, var_short@tls 82; CHECK-NEXT: add 5, 5, 3 83; CHECK-NEXT: extsh 3, 5 84; CHECK-NEXT: sthx 5, 4, var_short@tls 85; CHECK-NEXT: blr 86entry: 87 %0 = load i16, i16* @var_short, align 2, !tbaa !7 88 %add = add i16 %0, %a 89 store i16 %add, i16* @var_short, align 2, !tbaa !7 90 ret i16 %add 91} 92 93define dso_local signext i32 @test_int_one() { 94; CHECK-LABEL: test_int_one: 95; CHECK: # %bb.0: # %entry 96; CHECK-NEXT: addis 3, 2, var_int@got@tprel@ha 97; CHECK-NEXT: ld 3, var_int@got@tprel@l(3) 98; CHECK-NEXT: lwzx 3, 3, var_int@tls 99; CHECK-NEXT: blr 100entry: 101 %0 = load i32, i32* @var_int, align 4, !tbaa !9 102 ret i32 %0 103} 104 105define dso_local void @test_int_two(i32 signext %a) { 106; CHECK-LABEL: test_int_two: 107; CHECK: # %bb.0: # %entry 108; CHECK-NEXT: addis 4, 2, var_int@got@tprel@ha 109; CHECK-NEXT: ld 4, var_int@got@tprel@l(4) 110; CHECK-NEXT: stwx 3, 4, var_int@tls 111; CHECK-NEXT: blr 112entry: 113 store i32 %a, i32* @var_int, align 4, !tbaa !9 114 ret void 115} 116 117define dso_local signext i32 @test_int_three(i32 signext %a) { 118; CHECK-LABEL: test_int_three: 119; CHECK: # %bb.0: # %entry 120; CHECK-NEXT: addis 4, 2, var_int@got@tprel@ha 121; CHECK-NEXT: ld 4, var_int@got@tprel@l(4) 122; CHECK-NEXT: lwzx 5, 4, var_int@tls 123; CHECK-NEXT: add 5, 5, 3 124; CHECK-NEXT: extsw 3, 5 125; CHECK-NEXT: stwx 5, 4, var_int@tls 126; CHECK-NEXT: blr 127entry: 128 %0 = load i32, i32* @var_int, align 4, !tbaa !9 129 %add = add nsw i32 %0, %a 130 store i32 %add, i32* @var_int, align 4, !tbaa !9 131 ret i32 %add 132} 133 134define dso_local i64 @test_longlong_one() { 135; CHECK-LABEL: test_longlong_one: 136; CHECK: # %bb.0: # %entry 137; CHECK-NEXT: addis 3, 2, var_long_long@got@tprel@ha 138; CHECK-NEXT: ld 3, var_long_long@got@tprel@l(3) 139; CHECK-NEXT: ldx 3, 3, var_long_long@tls 140; CHECK-NEXT: blr 141entry: 142 %0 = load i64, i64* @var_long_long, align 8, !tbaa !11 143 ret i64 %0 144} 145 146define dso_local void @test_longlong_two(i32 signext %a) { 147; CHECK-LABEL: test_longlong_two: 148; CHECK: # %bb.0: # %entry 149; CHECK-NEXT: addis 4, 2, var_long_long@got@tprel@ha 150; CHECK-NEXT: ld 4, var_long_long@got@tprel@l(4) 151; CHECK-NEXT: stdx 3, 4, var_long_long@tls 152; CHECK-NEXT: blr 153entry: 154 %conv = sext i32 %a to i64 155 store i64 %conv, i64* @var_long_long, align 8, !tbaa !11 156 ret void 157} 158 159define dso_local i64 @test_longlong_three(i64 %a) { 160; CHECK-LABEL: test_longlong_three: 161; CHECK: # %bb.0: # %entry 162; CHECK-NEXT: addis 4, 2, var_long_long@got@tprel@ha 163; CHECK-NEXT: ld 4, var_long_long@got@tprel@l(4) 164; CHECK-NEXT: ldx 5, 4, var_long_long@tls 165; CHECK-NEXT: add 3, 5, 3 166; CHECK-NEXT: stdx 3, 4, var_long_long@tls 167; CHECK-NEXT: blr 168entry: 169 %0 = load i64, i64* @var_long_long, align 8, !tbaa !11 170 %add = add nsw i64 %0, %a 171 store i64 %add, i64* @var_long_long, align 8, !tbaa !11 172 ret i64 %add 173} 174 175!llvm.module.flags = !{!0, !1, !2} 176 177!0 = !{i32 1, !"wchar_size", i32 4} 178!1 = !{i32 7, !"PIC Level", i32 1} 179!2 = !{i32 7, !"PIE Level", i32 1} 180!4 = !{!5, !5, i64 0} 181!5 = !{!"omnipotent char", !6, i64 0} 182!6 = !{!"Simple C/C++ TBAA"} 183!7 = !{!8, !8, i64 0} 184!8 = !{!"short", !5, i64 0} 185!9 = !{!10, !10, i64 0} 186!10 = !{!"int", !5, i64 0} 187!11 = !{!12, !12, i64 0} 188!12 = !{!"long long", !5, i64 0} 189