xref: /llvm-project/llvm/test/CodeGen/LoongArch/psabi-restricted-scheduling.ll (revision 67ff11ea5b2d2d51fa634361dd88c6dc9429706a)
1; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium --relocation-model=pic --post-RA-scheduler=0 < %s \
2; RUN:     | FileCheck %s --check-prefix=MEDIUM_NO_SCH
3; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium --relocation-model=pic --post-RA-scheduler=1 < %s \
4; RUN:     | FileCheck %s --check-prefix=MEDIUM_SCH
5; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large --relocation-model=pic --post-RA-scheduler=0 < %s \
6; RUN:     | FileCheck %s --check-prefix=LARGE_NO_SCH
7; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large --relocation-model=pic --post-RA-scheduler=1 < %s \
8; RUN:     | FileCheck %s --check-prefix=LARGE_SCH
9; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium --relocation-model=pic --enable-tlsdesc \
10; RUN:     --post-RA-scheduler=0 < %s | FileCheck %s --check-prefix=MEDIUMDESC_NO_SCH
11; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=medium --relocation-model=pic --enable-tlsdesc \
12; RUN:     --post-RA-scheduler=1 < %s | FileCheck %s --check-prefix=MEDIUMDESC_SCH
13; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large --relocation-model=pic --enable-tlsdesc \
14; RUN:     --post-RA-scheduler=0 < %s | FileCheck %s --check-prefix=LARGEDESC_NO_SCH
15; RUN: llc --mtriple=loongarch64 -mattr=+d --code-model=large --relocation-model=pic --enable-tlsdesc \
16; RUN:     --post-RA-scheduler=1 < %s | FileCheck %s --check-prefix=LARGEDESC_SCH
17
18@g = dso_local global i64 zeroinitializer, align 4
19@G = global i64 zeroinitializer, align 4
20@gd = external thread_local global i64
21@ld = external thread_local(localdynamic) global i64
22@ie = external thread_local(initialexec) global i64
23
24declare ptr @bar(i64)
25
26define void @foo() nounwind {
27; MEDIUM_NO_SCH-LABEL: foo:
28; MEDIUM_NO_SCH:       # %bb.0:
29; MEDIUM_NO_SCH-NEXT:    addi.d $sp, $sp, -16
30; MEDIUM_NO_SCH-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
31; MEDIUM_NO_SCH-NEXT:    pcalau12i $a0, %got_pc_hi20(G)
32; MEDIUM_NO_SCH-NEXT:    ld.d $a0, $a0, %got_pc_lo12(G)
33; MEDIUM_NO_SCH-NEXT:    ld.d $zero, $a0, 0
34; MEDIUM_NO_SCH-NEXT:    pcalau12i $a0, %pc_hi20(.Lg$local)
35; MEDIUM_NO_SCH-NEXT:    ld.d $zero, $a0, %pc_lo12(.Lg$local)
36; MEDIUM_NO_SCH-NEXT:    ori $a0, $zero, 1
37; MEDIUM_NO_SCH-NEXT:    pcaddu18i $ra, %call36(bar)
38; MEDIUM_NO_SCH-NEXT:    jirl $ra, $ra, 0
39; MEDIUM_NO_SCH-NEXT:    pcalau12i $a0, %gd_pc_hi20(gd)
40; MEDIUM_NO_SCH-NEXT:    addi.d $a0, $a0, %got_pc_lo12(gd)
41; MEDIUM_NO_SCH-NEXT:    pcaddu18i $ra, %call36(__tls_get_addr)
42; MEDIUM_NO_SCH-NEXT:    jirl $ra, $ra, 0
43; MEDIUM_NO_SCH-NEXT:    ld.d $zero, $a0, 0
44; MEDIUM_NO_SCH-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
45; MEDIUM_NO_SCH-NEXT:    addi.d $a0, $a0, %got_pc_lo12(ld)
46; MEDIUM_NO_SCH-NEXT:    pcaddu18i $ra, %call36(__tls_get_addr)
47; MEDIUM_NO_SCH-NEXT:    jirl $ra, $ra, 0
48; MEDIUM_NO_SCH-NEXT:    pcalau12i $a1, %ie_pc_hi20(ie)
49; MEDIUM_NO_SCH-NEXT:    ld.d $a1, $a1, %ie_pc_lo12(ie)
50; MEDIUM_NO_SCH-NEXT:    ld.d $zero, $a0, 0
51; MEDIUM_NO_SCH-NEXT:    ldx.d $zero, $a1, $tp
52; MEDIUM_NO_SCH-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
53; MEDIUM_NO_SCH-NEXT:    addi.d $sp, $sp, 16
54; MEDIUM_NO_SCH-NEXT:    ret
55;
56; MEDIUM_SCH-LABEL: foo:
57; MEDIUM_SCH:       # %bb.0:
58; MEDIUM_SCH-NEXT:    addi.d $sp, $sp, -16
59; MEDIUM_SCH-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
60; MEDIUM_SCH-NEXT:    pcalau12i $a0, %got_pc_hi20(G)
61; MEDIUM_SCH-NEXT:    ld.d $a0, $a0, %got_pc_lo12(G)
62; MEDIUM_SCH-NEXT:    ld.d $zero, $a0, 0
63; MEDIUM_SCH-NEXT:    pcalau12i $a0, %pc_hi20(.Lg$local)
64; MEDIUM_SCH-NEXT:    ld.d $zero, $a0, %pc_lo12(.Lg$local)
65; MEDIUM_SCH-NEXT:    ori $a0, $zero, 1
66; MEDIUM_SCH-NEXT:    pcaddu18i $ra, %call36(bar)
67; MEDIUM_SCH-NEXT:    jirl $ra, $ra, 0
68; MEDIUM_SCH-NEXT:    pcalau12i $a0, %gd_pc_hi20(gd)
69; MEDIUM_SCH-NEXT:    addi.d $a0, $a0, %got_pc_lo12(gd)
70; MEDIUM_SCH-NEXT:    pcaddu18i $ra, %call36(__tls_get_addr)
71; MEDIUM_SCH-NEXT:    jirl $ra, $ra, 0
72; MEDIUM_SCH-NEXT:    ld.d $zero, $a0, 0
73; MEDIUM_SCH-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
74; MEDIUM_SCH-NEXT:    addi.d $a0, $a0, %got_pc_lo12(ld)
75; MEDIUM_SCH-NEXT:    pcaddu18i $ra, %call36(__tls_get_addr)
76; MEDIUM_SCH-NEXT:    jirl $ra, $ra, 0
77; MEDIUM_SCH-NEXT:    pcalau12i $a1, %ie_pc_hi20(ie)
78; MEDIUM_SCH-NEXT:    ld.d $zero, $a0, 0
79; MEDIUM_SCH-NEXT:    ld.d $a1, $a1, %ie_pc_lo12(ie)
80; MEDIUM_SCH-NEXT:    ldx.d $zero, $a1, $tp
81; MEDIUM_SCH-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
82; MEDIUM_SCH-NEXT:    addi.d $sp, $sp, 16
83; MEDIUM_SCH-NEXT:    ret
84;
85; LARGE_NO_SCH-LABEL: foo:
86; LARGE_NO_SCH:       # %bb.0:
87; LARGE_NO_SCH-NEXT:    addi.d $sp, $sp, -16
88; LARGE_NO_SCH-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
89; LARGE_NO_SCH-NEXT:    pcalau12i $a0, %got_pc_hi20(G)
90; LARGE_NO_SCH-NEXT:    addi.d $a1, $zero, %got_pc_lo12(G)
91; LARGE_NO_SCH-NEXT:    lu32i.d $a1, %got64_pc_lo20(G)
92; LARGE_NO_SCH-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(G)
93; LARGE_NO_SCH-NEXT:    ldx.d $a0, $a1, $a0
94; LARGE_NO_SCH-NEXT:    ld.d $zero, $a0, 0
95; LARGE_NO_SCH-NEXT:    pcalau12i $a0, %pc_hi20(.Lg$local)
96; LARGE_NO_SCH-NEXT:    addi.d $a1, $zero, %pc_lo12(.Lg$local)
97; LARGE_NO_SCH-NEXT:    lu32i.d $a1, %pc64_lo20(.Lg$local)
98; LARGE_NO_SCH-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(.Lg$local)
99; LARGE_NO_SCH-NEXT:    ldx.d $zero, $a1, $a0
100; LARGE_NO_SCH-NEXT:    ori $a0, $zero, 1
101; LARGE_NO_SCH-NEXT:    pcalau12i $a1, %got_pc_hi20(bar)
102; LARGE_NO_SCH-NEXT:    addi.d $ra, $zero, %got_pc_lo12(bar)
103; LARGE_NO_SCH-NEXT:    lu32i.d $ra, %got64_pc_lo20(bar)
104; LARGE_NO_SCH-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(bar)
105; LARGE_NO_SCH-NEXT:    ldx.d $ra, $ra, $a1
106; LARGE_NO_SCH-NEXT:    jirl $ra, $ra, 0
107; LARGE_NO_SCH-NEXT:    pcalau12i $a0, %gd_pc_hi20(gd)
108; LARGE_NO_SCH-NEXT:    addi.d $a1, $zero, %got_pc_lo12(gd)
109; LARGE_NO_SCH-NEXT:    lu32i.d $a1, %got64_pc_lo20(gd)
110; LARGE_NO_SCH-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(gd)
111; LARGE_NO_SCH-NEXT:    add.d $a0, $a1, $a0
112; LARGE_NO_SCH-NEXT:    pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
113; LARGE_NO_SCH-NEXT:    addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
114; LARGE_NO_SCH-NEXT:    lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
115; LARGE_NO_SCH-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
116; LARGE_NO_SCH-NEXT:    ldx.d $ra, $ra, $a1
117; LARGE_NO_SCH-NEXT:    jirl $ra, $ra, 0
118; LARGE_NO_SCH-NEXT:    ld.d $zero, $a0, 0
119; LARGE_NO_SCH-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
120; LARGE_NO_SCH-NEXT:    addi.d $a1, $zero, %got_pc_lo12(ld)
121; LARGE_NO_SCH-NEXT:    lu32i.d $a1, %got64_pc_lo20(ld)
122; LARGE_NO_SCH-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(ld)
123; LARGE_NO_SCH-NEXT:    add.d $a0, $a1, $a0
124; LARGE_NO_SCH-NEXT:    pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
125; LARGE_NO_SCH-NEXT:    addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
126; LARGE_NO_SCH-NEXT:    lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
127; LARGE_NO_SCH-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
128; LARGE_NO_SCH-NEXT:    ldx.d $ra, $ra, $a1
129; LARGE_NO_SCH-NEXT:    jirl $ra, $ra, 0
130; LARGE_NO_SCH-NEXT:    ld.d $zero, $a0, 0
131; LARGE_NO_SCH-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
132; LARGE_NO_SCH-NEXT:    addi.d $a1, $zero, %ie_pc_lo12(ie)
133; LARGE_NO_SCH-NEXT:    lu32i.d $a1, %ie64_pc_lo20(ie)
134; LARGE_NO_SCH-NEXT:    lu52i.d $a1, $a1, %ie64_pc_hi12(ie)
135; LARGE_NO_SCH-NEXT:    ldx.d $a0, $a1, $a0
136; LARGE_NO_SCH-NEXT:    ldx.d $zero, $a0, $tp
137; LARGE_NO_SCH-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
138; LARGE_NO_SCH-NEXT:    addi.d $sp, $sp, 16
139; LARGE_NO_SCH-NEXT:    ret
140;
141; LARGE_SCH-LABEL: foo:
142; LARGE_SCH:       # %bb.0:
143; LARGE_SCH-NEXT:    addi.d $sp, $sp, -16
144; LARGE_SCH-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
145; LARGE_SCH-NEXT:    pcalau12i $a0, %got_pc_hi20(G)
146; LARGE_SCH-NEXT:    addi.d $a1, $zero, %got_pc_lo12(G)
147; LARGE_SCH-NEXT:    lu32i.d $a1, %got64_pc_lo20(G)
148; LARGE_SCH-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(G)
149; LARGE_SCH-NEXT:    ldx.d $a0, $a1, $a0
150; LARGE_SCH-NEXT:    ld.d $zero, $a0, 0
151; LARGE_SCH-NEXT:    pcalau12i $a0, %pc_hi20(.Lg$local)
152; LARGE_SCH-NEXT:    addi.d $a1, $zero, %pc_lo12(.Lg$local)
153; LARGE_SCH-NEXT:    lu32i.d $a1, %pc64_lo20(.Lg$local)
154; LARGE_SCH-NEXT:    lu52i.d $a1, $a1, %pc64_hi12(.Lg$local)
155; LARGE_SCH-NEXT:    ldx.d $zero, $a1, $a0
156; LARGE_SCH-NEXT:    ori $a0, $zero, 1
157; LARGE_SCH-NEXT:    pcalau12i $a1, %got_pc_hi20(bar)
158; LARGE_SCH-NEXT:    addi.d $ra, $zero, %got_pc_lo12(bar)
159; LARGE_SCH-NEXT:    lu32i.d $ra, %got64_pc_lo20(bar)
160; LARGE_SCH-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(bar)
161; LARGE_SCH-NEXT:    ldx.d $ra, $ra, $a1
162; LARGE_SCH-NEXT:    jirl $ra, $ra, 0
163; LARGE_SCH-NEXT:    pcalau12i $a0, %gd_pc_hi20(gd)
164; LARGE_SCH-NEXT:    addi.d $a1, $zero, %got_pc_lo12(gd)
165; LARGE_SCH-NEXT:    lu32i.d $a1, %got64_pc_lo20(gd)
166; LARGE_SCH-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(gd)
167; LARGE_SCH-NEXT:    add.d $a0, $a1, $a0
168; LARGE_SCH-NEXT:    pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
169; LARGE_SCH-NEXT:    addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
170; LARGE_SCH-NEXT:    lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
171; LARGE_SCH-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
172; LARGE_SCH-NEXT:    ldx.d $ra, $ra, $a1
173; LARGE_SCH-NEXT:    jirl $ra, $ra, 0
174; LARGE_SCH-NEXT:    ld.d $zero, $a0, 0
175; LARGE_SCH-NEXT:    pcalau12i $a0, %ld_pc_hi20(ld)
176; LARGE_SCH-NEXT:    addi.d $a1, $zero, %got_pc_lo12(ld)
177; LARGE_SCH-NEXT:    lu32i.d $a1, %got64_pc_lo20(ld)
178; LARGE_SCH-NEXT:    lu52i.d $a1, $a1, %got64_pc_hi12(ld)
179; LARGE_SCH-NEXT:    add.d $a0, $a1, $a0
180; LARGE_SCH-NEXT:    pcalau12i $a1, %got_pc_hi20(__tls_get_addr)
181; LARGE_SCH-NEXT:    addi.d $ra, $zero, %got_pc_lo12(__tls_get_addr)
182; LARGE_SCH-NEXT:    lu32i.d $ra, %got64_pc_lo20(__tls_get_addr)
183; LARGE_SCH-NEXT:    lu52i.d $ra, $ra, %got64_pc_hi12(__tls_get_addr)
184; LARGE_SCH-NEXT:    ldx.d $ra, $ra, $a1
185; LARGE_SCH-NEXT:    jirl $ra, $ra, 0
186; LARGE_SCH-NEXT:    ld.d $zero, $a0, 0
187; LARGE_SCH-NEXT:    pcalau12i $a0, %ie_pc_hi20(ie)
188; LARGE_SCH-NEXT:    addi.d $a1, $zero, %ie_pc_lo12(ie)
189; LARGE_SCH-NEXT:    lu32i.d $a1, %ie64_pc_lo20(ie)
190; LARGE_SCH-NEXT:    lu52i.d $a1, $a1, %ie64_pc_hi12(ie)
191; LARGE_SCH-NEXT:    ldx.d $a0, $a1, $a0
192; LARGE_SCH-NEXT:    ldx.d $zero, $a0, $tp
193; LARGE_SCH-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
194; LARGE_SCH-NEXT:    addi.d $sp, $sp, 16
195; LARGE_SCH-NEXT:    ret
196  %V = load volatile i64, ptr @G
197  %v = load volatile i64, ptr @g
198  call void @bar(i64 1)
199  %v_gd = load volatile i64, ptr @gd
200  %v_ld = load volatile i64, ptr @ld
201  %v_ie = load volatile i64, ptr @ie
202  ret void
203}
204
205define void @baz() nounwind {
206; MEDIUMDESC_NO_SCH-LABEL: baz:
207; MEDIUMDESC_NO_SCH:       # %bb.0:
208; MEDIUMDESC_NO_SCH-NEXT:    addi.d $sp, $sp, -16
209; MEDIUMDESC_NO_SCH-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
210; MEDIUMDESC_NO_SCH-NEXT:    pcalau12i $a0, %desc_pc_hi20(gd)
211; MEDIUMDESC_NO_SCH-NEXT:    addi.d $a0, $a0, %desc_pc_lo12(gd)
212; MEDIUMDESC_NO_SCH-NEXT:    ld.d $ra, $a0, %desc_ld(gd)
213; MEDIUMDESC_NO_SCH-NEXT:    jirl $ra, $ra, %desc_call(gd)
214; MEDIUMDESC_NO_SCH-NEXT:    add.d $a0, $a0, $tp
215; MEDIUMDESC_NO_SCH-NEXT:    ld.d $zero, $a0, 0
216; MEDIUMDESC_NO_SCH-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
217; MEDIUMDESC_NO_SCH-NEXT:    addi.d $sp, $sp, 16
218; MEDIUMDESC_NO_SCH-NEXT:    ret
219;
220; MEDIUMDESC_SCH-LABEL: baz:
221; MEDIUMDESC_SCH:       # %bb.0:
222; MEDIUMDESC_SCH-NEXT:    addi.d $sp, $sp, -16
223; MEDIUMDESC_SCH-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
224; MEDIUMDESC_SCH-NEXT:    pcalau12i $a0, %desc_pc_hi20(gd)
225; MEDIUMDESC_SCH-NEXT:    addi.d $a0, $a0, %desc_pc_lo12(gd)
226; MEDIUMDESC_SCH-NEXT:    ld.d $ra, $a0, %desc_ld(gd)
227; MEDIUMDESC_SCH-NEXT:    jirl $ra, $ra, %desc_call(gd)
228; MEDIUMDESC_SCH-NEXT:    add.d $a0, $a0, $tp
229; MEDIUMDESC_SCH-NEXT:    ld.d $zero, $a0, 0
230; MEDIUMDESC_SCH-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
231; MEDIUMDESC_SCH-NEXT:    addi.d $sp, $sp, 16
232; MEDIUMDESC_SCH-NEXT:    ret
233;
234; LARGEDESC_NO_SCH-LABEL: baz:
235; LARGEDESC_NO_SCH:       # %bb.0:
236; LARGEDESC_NO_SCH-NEXT:    addi.d $sp, $sp, -16
237; LARGEDESC_NO_SCH-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
238; LARGEDESC_NO_SCH-NEXT:    pcalau12i $a0, %desc_pc_hi20(gd)
239; LARGEDESC_NO_SCH-NEXT:    addi.d $a1, $zero, %desc_pc_lo12(gd)
240; LARGEDESC_NO_SCH-NEXT:    lu32i.d $a1, %desc64_pc_lo20(gd)
241; LARGEDESC_NO_SCH-NEXT:    lu52i.d $a1, $a1, %desc64_pc_hi12(gd)
242; LARGEDESC_NO_SCH-NEXT:    add.d $a0, $a0, $a1
243; LARGEDESC_NO_SCH-NEXT:    ld.d $ra, $a0, %desc_ld(gd)
244; LARGEDESC_NO_SCH-NEXT:    jirl $ra, $ra, %desc_call(gd)
245; LARGEDESC_NO_SCH-NEXT:    add.d $a0, $a0, $tp
246; LARGEDESC_NO_SCH-NEXT:    ld.d $zero, $a0, 0
247; LARGEDESC_NO_SCH-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
248; LARGEDESC_NO_SCH-NEXT:    addi.d $sp, $sp, 16
249; LARGEDESC_NO_SCH-NEXT:    ret
250;
251; LARGEDESC_SCH-LABEL: baz:
252; LARGEDESC_SCH:       # %bb.0:
253; LARGEDESC_SCH-NEXT:    addi.d $sp, $sp, -16
254; LARGEDESC_SCH-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
255; LARGEDESC_SCH-NEXT:    pcalau12i $a0, %desc_pc_hi20(gd)
256; LARGEDESC_SCH-NEXT:    addi.d $a1, $zero, %desc_pc_lo12(gd)
257; LARGEDESC_SCH-NEXT:    lu32i.d $a1, %desc64_pc_lo20(gd)
258; LARGEDESC_SCH-NEXT:    lu52i.d $a1, $a1, %desc64_pc_hi12(gd)
259; LARGEDESC_SCH-NEXT:    add.d $a0, $a0, $a1
260; LARGEDESC_SCH-NEXT:    ld.d $ra, $a0, %desc_ld(gd)
261; LARGEDESC_SCH-NEXT:    jirl $ra, $ra, %desc_call(gd)
262; LARGEDESC_SCH-NEXT:    add.d $a0, $a0, $tp
263; LARGEDESC_SCH-NEXT:    ld.d $zero, $a0, 0
264; LARGEDESC_SCH-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
265; LARGEDESC_SCH-NEXT:    addi.d $sp, $sp, 16
266; LARGEDESC_SCH-NEXT:    ret
267  %v_gd = load volatile i64, ptr @gd
268  ret void
269}
270