* 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.
341 lines
5.3 KiB
Plaintext
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
|
|
|