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