1/* -*- mode: C; c-basic-offset: 3; -*- */
2
3#ifndef VBITS_H
4#define VBITS_H
5
6#include <stdint.h>
7#include <stdio.h>
8
9typedef uint64_t uint128_t[2];
10typedef uint64_t uint256_t[4];
11
12/* A type to represent V-bits */
13typedef struct {
14   unsigned num_bits;
15   union {
16      uint8_t   u8;
17      uint16_t  u16;
18      uint32_t  u32;
19      uint64_t  u64;
20      uint128_t u128;
21      uint256_t u256;
22   } bits;
23} vbits_t;
24
25
26/* A type large enough to hold any IRtype'd value. At this point
27   we do not expect to test with specific floating point values.
28   So we don't need to represent them. */
29typedef union {
30   uint8_t   u8;
31   uint16_t  u16;
32   uint32_t  u32;
33   uint64_t  u64;
34   uint128_t u128;
35   uint256_t u256;
36} value_t;
37
38
39void    print_vbits(FILE *, vbits_t);
40vbits_t undefined_vbits(unsigned num_bits);
41vbits_t defined_vbits(unsigned num_bits);
42int     equal_vbits(vbits_t, vbits_t);
43vbits_t truncate_vbits(vbits_t, unsigned num_bits);
44vbits_t left_vbits(vbits_t, unsigned num_bits);
45vbits_t or_vbits(vbits_t, vbits_t);
46vbits_t and_vbits(vbits_t, vbits_t);
47vbits_t concat_vbits(vbits_t, vbits_t);
48vbits_t upper_vbits(vbits_t);
49vbits_t sextend_vbits(vbits_t, unsigned num_bits);
50vbits_t zextend_vbits(vbits_t, unsigned num_bits);
51vbits_t onehot_vbits(unsigned bitno, unsigned num_bits);
52vbits_t shl_vbits(vbits_t, unsigned amount);
53vbits_t shr_vbits(vbits_t, unsigned amount);
54vbits_t sar_vbits(vbits_t, unsigned amount);
55int     completely_defined_vbits(vbits_t);
56vbits_t cmpord_vbits(unsigned v1_num_bits, unsigned v2_num_bits);
57
58#endif // VBITS_H
59