1; REQUIRES: asserts
2; RUN: llc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs < %s \
3; RUN:     -stop-before=ppc-ctr-loops-verify | FileCheck %s --check-prefix CHECK32
4; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s \
5; RUN:     -stop-before=ppc-ctr-loops-verify | FileCheck %s --check-prefix CHECK64
6; RUN: llc -mtriple powerpc-ibm-aix-xcoff -verify-machineinstrs < %s | FileCheck %s --check-prefix TEST32
7; RUN: llc -mtriple powerpc64-ibm-aix-xcoff -verify-machineinstrs < %s | FileCheck %s --check-prefix TEST64
8
9@i = dso_local global i32 0, align 4 #0
10@d = dso_local local_unnamed_addr global double 3.141590e+00, align 8
11@f = dso_local local_unnamed_addr global float 0x4005BE76C0000000, align 4 #0
12@ll = dso_local local_unnamed_addr global i64 55, align 8
13@ilocal = internal global i32 0, align 4
14
15define dso_local void @write_int(i32 signext %in) {
16  entry:
17    store i32 %in, i32* @i, align 4
18    ret void
19}
20; CHECK32: name:            write_int
21; CHECK32:      %[[SCRATCH:[0-9]+]]:gprc_and_gprc_nor0 = ADDItoc @i, $r2
22; CHECK32-NEXT: STW %{{[0-9]+}}, 0, killed %[[SCRATCH]] :: (store (s32) into @i)
23
24; TEST32:         .write_int:
25; TEST32:           la 4, i[TD](2)
26; TEST32-NEXT:      stw 3, 0(4)
27
28; CHECK64: name:            write_int
29; CHECK64:      %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 @i, $x2
30; CHECK64-NEXT: STW8 %{{[0-9]+}}, 0, killed %[[SCRATCH]] :: (store (s32) into @i)
31
32; TEST64:         .write_int:
33; TEST64:           la 4, i[TD](2)
34; TEST64-NEXT:      stw 3, 0(4)
35
36
37define dso_local i64 @read_ll() {
38  entry:
39    %0 = load i64, i64* @ll, align 8
40    ret i64 %0
41}
42; CHECK32: name:            read_ll
43; CHECK32: LWZtoc @ll, $r2 :: (load (s32) from got)
44
45; TEST32:       .read_ll:
46; TEST32:         lwz 4, L..C0(2)
47; TEST32-NEXT:    lwz 3, 0(4)
48; TEST32-NEXT:    lwz 4, 4(4)
49
50; CHECK64: name:            read_ll
51; CHECK64: LDtoc @ll, $x2 :: (load (s64) from got)
52
53; TEST64:       .read_ll:
54; TEST64:         ld 3, L..C0(2)
55; TEST64-NEXT:    ld 3, 0(3)
56
57
58define dso_local float @read_float() {
59  entry:
60    %0 = load float, float* @f, align 4
61    ret float %0
62}
63; CHECK32: name:            read_float
64; CHECK32: %[[SCRATCH:[0-9]+]]:gprc_and_gprc_nor0 = ADDItoc @f, $r2
65; CHECK32: %{{[0-9]+}}:f4rc = LFS 0, killed %[[SCRATCH]] :: (dereferenceable load (s32) from @f)
66
67; TEST32:       .read_float:
68; TEST32:         la 3, f[TD](2)
69; TEST32-NEXT:    lfs 1, 0(3)
70
71; CHECK64: name:            read_float
72; CHECK64: %[[SCRATCH:[0-9]+]]:g8rc_and_g8rc_nox0 = ADDItoc8 @f, $x2
73; CHECK64: %{{[0-9]+}}:f4rc = LFS 0, killed %[[SCRATCH]] :: (dereferenceable load (s32) from @f)
74
75; TEST64:       .read_float:
76; TEST64:         la 3, f[TD](2)
77; TEST64-NEXT:    lfs 1, 0(3)
78
79
80define dso_local void @write_double(double %in) {
81  entry:
82    store double %in, double* @d, align 8
83    ret void
84}
85; CHECK32: name:            write_double
86; CHECK32: LWZtoc @d, $r2 :: (load (s32) from got)
87
88; TEST32:       .write_double
89; TEST32:         lwz 3, L..C1(2)
90; TEST32-NEXT:    stfd 1, 0(3)
91
92; CHECK64: name:            write_double
93; CHECK64: LDtoc @d, $x2 :: (load (s64) from got)
94
95; TEST64:       .write_double
96; TEST64:         ld 3, L..C1(2)
97; TEST64-NEXT:    stfd 1, 0(3)
98
99
100define dso_local nonnull i32* @addr() {
101  entry:
102    ret i32* @i
103}
104; CHECK32: name:            addr
105; CHECK32:       %[[SCRATCH:[0-9]+]]:gprc = ADDItoc @i, $r2
106; CHECK32-NEXT:  $r3 = COPY %[[SCRATCH]]
107
108; TEST32:       .addr
109; TEST32:         la 3, i[TD](2)
110
111; CHECK64: name:            addr
112; CHECK64:       %[[SCRATCH:[0-9]+]]:g8rc = ADDItoc8 @i, $x2
113; CHECK64-NEXT:  $x3 = COPY %[[SCRATCH]]
114
115; TEST64:       .addr
116; TEST64:         la 3, i[TD](2)
117
118; TEST32:         .toc
119; TEST32:           .tc ll[TC],ll[RW]
120; TEST32-NOT:       .csect ll[TD]
121; TEST32:           .tc d[TC],d[RW]
122; TEST32-NOT:       .csect d[TD],2
123; TEST32:           .csect i[TD],2
124; TEST32-NEXT:      .globl  i[TD]
125; TEST32-NEXT:      .align  2
126; TEST32-NOT:       .tc i[TC],i[RW]
127; TEST32:           .csect f[TD],2
128; TEST32-NEXT:      .globl f[TD]
129; TEST32-NOT:       .tc f[TD],f[RW]
130
131; TEST64:         .toc
132; TEST64:           .tc ll[TC],ll[RW]
133; TEST64-NOT:       .csect ll[TD]
134; TEST64:           .tc d[TC],d[RW]
135; TEST64-NOT:       .csect d[TD],2
136; TEST64:           .csect i[TD],2
137; TEST64-NEXT:      .globl  i[TD]
138; TEST64-NEXT:      .align  2
139; TEST64-NOT:       .tc i[TC],i[RW]
140; TEST64:           .csect f[TD],2
141; TEST64-NEXT:      .globl f[TD]
142; TEST64-NOT:       .tc f[TD],f[RW]
143
144attributes #0 = { "toc-data" }
145