Home | History | Annotate | Download | only in vbit-test
      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 
    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