Files
wasmtime/cranelift/filetests/filetests/isa/s390x/call.clif
Ulrich Weigand b17b1eb25d [s390x, abi_impl] Add i128 support (#4598)
This adds full i128 support to the s390x target, including new filetests
and enabling the existing i128 runtest on s390x.

The ABI requires that i128 is passed and returned via implicit pointer,
but the front end still generates direct i128 types in call.  This means
we have to implement ABI support to implicitly convert i128 types to
pointers when passing arguments.

To do so, we add a new variant ABIArg::ImplicitArg.  This acts like
StructArg, except that the value type is the actual target type,
not a pointer type.  The required conversions have to be inserted
in the prologue and at function call sites.

Note that when dereferencing the implicit pointer in the prologue,
we may require a temp register: the pointer may be passed on the
stack so it needs to be loaded first, but the value register may
be in the wrong class for pointer values.  In this case, we use
the "stack limit" register, which should be available at this
point in the prologue.

For return values, we use a mechanism similar to the one used for
supporting multiple return values in the Wasmtime ABI.  The only
difference is that the hidden pointer to the return buffer must
be the *first*, not last, argument in this case.

(This implements the second half of issue #4565.)
2022-08-04 20:41:26 +00:00

221 lines
4.3 KiB
Plaintext

test compile precise-output
target s390x
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; CALL
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
function %call(i64) -> i64 {
fn0 = %g(i64) -> i64
block0(v0: i64):
v1 = call fn0(v0)
return v1
}
; stmg %r14, %r15, 112(%r15)
; aghi %r15, -160
; virtual_sp_offset_adjust 160
; block0:
; bras %r1, 12 ; data %g + 0 ; lg %r3, 0(%r1)
; basr %r14, %r3
; lmg %r14, %r15, 272(%r15)
; br %r14
function %call_uext(i32) -> i64 {
fn0 = %g(i32 uext) -> i64
block0(v0: i32):
v1 = call fn0(v0)
return v1
}
; stmg %r14, %r15, 112(%r15)
; aghi %r15, -160
; virtual_sp_offset_adjust 160
; block0:
; llgfr %r2, %r2
; bras %r1, 12 ; data %g + 0 ; lg %r3, 0(%r1)
; basr %r14, %r3
; lmg %r14, %r15, 272(%r15)
; br %r14
function %ret_uext(i32) -> i32 uext {
block0(v0: i32):
return v0
}
; block0:
; llgfr %r2, %r2
; br %r14
function %call_uext(i32) -> i64 {
fn0 = %g(i32 sext) -> i64
block0(v0: i32):
v1 = call fn0(v0)
return v1
}
; stmg %r14, %r15, 112(%r15)
; aghi %r15, -160
; virtual_sp_offset_adjust 160
; block0:
; lgfr %r2, %r2
; bras %r1, 12 ; data %g + 0 ; lg %r3, 0(%r1)
; basr %r14, %r3
; lmg %r14, %r15, 272(%r15)
; br %r14
function %ret_uext(i32) -> i32 sext {
block0(v0: i32):
return v0
}
; block0:
; lgfr %r2, %r2
; br %r14
function %call_colocated(i64) -> i64 {
fn0 = colocated %g(i64) -> i64
block0(v0: i64):
v1 = call fn0(v0)
return v1
}
; stmg %r14, %r15, 112(%r15)
; aghi %r15, -160
; virtual_sp_offset_adjust 160
; block0:
; brasl %r14, %g
; lmg %r14, %r15, 272(%r15)
; br %r14
function %f2(i32) -> i64 {
fn0 = %g(i32 uext) -> i64
block0(v0: i32):
v1 = call fn0(v0)
return v1
}
; stmg %r14, %r15, 112(%r15)
; aghi %r15, -160
; virtual_sp_offset_adjust 160
; block0:
; llgfr %r2, %r2
; bras %r1, 12 ; data %g + 0 ; lg %r3, 0(%r1)
; basr %r14, %r3
; lmg %r14, %r15, 272(%r15)
; br %r14
function %call_indirect(i64, i64) -> i64 {
sig0 = (i64) -> i64
block0(v0: i64, v1: i64):
v2 = call_indirect.i64 sig0, v1(v0)
return v2
}
; stmg %r14, %r15, 112(%r15)
; aghi %r15, -160
; virtual_sp_offset_adjust 160
; block0:
; basr %r14, %r3
; lmg %r14, %r15, 272(%r15)
; br %r14
function %incoming_args(i64, i32, i32 uext, i32 sext, i16, i16 uext, i16 sext, i8, i8 uext, i8 sext) -> i64 {
block0(v0: i64, v1: i32, v2: i32, v3: i32, v4: i16, v5: i16, v6: i16, v7: i8, v8: i8, v9: i8):
v10 = uextend.i64 v1
v11 = uextend.i64 v2
v12 = uextend.i64 v3
v13 = uextend.i64 v4
v14 = uextend.i64 v5
v15 = uextend.i64 v6
v16 = uextend.i64 v7
v17 = uextend.i64 v8
v18 = uextend.i64 v9
v19 = iadd v0, v10
v20 = iadd v11, v12
v21 = iadd v13, v14
v22 = iadd v15, v16
v23 = iadd v17, v18
v24 = iadd v19, v20
v25 = iadd v21, v22
v26 = iadd v23, v24
v27 = iadd v25, v26
return v27
}
; stmg %r7, %r15, 56(%r15)
; aghi %r15, -16
; block0:
; stg %r4, 8(%r15)
; lgr %r10, %r5
; lg %r11, 176(%r15)
; lg %r12, 184(%r15)
; llgc %r13, 199(%r15)
; lg %r8, 200(%r15)
; lg %r7, 208(%r15)
; llgfr %r4, %r3
; lg %r5, 8(%r15)
; llgfr %r5, %r5
; lgr %r3, %r10
; llgfr %r3, %r3
; llghr %r9, %r6
; llghr %r10, %r11
; llghr %r11, %r12
; llgcr %r12, %r13
; llgcr %r8, %r8
; llgcr %r13, %r7
; agrk %r4, %r2, %r4
; agr %r5, %r3
; agrk %r2, %r9, %r10
; agrk %r3, %r11, %r12
; agr %r8, %r13
; agr %r4, %r5
; agrk %r5, %r2, %r3
; agrk %r4, %r8, %r4
; agrk %r2, %r5, %r4
; lmg %r7, %r15, 72(%r15)
; br %r14
function %incoming_args_i128(i128, i128, i128, i128, i128, i128, i128, i128) -> i128 {
block0(v0: i128, v1: i128, v2: i128, v3: i128, v4: i128, v5: i128, v6: i128, v7: i128):
v8 = iadd v0, v1
v9 = iadd v2, v3
v10 = iadd v4, v5
v11 = iadd v6, v7
v12 = iadd v8, v9
v13 = iadd v10, v11
v14 = iadd v12, v13
return v14
}
; block0:
; vl %v0, 0(%r3)
; vl %v1, 0(%r4)
; vl %v2, 0(%r5)
; vl %v3, 0(%r6)
; lg %r3, 160(%r15)
; vl %v4, 0(%r3)
; lg %r3, 168(%r15)
; vl %v5, 0(%r3)
; lg %r5, 176(%r15)
; vl %v6, 0(%r5)
; lg %r4, 184(%r15)
; vl %v7, 0(%r4)
; vaq %v17, %v0, %v1
; vaq %v18, %v2, %v3
; vaq %v19, %v4, %v5
; vaq %v20, %v6, %v7
; vaq %v17, %v17, %v18
; vaq %v18, %v19, %v20
; vaq %v17, %v17, %v18
; vst %v17, 0(%r2)
; br %r14