• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* -*- mode: C; c-basic-offset: 3; -*- */
2 
3 #ifndef VTEST_H
4 #define VTEST_H
5 
6 /* Main header file for the V-bit tester */
7 
8 #include <stdint.h>   // uint64_t
9 #include "libvex.h"   // IROp
10 #include "vbits.h"    // vbits_t
11 
12 
13 /* How undefinedness propagates from input to output */
14 
15 typedef enum {
16    // For any undefined input bit, all output bits are defined.
17    UNDEF_NONE,
18 
19    // For any undefined input bit, all output bits are undefined.
20    UNDEF_ALL,
21 
22    // For each undefined input bit, the corresponding output bit
23    // in the same position is undefined. No other bit is undefined.
24    UNDEF_SAME,
25 
26    // For each undefined input bit, the corresponding output bit
27    // in the same position is undefined. No other bit is undefined.
28    // If the corresponding output bit does not exist, the input bit
29    // does not cause any output bits to be undefined.
30    UNDEF_TRUNC,
31 
32    // For each undefined input bit, the corresponding output bit
33    // in the same position is undefined. No other bit is undefined.
34    // Output bits that do no not have a corresponding input bit are
35    // defined.
36    UNDEF_ZEXT,
37 
38    // For each undefined input bit, the corresponding output bit
39    // in the same position is undefined. If the MSB of the input value
40    // is undefined, so are all output bits with higher significance
41    // than the MSB input bit.
42    UNDEF_SEXT,
43 
44    // For each undefined input bit, the corresponding output bit
45    // and all output bits with higher significance are undefined.
46    UNDEF_LEFT,
47 
48    UNDEF_CONCAT,  // nHLto2n ops e.g. Iop_32HLto64
49    UNDEF_UPPER,   // 2nHIton ops e.g. Iop_64HIto32
50    UNDEF_SHL,     // shift-left
51    UNDEF_SHR,     // logical shift-right
52    UNDEF_SAR,     // arithmetic shift-right
53    UNDEF_OR,      // bitwise OR operation
54    UNDEF_AND,     // bitwise AND operation
55 
56    UNDEF_ORD,     // Iop_CmpORD compare
57 
58    // For IROps I don't know anything about
59    UNDEF_UNKNOWN
60 } undef_t;
61 
62 
63 // Everything we want to know about an IROp
64 typedef struct {
65    IROp op;
66    const char *name;
67    undef_t     undef_kind;
68    int         shift_amount_is_immediate;
69    // Indicate whether IROp can be tested on a particular architecture
70    unsigned    s390x  : 1;
71    unsigned    amd64  : 1;
72    unsigned    ppc32  : 1;
73    unsigned    ppc64  : 1;
74    unsigned    arm    : 1;
75    unsigned    x86    : 1;
76    unsigned    mips32 : 1;
77    unsigned    mips64 : 1;
78 } irop_t;
79 
80 
81 /* The maximum number of input operands */
82 #define MAX_OPERANDS 4
83 
84 /* An operand of an IROp (also used for the result) */
85 typedef struct {
86    IRType  type;
87    vbits_t vbits;
88    value_t value;
89 } opnd_t;
90 
91 
92 /* Carries the data needed to execute and evaluate a test. I.e.
93    inputs and results (V-bits and actual value). */
94 typedef struct {
95    opnd_t result;
96    opnd_t opnds[MAX_OPERANDS];
97    unsigned rounding_mode;
98 } test_data_t;
99 
100 
101 /* Function prototypes */
102 irop_t *get_irop(IROp);
103 int  is_floating_point_op_with_rounding_mode(IROp);
104 int  get_num_operands(IROp);
105 
106 void print_opnd(FILE *, const opnd_t *);
107 
108 int test_unary_op(const irop_t *, test_data_t *);
109 int test_binary_op(const irop_t *, test_data_t *);
110 int test_ternary_op(const irop_t *, test_data_t *);
111 int test_qernary_op(const irop_t *, test_data_t *);
112 
113 void valgrind_vex_init_for_iri(IRICB *);
114 void valgrind_execute_test(const irop_t *, test_data_t *);
115 
116 IRICB new_iricb(const irop_t *, test_data_t *);
117 
118 void panic(const char *) __attribute__((noreturn));
119 void complain(const irop_t *, const test_data_t *, vbits_t expected);
120 
121 /* Imported from VEX */
122 unsigned sizeof_irtype(IRType);
123 void typeof_primop(IROp, IRType *t_dst, IRType *t_arg1, IRType *t_arg2,
124                    IRType *t_arg3, IRType *t_arg4);
125 
bitsof_irtype(IRType type)126 static unsigned __inline__ bitsof_irtype(IRType type)
127 {
128    return type == Ity_I1 ? 1 : sizeof_irtype(type) * 8;
129 }
130 
131 
132 /* Exported variables */
133 extern int verbose;
134 
135 #endif // VTEST_H
136