1*38fd1498Szrj /* Generic streaming support for basic data types.
2*38fd1498Szrj 
3*38fd1498Szrj    Copyright (C) 2011-2018 Free Software Foundation, Inc.
4*38fd1498Szrj    Contributed by Diego Novillo <dnovillo@google.com>
5*38fd1498Szrj 
6*38fd1498Szrj This file is part of GCC.
7*38fd1498Szrj 
8*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under
9*38fd1498Szrj the terms of the GNU General Public License as published by the Free
10*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later
11*38fd1498Szrj version.
12*38fd1498Szrj 
13*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY
14*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or
15*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
16*38fd1498Szrj for more details.
17*38fd1498Szrj 
18*38fd1498Szrj You should have received a copy of the GNU General Public License
19*38fd1498Szrj along with GCC; see the file COPYING3.  If not see
20*38fd1498Szrj <http://www.gnu.org/licenses/>.  */
21*38fd1498Szrj 
22*38fd1498Szrj #include "config.h"
23*38fd1498Szrj #include "system.h"
24*38fd1498Szrj #include "coretypes.h"
25*38fd1498Szrj #include "backend.h"
26*38fd1498Szrj #include "tree.h"
27*38fd1498Szrj #include "gimple.h"
28*38fd1498Szrj #include "cgraph.h"
29*38fd1498Szrj #include "data-streamer.h"
30*38fd1498Szrj 
31*38fd1498Szrj /* Pack WORK into BP in a variant of uleb format.  */
32*38fd1498Szrj 
33*38fd1498Szrj void
bp_pack_var_len_unsigned(struct bitpack_d * bp,unsigned HOST_WIDE_INT work)34*38fd1498Szrj bp_pack_var_len_unsigned (struct bitpack_d *bp, unsigned HOST_WIDE_INT work)
35*38fd1498Szrj {
36*38fd1498Szrj   do
37*38fd1498Szrj     {
38*38fd1498Szrj       unsigned int half_byte = (work & 0x7);
39*38fd1498Szrj       work >>= 3;
40*38fd1498Szrj       if (work != 0)
41*38fd1498Szrj 	/* More half_bytes to follow.  */
42*38fd1498Szrj 	half_byte |= 0x8;
43*38fd1498Szrj 
44*38fd1498Szrj       bp_pack_value (bp, half_byte, 4);
45*38fd1498Szrj     }
46*38fd1498Szrj   while (work != 0);
47*38fd1498Szrj }
48*38fd1498Szrj 
49*38fd1498Szrj 
50*38fd1498Szrj /* Pack WORK into BP in a variant of sleb format.  */
51*38fd1498Szrj 
52*38fd1498Szrj void
bp_pack_var_len_int(struct bitpack_d * bp,HOST_WIDE_INT work)53*38fd1498Szrj bp_pack_var_len_int (struct bitpack_d *bp, HOST_WIDE_INT work)
54*38fd1498Szrj {
55*38fd1498Szrj   int more, half_byte;
56*38fd1498Szrj 
57*38fd1498Szrj   do
58*38fd1498Szrj     {
59*38fd1498Szrj       half_byte = (work & 0x7);
60*38fd1498Szrj       /* arithmetic shift */
61*38fd1498Szrj       work >>= 3;
62*38fd1498Szrj       more = !((work == 0 && (half_byte & 0x4) == 0)
63*38fd1498Szrj 	       || (work == -1 && (half_byte & 0x4) != 0));
64*38fd1498Szrj       if (more)
65*38fd1498Szrj 	half_byte |= 0x8;
66*38fd1498Szrj 
67*38fd1498Szrj       bp_pack_value (bp, half_byte, 4);
68*38fd1498Szrj     }
69*38fd1498Szrj   while (more);
70*38fd1498Szrj }
71*38fd1498Szrj 
72*38fd1498Szrj 
73*38fd1498Szrj /* Unpack VAL from BP in a variant of uleb format.  */
74*38fd1498Szrj 
75*38fd1498Szrj unsigned HOST_WIDE_INT
bp_unpack_var_len_unsigned(struct bitpack_d * bp)76*38fd1498Szrj bp_unpack_var_len_unsigned (struct bitpack_d *bp)
77*38fd1498Szrj {
78*38fd1498Szrj   unsigned HOST_WIDE_INT result = 0;
79*38fd1498Szrj   int shift = 0;
80*38fd1498Szrj   unsigned HOST_WIDE_INT half_byte;
81*38fd1498Szrj 
82*38fd1498Szrj   while (true)
83*38fd1498Szrj     {
84*38fd1498Szrj       half_byte = bp_unpack_value (bp, 4);
85*38fd1498Szrj       result |= (half_byte & 0x7) << shift;
86*38fd1498Szrj       shift += 3;
87*38fd1498Szrj       if ((half_byte & 0x8) == 0)
88*38fd1498Szrj 	return result;
89*38fd1498Szrj     }
90*38fd1498Szrj }
91*38fd1498Szrj 
92*38fd1498Szrj 
93*38fd1498Szrj /* Unpack VAL from BP in a variant of sleb format.  */
94*38fd1498Szrj 
95*38fd1498Szrj HOST_WIDE_INT
bp_unpack_var_len_int(struct bitpack_d * bp)96*38fd1498Szrj bp_unpack_var_len_int (struct bitpack_d *bp)
97*38fd1498Szrj {
98*38fd1498Szrj   HOST_WIDE_INT result = 0;
99*38fd1498Szrj   int shift = 0;
100*38fd1498Szrj   unsigned HOST_WIDE_INT half_byte;
101*38fd1498Szrj 
102*38fd1498Szrj   while (true)
103*38fd1498Szrj     {
104*38fd1498Szrj       half_byte = bp_unpack_value (bp, 4);
105*38fd1498Szrj       result |= (half_byte & 0x7) << shift;
106*38fd1498Szrj       shift += 3;
107*38fd1498Szrj       if ((half_byte & 0x8) == 0)
108*38fd1498Szrj 	{
109*38fd1498Szrj 	  if ((shift < HOST_BITS_PER_WIDE_INT) && (half_byte & 0x4))
110*38fd1498Szrj 	    result |= - (HOST_WIDE_INT_1U << shift);
111*38fd1498Szrj 
112*38fd1498Szrj 	  return result;
113*38fd1498Szrj 	}
114*38fd1498Szrj     }
115*38fd1498Szrj }
116