1# RUN: llvm-mc -triple mips-unknown-linux -target-abi o32 -filetype=obj -o - %s | \
2# RUN:   llvm-objdump -d -r - | FileCheck -check-prefixes=ALL,O32 %s
3
4# RUN: llvm-mc -triple mips-unknown-linux -target-abi o32 %s | \
5# RUN:   FileCheck -check-prefixes=ALL,ASM,ASM-O32 %s
6
7# FIXME: Now we check .cpsetup expansion for `-mno-shared` case only.
8#        We also need to implement/check the `-mshared` case.
9# RUN: llvm-mc -triple mips64-unknown-linux -target-abi n32 -filetype=obj -o - %s | \
10# RUN:   llvm-objdump -d -r - | \
11# RUN:   FileCheck -check-prefixes=ALL,NXX,N32 %s
12
13# RUN: llvm-mc -triple mips64-unknown-linux -target-abi n32 %s | \
14# RUN:   FileCheck -check-prefixes=ALL,ASM,ASM-N32 %s
15
16# RUN: llvm-mc -triple mips64-unknown-linux %s -filetype=obj -o - | \
17# RUN:   llvm-objdump -d -r - | \
18# RUN:   FileCheck -check-prefixes=ALL,NXX,N64 %s
19
20# RUN: llvm-mc -triple mips64-unknown-linux %s | \
21# RUN:   FileCheck -check-prefixes=ALL,ASM,ASM-N64 %s
22
23        .text
24        .option pic2
25t1:
26        .cpsetup $25, 8, __cerror
27        nop
28        .cpreturn
29        nop
30
31# ALL-LABEL: t1:
32
33# O32-NOT: __cerror
34
35# NXX-NEXT: sd       $gp, 8($sp)
36# NXX-NEXT: lui      $gp, 0
37# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
38# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16  __cerror
39# NXX-NEXT: addiu    $gp, $gp, 0
40# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
41# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16  __cerror
42# N64-NEXT: daddu    $gp, $gp, $25
43
44# ASM-NEXT: .cpsetup $25, 8, __cerror
45
46# ALL-NEXT: nop
47
48# ASM-NEXT: .cpreturn
49# NXX-NEXT: ld $gp, 8($sp)
50
51# ALL-NEXT: nop
52
53t2:
54        .cpsetup $25, $2, __cerror
55        nop
56        .cpreturn
57        nop
58
59# ALL-LABEL: t2:
60
61# O32-NOT: __cerror
62
63# NXX-NEXT: move     $2, $gp
64# NXX-NEXT: lui      $gp, 0
65# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
66# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16  __cerror
67# NXX-NEXT: addiu    $gp, $gp, 0
68# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
69# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16  __cerror
70# N64-NEXT: daddu    $gp, $gp, $25
71
72# ASM-NEXT: .cpsetup $25, $2, __cerror
73
74# ALL-NEXT: nop
75
76# ASM-NEXT: .cpreturn
77# NXX-NEXT: move $gp, $2
78
79# ALL-NEXT: nop
80
81# .cpsetup with local labels (PR22518):
82
83# The '1:' label isn't emitted in all cases but we still want a label to match
84# so we force one here.
85
86t3:
87        nop
881:
89        .cpsetup $25, $2, 1b
90        nop
91        sub $3, $3, $2
92
93# ALL-LABEL: t3:
94# ALL-NEXT:  nop
95
96# O32-NEXT:   nop
97# O32-NEXT:   sub $3, $3, $2
98
99# NXX-NEXT: move     $2, $gp
100# NXX-NEXT: lui      $gp, 0
101# N32-NEXT: {{^ *0+}}38: R_MIPS_HI16 __gnu_local_gp
102# N64-NEXT: {{^ *0+}}40: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16 .text
103# NXX-NEXT: addiu    $gp, $gp, 0
104# N32-NEXT: {{^ *0+}}3c: R_MIPS_LO16 __gnu_local_gp
105# N64-NEXT: {{^ *0+}}44: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16 .text
106# N64-NEXT: daddu    $gp, $gp, $25
107# NXX-NEXT: nop
108# NXX-NEXT: sub $3, $3, $2
109
110# ASM-O32: [[LABEL:\$tmp0]]:
111# ASM-N32: [[LABEL:\.Ltmp0]]:
112# ASM-N64: [[LABEL:\.Ltmp0]]:
113# ASM-NEXT: .cpsetup $25, $2, [[LABEL]]
114
115# Ensure we have at least one instruction between labels so that the labels
116# we're matching aren't removed.
117        nop
118# ALL-NEXT: nop
119
120        .option pic0
121t4:
122        nop
123        .cpsetup $25, 8, __cerror
124        nop
125        .cpreturn
126        nop
127
128# Testing that .cpsetup expands to nothing in this case
129# by checking that the next instruction after the first
130# nop is also a 'nop'.
131
132# ALL-LABEL: t4:
133
134# NXX-NEXT: nop
135# NXX-NEXT: nop
136# NXX-NEXT: nop
137
138# ASM-NEXT: nop
139# ASM-NEXT: .cpsetup $25, 8, __cerror
140# ASM-NEXT: nop
141# ASM-NEXT: .cpreturn
142# ASM-NEXT: nop
143
144# Test that we accept constant expressions.
145        .option pic2
146t5:
147        .cpsetup $25, ((8*4) - (3*8)), __cerror
148        nop
149
150# ALL-LABEL: t5:
151
152# O32-NOT: __cerror
153
154# NXX-NEXT: sd       $gp, 8($sp)
155# NXX-NEXT: lui      $gp, 0
156# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
157# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16  __cerror
158# NXX-NEXT: addiu    $gp, $gp, 0
159# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
160# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16  __cerror
161# N64-NEXT: daddu    $gp, $gp, $25
162
163# ASM-NEXT: .cpsetup $25, 8, __cerror
164
165# ALL-NEXT: nop
166
167t1b:
168IMM_8 = 8
169        .cpsetup $25, IMM_8, __cerror
170        nop
171        .cpreturn
172        nop
173
174# ALL-LABEL: t1b:
175# ASM-NEXT: .set IMM_8, 8
176
177# O32-NOT: __cerror
178
179# NXX-NEXT: sd       $gp, 8($sp)
180# NXX-NEXT: lui      $gp, 0
181# N32-NEXT: R_MIPS_HI16 __gnu_local_gp
182# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_HI16  __cerror
183# NXX-NEXT: addiu    $gp, $gp, 0
184# N32-NEXT: R_MIPS_LO16 __gnu_local_gp
185# N64-NEXT: R_MIPS_GPREL16/R_MIPS_SUB/R_MIPS_LO16  __cerror
186# N64-NEXT: daddu    $gp, $gp, $25
187
188# ASM-NEXT: .cpsetup $25, 8, __cerror
189
190# ALL-NEXT: nop
191
192# ASM-NEXT: .cpreturn
193# NXX-NEXT: ld $gp, 8($sp)
194
195# ALL-NEXT: nop
196
197