[ELF] Refine isExported/isPreemptible condition
[llvm-project.git] / lld / test / ELF / hexagon.s
blobb1576fb47d81afb60b81dbb03d57697f72ea6176
1 # REQUIRES: hexagon
2 # RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %s -o %t.o
3 # RUN: llvm-mc -filetype=obj -triple=hexagon-unknown-elf %S/Inputs/hexagon.s -o %t1.o
4 # RUN: ld.lld %t.o %t1.o -o %t --Ttext=0x200b4 --section-start=b_1000000=0x1000000 \
5 # RUN: --section-start=b_1000400=0x1000400 --section-start=b_1004000=0x1004000 \
6 # RUN: --section-start=b_1010000=0x1010000 --section-start=b_1800000=0x1800000
7 # RUN: llvm-objdump --no-print-imm-hex -d %t | FileCheck %s
9 # Note: 131584 == 0x20200
10 # R_HEX_32_6_X
11 # R_HEX_12_X
12 if (p0) r0 = ##_start
13 # CHECK: immext(#131584)
14 # CHECK: if (p0) r0 = ##131644
16 # R_HEX_B15_PCREL
17 if (p0) jump:nt #_start
18 # CHECK: if (p0) jump:nt 0x2023c
20 # R_HEX_B32_PCREL_X
21 # R_HEX_B15_PCREL_X
22 if (p0) jump:nt ##_start
23 # CHECK: if (p0) jump:nt 0x2023c
25 # R_HEX_B22_PCREL
26 call #_start
27 # CHECK: call 0x2023c
29 # R_HEX_B32_PCREL_X
30 # R_HEX_B22_PCREL_X
31 call ##_start
32 # CHECK: immext(#320)
33 # CHECK: call 0x2023c
35 # R_HEX_6_X tests:
36 # One test for each mask in the lookup table.
38 #0x38000000
39 if (!P0) memw(r0+#8)=##_start
40 # CHECK: 38c0e11c if (!p0) memw(r0+#8) = ##131644 }
42 #0x39000000
43 { p0 = p1
44 if (!P0.new) memw(r0+#0)=##_start }
45 # CHECK: 39c0e01c if (!p0.new) memw(r0+#0) = ##131644 }
47 #0x3e000000
48 memw(r0+##_start)+=r1
49 # CHECK: 3e40de01 memw(r0+##131644) += r1 }
51 #0x3f000000
52 memw(r0+##_start)+=#4
53 # CHECK: 3f40de04 memw(r0+##131644) += #4 }
55 #0x40000000
56 { r0 = r1
57 if (p0) memb(r0+##_start)=r0.new }
58 # CHECK: 40a0e2e0 if (p0) memb(r0+##131644) = r0.new }
60 #0x41000000
61 if (p0) r0=memb(r1+##_start)
62 # CHECK: 4101c780 if (p0) r0 = memb(r1+##131644) }
64 #0x42000000
65 { r0 = r1
66 p0 = p1
67 if (p0.new) memb(r0+##_start)=r0.new }
68 # CHECK: 42a0e2e0 if (p0.new) memb(r0+##131644) = r0.new }
70 #0x43000000
71 { p0 = p1
72 if (P0.new) r0=memb(r0+##_start) }
73 # CHECK: 4300c780 if (p0.new) r0 = memb(r0+##131644) }
75 #0x44000000
76 if (!p0) memb(r0+##_start)=r1
77 # CHECK: 4400e1e0 if (!p0) memb(r0+##131644) = r1 }
79 #0x45000000
80 if (!p0) r0=memb(r1+##_start)
81 # CHECK: 4501c780 if (!p0) r0 = memb(r1+##131644) }
83 #0x46000000
84 { p0 = p1
85 if (!p0.new) memb(r0+##_start)=r1 }
86 # CHECK: 4600e1e0 if (!p0.new) memb(r0+##131644) = r1 }
88 #0x47000000
89 { p0 = p1
90 if (!p0.new) r0=memb(r1+##_start) }
91 # CHECK: 4701c780 if (!p0.new) r0 = memb(r1+##131644) }
93 #0x6a000000 -- Note 4294967132 == -0xa4 the distance between
94 # here and _start, so this will change if
95 # tests are added between here and _start
96 r0=add(pc,##_start@pcrel)
97 # CHECK: 6a49d600 r0 = add(pc,##236) }
99 #0x7c000000
100 r1:0=combine(#8,##_start)
101 # CHECK: 7c9ec100 r1:0 = combine(#8,##131644) }
103 #0x9a000000
104 r1:0=memb_fifo(r2=##_start)
105 # CHECK: 9a82df00 r1:0 = memb_fifo(r2=##131644) }
107 #0x9b000000
108 r0=memb(r1=##_start)
109 # CHECK: 9b01df00 r0 = memb(r1=##131644) }
111 #0x9c000000
112 r1:0=memb_fifo(r2<<#2+##_start)
113 # CHECK: 9c82ff00 r1:0 = memb_fifo(r2<<#2+##131644) }
115 #0x9d000000
116 r0=memb(r1<<#2+##_start)
117 # CHECK: 9d01ff00 r0 = memb(r1<<#2+##131644) }
119 #0x9f000000
120 if (!p0) r0=memb(##_start)
121 # CHECK: 9f1ee880 if (!p0) r0 = memb(##131644) }
123 #0xab000000
124 memb(r0=##_start)=r1
125 # CHECK: ab00c1bc memb(r0=##131644) = r1 }
127 #0xad000000
128 memb(r0<<#2+##_start)=r1
129 # CHECK: ad00e1bc memb(r0<<#2+##131644) = r1 }
131 #0xaf000000
132 if (!p0) memb(##_start)=r1
133 # CHECK: af03c1e4 if (!p0) memb(##131644) = r1 }
135 #0xd7000000
136 r0=add(##_start,mpyi(r1,r2))
137 # CHECK: d761e280 r0 = add(##131644,mpyi(r1,r2)) }
139 #0xd8000000
140 R0=add(##_start,mpyi(r0,#2))
141 # CHECK: d860e082 r0 = add(##131644,mpyi(r0,#2)) }
143 #0xdb000000
144 r0=add(r1,add(r2,##_start))
145 # CHECK: db61e082 r0 = add(r1,add(r2,##131644)) }
147 #0xdf000000
148 r0=add(r1,mpyi(r2,##_start))
149 # CHECK: dfe2e081 r0 = add(r1,mpyi(r2,##131644)) }
151 # Duplex form of R_HEX_6_X
152 # R_HEX_32_6_X
153 # R_HEX_6_X
154 { r0 = ##_start; r2 = r16 }
155 # CHECK: 2bc03082 r0 = ##131644; r2 = r16 }
157 # R_HEX_HI16
158 r0.h = #HI(_start)
159 # CHECK: r0.h = #2
161 # R_HEX_LO16
162 r0.l = #LO(_start)
163 # CHECK: r0.l = #572
165 # R_HEX_8_X has 3 relocation mask variations
166 #0xde000000
167 r0=sub(##_start, asl(r0, #1))
168 # CHECK: de20e1c6 r0 = sub(##131644,asl(r0,#1)) }
170 #0x3c000000
171 memw(r0+#0) = ##_start
172 # CHECK: 3c40c03c memw(r0+#0) = ##131644 }
174 # The rest:
175 r1:0=combine(r2,##_start);
176 # CHECK: 7302e780 r1:0 = combine(r2,##131644) }
178 # R_HEX_32:
179 r_hex_32:
180 .word _start
181 # CHECK: 0002023c
183 # R_HEX_16_X has 4 relocation mask variations
184 # 0x48000000
185 memw(##_start) = r0
186 # CHECK: 4880c03c memw(##131644) = r0 }
188 # 0x49000000
189 r0 = memw(##_start)
190 # CHECK: 4980c780 r0 = memw(##131644)
192 # 0x78000000
193 r0 = ##_start
194 # CHECK: 7800c780 r0 = ##131644 }
196 # 0xb0000000
197 r0 = add(r1, ##_start)
198 # CHECK: b001c780 r0 = add(r1,##131644) }
200 # R_HEX_B9_PCREL:
201 {r0=#1 ; jump #_start}
202 # CHECK: jump 0x2023c
204 # R_HEX_B9_PCREL_X:
205 {r0=#1 ; jump ##_start}
206 # CHECK: jump 0x2023c
208 # R_HEX_B13_PCREL
209 if (r0 == #0) jump:t #_start
210 # CHECK: if (r0==#0) jump:t 0x2023c
212 # R_HEX_9_X
213 p0 = !cmp.gtu(r0, ##_start)
214 # CHECK: p0 = !cmp.gtu(r0,##131644)
216 # R_HEX_10_X
217 p0 = !cmp.gt(r0, ##_start)
218 # CHECK: p0 = !cmp.gt(r0,##131644)
220 # R_HEX_11_X
221 r0 = memw(r1+##_start)
222 # CHECK: r0 = memw(r1+##131644)
224 memw(r0+##_start) = r1
225 # CHECK: memw(r0+##131644) = r1
228 ## Tests for maximum branch ranges reachable without trampolines.
230 .section b_1000000, "ax"
231 ## The nop makes sure the first jump is within range.
233 { r0 = #0; jump #b_1000400 } // R_HEX_B9_PCREL
234 if (r0==#0) jump:t #b_1004000 // R_HEX_B13_PCREL
235 if (p0) jump #b_1010000 // R_HEX_B15_PCREL
236 jump #b_1800000 // R_HEX_B22_PCREL
238 .section b_1000400, "ax"
241 .section b_1004000, "ax"
244 .section b_1010000, "ax"
247 .section b_1800000, "ax"
250 ## Make sure we got the right relocations.
251 # RUN: llvm-readelf -r %t.o | FileCheck %s --check-prefix=REL
252 # REL: R_HEX_B9_PCREL 00000000 b_1000400
253 # REL: R_HEX_B13_PCREL 00000000 b_1004000
254 # REL: R_HEX_B15_PCREL 00000000 b_1010000
255 # REL: R_HEX_B22_PCREL 00000000 b_1800000
257 # CHECK: 01000000 <b_1000000>:
258 # CHECK-NEXT: 1000000: {{.*}} { nop }
259 # CHECK-NEXT: 1000004: {{.*}} { r0 = #0 ; jump 0x1000400 }
260 # CHECK-NEXT: 1000008: {{.*}} { if (r0==#0) jump:t 0x1004000 }
261 # CHECK-NEXT: 100000c: {{.*}} { if (p0) jump:nt 0x1010000 }
262 # CHECK-NEXT: 1000010: {{.*}} { jump 0x1800000 }