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