File: basic-assembly.s

package info (click to toggle)
llvm-toolchain-15 1%3A15.0.6-4
  • links: PTS, VCS
  • area: main
  • in suites: bookworm
  • size: 1,554,644 kB
  • sloc: cpp: 5,922,452; ansic: 1,012,136; asm: 674,362; python: 191,568; objc: 73,855; f90: 42,327; lisp: 31,913; pascal: 11,973; javascript: 10,144; sh: 9,421; perl: 7,447; ml: 5,527; awk: 3,523; makefile: 2,520; xml: 885; cs: 573; fortran: 567
file content (290 lines) | stat: -rw-r--r-- 8,593 bytes parent folder | download | duplicates (6)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
# RUN: llvm-mc -triple=wasm32-unknown-unknown -mattr=+tail-call,+reference-types,atomics,+simd128,+nontrapping-fptoint,+exception-handling < %s | FileCheck %s
# Check that it converts to .o without errors, but don't check any output:
# RUN: llvm-mc -triple=wasm32-unknown-unknown -filetype=obj -mattr=+tail-call,+reference-types,+atomics,+simd128,+nontrapping-fptoint,+exception-handling -o %t.o < %s

.functype   something1 () -> ()
.functype   something2 (i64) -> (i32, f64)
.functype   something3 () -> (i32)
.globaltype __stack_pointer, i32

empty_func:
    .functype empty_func () -> ()
    end_function

test0:
# local labels can appear between label and its .functype.
.Ltest0begin:
    # Test all types:
    .functype   test0 (i32, i64) -> (i32)
    .tagtype  __cpp_exception i32
    .local      f32, f64, v128, v128
    # Explicit getlocal/setlocal:
    local.get   2
    local.set   2
    # Immediates:
    f32.const   -1.0
    drop
    f32.const   -infinity
    drop
    v128.const  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
    drop
    v128.const  0, 1, 2, 3, 4, 5, 6, 7
    drop
    local.get   0
    f64.const   0x1.999999999999ap1
    # Indirect addressing:
    f64.store   1234:p2align=4
    i32.const   -1
    f64.const   nan
    f64.store   1234     # Natural alignment (3)
    # Loops, conditionals, binary ops, calls etc:
    block       f32
    f32.const   2.0
    i32.const   1
    local.get   0
    i32.ge_s
    br_if       0        # 0: down to label0
.LBB0_1:
    loop        void      # label1:
    call        something1
    i64.const   1234
    call        something2
    i32.const   0
    call_indirect (i32, f64) -> ()
    i32.const   1
    i32.const   2
    i32.add
    local.tee   0
    local.get   0
    i32.lt_s
    br_if       0        # 0: up to label1
.LBB0_2:
    end_loop
    end_block            # label0:
    drop
    block       i32
    block       void
    block       void
    block       void
    block       () -> (i32, i32)
    i32.const   1
    i32.const   2
    end_block
    drop
    br_table {0, 1, 2}   # 2 entries, default
    end_block            # first entry jumps here.
    i32.const   1
    br          2
    end_block            # second entry jumps here.
    i32.const   2
    br          1
    end_block            # default jumps here.
    i32.const   3
    end_block            # "switch" exit.
    if                   # void
    if          i32
    end_if
    else
    end_if
    drop
    block       void
    i32.const   2
    return
    end_block
    block       void
    return_call something3
    end_block
    block       void
    i32.const   3
    return_call_indirect () -> (i32)
    end_block
    local.get   4
    local.get   5
    f32x4.add
    drop
    # Test correct parsing of instructions with / and : in them:
    # TODO: enable once instruction has been added.
    #i32x4.trunc_sat_f32x4_s
    f32.const   1.0
    i32.trunc_f32_s
    try
    i32.atomic.load 0
    i32.const   0
    memory.atomic.notify 0
    drop
.LBB0_3:
    catch       __cpp_exception
    local.set   0
    end_try
    i32.const   .L.str
    i32.load8_u .L.str+2
    i32.load16_u .L.str:p2align=0
    throw 0
.LBB0_4:
    #i32.trunc_sat_f32_s
    global.get  __stack_pointer
    global.set  __stack_pointer
    end_function

    .section    .rodata..L.str,"",@
    .hidden     .L.str
    .type       .L.str,@object
.L.str:
    .int8       'H'
    .asciz      "ello, World!"
    .int16      1234
    .int64      5000000000
    .int32      2000000000
    .size       .L.str, 28

    .data
    .int8       73

    .section    .init_array.42,"",@
    .p2align    2
    .int32      test0

    .ident      "clang version 9.0.0 (trunk 364502) (llvm/trunk 364571)"

.tabletype empty_eref_table, externref
empty_eref_table:

.tabletype empty_fref_table, funcref
empty_fref_table:


# CHECK:           .text
# CHECK:           .globaltype __stack_pointer, i32

# CHECK-LABEL: empty_func:
# CHECK-NEXT:      .functype	empty_func () -> ()
# CHECK-NEXT:      end_function
# CHECK-LABEL: test0:
# CHECK-NEXT:  .Ltest0begin:
# CHECK-NEXT:      .functype   test0 (i32, i64) -> (i32)
# CHECK-NEXT:      .tagtype  __cpp_exception i32
# CHECK-NEXT:      .local      f32, f64
# CHECK-NEXT:      local.get   2
# CHECK-NEXT:      local.set   2
# CHECK-NEXT:      f32.const   -0x1p0
# CHECK-NEXT:      drop
# CHECK-NEXT:      f32.const   -infinity
# CHECK-NEXT:      drop
# CHECK-NEXT:      v128.const  0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15
# CHECK-NEXT:      drop
# CHECK-NEXT:      v128.const  0, 1, 2, 3, 4, 5, 6, 7
# CHECK-NEXT:      drop
# CHECK-NEXT:      local.get   0
# CHECK-NEXT:      f64.const   0x1.999999999999ap1
# CHECK-NEXT:      f64.store   1234:p2align=4
# CHECK-NEXT:      i32.const   -1
# CHECK-NEXT:      f64.const   nan
# CHECK-NEXT:      f64.store   1234
# CHECK-NEXT:      block       f32
# CHECK-NEXT:      f32.const   0x1p1
# CHECK-NEXT:      i32.const   1
# CHECK-NEXT:      local.get   0
# CHECK-NEXT:      i32.ge_s
# CHECK-NEXT:      br_if       0       # 0: down to label0
# CHECK-NEXT:  .LBB0_1:
# CHECK-NEXT:      loop                # label1:
# CHECK-NEXT:      call        something1
# CHECK-NEXT:      i64.const   1234
# CHECK-NEXT:      call        something2
# CHECK-NEXT:      i32.const   0
# CHECK-NEXT:      call_indirect __indirect_function_table, (i32, f64) -> ()
# CHECK-NEXT:      i32.const   1
# CHECK-NEXT:      i32.const   2
# CHECK-NEXT:      i32.add
# CHECK-NEXT:      local.tee   0
# CHECK-NEXT:      local.get   0
# CHECK-NEXT:      i32.lt_s
# CHECK-NEXT:      br_if       0       # 0: up to label1
# CHECK-NEXT:  .LBB0_2:
# CHECK-NEXT:      end_loop
# CHECK-NEXT:      end_block           # label0:
# CHECK-NEXT:      drop
# CHECK-NEXT:      block       i32
# CHECK-NEXT:      block
# CHECK-NEXT:      block
# CHECK-NEXT:      block
# CHECK-NEXT:      block       () -> (i32, i32)
# CHECK-NEXT:      i32.const   1
# CHECK-NEXT:      i32.const   2
# CHECK-NEXT:      end_block
# CHECK-NEXT:      drop
# CHECK-NEXT:      br_table {0, 1, 2}  # 1: down to label4
# CHECK-NEXT:                          # 2: down to label3
# CHECK-NEXT:      end_block           # label5:
# CHECK-NEXT:      i32.const   1
# CHECK-NEXT:      br          2       # 2: down to label2
# CHECK-NEXT:      end_block           # label4:
# CHECK-NEXT:      i32.const   2
# CHECK-NEXT:      br          1       # 1: down to label2
# CHECK-NEXT:      end_block           # label3:
# CHECK-NEXT:      i32.const   3
# CHECK-NEXT:      end_block           # label2:
# CHECK-NEXT:      if
# CHECK-NEXT:      if          i32
# CHECK-NEXT:      end_if
# CHECK-NEXT:      else
# CHECK-NEXT:      end_if
# CHECK-NEXT:      drop
# CHECK-NEXT:      block
# CHECK-NEXT:      i32.const   2
# CHECK-NEXT:      return
# CHECK-NEXT:      end_block
# CHECK-NEXT:      block
# CHECK-NEXT:      return_call something3
# CHECK-NEXT:      end_block
# CHECK-NEXT:      block
# CHECK-NEXT:      i32.const   3
# CHECK-NEXT:      return_call_indirect __indirect_function_table, () -> (i32)
# CHECK-NEXT:      end_block
# CHECK-NEXT:      local.get   4
# CHECK-NEXT:      local.get   5
# CHECK-NEXT:      f32x4.add
# CHECK-NEXT:      drop
# CHECK-NEXT:      f32.const   0x1p0
# CHECK-NEXT:      i32.trunc_f32_s
# CHECK-NEXT:      try
# CHECK-NEXT:      i32.atomic.load 0
# CHECK-NEXT:      i32.const   0
# CHECK-NEXT:      memory.atomic.notify 0
# CHECK-NEXT:      drop
# CHECK-NEXT:  .LBB0_3:
# CHECK-NEXT:      catch       __cpp_exception
# CHECK-NEXT:      local.set   0
# CHECK-NEXT:      end_try
# CHECK-NEXT:      i32.const   .L.str
# CHECK-NEXT:      i32.load8_u .L.str+2
# CHECK-NEXT:      i32.load16_u .L.str:p2align=0
# CHECK-NEXT:      throw       0
# CHECK-NEXT:  .LBB0_4:
# CHECK-NEXT:      global.get  __stack_pointer
# CHECK-NEXT:      global.set  __stack_pointer
# CHECK-NEXT:      end_function

# CHECK:           .section    .rodata..L.str,"",@
# CHECK-NEXT:      .hidden     .L.str
# CHECK-NEXT:  .L.str:
# CHECK-NEXT:      .int8       72
# CHECK-NEXT:      .asciz      "ello, World!"
# CHECK-NEXT:      .int16      1234
# CHECK-NEXT:      .int64      5000000000
# CHECK-NEXT:      .int32      2000000000
# CHECK-NEXT:      .size       .L.str, 28

# CHECK:           .data
# CHECK-EMPTY:
# CHECK-NEXT:      .int8       73

# CHECK:           .section    .init_array.42,"",@
# CHECK-NEXT:      .p2align    2
# CHECK-NEXT:      .int32      test0

# CHECK:           .tabletype empty_eref_table, externref
# CHECK-NEXT: empty_eref_table:

# CHECK:           .tabletype empty_fref_table, funcref
# CHECK-NEXT: empty_fref_table: