On Mon, 2017-06-12 at 14:09 -0400, Michael Meissner wrote:

> > 
> > > > +(define_insn "vsx_xvcvsxwsp"
> > > > +  [(set (match_operand:V4SF 0 "vsx_register_operand" "=v")
> > > > +       (unspec:V4SF[(match_operand:V4SI 1 "vsx_register_operand" "v")]
> > > > +                   UNSPEC_VSX_CVSXWSP))]
> > > > +  "VECTOR_UNIT_VSX_P (V4SFmode)"
> > > > +  "xvcvsxwsp %x0,%x1"
> > > > +  [(set_attr "type" "vecdouble")])
> > > 
> > > "v" is only the VRs...  Do you want "wa" or similar instead?
> > > 
> > 
> > I went back and re-studied the Power register constrains.  I find them a
> > bit confusing, I am sure they are perfectly clear to everyone else.  So
> > the instructions all take VSX registers so "wa" should be fine if I
> > understand it correctly.  Not sure there is any need to further
> > constrain with "vs" for doubles or "ww" but I think you could.
> 
> Well in the power7 days, it wasn't clear whether we wanted to reduce the
> register set, so I added the general "wa", and then added the more specific
> changes ("ws", "wf", "wd").  In hindsight it probably wasn't a good idea.  But
> the trouble is we can't delete the old constraints, or we would break user asm
> code.
> 
> Over time, I have been deleting things where you have the specific constraint
> and the general one where I'm modifying code:
> 
>       (match_operand:V2DF 0 "=wd,?wa")
> 
> to
> 
>       (match_operand:V2DF 0 "=wa")
> 
> Now the second round of constraints are needed because of the
> -mupper-regs-<xxx> debug switches.  You might/might not allow DFmode into the
> Altivec registers, and so you need several constraints:
> 
>       d       Just the traditional FPRs
>       ws      Any FPR/Altivec register DFmode can go in for ISA 2.06 insns
>       wk      Like ws, but only if 64-bit direct moves are supported
>       wv      Only altivec registers (used for 64-bit load/stores)
> 
> Note, you have to be careful not to allow a register constraint that the
> current type cannot go into.  This is due to a 'feature' in the LRA register
> allocator that it will trap if such a case occurs.  For example, for ISA 2.06,
> we do not have 32-bit floating point instructions in the Altivec registers.
> This means you can't use "v" (just the Altivec registers) on any code where
> -mcpu=power7 (or -mno-upper-regs-sf) is allowed.
> 

Michael:

OK, so sounds like I should stick to the general wa register constraint.
The third field of the define_expand I have what I believe is called the
"condition string" as "TARGET_VSX".  Is that the appropriate condition
string?  I see conditions string "VECTOR_UNIT_VSX_P (V4SFmode)" also
used.  Segher is thinking that this string would have the same effect as
"TARGET_VSX"??  How does one select the correct condition string based
on the register constraint?


Here is what I currently have for my define_expand. Is it correct?

;; Generate
float2                                                              
;; convert two long long signed ints to float                                   
(define_expand "float2_v2di"                                                    
  [(match_operand:V4SF 0 "register_operand" "=wa")                              
   (unspec:V4SI [(match_operand:V2DI 1 "register_operand" "wa")                 
                 (match_operand:V2DI 2 "register_operand" "wa")]                
  UNSPEC_VSX_FLOAT2)]                                                           
                                                                                
  "TARGET_VSX"                                                                  
{                                                                               
  rtx rtx_src1, rtx_src2, rtx_dst;                                              
                                                                                
  rtx_dst = operands[0];                                                        
  rtx_src1 = operands[1];                                                       
  rtx_src2 = operands[2];                                                       
                                                                                
  rs6000_generate_float2_code (true, rtx_dst, rtx_src1, rtx_src2);              
  DONE;                                                                         
})

Thanks for your help on this.

Reply via email to