X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;ds=sidebyside;f=test%2FCodeGen%2FWebAssembly%2Fcall.ll;h=3b5437f5b6cd652110151127ab90704921e25681;hb=19dfe052ee3b5eefb2a9ac4300217f81aeaa810c;hp=e5d468b3cd1c2a2bffcfac9e9bbc84e00fb82f30;hpb=03685a9bf419e19ada39c9df4dc8a58c36eeee00;p=oota-llvm.git diff --git a/test/CodeGen/WebAssembly/call.ll b/test/CodeGen/WebAssembly/call.ll index e5d468b3cd1..3b5437f5b6c 100644 --- a/test/CodeGen/WebAssembly/call.ll +++ b/test/CodeGen/WebAssembly/call.ll @@ -2,21 +2,126 @@ ; Test that basic call operations assemble as expected. -target datalayout = "e-p:32:32-i64:64-v128:8:128-n32:64-S128" +target datalayout = "e-p:32:32-i64:64-n32:64-S128" target triple = "wasm32-unknown-unknown" -declare void @nullary() +declare i32 @i32_nullary() +declare i32 @i32_unary(i32) +declare i32 @i32_binary(i32, i32) +declare i64 @i64_nullary() +declare float @float_nullary() +declare double @double_nullary() +declare void @void_nullary() -; CHECK-LABEL: call_nullary: -; CHECK-NEXT: (call @foo) -; CHECK-NEXT: (return) -define void @call_nullary() { - call void @nullary() +; CHECK-LABEL: call_i32_nullary: +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: call i32_nullary, $push[[NUM:[0-9]+]]{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +define i32 @call_i32_nullary() { + %r = call i32 @i32_nullary() + ret i32 %r +} + +; CHECK-LABEL: call_i64_nullary: +; CHECK-NEXT: .result i64{{$}} +; CHECK-NEXT: call i64_nullary, $push[[NUM:[0-9]+]]{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +define i64 @call_i64_nullary() { + %r = call i64 @i64_nullary() + ret i64 %r +} + +; CHECK-LABEL: call_float_nullary: +; CHECK-NEXT: .result f32{{$}} +; CHECK-NEXT: call float_nullary, $push[[NUM:[0-9]+]]{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +define float @call_float_nullary() { + %r = call float @float_nullary() + ret float %r +} + +; CHECK-LABEL: call_double_nullary: +; CHECK-NEXT: .result f64{{$}} +; CHECK-NEXT: call double_nullary, $push[[NUM:[0-9]+]]{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +define double @call_double_nullary() { + %r = call double @double_nullary() + ret double %r +} + +; CHECK-LABEL: call_void_nullary: +; CHECK-NEXT: call void_nullary{{$}} +; CHECK-NEXT: return{{$}} +define void @call_void_nullary() { + call void @void_nullary() ret void } +; CHECK-LABEL: call_i32_unary: +; CHECK-NEXT: .param i32{{$}} +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: call i32_unary, $push[[NUM:[0-9]+]], $0{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +define i32 @call_i32_unary(i32 %a) { + %r = call i32 @i32_unary(i32 %a) + ret i32 %r +} + +; CHECK-LABEL: call_i32_binary: +; CHECK-NEXT: .param i32, i32{{$}} +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: call i32_binary, $push[[NUM:[0-9]+]], $0, $1{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +define i32 @call_i32_binary(i32 %a, i32 %b) { + %r = call i32 @i32_binary(i32 %a, i32 %b) + ret i32 %r +} + +; CHECK-LABEL: call_indirect_void: +; CHECK-NEXT: .param i32{{$}} +; CHECK-NEXT: call_indirect $0{{$}} +; CHECK-NEXT: return{{$}} +define void @call_indirect_void(void ()* %callee) { + call void %callee() + ret void +} + +; CHECK-LABEL: call_indirect_i32: +; CHECK-NEXT: .param i32{{$}} +; CHECK-NEXT: .result i32{{$}} +; CHECK-NEXT: call_indirect $0, $push[[NUM:[0-9]+]]{{$}} +; CHECK-NEXT: return $pop[[NUM]]{{$}} +define i32 @call_indirect_i32(i32 ()* %callee) { + %t = call i32 %callee() + ret i32 %t +} + +; CHECK-LABEL: tail_call_void_nullary: +; CHECK-NEXT: call void_nullary{{$}} +; CHECK-NEXT: return{{$}} +define void @tail_call_void_nullary() { + tail call void @void_nullary() + ret void +} + +; CHECK-LABEL: fastcc_tail_call_void_nullary: +; CHECK-NEXT: call void_nullary{{$}} +; CHECK-NEXT: return{{$}} +define void @fastcc_tail_call_void_nullary() { + tail call fastcc void @void_nullary() + ret void +} + +; CHECK-LABEL: coldcc_tail_call_void_nullary: +; CHECK-NEXT: call void_nullary +; CHECK-NEXT: return{{$}} +define void @coldcc_tail_call_void_nullary() { + tail call coldcc void @void_nullary() + ret void +} -; tail call -; multiple args -; interesting returns (int, float, struct, multiple) -; vararg +; FIXME test the following: +; - More argument combinations. +; - Tail call. +; - Interesting returns (struct, multiple). +; - Vararg.