blob: f44ba92045af77d36854065d0061128418d832a1 [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
JF Bastien1d20a5e2015-10-16 00:53:49 +000018; CHECK-NEXT: .local i32
Dan Gohmancf4748f2015-11-12 17:04:33 +000019; CHECK-NEXT: call i32_nullary, $push{{$}}
20; CHECK-NEXT: set_local 0, $pop
JF Bastien1d20a5e2015-10-16 00:53:49 +000021; CHECK-NEXT: return (get_local 0)
JF Bastienaf111db2015-08-24 22:16:48 +000022define i32 @call_i32_nullary() {
23 %r = call i32 @i32_nullary()
24 ret i32 %r
JF Bastiend8a9d662015-08-24 21:59:51 +000025}
26
Dan Gohmane51c0582015-10-06 00:27:55 +000027; CHECK-LABEL: call_i64_nullary:
28; CHECK-NEXT: .result i64
JF Bastien1d20a5e2015-10-16 00:53:49 +000029; CHECK-NEXT: .local i64
Dan Gohmancf4748f2015-11-12 17:04:33 +000030; CHECK-NEXT: call i64_nullary, $push{{$}}
31; CHECK-NEXT: set_local 0, $pop
JF Bastien1d20a5e2015-10-16 00:53:49 +000032; CHECK-NEXT: return (get_local 0)
JF Bastienaf111db2015-08-24 22:16:48 +000033define i64 @call_i64_nullary() {
34 %r = call i64 @i64_nullary()
35 ret i64 %r
36}
JF Bastiend8a9d662015-08-24 21:59:51 +000037
Dan Gohmane51c0582015-10-06 00:27:55 +000038; CHECK-LABEL: call_float_nullary:
39; CHECK-NEXT: .result f32
JF Bastien1d20a5e2015-10-16 00:53:49 +000040; CHECK-NEXT: .local f32
Dan Gohmancf4748f2015-11-12 17:04:33 +000041; CHECK-NEXT: call float_nullary, $push{{$}}
42; CHECK-NEXT: set_local 0, $pop
JF Bastien1d20a5e2015-10-16 00:53:49 +000043; CHECK-NEXT: return (get_local 0)
JF Bastienaf111db2015-08-24 22:16:48 +000044define float @call_float_nullary() {
45 %r = call float @float_nullary()
46 ret float %r
47}
48
Dan Gohmane51c0582015-10-06 00:27:55 +000049; CHECK-LABEL: call_double_nullary:
50; CHECK-NEXT: .result f64
JF Bastien1d20a5e2015-10-16 00:53:49 +000051; CHECK-NEXT: .local f64
Dan Gohmancf4748f2015-11-12 17:04:33 +000052; CHECK-NEXT: call double_nullary, $push{{$}}
53; CHECK-NEXT: set_local 0, $pop
JF Bastien1d20a5e2015-10-16 00:53:49 +000054; CHECK-NEXT: return (get_local 0)
JF Bastienaf111db2015-08-24 22:16:48 +000055define double @call_double_nullary() {
56 %r = call double @double_nullary()
57 ret double %r
58}
59
Dan Gohmane51c0582015-10-06 00:27:55 +000060; CHECK-LABEL: call_void_nullary:
Dan Gohmancf4748f2015-11-12 17:04:33 +000061; CHECK-NEXT: call void_nullary{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000062; CHECK-NEXT: return
Dan Gohmanf71abef2015-09-09 16:13:47 +000063define void @call_void_nullary() {
64 call void @void_nullary()
65 ret void
66}
67
Dan Gohmane51c0582015-10-06 00:27:55 +000068; CHECK-LABEL: call_i32_unary:
69; CHECK-NEXT: .param i32
70; CHECK-NEXT: .result i32
JF Bastien1d20a5e2015-10-16 00:53:49 +000071; CHECK-NEXT: .local i32, i32
Dan Gohmancf4748f2015-11-12 17:04:33 +000072; CHECK-NEXT: call i32_unary, $push, (get_local 0){{$}}
73; CHECK-NEXT: set_local 1, $pop
74; CHECK-NEXT: return (get_local 1)
JF Bastienaf111db2015-08-24 22:16:48 +000075define i32 @call_i32_unary(i32 %a) {
76 %r = call i32 @i32_unary(i32 %a)
77 ret i32 %r
78}
79
Dan Gohmane51c0582015-10-06 00:27:55 +000080; CHECK-LABEL: call_i32_binary:
81; CHECK-NEXT: .param i32
82; CHECK-NEXT: .param i32
83; CHECK-NEXT: .result i32
JF Bastien1d20a5e2015-10-16 00:53:49 +000084; CHECK-NEXT: .local i32, i32, i32
Dan Gohmancf4748f2015-11-12 17:04:33 +000085; CHECK-NEXT: call i32_binary, $push, (get_local 0), (get_local 1){{$}}
86; CHECK-NEXT: set_local 2, $pop
87; CHECK-NEXT: return (get_local 2)
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
JF Bastien1d20a5e2015-10-16 00:53:49 +000095; CHECK-NEXT: .local i32
Dan Gohmancf4748f2015-11-12 17:04:33 +000096; CHECK-NEXT: call_indirect (get_local 0){{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +000097; CHECK-NEXT: return
Dan Gohman05a17aa2015-09-28 16:22:39 +000098define void @call_indirect_void(void ()* %callee) {
99 call void %callee()
100 ret void
101}
102
Dan Gohmane51c0582015-10-06 00:27:55 +0000103; CHECK-LABEL: call_indirect_i32:
104; CHECK-NEXT: .param i32
105; CHECK-NEXT: .result i32
JF Bastien1d20a5e2015-10-16 00:53:49 +0000106; CHECK-NEXT: .local i32, i32
Dan Gohmancf4748f2015-11-12 17:04:33 +0000107; CHECK-NEXT: call_indirect (get_local 0), $push{{$}}
108; CHECK-NEXT: set_local 1, $pop
109; CHECK-NEXT: return (get_local 1)
Dan Gohman05a17aa2015-09-28 16:22:39 +0000110define i32 @call_indirect_i32(i32 ()* %callee) {
111 %t = call i32 %callee()
112 ret i32 %t
113}
114
Dan Gohmane51c0582015-10-06 00:27:55 +0000115; CHECK-LABEL: tail_call_void_nullary:
Dan Gohmancf4748f2015-11-12 17:04:33 +0000116; CHECK-NEXT: call void_nullary{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000117; CHECK-NEXT: return{{$}}
Dan Gohman9cc692b2015-10-02 20:54:23 +0000118define void @tail_call_void_nullary() {
119 tail call void @void_nullary()
120 ret void
121}
122
Dan Gohmane51c0582015-10-06 00:27:55 +0000123; CHECK-LABEL: fastcc_tail_call_void_nullary:
Dan Gohmancf4748f2015-11-12 17:04:33 +0000124; CHECK-NEXT: call void_nullary{{$}}
Dan Gohmane51c0582015-10-06 00:27:55 +0000125; CHECK-NEXT: return{{$}}
Dan Gohman9cc692b2015-10-02 20:54:23 +0000126define void @fastcc_tail_call_void_nullary() {
127 tail call fastcc void @void_nullary()
128 ret void
129}
130
Dan Gohmane51c0582015-10-06 00:27:55 +0000131; CHECK-LABEL: coldcc_tail_call_void_nullary:
Dan Gohmancf4748f2015-11-12 17:04:33 +0000132; CHECK-NEXT: call void_nullary
Dan Gohmane51c0582015-10-06 00:27:55 +0000133; CHECK-NEXT: return{{$}}
Dan Gohman9cc692b2015-10-02 20:54:23 +0000134define void @coldcc_tail_call_void_nullary() {
135 tail call coldcc void @void_nullary()
136 ret void
137}
138
JF Bastienaf111db2015-08-24 22:16:48 +0000139; FIXME test the following:
JF Bastienaf111db2015-08-24 22:16:48 +0000140; - More argument combinations.
141; - Tail call.
142; - Interesting returns (struct, multiple).
143; - Vararg.