aarch64: Use VCodeConstant for f64/v128 constants (#5997)

* aarch64: Translate float and splat lowering to ISLE

I was looking into `constant_f128` and its fallback lowering into memory
and to get familiar with the code I figured it'd be good to port some
Rust logic to ISLE. This commit ports the `constant_{f128,f64,f32}`
helpers into ISLE from Rust as well as the `splat_const` helper which
ended up being closely related.

Tests reflect a number of regalloc changes that happened but also namely
one major difference is that in the lowering of `f32` a 32-bit immediate
is created now instead of a 64-bit immediate (in a GP register before
it's moved into a FP register). This semantically has no change but the
generated code is slightly different in a few minor cases.

* aarch64: Load f64/v128 constants from a pool

This commit removes the `LoadFpuConst64` and `LoadFpuConst128`
pseudo-instructions from the AArch64 backend which internally loaded a
nearby constant and then jumped over it. Constants now go through the
`VCodeConstant` infrastructure which gets placed at the end of the
function similar to how x64 works. Some minor support was added in as
well to add a new addressing mode for a `MachLabel`-relative load.
This commit is contained in:
Alex Crichton
2023-03-13 14:33:52 -05:00
committed by GitHub
parent 6ecdc2482e
commit 03b5dbb3e0
25 changed files with 622 additions and 744 deletions

View File

@@ -531,9 +531,9 @@ block0(v0: f32):
; fmov s4, #-1
; fcmp s0, s4
; b.gt 8 ; udf
; movz x9, #20352, LSL #16
; fmov s17, w9
; fcmp s0, s17
; movz w8, #20352, LSL #16
; fmov s18, w8
; fcmp s0, s18
; b.lt 8 ; udf
; fcvtzu w0, s0
; ret
@@ -547,9 +547,9 @@ block0(v0: f32):
; fcmp s0, s4
; b.gt #0x1c
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; mov x9, #0x4f800000
; fmov s17, w9
; fcmp s0, s17
; mov w8, #0x4f800000
; fmov s18, w8
; fcmp s0, s18
; b.lt #0x30
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; fcvtzu w0, s0
@@ -565,13 +565,13 @@ block0(v0: f32):
; block0:
; fcmp s0, s0
; b.vc 8 ; udf
; movz x5, #52992, LSL #16
; fmov s5, w5
; fcmp s0, s5
; movz w4, #52992, LSL #16
; fmov s6, w4
; fcmp s0, s6
; b.ge 8 ; udf
; movz x11, #20224, LSL #16
; fmov s19, w11
; fcmp s0, s19
; movz w10, #20224, LSL #16
; fmov s20, w10
; fcmp s0, s20
; b.lt 8 ; udf
; fcvtzs w0, s0
; ret
@@ -581,14 +581,14 @@ block0(v0: f32):
; fcmp s0, s0
; b.vc #0xc
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: bad_toint
; mov x5, #0xcf000000
; fmov s5, w5
; fcmp s0, s5
; mov w4, #-0x31000000
; fmov s6, w4
; fcmp s0, s6
; b.ge #0x20
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; mov x11, #0x4f000000
; fmov s19, w11
; fcmp s0, s19
; mov w10, #0x4f000000
; fmov s20, w10
; fcmp s0, s20
; b.lt #0x34
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; fcvtzs w0, s0
@@ -607,9 +607,9 @@ block0(v0: f32):
; fmov s4, #-1
; fcmp s0, s4
; b.gt 8 ; udf
; movz x9, #24448, LSL #16
; fmov s17, w9
; fcmp s0, s17
; movz w8, #24448, LSL #16
; fmov s18, w8
; fcmp s0, s18
; b.lt 8 ; udf
; fcvtzu x0, s0
; ret
@@ -623,9 +623,9 @@ block0(v0: f32):
; fcmp s0, s4
; b.gt #0x1c
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; mov x9, #0x5f800000
; fmov s17, w9
; fcmp s0, s17
; mov w8, #0x5f800000
; fmov s18, w8
; fcmp s0, s18
; b.lt #0x30
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; fcvtzu x0, s0
@@ -641,13 +641,13 @@ block0(v0: f32):
; block0:
; fcmp s0, s0
; b.vc 8 ; udf
; movz x5, #57088, LSL #16
; fmov s5, w5
; fcmp s0, s5
; movz w4, #57088, LSL #16
; fmov s6, w4
; fcmp s0, s6
; b.ge 8 ; udf
; movz x11, #24320, LSL #16
; fmov s19, w11
; fcmp s0, s19
; movz w10, #24320, LSL #16
; fmov s20, w10
; fcmp s0, s20
; b.lt 8 ; udf
; fcvtzs x0, s0
; ret
@@ -657,14 +657,14 @@ block0(v0: f32):
; fcmp s0, s0
; b.vc #0xc
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: bad_toint
; mov x5, #0xdf000000
; fmov s5, w5
; fcmp s0, s5
; mov w4, #-0x21000000
; fmov s6, w4
; fcmp s0, s6
; b.ge #0x20
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; mov x11, #0x5f000000
; fmov s19, w11
; fcmp s0, s19
; mov w10, #0x5f000000
; fmov s20, w10
; fcmp s0, s20
; b.lt #0x34
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; fcvtzs x0, s0
@@ -683,9 +683,9 @@ block0(v0: f64):
; fmov d4, #-1
; fcmp d0, d4
; b.gt 8 ; udf
; movz x9, #16880, LSL #48
; fmov d17, x9
; fcmp d0, d17
; movz x8, #16880, LSL #48
; fmov d18, x8
; fcmp d0, d18
; b.lt 8 ; udf
; fcvtzu w0, d0
; ret
@@ -699,9 +699,9 @@ block0(v0: f64):
; fcmp d0, d4
; b.gt #0x1c
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; mov x9, #0x41f0000000000000
; fmov d17, x9
; fcmp d0, d17
; mov x8, #0x41f0000000000000
; fmov d18, x8
; fcmp d0, d18
; b.lt #0x30
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; fcvtzu w0, d0
@@ -717,12 +717,12 @@ block0(v0: f64):
; block0:
; fcmp d0, d0
; b.vc 8 ; udf
; ldr d4, pc+8 ; b 12 ; data.f64 -2147483649
; ldr d4, [const(0)]
; fcmp d0, d4
; b.gt 8 ; udf
; movz x9, #16864, LSL #48
; fmov d17, x9
; fcmp d0, d17
; movz x8, #16864, LSL #48
; fmov d18, x8
; fcmp d0, d18
; b.lt 8 ; udf
; fcvtzs w0, d0
; ret
@@ -732,20 +732,19 @@ block0(v0: f64):
; fcmp d0, d0
; b.vc #0xc
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: bad_toint
; ldr d4, #0x14
; b #0x1c
; .byte 0x00, 0x00, 0x20, 0x00
; .byte 0x00, 0x00, 0xe0, 0xc1
; ldr d4, #0x38
; fcmp d0, d4
; b.gt #0x28
; b.gt #0x1c
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; mov x9, #0x41e0000000000000
; fmov d17, x9
; fcmp d0, d17
; b.lt #0x3c
; mov x8, #0x41e0000000000000
; fmov d18, x8
; fcmp d0, d18
; b.lt #0x30
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; fcvtzs w0, d0
; ret
; .byte 0x00, 0x00, 0x20, 0x00
; .byte 0x00, 0x00, 0xe0, 0xc1
function %f39(f64) -> i64 {
block0(v0: f64):
@@ -760,9 +759,9 @@ block0(v0: f64):
; fmov d4, #-1
; fcmp d0, d4
; b.gt 8 ; udf
; movz x9, #17392, LSL #48
; fmov d17, x9
; fcmp d0, d17
; movz x8, #17392, LSL #48
; fmov d18, x8
; fcmp d0, d18
; b.lt 8 ; udf
; fcvtzu x0, d0
; ret
@@ -776,9 +775,9 @@ block0(v0: f64):
; fcmp d0, d4
; b.gt #0x1c
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; mov x9, #0x43f0000000000000
; fmov d17, x9
; fcmp d0, d17
; mov x8, #0x43f0000000000000
; fmov d18, x8
; fcmp d0, d18
; b.lt #0x30
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; fcvtzu x0, d0
@@ -794,13 +793,13 @@ block0(v0: f64):
; block0:
; fcmp d0, d0
; b.vc 8 ; udf
; movz x5, #50144, LSL #48
; fmov d5, x5
; fcmp d0, d5
; movz x4, #50144, LSL #48
; fmov d6, x4
; fcmp d0, d6
; b.ge 8 ; udf
; movz x11, #17376, LSL #48
; fmov d19, x11
; fcmp d0, d19
; movz x10, #17376, LSL #48
; fmov d20, x10
; fcmp d0, d20
; b.lt 8 ; udf
; fcvtzs x0, d0
; ret
@@ -810,14 +809,14 @@ block0(v0: f64):
; fcmp d0, d0
; b.vc #0xc
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: bad_toint
; mov x5, #-0x3c20000000000000
; fmov d5, x5
; fcmp d0, d5
; mov x4, #-0x3c20000000000000
; fmov d6, x4
; fcmp d0, d6
; b.ge #0x20
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; mov x11, #0x43e0000000000000
; fmov d19, x11
; fcmp d0, d19
; mov x10, #0x43e0000000000000
; fmov d20, x10
; fcmp d0, d20
; b.lt #0x34
; .byte 0x1f, 0xc1, 0x00, 0x00 ; trap: int_ovf
; fcvtzs x0, d0