[rfc] fix umul_ppmm() in our libgcc

Warner Losh imp at bsdimp.com
Mon Jun 15 21:39:10 UTC 2015


do { UDltype ll; __asm__ (“muiltu %2 %3” : “=x” ll : “d” ((USltype)(u)), “d”((USltype)(v))); w1 = ll >> 32; w0 = ll;} while 0;

might be a good replacement. The “h” constraint was abandoned and not replaced by anything. Thought there may be simpler ways, since I haven’t looked to see how this is actually used.

Warner


> On Jun 15, 2015, at 3:32 PM, Adrian Chadd <adrian at freebsd.org> wrote:
> 
> The error is unsupported constraints. '=h' (hi register) is
> unsupported as of some GCC > 4.2.1.
> 
> 
> 
> -a
> 
> 
> On 15 June 2015 at 10:15, Stanislav Sedov <stas at freebsd.org> wrote:
>> 
>>> On Jun 13, 2015, at 3:41 PM, Adrian Chadd <adrian at freebsd.org> wrote:
>>> 
>>> Hi,
>>> 
>>> our libgcc in -base is very .. old. It chokes when compiling for
>>> mips32. This patch seems to do the right thing.
>>> 
>>> Does anyone have any positive/negative feedback?
>>> 
>>> Thanks,
>>> 
>>> 
>>> -adrian
>>> 
>>> 
>>> Index: contrib/gcc/longlong.h
>>> ===================================================================
>>> --- contrib/gcc/longlong.h      (revision 284090)
>>> +++ contrib/gcc/longlong.h      (working copy)
>>> @@ -584,11 +584,11 @@
>>> 
>>> #if defined (__mips__) && W_TYPE_SIZE == 32
>>> #define umul_ppmm(w1, w0, u, v) \
>>> -  __asm__ ("multu %2,%3"                                               \
>>> -          : "=l" ((USItype) (w0)),                                     \
>>> -            "=h" ((USItype) (w1))                                      \
>>> -          : "d" ((USItype) (u)),                                       \
>>> -            "d" ((USItype) (v)))
>>> +       do {                                                            \
>>> +        UDItype __ll = (UDItype)(u) * (v);                             \
>>> +        w1 = __ll >> 32;                                               \
>>> +        w0 = __ll;                                                     \
>>> +       } while (0)
>>> #define UMUL_TIME 10
>>> #define UDIV_TIME 100
>>> #endif /* __mips__ */
>> 
>> This looks right to me in terms of functionality, but what is wrong
>> with the original code (multu)?  That one seems correct as well.
>> 
>> What error do you see when compiling it?
>> 
>> --
>> ST4096-RIPE
>> 
>> 
>> 
> _______________________________________________
> freebsd-mips at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-mips
> To unsubscribe, send any mail to "freebsd-mips-unsubscribe at freebsd.org"

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 842 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://lists.freebsd.org/pipermail/freebsd-mips/attachments/20150615/07eded66/attachment.sig>


More information about the freebsd-mips mailing list