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