To keep cross-compiling straightforward, Cretonne shouldn't have any behavior that depends on the host. This renames the "Native" calling convention to "SystemV", which has a defined meaning for each target, so that it's clear that the calling convention doesn't change depending on what host Cretonne is running on.
95 lines
2.1 KiB
Plaintext
95 lines
2.1 KiB
Plaintext
; Parser tests for call and return syntax.
|
|
test cat
|
|
|
|
function %mini() {
|
|
ebb1:
|
|
return
|
|
}
|
|
; sameln: function %mini() system_v {
|
|
; nextln: ebb1:
|
|
; nextln: return
|
|
; nextln: }
|
|
|
|
function %r1() -> i32, f32 spiderwasm {
|
|
ebb1:
|
|
v1 = iconst.i32 3
|
|
v2 = f32const 0.0
|
|
return v1, v2
|
|
}
|
|
; sameln: function %r1() -> i32, f32 spiderwasm {
|
|
; nextln: ebb1:
|
|
; nextln: v1 = iconst.i32 3
|
|
; nextln: v2 = f32const 0.0
|
|
; nextln: return v1, v2
|
|
; nextln: }
|
|
|
|
function %signatures() {
|
|
sig10 = ()
|
|
sig11 = (i32, f64) -> i32, b1 spiderwasm
|
|
fn5 = sig11 %foo
|
|
fn8 = function %bar(i32) -> b1
|
|
}
|
|
; sameln: function %signatures() system_v {
|
|
; check: sig10 = () system_v
|
|
; check: sig11 = (i32, f64) -> i32, b1 spiderwasm
|
|
; check: sig12 = (i32) -> b1 system_v
|
|
; not: fn0
|
|
; check: fn5 = sig11 %foo
|
|
; check: fn8 = sig12 %bar
|
|
; check: }
|
|
|
|
function %direct() {
|
|
fn0 = function %none()
|
|
fn1 = function %one() -> i32
|
|
fn2 = function %two() -> i32, f32
|
|
|
|
ebb0:
|
|
call fn0()
|
|
v1 = call fn1()
|
|
v2, v3 = call fn2()
|
|
return
|
|
}
|
|
; check: call fn0()
|
|
; check: v1 = call fn1()
|
|
; check: v2, v3 = call fn2()
|
|
; check: return
|
|
|
|
function %indirect(i64) {
|
|
sig0 = (i64)
|
|
sig1 = () -> i32
|
|
sig2 = () -> i32, f32
|
|
|
|
ebb0(v0: i64):
|
|
v1 = call_indirect sig1, v0()
|
|
call_indirect sig0, v1(v0)
|
|
v3, v4 = call_indirect sig2, v1()
|
|
return
|
|
}
|
|
; check: v1 = call_indirect sig1, v0()
|
|
; check: call_indirect sig0, v1(v0)
|
|
; check: v3, v4 = call_indirect sig2, v1()
|
|
; check: return
|
|
|
|
function %long_call() {
|
|
sig0 = ()
|
|
fn0 = sig0 %none
|
|
|
|
ebb0:
|
|
v0 = func_addr.i32 fn0
|
|
call_indirect sig0, v0()
|
|
return
|
|
}
|
|
; check: v0 = func_addr.i32 fn0
|
|
; check: call_indirect sig0, v0()
|
|
; check: return
|
|
|
|
; Special purpose function arguments
|
|
function %special1(i32 sret, i32 fp, i32 csr, i32 link) -> i32 link, i32 fp, i32 csr, i32 sret {
|
|
ebb0(v1: i32, v2: i32, v3: i32, v4: i32):
|
|
return v4, v2, v3, v1
|
|
}
|
|
; check: function %special1(i32 sret, i32 fp, i32 csr, i32 link) -> i32 link, i32 fp, i32 csr, i32 sret system_v {
|
|
; check: ebb0(v1: i32, v2: i32, v3: i32, v4: i32):
|
|
; check: return v4, v2, v3, v1
|
|
; check: }
|