Skip to content

Commit e0d2634

Browse files
committed
[SPARC][IAS] Make Is64Bit imply FeatureV9 in the assembler
This prevents usage of V9 instructions in assembly code intended for 32-bit V8. Fixes #142388
1 parent f3867f9 commit e0d2634

File tree

6 files changed

+264
-61
lines changed

6 files changed

+264
-61
lines changed

llvm/lib/Target/Sparc/SparcInstrInfo.td

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,8 @@ include "SparcInstrFormats.td"
2424
def Is32Bit : Predicate<"!Subtarget->is64Bit()">;
2525

2626
// True when generating 64-bit code. This also implies HasV9.
27-
def Is64Bit : Predicate<"Subtarget->is64Bit()">;
27+
def Is64Bit : Predicate<"Subtarget->is64Bit()">,
28+
AssemblerPredicate<(all_of FeatureV9)>;
2829

2930
def UseSoftMulDiv : Predicate<"Subtarget->useSoftMulDiv()">,
3031
AssemblerPredicate<(all_of FeatureSoftMulDiv)>;

llvm/test/CodeGen/SPARC/inlineasm-v9.ll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,3 +58,12 @@ Entry:
5858
tail call void asm sideeffect "", "{o0}"(i64 %val)
5959
ret void
6060
}
61+
62+
; CHECK-LABEL: test_twinword:
63+
; CHECK: rd %pc, %i1
64+
; CHECK: srlx %i1, 32, %i0
65+
66+
define i64 @test_twinword(){
67+
%1 = tail call i64 asm sideeffect "rd %asr5, ${0:L} \0A\09 srlx ${0:L}, 32, ${0:H}", "={i0}"()
68+
ret i64 %1
69+
}

llvm/test/CodeGen/SPARC/inlineasm.ll

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -144,15 +144,6 @@ entry:
144144
ret void
145145
}
146146

147-
; CHECK-LABEL: test_twinword:
148-
; CHECK: rd %asr5, %i1
149-
; CHECK: srlx %i1, 32, %i0
150-
151-
define i64 @test_twinword(){
152-
%1 = tail call i64 asm sideeffect "rd %asr5, ${0:L} \0A\09 srlx ${0:L}, 32, ${0:H}", "={i0}"()
153-
ret i64 %1
154-
}
155-
156147
; CHECK-LABEL: test_symbol:
157148
; CHECK: ba,a brtarget
158149
define void @test_symbol() {
Lines changed: 211 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
# RUN: llvm-mc %s -triple=sparcv9 | FileCheck %s --check-prefix=ASM
2+
3+
# RUN: llvm-mc %s -triple=sparcv9 -filetype=obj -o %t
4+
# RUN: llvm-objdump -dr %t | FileCheck %s --check-prefix=OBJDUMP
5+
# RUN: llvm-readelf -s - < %t | FileCheck %s --check-prefix=READELF --implicit-check-not=TLS
6+
7+
# READELF: TLS LOCAL DEFAULT [[#]] s_tle_hix22
8+
# READELF: TLS LOCAL DEFAULT [[#]] s_tldo_hix22
9+
# READELF: TLS GLOBAL DEFAULT UND s_tle_lox10
10+
# READELF: TLS GLOBAL DEFAULT UND s_tie_hi22
11+
# READELF: TLS GLOBAL DEFAULT UND s_tie_lo10
12+
# READELF: TLS GLOBAL DEFAULT UND s_tie_ld
13+
# READELF: TLS GLOBAL DEFAULT UND s_tie_ldx
14+
# READELF: TLS GLOBAL DEFAULT UND s_tie_add
15+
# READELF: TLS GLOBAL DEFAULT UND s_tldm_hi22
16+
# READELF: TLS GLOBAL DEFAULT UND s_tldm_lo10
17+
# READELF: TLS GLOBAL DEFAULT UND s_tldm_add
18+
# READELF: TLS GLOBAL DEFAULT UND s_tldo_lox10
19+
# READELF: TLS GLOBAL DEFAULT UND s_tldo_add
20+
# READELF: TLS GLOBAL DEFAULT UND s_tgd_hi22
21+
# READELF: TLS GLOBAL DEFAULT UND s_tgd_lo10
22+
# READELF: TLS GLOBAL DEFAULT UND s_tgd_add
23+
24+
main:
25+
26+
# ASM: or %g1, %lo(sym), %g3
27+
# ASM-NEXT: sethi %hi(sym), %l0
28+
# ASM-NEXT: sethi %h44(sym), %l0
29+
# ASM-NEXT: or %g1, %m44(sym), %g3
30+
# ASM-NEXT: or %g1, %l44(sym), %g3
31+
# OBJDUMP: 0000000: R_SPARC_LO10 sym
32+
# OBJDUMP: 0000004: R_SPARC_HI22 sym
33+
# OBJDUMP: 0000008: R_SPARC_H44 sym
34+
# OBJDUMP: 000000c: R_SPARC_M44 sym
35+
# OBJDUMP: 0000010: R_SPARC_L44 sym
36+
or %g1, %lo(sym), %g3
37+
sethi %hi(sym), %l0
38+
sethi %h44(sym), %l0
39+
or %g1, %m44(sym), %g3
40+
or %g1, %l44(sym), %g3
41+
42+
## FIXME: Emit %pc22/%pc10
43+
# ASM: sethi %hi(sym), %o1
44+
# ASM-NEXT: or %o1, %lo(sym), %o1
45+
# OBJDUMP: sethi 0x0, %o1
46+
# OBJDUMP-NEXT: R_SPARC_PC22 sym
47+
# OBJDUMP-NEXT: or %o1, 0x0, %o1
48+
# OBJDUMP-NEXT: R_SPARC_PC10 sym
49+
# OBJDUMP-NEXT: sethi 0x3fffff, %o1
50+
# OBJDUMP-NEXT: or %o1, 0x3e0, %o1
51+
sethi %pc22(sym), %o1
52+
or %o1, %pc10(sym), %o1
53+
sethi %pc22(main), %o1
54+
or %o1, %pc10(main), %o1
55+
56+
# ASM: sethi %hh(sym), %l0
57+
# ASM-NEXT: sethi %hh(sym), %l0
58+
# ASM-NEXT: or %g1, %hm(sym), %g3
59+
# ASM-NEXT: or %g1, %hm(sym), %g3
60+
# ASM-NEXT: sethi %lm(sym), %l0
61+
# OBJDUMP: R_SPARC_HH22 sym
62+
# OBJDUMP: R_SPARC_HH22 sym
63+
# OBJDUMP: R_SPARC_HM10 sym
64+
# OBJDUMP: R_SPARC_HM10 sym
65+
# OBJDUMP: R_SPARC_LM22 sym
66+
sethi %hh(sym), %l0
67+
sethi %uhi(sym), %l0
68+
or %g1, %hm(sym), %g3
69+
or %g1, %ulo(sym), %g3
70+
sethi %lm(sym), %l0
71+
72+
# ASM: sethi %hix(sym), %g1
73+
# ASM-NEXT: xor %g1, %lox(sym), %g1
74+
# ASM-NEXT: sethi %gdop_hix22(sym), %l1
75+
# ASM-NEXT: or %l1, %gdop_lox10(sym), %l1
76+
# ASM-NEXT: ldx [%l7+%l1], %l2, %gdop(sym)
77+
# OBJDUMP: sethi 0x3fffff, %g0
78+
# OBJDUMP-NEXT: xor %g0, -0x400, %g0
79+
# OBJDUMP-NEXT: sethi 0x0, %g1
80+
# OBJDUMP-NEXT: R_SPARC_HIX22 sym
81+
# OBJDUMP-NEXT: xor %g1, 0x0, %g1
82+
# OBJDUMP-NEXT: R_SPARC_LOX10 sym
83+
# OBJDUMP-NEXT: sethi 0x0, %l1
84+
# OBJDUMP-NEXT: R_SPARC_GOTDATA_OP_HIX22 sym
85+
# OBJDUMP-NEXT: or %l1, 0x0, %l1
86+
# OBJDUMP-NEXT: R_SPARC_GOTDATA_OP_LOX10 sym
87+
# OBJDUMP-NEXT: ldx [%l7+%l1], %l2
88+
# OBJDUMP-NEXT: R_SPARC_GOTDATA_OP sym
89+
sethi %hix(zero), %g0
90+
xor %g0, %lox(zero), %g0
91+
sethi %hix(sym), %g1
92+
xor %g1, %lox(sym), %g1
93+
sethi %gdop_hix22(sym), %l1
94+
or %l1, %gdop_lox10(sym), %l1
95+
ldx [%l7 + %l1], %l2, %gdop(sym)
96+
97+
.set abs, 0xfedcba98
98+
.set abs48, 0xfedcba987654
99+
zero = 0
100+
101+
## FIXME: Don't emit GOT relocations when -position-independent is specified.
102+
# NOPIC: sethi 0x3fb72e, %o0
103+
# NOPIC-NEXT: xor %o0, 0x298, %o0
104+
# NOPIC-NEXT: sethi 0x3b72ea, %o1
105+
# NOPIC-NEXT: xor %o0, 0x188, %o1
106+
sethi %hi(abs), %o0
107+
xor %o0, %lo(abs), %o0
108+
sethi %hi(-0x12345678), %o1
109+
xor %o0, %lo(-0x12345678), %o1
110+
111+
# OBJDUMP: ld [%o0+0x7], %o0
112+
ld [%o0 + seven], %o0
113+
seven = 7
114+
115+
# OBJDUMP: sethi 0x3b72ea, %o0
116+
# OBJDUMP-NEXT: or %o0, 0x187, %o0
117+
# OBJDUMP-NEXT: ld [%o0+0x654], %o0
118+
sethi %h44(abs48), %o0
119+
or %o0, %m44(abs48), %o0
120+
ld [%o0 + %l44(abs48)], %o0
121+
122+
# OBJDUMP-NEXT: sethi 0x0, %o0
123+
# OBJDUMP-NEXT: sethi 0x3fb72e, %o0
124+
# OBJDUMP-NEXT: or %o0, 0x0, %o0
125+
sethi %hh(abs), %o0
126+
sethi %lm(abs), %o0
127+
or %o0, %hm(abs), %o0
128+
129+
# OBJDUMP-NEXT: sethi 0x48d1, %o0
130+
# OBJDUMP-NEXT: xor %o0, -0x168, %o0
131+
sethi %hix(abs), %o0
132+
xor %o0, %lox(abs), %o0
133+
134+
# OBJDUMP-LABEL: <.tls>:
135+
.section .tls,"ax"
136+
## Local Executable model:
137+
# ASM: sethi %tle_hix22(s_tle_hix22), %i0
138+
# ASM-NEXT: xor %i0, %tle_lox10(s_tle_lox10), %i0
139+
140+
# OBJDUMP: 31 00 00 00 sethi 0x0, %i0
141+
# OBJDUMP-NEXT: 00000000: R_SPARC_TLS_LE_HIX22 s_tle_hix22
142+
# OBJDUMP-NEXT: b0 1e 20 00 xor %i0, 0x0, %i0
143+
# OBJDUMP-NEXT: 00000004: R_SPARC_TLS_LE_LOX10 s_tle_lox10
144+
sethi %tle_hix22(s_tle_hix22), %i0
145+
xor %i0, %tle_lox10(s_tle_lox10), %i0
146+
147+
## Initial Executable model
148+
# ASM: sethi %tie_hi22(s_tie_hi22), %i1
149+
# ASM-NEXT: add %i1, %tie_lo10(s_tie_lo10), %i1
150+
# ASM-NEXT: ld [%i0+%i1], %i0, %tie_ld(s_tie_ld)
151+
# ASM-NEXT: ldx [%i0+%i1], %i0, %tie_ldx(s_tie_ldx)
152+
# ASM-NEXT: add %g7, %i0, %o0, %tie_add(s_tie_add)
153+
154+
# OBJDUMP: R_SPARC_TLS_IE_HI22 s_tie_hi22
155+
# OBJDUMP: R_SPARC_TLS_IE_LO10 s_tie_lo10
156+
# OBJDUMP: R_SPARC_TLS_IE_LD s_tie_ld
157+
# OBJDUMP: R_SPARC_TLS_IE_LDX s_tie_ldx
158+
# OBJDUMP: R_SPARC_TLS_IE_ADD s_tie_add
159+
sethi %tie_hi22(s_tie_hi22), %i1
160+
add %i1, %tie_lo10(s_tie_lo10), %i1
161+
ld [%i0+%i1], %i0, %tie_ld(s_tie_ld)
162+
ldx [%i0+%i1], %i0, %tie_ldx(s_tie_ldx)
163+
add %g7, %i0, %o0, %tie_add(s_tie_add)
164+
165+
## Local Dynamic model
166+
# ASM: sethi %tldo_hix22(s_tldo_hix22), %i1
167+
# ASM-NEXT: sethi %tldm_hi22(s_tldm_hi22), %i2
168+
# ASM-NEXT: add %i2, %tldm_lo10(s_tldm_lo10), %i2
169+
# ASM-NEXT: add %i0, %i2, %o0, %tldm_add(s_tldm_add)
170+
# ASM-NEXT: xor %i1, %tldo_lox10(s_tldo_lox10), %i0
171+
# ASM-NEXT: call __tls_get_addr, %tldm_call(s_tldm_call)
172+
# ASM-NEXT: nop
173+
# ASM-NEXT: add %o0, %i0, %o0, %tldo_add(s_tldo_add)
174+
175+
# OBJDUMP: R_SPARC_TLS_LDO_HIX22 s_tldo_hix22
176+
# OBJDUMP: R_SPARC_TLS_LDM_HI22 s_tldm_hi22
177+
# OBJDUMP: R_SPARC_TLS_LDM_LO10 s_tldm_lo10
178+
# OBJDUMP: R_SPARC_TLS_LDM_ADD s_tldm_add
179+
# OBJDUMP: R_SPARC_TLS_LDO_LOX10 s_tldo_lox10
180+
# OBJDUMP: R_SPARC_TLS_LDM_CALL s_tldm_call
181+
# OBJDUMP: R_SPARC_TLS_LDO_ADD s_tldo_add
182+
sethi %tldo_hix22(s_tldo_hix22), %i1
183+
sethi %tldm_hi22(s_tldm_hi22), %i2
184+
add %i2, %tldm_lo10(s_tldm_lo10), %i2
185+
add %i0, %i2, %o0, %tldm_add(s_tldm_add)
186+
xor %i1, %tldo_lox10(s_tldo_lox10), %i0
187+
call __tls_get_addr, %tldm_call(s_tldm_call)
188+
nop
189+
add %o0, %i0, %o0, %tldo_add(s_tldo_add)
190+
191+
## General Dynamic model
192+
# ASM: sethi %tgd_hi22(s_tgd_hi22), %i1
193+
# ASM-NEXT: add %i1, %tgd_lo10(s_tgd_lo10), %i1
194+
# ASM-NEXT: add %i0, %i1, %o0, %tgd_add(s_tgd_add)
195+
# ASM-NEXT: call __tls_get_addr, %tgd_call(s_tgd_call)
196+
197+
# OBJDUMP: R_SPARC_TLS_GD_HI22 s_tgd_hi22
198+
# OBJDUMP: R_SPARC_TLS_GD_LO10 s_tgd_lo10
199+
# OBJDUMP: R_SPARC_TLS_GD_ADD s_tgd_add
200+
# OBJDUMP: R_SPARC_TLS_GD_CALL s_tgd_call
201+
sethi %tgd_hi22(s_tgd_hi22), %i1
202+
add %i1, %tgd_lo10(s_tgd_lo10), %i1
203+
add %i0, %i1, %o0, %tgd_add(s_tgd_add)
204+
call __tls_get_addr, %tgd_call(s_tgd_call)
205+
206+
.type Local,@object
207+
.section .tbss,#alloc,#write,#tls
208+
s_tle_hix22:
209+
s_tldo_hix22:
210+
.word 0
211+
.size Local, 4

llvm/test/MC/Sparc/Relocations/relocation-specifier.s

Lines changed: 0 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,12 @@
11
# RUN: llvm-mc %s -triple=sparc | FileCheck %s --check-prefix=ASM
2-
# RUN: llvm-mc %s -triple=sparcv9 | FileCheck %s --check-prefix=ASM
32

43
# RUN: llvm-mc %s -triple=sparc -filetype=obj -o %t
54
# RUN: llvm-objdump -dr %t | FileCheck %s --check-prefix=OBJDUMP
6-
# RUN: llvm-mc %s -triple=sparcv9 -filetype=obj -o %t
7-
# RUN: llvm-objdump -dr %t | FileCheck %s --check-prefix=OBJDUMP
85
# RUN: llvm-readelf -s - < %t | FileCheck %s --check-prefix=READELF --implicit-check-not=TLS
96

107
# READELF: TLS LOCAL DEFAULT [[#]] s_tle_hix22
118
# READELF: TLS LOCAL DEFAULT [[#]] s_tldo_hix22
129
# READELF: TLS GLOBAL DEFAULT UND s_tle_lox10
13-
# READELF: TLS GLOBAL DEFAULT UND s_tie_hi22
14-
# READELF: TLS GLOBAL DEFAULT UND s_tie_lo10
15-
# READELF: TLS GLOBAL DEFAULT UND s_tie_ld
16-
# READELF: TLS GLOBAL DEFAULT UND s_tie_ldx
17-
# READELF: TLS GLOBAL DEFAULT UND s_tie_add
1810
# READELF: TLS GLOBAL DEFAULT UND s_tldm_hi22
1911
# READELF: TLS GLOBAL DEFAULT UND s_tldm_lo10
2012
# READELF: TLS GLOBAL DEFAULT UND s_tldm_add
@@ -72,31 +64,6 @@ or %g1, %hm(sym), %g3
7264
or %g1, %ulo(sym), %g3
7365
sethi %lm(sym), %l0
7466

75-
# ASM: sethi %hix(sym), %g1
76-
# ASM-NEXT: xor %g1, %lox(sym), %g1
77-
# ASM-NEXT: sethi %gdop_hix22(sym), %l1
78-
# ASM-NEXT: or %l1, %gdop_lox10(sym), %l1
79-
# ASM-NEXT: ldx [%l7+%l1], %l2, %gdop(sym)
80-
# OBJDUMP: sethi 0x3fffff, %g0
81-
# OBJDUMP-NEXT: xor %g0, -0x400, %g0
82-
# OBJDUMP-NEXT: sethi 0x0, %g1
83-
# OBJDUMP-NEXT: R_SPARC_HIX22 sym
84-
# OBJDUMP-NEXT: xor %g1, 0x0, %g1
85-
# OBJDUMP-NEXT: R_SPARC_LOX10 sym
86-
# OBJDUMP-NEXT: sethi 0x0, %l1
87-
# OBJDUMP-NEXT: R_SPARC_GOTDATA_OP_HIX22 sym
88-
# OBJDUMP-NEXT: or %l1, 0x0, %l1
89-
# OBJDUMP-NEXT: R_SPARC_GOTDATA_OP_LOX10 sym
90-
# OBJDUMP-NEXT: ldx [%l7+%l1], %l2
91-
# OBJDUMP-NEXT: R_SPARC_GOTDATA_OP sym
92-
sethi %hix(zero), %g0
93-
xor %g0, %lox(zero), %g0
94-
sethi %hix(sym), %g1
95-
xor %g1, %lox(sym), %g1
96-
sethi %gdop_hix22(sym), %l1
97-
or %l1, %gdop_lox10(sym), %l1
98-
ldx [%l7 + %l1], %l2, %gdop(sym)
99-
10067
.set abs, 0xfedcba98
10168
.set abs48, 0xfedcba987654
10269
zero = 0
@@ -147,24 +114,6 @@ xor %o0, %lox(abs), %o0
147114
sethi %tle_hix22(s_tle_hix22), %i0
148115
xor %i0, %tle_lox10(s_tle_lox10), %i0
149116

150-
## Initial Executable model
151-
# ASM: sethi %tie_hi22(s_tie_hi22), %i1
152-
# ASM-NEXT: add %i1, %tie_lo10(s_tie_lo10), %i1
153-
# ASM-NEXT: ld [%i0+%i1], %i0, %tie_ld(s_tie_ld)
154-
# ASM-NEXT: ldx [%i0+%i1], %i0, %tie_ldx(s_tie_ldx)
155-
# ASM-NEXT: add %g7, %i0, %o0, %tie_add(s_tie_add)
156-
157-
# OBJDUMP: R_SPARC_TLS_IE_HI22 s_tie_hi22
158-
# OBJDUMP: R_SPARC_TLS_IE_LO10 s_tie_lo10
159-
# OBJDUMP: R_SPARC_TLS_IE_LD s_tie_ld
160-
# OBJDUMP: R_SPARC_TLS_IE_LDX s_tie_ldx
161-
# OBJDUMP: R_SPARC_TLS_IE_ADD s_tie_add
162-
sethi %tie_hi22(s_tie_hi22), %i1
163-
add %i1, %tie_lo10(s_tie_lo10), %i1
164-
ld [%i0+%i1], %i0, %tie_ld(s_tie_ld)
165-
ldx [%i0+%i1], %i0, %tie_ldx(s_tie_ldx)
166-
add %g7, %i0, %o0, %tie_add(s_tie_add)
167-
168117
## Local Dynamic model
169118
# ASM: sethi %tldo_hix22(s_tldo_hix22), %i1
170119
# ASM-NEXT: sethi %tldm_hi22(s_tldm_hi22), %i2

0 commit comments

Comments
 (0)