1	.data
2	.align	4096
3	.section ".tdata", #alloc, #write, #tls
4	.align	4
5	.globl sg1, sg2, sg3, sg4, sg5, sg6, sg7, sg8
6	.globl sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
7	.hidden sh1, sh2, sh3, sh4, sh5, sh6, sh7, sh8
8sg1:	.word 17
9	.skip	4096
10sg2:	.word 18
11sg3:	.word 19
12sg4:	.word 20
13sg5:	.word 21
14sg6:	.word 22
15sg7:	.word 23
16sg8:	.word 24
17sl1:	.word 65
18sl2:	.word 66
19sl3:	.word 67
20sl4:	.word 68
21sl5:	.word 69
22sl6:	.word 70
23sl7:	.word 71
24sl8:	.word 72
25sh1:	.word 257
26sh2:	.word 258
27sh3:	.word 259
28sh4:	.word 260
29sh5:	.word 261
30sh6:	.word 262
31sh7:	.word 263
32sh8:	.word 264
33	.text
34	.align	4096
35.LLGETPC0:
36        retl
37        add     %o7, %l7, %l7
38
39	.globl	fn2
40	.type	fn2,#function
41	.proc	04
42fn2:
43	save	%sp, -104, %sp
44	sethi	%hi(_GLOBAL_OFFSET_TABLE_-4), %l7
45	call	.LLGETPC0
46	add	%l7, %lo(_GLOBAL_OFFSET_TABLE_+4), %l7
47	nop;nop;nop;nop
48
49	/* GD -> IE because variable is not defined in executable */
50	sethi	%tgd_hi22(sG1), %l1
51	nop
52	add	%l1, %tgd_lo10(sG1), %l2
53	nop
54	add	%l7, %l2, %o0, %tgd_add(sG1)
55	nop
56	call	__tls_get_addr, %tgd_call(sG1)
57	nop
58	nop;nop;nop;nop
59
60	/* GD -> IE because variable is not defined in executable where
61	   the variable is referenced through IE too */
62	sethi	%tgd_hi22(sG2), %o0
63	add	%o0, %tgd_lo10(sG2), %o1
64	add	%l7, %o1, %o0, %tgd_add(sG2)
65	call	__tls_get_addr, %tgd_call(sG2)
66	nop
67	nop;nop;nop;nop
68
69	/* GD -> LE with global variable defined in executable */
70	sethi	%tgd_hi22(sg1), %l0
71	add	%l0, %tgd_lo10(sg1), %l5
72	add	%l7, %l5, %o0, %tgd_add(sg1)
73	call	__tls_get_addr, %tgd_call(sg1)
74	nop
75	nop;nop;nop;nop
76
77	/* GD -> LE with local variable defined in executable */
78	sethi	%tgd_hi22(sl1), %o0
79	add	%o0, %tgd_lo10(sl1), %o1
80	add	%l7, %o1, %o0, %tgd_add(sl1)
81	call	__tls_get_addr, %tgd_call(sl1)
82	nop
83	nop;nop;nop;nop
84
85	/* GD -> LE with hidden variable defined in executable */
86	sethi	%tgd_hi22(sh1), %o0
87	add	%o0, %tgd_lo10(sh1), %o1
88	add	%l7, %o1, %o0, %tgd_add(sh1)
89	call	__tls_get_addr, %tgd_call(sh1)
90	nop
91	nop;nop;nop;nop
92
93	/* LD -> LE */
94	sethi	%tldm_hi22(sl1), %l1
95	nop
96	add	%l1, %tldm_lo10(sl1), %l2
97	nop
98	add	%l7, %l2, %o0, %tldm_add(sl1)
99	nop
100	call	__tls_get_addr, %tldm_call(sl1)
101	nop
102	sethi	%tldo_hix22(sl1), %l3
103	nop
104	xor	%l3, %tldo_lox10(sl1), %l4
105	nop
106	add	%o0, %l4, %l5, %tldo_add(sl1)
107	nop
108	sethi	%tldo_hix22(sl2 + 2), %l2
109	nop
110	xor	%l2, %tldo_lox10(sl2 + 2), %l3
111	nop
112	lduh	[%o0 + %l3], %l6, %tldo_add(sl2 + 2)
113	nop;nop;nop;nop
114
115	/* LD -> LE against hidden variables */
116	sethi	%tldm_hi22(sh1), %o1
117	sethi	%tldo_hix22(sh1), %l3
118	add	%o1, %tldm_lo10(sh1), %o2
119	sethi	%tldo_hix22(sh2 + 1), %l2
120	add	%l7, %o2, %o0, %tldm_add(sh1)
121	xor	%l3, %tldo_lox10(sh1), %l4
122	call	__tls_get_addr, %tldm_call(sh1)
123	xor	%l2, %tldo_lox10(sh2 + 1), %l3
124	add	%o0, %l4, %l5, %tldo_add(sh1)
125	ldub	[%o0 + %l3], %l6, %tldo_add(sh2 + 1)
126	nop;nop;nop;nop
127
128	/* IE against global var  */
129	sethi	%tie_hi22(sG2), %l1
130	nop
131	add	%l1, %tie_lo10(sG2), %l2
132	nop
133	ld	[%l7 + %l2], %l2, %tie_ld(sG2)
134	nop
135	add	%g7, %l2, %l2, %tie_add(sG2)
136	nop;nop;nop;nop
137
138	/* IE -> LE against global var defined in exec */
139	sethi	%tie_hi22(sg1), %o3
140	add	%o3, %tie_lo10(sg1), %o3
141	ld	[%l7 + %o3], %o3, %tie_ld(sg1)
142	add	%g7, %o3, %o4, %tie_add(sg1)
143	nop;nop;nop;nop
144
145	/* IE -> LE against local var */
146	sethi	%tie_hi22(sl1), %l4
147	add	%l4, %tie_lo10(sl1), %l1
148	ld	[%l7 + %l1], %l3, %tie_ld(sl1)
149	add	%g7, %l3, %l3, %tie_add(sl1)
150	nop;nop;nop;nop
151
152	/* IE -> LE against hidden var */
153	sethi	%tie_hi22(sh1), %o1
154	add	%o1, %tie_lo10(sh1), %o3
155	ld	[%l7 + %o3], %o0, %tie_ld(sh1)
156	add	%g7, %o0, %o3, %tie_add(sh1)
157	nop;nop;nop;nop
158
159	/* Direct access through %g7  */
160
161	/* IE against global var  */
162	sethi	%tie_hi22(sG5), %o3
163	add	%o3, %tie_lo10(sG5), %o3
164	ld	[%l7 + %o3], %o2, %tie_ld(sG5)
165	ld	[%g7 + %o2], %o4, %tie_add(sG5)
166	nop;nop;nop;nop
167
168	/* IE->LE against local var  */
169	sethi	%tie_hi22(sl5), %o3
170	add	%o3, %tie_lo10(sl5), %o3
171	ld	[%l7 + %o3], %o2, %tie_ld(sl5)
172	stb	%o4, [%g7 + %o2], %tie_add(sl5)
173	nop;nop;nop;nop
174
175	/* IE->LE against hidden var  */
176	sethi	%tie_hi22(sh5), %o5
177	add	%o5, %tie_lo10(sh5), %o3
178	ld	[%l7 + %o3], %o2, %tie_ld(sh5)
179	ldsb	[%g7 + %o2], %o4, %tie_add(sh5)
180	nop;nop;nop;nop
181
182	ret
183	restore
184