On 19/01/16 14:42, Jeff Law wrote:
> On 01/19/2016 04:59 AM, Woon yung Liu wrote:
>>
>> In my current attempt at adding support for the TI mode, the MMI
>> definitions are added into a MD file for the R5900 and some functions
>> (i.e. mips_output_move) were modified to allow certain moves for the
>> TI mode of the R5900 target. However, while it seems like TI-mode
>> integers can now be passed between functions and used with the MMI
>> (within one 128-bit GPR), GCC still treats 128-bit moves as complex
>> moves (split across two 64-bit registers); its built-in functions
>> expect both $a0 and $a1 to be used if the first argument is a 128-bit
>> value. To return a 128-bit value, both $v0 and $v1 are used.
> You'll have to adjust FUNCTION_ARG and its counterpart for return values
> to describe how to pass these 128 bit values around.
> 
>>
>>
>> Otherwise, I believe that there are two solutions to the problem with
>> the calling convention (but again, I have no idea which is better):
>> 1. Keep the target as 64-bit. Support for MMI will be either
>> compromised (i.e. made to assemble and split the 128-bit vectors upon
>> entry/exit) or totally omitted. Perhaps omission would be best so
>> that there will never be a compromise in performance.
> 
>>
>> 2. Promote the word size of the R5900 to 128-bit. I think that SONY
>> might have done this, as the code from their late games used lq/sq
>> (quard-word load/store) to preserve registers. However, I think that
>> this goes against the existing ABIs, doesn't it? Plus the MMI
>> instruction set is proprietary and isn't used in any other MIPS.
> Changing the word size to 128 bit should not be necessary.
> 
> Many ports define patterns for operations on data types that are larger
> than their native word mode.
> 
> You really need to add the new patterns for operating on 128bit values
> to the machine description and adjust the parameter passing routines .
> 
> We did have to force the compiler to assume a 64bit *host* datatype
> (long long).  I don't recall the reasoning behind that.
> 

Probably because historically you needed CONST_DOUBLE (with VOIDmode) to
handle 128-bit immediates (a pair of HOST_WIDE_INTs).  It may not be
necessary any more with the new wide integer types.

R.

> 
>> If I carry on with my current design, I suppose that I need to make
>> it so that the hi1/lo1 registers are never used for other MIPS
>> targets. I didn't find a RTL constraint that meant something like
>> "nothing", so I made the new constraints define MD1_REGS (hi1/lo1) as
>> their MD_REGS (hi/lo) equivalents if the target is not the R5900
>> (much like the DSP ACC register constraint, ka). But unlike the DSP
>> ACC register constraint (ka), my constraints are used as alternatives
>> alongside whatever (i.e. x for hi/lo or ka for hi/lo/acc) that was
>> originally there. Would this be acceptable, given that there will be
>> two similar alternatives for some instructions when the target is not
>> the R5900?
> You define the registers & constraints normally.  However, you make the
> registers conditional on the target in use.  ie, if you're not on an
> r5900 target, then mark those registers as fixed.  That will prevent the
> compiler from trying to use them on things other than the r5900.
> 
> Again, you may want to find the old cygnus releases of the r5900
> toolchain.  It had functional access to the second hi/lo register pair.
> 
> jeff
> 

Reply via email to