public inbox for gcc-cvs@sourceware.org
help / color / mirror / Atom feed
* [gcc r11-5788] VAX: Make `extv' an expander matching the remaining bit-field operations
@ 2020-12-05 18:29 Maciej W. Rozycki
  0 siblings, 0 replies; only message in thread
From: Maciej W. Rozycki @ 2020-12-05 18:29 UTC (permalink / raw)
  To: gcc-cvs

https://gcc.gnu.org/g:0a9ea215f7400612f6dae2c77351e503798ea599

commit r11-5788-g0a9ea215f7400612f6dae2c77351e503798ea599
Author: Maciej W. Rozycki <macro@linux-mips.org>
Date:   Sat Dec 5 18:26:26 2020 +0000

    VAX: Make `extv' an expander matching the remaining bit-field operations
    
    We have matching insns defined for `sign_extract' and `zero_extract'
    expressions, so make the three named patterns for bit-field operations
    consistent and make `extv' an expander rather than an insn taking a
    SImode, a QImode, and a SImode general operand for the LOC, SIZE, and
    POS operands respectively, like with the `extzv' and `insv' patterns,
    matching the machine instructions and giving the middle end more choice
    as to which actual insn to choose in a given situation.
    
    Given this program:
    
    typedef struct
    {
      int f0:1;
      int f1:7;
      int f8:8;
      int f16:16;
    } bit_t;
    
    typedef struct
    {
      unsigned int f0:1;
      unsigned int f1:7;
      unsigned int f8:8;
      unsigned int f16:16;
    } ubit_t;
    
    typedef union
    {
      bit_t b;
      int i;
    } bit_u;
    
    typedef union
    {
      ubit_t b;
      unsigned int i;
    } ubit_u;
    
    int
    ins1 (bit_u x, int y)
    {
      asm volatile ("" : "+r" (x), "+r" (y));
      x.b.f1 = y;
      return x.i;
    }
    
    int
    ext1 (bit_u x)
    {
      asm volatile ("" : "+r" (x));
      return x.b.f1;
    }
    
    unsigned int
    extz1 (ubit_u x)
    {
      asm volatile ("" : "+r" (x));
      return x.b.f1;
    }
    
    int
    ins8 (bit_u x, int y)
    {
      asm volatile ("" : "+r" (x), "+r" (y));
      x.b.f8 = y;
      return x.i;
    }
    
    int
    ext8 (bit_u x)
    {
      asm volatile ("" : "+r" (x));
      return x.b.f8;
    }
    
    unsigned int
    extz8 (ubit_u x)
    {
      asm volatile ("" : "+r" (x));
      return x.b.f8;
    }
    
    int
    ins16 (bit_u x, int y)
    {
      asm volatile ("" : "+r" (x), "+r" (y));
      x.b.f16 = y;
      return x.i;
    }
    
    int
    ext16 (bit_u x)
    {
      asm volatile ("" : "+r" (x));
      return x.b.f16;
    }
    
    unsigned int
    extz16 (ubit_u x)
    {
      asm volatile ("" : "+r" (x));
      return x.b.f16;
    }
    
    this results in the following code change:
    
    @@ -16,12 +16,12 @@ ins1:
     .globl ext1
            .type   ext1, @function
     ext1:
    -       .word 0 # 19    [c=0]  procedure_entry_mask
    -       subl2 $4,%sp    # 20    [c=32]  addsi3
    +       .word 0 # 18    [c=0]  procedure_entry_mask
    +       subl2 $4,%sp    # 19    [c=32]  addsi3
            movl 4(%ap),%r0 # 2     [c=16]  movsi_2
    -       cvtbl %r0,%r0   # 7     [c=4]  extendqisi2
    -       ashl $-1,%r0,%r0        # 14    [c=40]  *vax.md:624
    -       ret             # 24    [c=0]  return
    +       extv $1,$7,%r0,%r0      # 7     [c=60]  *extv_non_const
    +       cvtbl %r0,%r0   # 13    [c=4]  extendqisi2
    +       ret             # 23    [c=0]  return
            .size   ext1, .-ext1
            .align 1
     .globl extz1
    @@ -49,12 +49,12 @@ ins8:
     .globl ext8
            .type   ext8, @function
     ext8:
    -       .word 0 # 20    [c=0]  procedure_entry_mask
    -       subl2 $4,%sp    # 21    [c=32]  addsi3
    +       .word 0 # 18    [c=0]  procedure_entry_mask
    +       subl2 $4,%sp    # 19    [c=32]  addsi3
            movl 4(%ap),%r0 # 2     [c=16]  movsi_2
    -       cvtwl %r0,%r0   # 7     [c=4]  extendhisi2
    -       ashl $-8,%r0,%r0        # 15    [c=40]  *vax.md:624
    -       ret             # 25    [c=0]  return
    +       rotl $24,%r0,%r0        # 13    [c=60]  *extv_non_const
    +       cvtbl %r0,%r0
    +       ret             # 23    [c=0]  return
            .size   ext8, .-ext8
            .align 1
     .globl extz8
    
    If there is a performance degradation with the replacement sequences,
    then it can and should be sorted within `extv_non_const'.
    
            gcc/
            * config/vax/vax.md (extv): Rename insn to...
            (*extv): ... this.
            (extv): New expander.

Diff:
---
 gcc/config/vax/vax.md | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/gcc/config/vax/vax.md b/gcc/config/vax/vax.md
index f90ae89391f..d8774cdd36c 100644
--- a/gcc/config/vax/vax.md
+++ b/gcc/config/vax/vax.md
@@ -941,7 +941,15 @@
   ""
   "cmpzv %2,%1,%0,%3")
 
-(define_insn "extv"
+(define_expand "extv"
+  [(set (match_operand:SI 0 "general_operand" "")
+	(sign_extract:SI (match_operand:SI 1 "general_operand" "")
+			 (match_operand:QI 2 "general_operand" "")
+			 (match_operand:SI 3 "general_operand" "")))]
+  ""
+  "")
+
+(define_insn "*extv"
   [(set (match_operand:SI 0 "nonimmediate_operand" "=g")
 	(sign_extract:SI (match_operand:QI 1 "memory_operand" "m")
 			 (match_operand:QI 2 "general_operand" "g")


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2020-12-05 18:29 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2020-12-05 18:29 [gcc r11-5788] VAX: Make `extv' an expander matching the remaining bit-field operations Maciej W. Rozycki

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).