Re: gnupg
>Hopefully it now works, but there might be 1 in 2**32 (or 1 in 2**64)
>cases where it still doesn't
That change didn't seem to produce the goods on its own. I've ended up with this,
which works for the cases I tested.
#if defined __ARM_ARCH_2__ || defined __ARM_ARCH_3__
#define umul_ppmm(xh, xl, a, b) \
do { \
register USItype i0, i1, i2; \
__asm__ ("%@ Inlined umul_ppmm
mov %2, %5, lsr #16 @ AAAA
mov %4, %6, lsr #16 @ BBBB
bic %3, %5, %2, lsl #16 @ aaaa
bic %0, %6, %4, lsl #16 @ bbbb
mul %1, %3, %4 @ aaaa * BBBB
mul %4, %2, %4 @ AAAA * BBBB
mul %3, %0, %3 @ aaaa * bbbb
mul %0, %2, %0 @ AAAA * bbbb
adds %2, %1, %0
addcs %4, %4, #65536
adds %1, %3, %2, lsl #16
adc %0, %4, %2, lsr #16" \
: "=&r" ((USItype)(xh)), \
"=r" ((USItype)(xl)), \
"=&r" ((USItype)(i0)), \
"=&r" ((USItype)(i1)), \
"=&r" ((USItype)(i2)), \
: "r" ((USItype)(a)), \
"r" ((USItype)(b))); \
} while (0)
#else
#define umul_ppmm(xh, xl, a, b) \
__asm__ ("%@ Inlined umul_ppmm
umull %r1, %r0, %r2, %r3" \
: "=&r" ((USItype)(xh)), \
"=r" ((USItype)(xl)) \
: "r" ((USItype)(a)), \
"r" ((USItype)(b)) \
: "r0", "r1")
#endif
I'll dispatch this to the BTS.
p.
Reply to:
- References:
- gnupg
- From: Philip Blundell <philb@gnu.org>
- Re: gnupg
- From: Nicholas Clark <nick@ccl4.org>
- Re: gnupg
- From: Philip Blundell <philb@gnu.org>
- Re: gnupg
- From: Nicholas Clark <nick@ccl4.org>