xref: /llvm-project/llvm/test/CodeGen/PowerPC/aix-small-local-exec-tls-float.ll (revision 2a50921553798d2db52ca6330c89f0f8a5bc2215)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 3
2; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \
3; RUN:      -mtriple powerpc64-ibm-aix-xcoff -mattr=+aix-small-local-exec-tls < %s \
4; RUN:      | FileCheck %s --check-prefix=SMALL-LOCAL-EXEC-SMALLCM64
5; RUN: llc  -verify-machineinstrs -mcpu=pwr7 -ppc-asm-full-reg-names \
6; RUN:      -mtriple powerpc64-ibm-aix-xcoff --code-model=large \
7; RUN:      -mattr=+aix-small-local-exec-tls < %s | FileCheck %s \
8; RUN:      --check-prefix=SMALL-LOCAL-EXEC-LARGECM64
9
10@ThreadLocalVarInit = thread_local(localexec) global float 1.000000e+00, align 4
11@VarInit = local_unnamed_addr global float 8.700000e+01, align 4
12@IThreadLocalVarInit = internal thread_local(localexec) global float 1.000000e+00, align 4
13declare nonnull ptr @llvm.threadlocal.address.p0(ptr nonnull) #1
14@e = thread_local(localexec) global [87 x float] zeroinitializer, align 4
15
16define nonnull ptr @AddrTest1() local_unnamed_addr #0 {
17; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: AddrTest1:
18; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
19; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    la r3, e[TL]@le+16(r13)
20; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
21;
22; SMALL-LOCAL-EXEC-LARGECM64-LABEL: AddrTest1:
23; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
24; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    la r3, e[TL]@le+16(r13)
25; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
26entry:
27  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @e)
28  %arrayidx = getelementptr inbounds [87 x float], ptr %0, i64 0, i64 4
29  ret ptr %arrayidx
30}
31
32define void @storeITLInit(float noundef %x) {
33; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeITLInit:
34; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
35; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stfs f1, IThreadLocalVarInit[TL]@le(r13)
36; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
37;
38; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeITLInit:
39; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
40; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stfs f1, IThreadLocalVarInit[TL]@le(r13)
41; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
42entry:
43  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)
44  store float %x, ptr %0, align 4
45  ret void
46}
47
48define void @storeTLInit(float noundef %x) {
49; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: storeTLInit:
50; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
51; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stfs f1, ThreadLocalVarInit[TL]@le(r13)
52; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
53;
54; SMALL-LOCAL-EXEC-LARGECM64-LABEL: storeTLInit:
55; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
56; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stfs f1, ThreadLocalVarInit[TL]@le(r13)
57; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
58entry:
59  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarInit)
60  store float %x, ptr %0, align 4
61  ret void
62}
63
64define float @loadITLInit() {
65; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadITLInit:
66; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
67; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    lfs f1, IThreadLocalVarInit[TL]@le(r13)
68; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
69;
70; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadITLInit:
71; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
72; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    lfs f1, IThreadLocalVarInit[TL]@le(r13)
73; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
74entry:
75  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)
76  %1 = load float, ptr %0, align 4
77  ret float %1
78}
79
80define float @loadITLInit2() {
81; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadITLInit2:
82; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
83; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    ld r3, L..C0(r2) # @VarInit
84; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    lfs f0, IThreadLocalVarInit[TL]@le(r13)
85; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    lfs f1, 0(r3)
86; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    fadds f1, f0, f1
87; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
88;
89; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadITLInit2:
90; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
91; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    addis r3, L..C0@u(r2)
92; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    lfs f0, IThreadLocalVarInit[TL]@le(r13)
93; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    ld r3, L..C0@l(r3)
94; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    lfs f1, 0(r3)
95; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    fadds f1, f0, f1
96; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
97entry:
98  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)
99  %1 = load float, ptr %0, align 4
100  %2 = load float, ptr @VarInit, align 4
101  %add = fadd float %1, %2
102  ret float %add
103}
104
105define float @loadTLInit() {
106; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadTLInit:
107; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
108; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    lfs f1, ThreadLocalVarInit[TL]@le(r13)
109; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
110;
111; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadTLInit:
112; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
113; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    lfs f1, ThreadLocalVarInit[TL]@le(r13)
114; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
115entry:
116  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarInit)
117  %1 = load float, ptr %0, align 4
118  ret float %1
119}
120
121define float @loadTLInit2() {
122; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadTLInit2:
123; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
124; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    ld r3, L..C0(r2) # @VarInit
125; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    lfs f0, ThreadLocalVarInit[TL]@le(r13)
126; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    lfs f1, 0(r3)
127; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    fadds f1, f0, f1
128; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
129;
130; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadTLInit2:
131; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
132; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    addis r3, L..C0@u(r2)
133; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    lfs f0, ThreadLocalVarInit[TL]@le(r13)
134; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    ld r3, L..C0@l(r3)
135; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    lfs f1, 0(r3)
136; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    fadds f1, f0, f1
137; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
138entry:
139  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @ThreadLocalVarInit)
140  %1 = load float, ptr %0, align 4
141  %2 = load float, ptr @VarInit, align 4
142  %add = fadd float %1, %2
143  ret float %add
144}
145
146define void @loadStore1(float noundef %x) {
147; SMALL-LOCAL-EXEC-SMALLCM64-LABEL: loadStore1:
148; SMALL-LOCAL-EXEC-SMALLCM64:       # %bb.0: # %entry
149; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    vspltisw v2, 1
150; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    lfs f1, IThreadLocalVarInit[TL]@le(r13)
151; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    xvcvsxwdp vs0, vs34
152; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    vspltisw v3, 8
153; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    fadds f0, f1, f0
154; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    xvcvsxwdp vs1, vs35
155; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    fadds f0, f0, f1
156; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    stfs f0, IThreadLocalVarInit[TL]@le(r13)
157; SMALL-LOCAL-EXEC-SMALLCM64-NEXT:    blr
158;
159; SMALL-LOCAL-EXEC-LARGECM64-LABEL: loadStore1:
160; SMALL-LOCAL-EXEC-LARGECM64:       # %bb.0: # %entry
161; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    vspltisw v2, 1
162; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    lfs f1, IThreadLocalVarInit[TL]@le(r13)
163; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    xvcvsxwdp vs0, vs34
164; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    vspltisw v3, 8
165; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    fadds f0, f1, f0
166; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    xvcvsxwdp vs1, vs35
167; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    fadds f0, f0, f1
168; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    stfs f0, IThreadLocalVarInit[TL]@le(r13)
169; SMALL-LOCAL-EXEC-LARGECM64-NEXT:    blr
170entry:
171  %0 = tail call align 4 ptr @llvm.threadlocal.address.p0(ptr align 4 @IThreadLocalVarInit)
172  %1 = load float, ptr %0, align 4
173  %inc = fadd float %1, 1.000000e+00
174  %add = fadd float %inc, 8.000000e+00
175  store float %add, ptr %0, align 4
176  ret void
177}
178