OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [gnu-dev/] [or1k-gcc/] [gcc/] [data-streamer.c] - Blame information for rev 749

Go to most recent revision | Details | Compare with Previous | View Log

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

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.