1; RUN: llc < %s -asm-verbose=false | FileCheck %s 2 3; Test that basic call operations assemble as expected. 4 5target datalayout = "e-p:32:32-i64:64-n32:64-S128" 6target triple = "wasm32-unknown-unknown" 7 8declare i32 @i32_nullary() 9declare i32 @i32_unary(i32) 10declare i32 @i32_binary(i32, i32) 11declare i64 @i64_nullary() 12declare float @float_nullary() 13declare double @double_nullary() 14declare void @void_nullary() 15 16; CHECK-LABEL: (func $call_i32_nullary 17; CHECK-NEXT: (result i32) 18; CHECK-NEXT: (set_local @0 (call $i32_nullary)) 19; CHECK-NEXT: (return @0) 20define i32 @call_i32_nullary() { 21 %r = call i32 @i32_nullary() 22 ret i32 %r 23} 24 25; CHECK-LABEL: (func $call_i64_nullary 26; CHECK-NEXT: (result i64) 27; CHECK-NEXT: (set_local @0 (call $i64_nullary)) 28; CHECK-NEXT: (return @0) 29define i64 @call_i64_nullary() { 30 %r = call i64 @i64_nullary() 31 ret i64 %r 32} 33 34; CHECK-LABEL: (func $call_float_nullary 35; CHECK-NEXT: (result f32) 36; CHECK-NEXT: (set_local @0 (call $float_nullary)) 37; CHECK-NEXT: (return @0) 38define float @call_float_nullary() { 39 %r = call float @float_nullary() 40 ret float %r 41} 42 43; CHECK-LABEL: (func $call_double_nullary 44; CHECK-NEXT: (result f64) 45; CHECK-NEXT: (set_local @0 (call $double_nullary)) 46; CHECK-NEXT: (return @0) 47define double @call_double_nullary() { 48 %r = call double @double_nullary() 49 ret double %r 50} 51 52; CHECK-LABEL: (func $call_void_nullary 53; CHECK-NEXT: (call $void_nullary) 54; CHECK-NEXT: (return) 55define void @call_void_nullary() { 56 call void @void_nullary() 57 ret void 58} 59 60; CHECK-LABEL: (func $call_i32_unary 61; CHECK-NEXT: (param i32) (result i32) 62; CHECK-NEXT: (set_local @0 (argument 0)) 63; CHECK-NEXT: (set_local @1 (call $i32_unary @0)) 64; CHECK-NEXT: (return @1) 65define i32 @call_i32_unary(i32 %a) { 66 %r = call i32 @i32_unary(i32 %a) 67 ret i32 %r 68} 69 70; CHECK-LABEL: (func $call_i32_binary 71; CHECK-NEXT: (param i32) (param i32) (result i32) 72; CHECK-NEXT: (set_local @0 (argument 1)) 73; CHECK-NEXT: (set_local @1 (argument 0)) 74; CHECK-NEXT: (set_local @2 (call $i32_binary @1 @0)) 75; CHECK-NEXT: (return @2) 76define i32 @call_i32_binary(i32 %a, i32 %b) { 77 %r = call i32 @i32_binary(i32 %a, i32 %b) 78 ret i32 %r 79} 80 81; CHECK-LABEL: (func $call_indirect_void 82; CHECK-NEXT: (param i32) 83; CHECK-NEXT: (set_local @0 (argument 0)) 84; CHECK-NEXT: (call_indirect @0) 85; CHECK-NEXT: (return) 86define void @call_indirect_void(void ()* %callee) { 87 call void %callee() 88 ret void 89} 90 91; CHECK-LABEL: (func $call_indirect_i32 92; CHECK-NEXT: (param i32) 93; CHECK-NEXT: (set_local @0 (argument 0)) 94; CHECK-NEXT: (set_local @1 (call_indirect @0)) 95; CHECK-NEXT: (return @1) 96define i32 @call_indirect_i32(i32 ()* %callee) { 97 %t = call i32 %callee() 98 ret i32 %t 99} 100 101; CHECK-LABEL: (func $tail_call_void_nullary 102; CHECK-NEXT: (call $void_nullary) 103; CHECK-NEXT: (return) 104define void @tail_call_void_nullary() { 105 tail call void @void_nullary() 106 ret void 107} 108 109; CHECK-LABEL: (func $fastcc_tail_call_void_nullary 110; CHECK-NEXT: (call $void_nullary) 111; CHECK-NEXT: (return) 112define void @fastcc_tail_call_void_nullary() { 113 tail call fastcc void @void_nullary() 114 ret void 115} 116 117; CHECK-LABEL: (func $coldcc_tail_call_void_nullary 118; CHECK-NEXT: (call $void_nullary) 119; CHECK-NEXT: (return) 120define void @coldcc_tail_call_void_nullary() { 121 tail call coldcc void @void_nullary() 122 ret void 123} 124 125; FIXME test the following: 126; - More argument combinations. 127; - Tail call. 128; - Interesting returns (struct, multiple). 129; - Vararg. 130