Files
wasmtime/cranelift/filetests/filetests/isa/aarch64/amodes.clif
Chris Fallin 05cbd667c7 Cranelift: use regalloc2 constraints on caller side of ABI code. (#4892)
* Cranelift: use regalloc2 constraints on caller side of ABI code.

This PR updates the shared ABI code and backends to use register-operand
constraints rather than explicit pinned-vreg moves for register
arguments and return values.

The s390x backend was not updated, because it has its own implementation
of ABI code. Ideally we could converge back to the code shared by x64
and aarch64 (which didn't exist when s390x ported calls to ISLE, so the
current situation is underestandable, to be clear!). I'll leave this for
future work.

This PR exposed several places where regalloc2 needed to be a bit more
flexible with constraints; it requires regalloc2#74 to be merged and
pulled in.

* Update to regalloc2 0.3.3.

In addition to version bump, this required removing two asserts as
`SpillSlot`s no longer carry their class (so we can't assert that they
have the correct class).

* Review comments.

* Filetest updates.

* Add cargo-vet audit for regalloc2 0.3.2 -> 0.3.3 upgrade.

* Update to regalloc2 0.4.0.
2022-09-21 01:17:04 +00:00

341 lines
5.3 KiB
Plaintext

test compile precise-output
set unwind_info=false
target aarch64
function %f5(i64, i32) -> i32 {
block0(v0: i64, v1: i32):
v2 = sextend.i64 v1
v3 = iadd.i64 v0, v2
v4 = load.i32 v3
return v4
}
; block0:
; ldr w0, [x0, w1, SXTW]
; ret
function %f6(i64, i32) -> i32 {
block0(v0: i64, v1: i32):
v2 = sextend.i64 v1
v3 = iadd.i64 v2, v0
v4 = load.i32 v3
return v4
}
; block0:
; ldr w0, [x0, w1, SXTW]
; ret
function %f7(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
v2 = uextend.i64 v0
v3 = uextend.i64 v1
v4 = iadd.i64 v2, v3
v5 = load.i32 v4
return v5
}
; block0:
; mov w4, w0
; ldr w0, [x4, w1, UXTW]
; ret
function %f8(i64, i32) -> i32 {
block0(v0: i64, v1: i32):
v2 = sextend.i64 v1
v3 = iconst.i64 32
v4 = iadd.i64 v2, v3
v5 = iadd.i64 v4, v0
v6 = iadd.i64 v5, v5
v7 = load.i32 v6+4
return v7
}
; block0:
; add x4, x0, #68
; add x4, x4, x0
; add x4, x4, x1, SXTW
; ldr w0, [x4, w1, SXTW]
; ret
function %f9(i64, i64, i64) -> i32 {
block0(v0: i64, v1: i64, v2: i64):
v3 = iconst.i64 48
v4 = iadd.i64 v0, v1
v5 = iadd.i64 v4, v2
v6 = iadd.i64 v5, v3
v7 = load.i32 v6
return v7
}
; block0:
; mov x6, x0
; add x6, x6, x2
; add x6, x6, x1
; ldr w0, [x6, #48]
; ret
function %f10(i64, i64, i64) -> i32 {
block0(v0: i64, v1: i64, v2: i64):
v3 = iconst.i64 4100
v4 = iadd.i64 v0, v1
v5 = iadd.i64 v4, v2
v6 = iadd.i64 v5, v3
v7 = load.i32 v6
return v7
}
; block0:
; movz x5, #4100
; add x5, x5, x1
; add x5, x5, x2
; ldr w0, [x5, x0]
; ret
function %f10() -> i32 {
block0:
v1 = iconst.i64 1234
v2 = load.i32 v1
return v2
}
; block0:
; movz x1, #1234
; ldr w0, [x1]
; ret
function %f11(i64) -> i32 {
block0(v0: i64):
v1 = iconst.i64 8388608 ;; Imm12: 0x800 << 12
v2 = iadd.i64 v0, v1
v3 = load.i32 v2
return v3
}
; block0:
; add x3, x0, #8388608
; ldr w0, [x3]
; ret
function %f12(i64) -> i32 {
block0(v0: i64):
v1 = iconst.i64 -4
v2 = iadd.i64 v0, v1
v3 = load.i32 v2
return v3
}
; block0:
; sub x3, x0, #4
; ldr w0, [x3]
; ret
function %f13(i64) -> i32 {
block0(v0: i64):
v1 = iconst.i64 1000000000
v2 = iadd.i64 v0, v1
v3 = load.i32 v2
return v3
}
; block0:
; movz w3, #51712
; movk w3, w3, #15258, LSL #16
; add x3, x3, x0
; ldr w0, [x3]
; ret
function %f14(i32) -> i32 {
block0(v0: i32):
v1 = sextend.i64 v0
v2 = load.i32 v1
return v2
}
; block0:
; sxtw x3, w0
; ldr w0, [x3]
; ret
function %f15(i32, i32) -> i32 {
block0(v0: i32, v1: i32):
v2 = sextend.i64 v0
v3 = sextend.i64 v1
v4 = iadd.i64 v2, v3
v5 = load.i32 v4
return v5
}
; block0:
; sxtw x4, w0
; ldr w0, [x4, w1, SXTW]
; ret
function %f18(i64, i64, i64) -> i32 {
block0(v0: i64, v1: i64, v2: i64):
v3 = iconst.i32 -4098
v6 = uextend.i64 v3
v5 = sload16.i32 v6+0
return v5
}
; block0:
; movn w5, #4097
; ldrsh x0, [x5]
; ret
function %f19(i64, i64, i64) -> i32 {
block0(v0: i64, v1: i64, v2: i64):
v3 = iconst.i32 4098
v6 = uextend.i64 v3
v5 = sload16.i32 v6+0
return v5
}
; block0:
; movz x5, #4098
; ldrsh x0, [x5]
; ret
function %f20(i64, i64, i64) -> i32 {
block0(v0: i64, v1: i64, v2: i64):
v3 = iconst.i32 -4098
v6 = sextend.i64 v3
v5 = sload16.i32 v6+0
return v5
}
; block0:
; movn w5, #4097
; sxtw x7, w5
; ldrsh x0, [x7]
; ret
function %f21(i64, i64, i64) -> i32 {
block0(v0: i64, v1: i64, v2: i64):
v3 = iconst.i32 4098
v6 = sextend.i64 v3
v5 = sload16.i32 v6+0
return v5
}
; block0:
; movz x5, #4098
; sxtw x7, w5
; ldrsh x0, [x7]
; ret
function %i128(i64) -> i128 {
block0(v0: i64):
v1 = load.i128 v0
store.i128 v1, v0
return v1
}
; block0:
; mov x8, x0
; mov x6, x8
; ldp x0, x1, [x6]
; mov x7, x8
; stp x0, x1, [x7]
; ret
function %i128_imm_offset(i64) -> i128 {
block0(v0: i64):
v1 = load.i128 v0+16
store.i128 v1, v0+16
return v1
}
; block0:
; mov x8, x0
; mov x6, x8
; ldp x0, x1, [x6, #16]
; mov x7, x8
; stp x0, x1, [x7, #16]
; ret
function %i128_imm_offset_large(i64) -> i128 {
block0(v0: i64):
v1 = load.i128 v0+504
store.i128 v1, v0+504
return v1
}
; block0:
; mov x8, x0
; mov x6, x8
; ldp x0, x1, [x6, #504]
; mov x7, x8
; stp x0, x1, [x7, #504]
; ret
function %i128_imm_offset_negative_large(i64) -> i128 {
block0(v0: i64):
v1 = load.i128 v0-512
store.i128 v1, v0-512
return v1
}
; block0:
; mov x8, x0
; mov x6, x8
; ldp x0, x1, [x6, #-512]
; mov x7, x8
; stp x0, x1, [x7, #-512]
; ret
function %i128_add_offset(i64) -> i128 {
block0(v0: i64):
v1 = iadd_imm v0, 32
v2 = load.i128 v1
store.i128 v2, v1
return v2
}
; block0:
; mov x8, x0
; mov x6, x8
; ldp x0, x1, [x6, #32]
; mov x7, x8
; stp x0, x1, [x7, #32]
; ret
function %i128_32bit_sextend_simple(i32) -> i128 {
block0(v0: i32):
v1 = sextend.i64 v0
v2 = load.i128 v1
store.i128 v2, v1
return v2
}
; block0:
; sxtw x6, w0
; ldp x10, x1, [x6]
; sxtw x7, w0
; mov x0, x10
; stp x0, x1, [x7]
; ret
function %i128_32bit_sextend(i64, i32) -> i128 {
block0(v0: i64, v1: i32):
v2 = sextend.i64 v1
v3 = iadd.i64 v0, v2
v4 = iadd_imm.i64 v3, 24
v5 = load.i128 v4
store.i128 v5, v4
return v5
}
; block0:
; mov x11, x0
; mov x7, x11
; add x7, x7, x1, SXTW
; ldp x0, x10, [x7, #24]
; mov x9, x11
; add x9, x9, x1, SXTW
; mov x1, x10
; stp x0, x1, [x9, #24]
; ret