blob: 0d5ebb9289a657495785c67acbd480355b6efe2b [file] [log] [blame]
JF Bastiend8a9d662015-08-24 21:59:51 +00001; RUN: llc < %s -asm-verbose=false | FileCheck %s
2
3; Test that basic call operations assemble as expected.
4
Dan Gohman5e066842015-09-09 20:54:31 +00005target datalayout = "e-p:32:32-i64:64-n32:64-S128"
JF Bastiend8a9d662015-08-24 21:59:51 +00006target triple = "wasm32-unknown-unknown"
7
JF Bastienaf111db2015-08-24 22:16:48 +00008declare i32 @i32_nullary()
9declare i32 @i32_unary(i32)
Dan Gohmane590b332015-09-09 01:52:45 +000010declare i32 @i32_binary(i32, i32)
JF Bastienaf111db2015-08-24 22:16:48 +000011declare i64 @i64_nullary()
12declare float @float_nullary()
13declare double @double_nullary()
Dan Gohmanf71abef2015-09-09 16:13:47 +000014declare void @void_nullary()
JF Bastiend8a9d662015-08-24 21:59:51 +000015
Dan Gohmane51c0582015-10-06 00:27:55 +000016; CHECK-LABEL: call_i32_nullary:
17; CHECK-NEXT: .result i32
18; CHECK-NEXT: call $i32_nullary
19; CHECK-NEXT: set_local @0, pop
20; CHECK-NEXT: return @0
JF Bastienaf111db2015-08-24 22:16:48 +000021define i32 @call_i32_nullary() {
22 %r = call i32 @i32_nullary()
23 ret i32 %r
JF Bastiend8a9d662015-08-24 21:59:51 +000024}
25
Dan Gohmane51c0582015-10-06 00:27:55 +000026; CHECK-LABEL: call_i64_nullary:
27; CHECK-NEXT: .result i64
28; CHECK-NEXT: call $i64_nullary
29; CHECK-NEXT: set_local @0, pop
30; CHECK-NEXT: return @0
JF Bastienaf111db2015-08-24 22:16:48 +000031define i64 @call_i64_nullary() {
32 %r = call i64 @i64_nullary()
33 ret i64 %r
34}
JF Bastiend8a9d662015-08-24 21:59:51 +000035
Dan Gohmane51c0582015-10-06 00:27:55 +000036; CHECK-LABEL: call_float_nullary:
37; CHECK-NEXT: .result f32
38; CHECK-NEXT: call $float_nullary
39; CHECK-NEXT: set_local @0, pop
40; CHECK-NEXT: return @0
JF Bastienaf111db2015-08-24 22:16:48 +000041define float @call_float_nullary() {
42 %r = call float @float_nullary()
43 ret float %r
44}
45
Dan Gohmane51c0582015-10-06 00:27:55 +000046; CHECK-LABEL: call_double_nullary:
47; CHECK-NEXT: .result f64
48; CHECK-NEXT: call $double_nullary
49; CHECK-NEXT: set_local @0, pop
50; CHECK-NEXT: return @0
JF Bastienaf111db2015-08-24 22:16:48 +000051define double @call_double_nullary() {
52 %r = call double @double_nullary()
53 ret double %r
54}
55
Dan Gohmane51c0582015-10-06 00:27:55 +000056; CHECK-LABEL: call_void_nullary:
57; CHECK-NEXT: call $void_nullary
58; CHECK-NEXT: return
Dan Gohmanf71abef2015-09-09 16:13:47 +000059define void @call_void_nullary() {
60 call void @void_nullary()
61 ret void
62}
63
Dan Gohmane51c0582015-10-06 00:27:55 +000064; CHECK-LABEL: call_i32_unary:
65; CHECK-NEXT: .param i32
66; CHECK-NEXT: .result i32
67; CHECK-NEXT: @0
68; CHECK-NEXT: set_local @1, pop
69; CHECK-NEXT: call $i32_unary, @1
70; CHECK-NEXT: set_local @2, pop
71; CHECK-NEXT: return @2
JF Bastienaf111db2015-08-24 22:16:48 +000072define i32 @call_i32_unary(i32 %a) {
73 %r = call i32 @i32_unary(i32 %a)
74 ret i32 %r
75}
76
Dan Gohmane51c0582015-10-06 00:27:55 +000077; CHECK-LABEL: call_i32_binary:
78; CHECK-NEXT: .param i32
79; CHECK-NEXT: .param i32
80; CHECK-NEXT: .result i32
81; CHECK-NEXT: @1
82; CHECK-NEXT: set_local @2, pop
83; CHECK-NEXT: @0
84; CHECK-NEXT: set_local @3, pop
85; CHECK-NEXT: call $i32_binary, @3, @2
86; CHECK-NEXT: set_local @4, pop
87; CHECK-NEXT: return @4
Dan Gohmane590b332015-09-09 01:52:45 +000088define i32 @call_i32_binary(i32 %a, i32 %b) {
89 %r = call i32 @i32_binary(i32 %a, i32 %b)
90 ret i32 %r
91}
92
Dan Gohmane51c0582015-10-06 00:27:55 +000093; CHECK-LABEL: call_indirect_void:
94; CHECK-NEXT: .param i32
95; CHECK-NEXT: @0
96; CHECK-NEXT: set_local @1, pop
97; CHECK-NEXT: call_indirect @1
98; CHECK-NEXT: return
Dan Gohman05a17aa2015-09-28 16:22:39 +000099define void @call_indirect_void(void ()* %callee) {
100 call void %callee()
101 ret void
102}
103
Dan Gohmane51c0582015-10-06 00:27:55 +0000104; CHECK-LABEL: call_indirect_i32:
105; CHECK-NEXT: .param i32
106; CHECK-NEXT: .result i32
107; CHECK-NEXT: @0
108; CHECK-NEXT: set_local @1, pop
109; CHECK-NEXT: call_indirect @1
110; CHECK-NEXT: set_local @2, pop
111; CHECK-NEXT: return @2
Dan Gohman05a17aa2015-09-28 16:22:39 +0000112define i32 @call_indirect_i32(i32 ()* %callee) {
113 %t = call i32 %callee()
114 ret i32 %t
115}
116
Dan Gohmane51c0582015-10-06 00:27:55 +0000117; CHECK-LABEL: tail_call_void_nullary:
118; CHECK-NEXT: call $void_nullary
119; CHECK-NEXT: return{{$}}
Dan Gohman9cc692b2015-10-02 20:54:23 +0000120define void @tail_call_void_nullary() {
121 tail call void @void_nullary()
122 ret void
123}
124
Dan Gohmane51c0582015-10-06 00:27:55 +0000125; CHECK-LABEL: fastcc_tail_call_void_nullary:
126; CHECK-NEXT: call $void_nullary
127; CHECK-NEXT: return{{$}}
Dan Gohman9cc692b2015-10-02 20:54:23 +0000128define void @fastcc_tail_call_void_nullary() {
129 tail call fastcc void @void_nullary()
130 ret void
131}
132
Dan Gohmane51c0582015-10-06 00:27:55 +0000133; CHECK-LABEL: coldcc_tail_call_void_nullary:
134; CHECK-NEXT: call $void_nullary
135; CHECK-NEXT: return{{$}}
Dan Gohman9cc692b2015-10-02 20:54:23 +0000136define void @coldcc_tail_call_void_nullary() {
137 tail call coldcc void @void_nullary()
138 ret void
139}
140
JF Bastienaf111db2015-08-24 22:16:48 +0000141; FIXME test the following:
JF Bastienaf111db2015-08-24 22:16:48 +0000142; - More argument combinations.
143; - Tail call.
144; - Interesting returns (struct, multiple).
145; - Vararg.