On 11/19/20 8:36 PM, Maciej W. Rozycki wrote:
> The use of a constant double zero is required for post-reload compare
> elimination to be able to discard redundant floating-point comparisons,
> for example with a VAX RTL instruction stream like:
>
> (insn 34 4 3 2 (parallel [
>             (set (reg/v:DF 0 %r0 [orig:24 x ] [24])
>                 (mem/c:DF (plus:SI (reg/f:SI 12 %ap)
>                         (const_int 4 [0x4])) [1 x+0 S8 A32]))
>             (clobber (reg:CC 16 %psl))
>         ]) ".../gcc/testsuite/gcc.target/vax/cmpelim-eq-movdf.c":9:1 37 
> {*movdf}
>      (nil))
> (note 3 34 35 2 NOTE_INSN_FUNCTION_BEG)
> (insn 35 3 36 2 (set (reg:CCZ 16 %psl)
>         (compare:CCZ (reg/v:DF 0 %r0 [orig:24 x ] [24])
>             (const_double:DF 0.0 [0x0.0p+0]))) 
> ".../gcc/testsuite/gcc.target/vax/cmpelim-eq-movdf.c":10:6 21 {*cmpdf_ccz}
>      (nil))
> (jump_insn 36 35 9 2 (set (pc)
>         (if_then_else (eq (reg:CCZ 16 %psl)
>                 (const_int 0 [0]))
>             (label_ref 11)
>             (pc))) ".../gcc/testsuite/gcc.target/vax/cmpelim-eq-movdf.c":10:6 
> 537 {*branch_ccz}
>      (int_list:REG_BR_PROB 536870916 (nil))
>  -> 11)
>
> that we want to transform into:
>
> (insn 34 4 3 2 (parallel [
>             (set (reg:CCZ 16 %psl)
>                 (compare:CCZ (mem/c:DF (plus:SI (reg/f:SI 12 %ap)
>                             (const_int 4 [0x4])) [1 x+0 S8 A32])
>                     (const_double:DF 0.0 [0x0.0p+0])))
>             (set (reg/v:DF 0 %r0 [orig:24 x ] [24])
>                 (mem/c:DF (plus:SI (reg/f:SI 12 %ap)
>                         (const_int 4 [0x4])) [1 x+0 S8 A32]))
>         ]) ".../gcc/testsuite/gcc.target/vax/cmpelim-eq-movdf.c":9:1 40 
> {*movdf_ccz}
>      (nil))
> (note 3 34 36 2 NOTE_INSN_FUNCTION_BEG)
> (jump_insn 36 3 9 2 (set (pc)
>         (if_then_else (eq (reg:CCZ 16 %psl)
>                 (const_int 0 [0]))
>             (label_ref 11)
>             (pc))) ".../gcc/testsuite/gcc.target/vax/cmpelim-eq-movdf.c":10:6 
> 537 {*branch_ccz}
>      (int_list:REG_BR_PROB 536870916 (nil))
>  -> 11)
>
> with the upcoming MODE_CC representation.
>
> For this we need to express the `const_double:DF 0.0 [0x0.0p+0]' rtx as
> recorded above in the relevant pattern(s) in machine description.  The
> way we represent double constants, as a host-dependent number of wide
> integers, however means that we currently have no portable way to encode
> a double zero constant in machine description.
>
> Define a syntactic rtx alias then to represent `(const_double 0 0 ...)'
> as if the suitable number of zeros have been supplied according to the
> host-specific definition of CONST_DOUBLE_FORMAT.
>
>       gcc/
>       * read-rtl.c (rtx_reader::read_rtx_code): Handle syntactic
>       `const_double_zero' rtx.
>       * doc/rtl.texi (Constant Expression Types): Document it.
OK
jeff

Reply via email to