Skip to content

Commit

Permalink
riscv64: Special-case f32const 0 and f64const 0 (#8701)
Browse files Browse the repository at this point in the history
* riscv64: Special-case `f32const 0` and `f64const 0`

This commit is inspired by discussion on #8695 which made me remember
the discussion around #7162 historically. In lieu of a deeper fix for
the issue of "why can't `iconst 0` use `(zero_reg)`" it's still possible
to add special-cases to rules throughout the backend so this commit does
that for generating zero-value floats.

* Fix tests

* Run all tests on CI

prtest:full
  • Loading branch information
alexcrichton authored May 30, 2024
1 parent 700f43c commit 79146f0
Show file tree
Hide file tree
Showing 4 changed files with 47 additions and 52 deletions.
5 changes: 5 additions & 0 deletions cranelift/codegen/src/isa/riscv64/inst.isle
Original file line number Diff line number Diff line change
Expand Up @@ -1863,6 +1863,11 @@
;; TODO: Load floats using `fld` instead of `ld`
(decl imm (Type u64) Reg)

;; Special-case 0.0 for floats to use the `(zero_reg)` directly.
;; See #7162 for why this doesn't fall out of the rules below.
(rule 8 (imm $F32 0) (gen_bitcast (zero_reg) $I32 $F32))
(rule 8 (imm $F64 0) (gen_bitcast (zero_reg) $I64 $F64))

;; If Zfa is enabled, we can load certain constants with the `fli` instruction.
(rule 7 (imm (ty_scalar_float ty) imm)
(if-let $true (has_zfa))
Expand Down
54 changes: 26 additions & 28 deletions cranelift/filetests/filetests/isa/riscv64/bitops-float.clif
Original file line number Diff line number Diff line change
Expand Up @@ -22,52 +22,50 @@ block1(v4: f32):
; VCode:
; block0:
; li a0,0
; li a1,0
; fmv.w.x fa1,zero
; fmv.x.w a5,fa1
; not a1,a5
; fmv.w.x fa3,a1
; fmv.x.w a4,fa3
; fmv.x.w a1,fa3
; not a2,a1
; fmv.w.x fa4,a2
; fmv.x.w a5,fa4
; fmv.x.w a1,fa4
; or a3,a5,a1
; fmv.w.x fa4,a3
; br_table a0,[MachLabel(1),MachLabel(2)]##tmp1=a1,tmp2=a2
; or a2,a4,a1
; fmv.w.x fa2,a2
; br_table a0,[MachLabel(1),MachLabel(2)]##tmp1=a2,tmp2=a1
; block1:
; j label3
; block2:
; fmv.d fa4,fa3
; fmv.d fa2,fa1
; j label3
; block3:
; ret
;
; Disassembled:
; block0: ; offset 0x0
; mv a0, zero
; mv a1, zero
; fmv.w.x fa1, zero
; fmv.x.w a5, fa1
; not a1, a5
; fmv.w.x fa3, a1
; fmv.x.w a4, fa3
; fmv.x.w a1, fa3
; not a2, a1
; fmv.w.x fa4, a2
; fmv.x.w a5, fa4
; fmv.x.w a1, fa4
; or a3, a5, a1
; fmv.w.x fa4, a3
; or a2, a4, a1
; fmv.w.x fa2, a2
; slli t6, a0, 0x20
; srli t6, t6, 0x20
; addi a2, zero, 1
; bltu t6, a2, 0xc
; auipc a2, 0
; jalr zero, a2, 0x28
; addi a1, zero, 1
; bltu t6, a1, 0xc
; auipc a1, 0
; slli a2, t6, 3
; add a1, a1, a2
; jalr zero, a1, 0x10
; jalr zero, a1, 0x28
; auipc a2, 0
; jalr zero, a2, 0xc
; block1: ; offset 0x58
; slli a1, t6, 3
; add a2, a2, a1
; jalr zero, a2, 0x10
; auipc a1, 0
; jalr zero, a1, 0xc
; block1: ; offset 0x54
; j 8
; block2: ; offset 0x5c
; fmv.d fa4, fa3
; block3: ; offset 0x60
; block2: ; offset 0x58
; fmv.d fa2, fa1
; block3: ; offset 0x5c
; ret

12 changes: 4 additions & 8 deletions cranelift/filetests/filetests/isa/riscv64/constants.clif
Original file line number Diff line number Diff line change
Expand Up @@ -426,14 +426,12 @@ block0:

; VCode:
; block0:
; li a0,0
; fmv.d.x fa0,a0
; fmv.d.x fa0,zero
; ret
;
; Disassembled:
; block0: ; offset 0x0
; mv a0, zero
; fmv.d.x fa0, a0
; fmv.d.x fa0, zero
; ret

function %f() -> f32 {
Expand All @@ -444,14 +442,12 @@ block0:

; VCode:
; block0:
; li a0,0
; fmv.w.x fa0,a0
; fmv.w.x fa0,zero
; ret
;
; Disassembled:
; block0: ; offset 0x0
; mv a0, zero
; fmv.w.x fa0, a0
; fmv.w.x fa0, zero
; ret

function %f() -> f64 {
Expand Down
28 changes: 12 additions & 16 deletions cranelift/filetests/filetests/isa/riscv64/fcmp.clif
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,9 @@ block1:

; VCode:
; block0:
; li a1,0
; fmv.d.x fa3,a1
; fle.d a2,fa3,fa3
; beq a2,zero,taken(label1),not_taken(label2)
; fmv.d.x fa1,zero
; fle.d a1,fa1,fa1
; beq a1,zero,taken(label1),not_taken(label2)
; block1:
; j label3
; block2:
Expand All @@ -27,10 +26,9 @@ block1:
;
; Disassembled:
; block0: ; offset 0x0
; mv a1, zero
; fmv.d.x fa3, a1
; fle.d a2, fa3, fa3
; block1: ; offset 0xc
; fmv.d.x fa1, zero
; fle.d a1, fa1, fa1
; block1: ; offset 0x8
; ret

function %f1() {
Expand All @@ -45,10 +43,9 @@ block1:

; VCode:
; block0:
; li a1,0
; fmv.d.x fa3,a1
; fle.d a2,fa3,fa3
; beq a2,zero,taken(label1),not_taken(label2)
; fmv.d.x fa1,zero
; fle.d a1,fa1,fa1
; beq a1,zero,taken(label1),not_taken(label2)
; block1:
; j label3
; block2:
Expand All @@ -58,10 +55,9 @@ block1:
;
; Disassembled:
; block0: ; offset 0x0
; mv a1, zero
; fmv.d.x fa3, a1
; fle.d a2, fa3, fa3
; block1: ; offset 0xc
; fmv.d.x fa1, zero
; fle.d a1, fa1, fa1
; block1: ; offset 0x8
; ret

function %ord(f32, f32) -> i8 {
Expand Down

0 comments on commit 79146f0

Please sign in to comment.