blob: 6c5797417b8e65db962f4e93d1b85c4b9778f86f (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
|
#include <stdint.h>
#include "platform.h"
#include "primitives.h"
struct uint128_extra
softfloat_shift128ExtraRightJam(
uint64_t a64, uint64_t a0, uint64_t extra, unsigned int count )
{
unsigned int negCount;
struct uint128_extra z;
negCount = - count;
if ( count < 64 ) {
z.v64 = a64>>count;
z.v0 = a64<<( negCount & 63 ) | a0>>count;
z.extra = a0<<( negCount & 63 );
} else {
z.v64 = 0;
if ( count == 64 ) {
z.v0 = a64;
z.extra = a0;
} else {
extra |= a0;
if ( count < 128 ) {
z.v0 = a64>>( count & 63 );
z.extra = a64<<( negCount & 63 );
} else {
z.v0 = 0;
z.extra = ( count == 128 ) ? a64 : ( a64 != 0 );
}
}
}
z.extra |= ( extra != 0 );
return z;
}
|