Files
ftmemsim-valgrind/memcheck/tests/vbit-test/vtest.h
Carl Love 59fc40a7f3 vbit-tester, add counts for the number of 1, 2, 3 and 4 operand tests.
This patch adds code to count the number of each type of test.  The
number of 1, 2, 3 and 4 operand tests that are generated by the vbit-tester
are counted and printed by the vbit-tester.  The user should refer to the
Valgrind output to see if any of the tests failed.

The existing two verbose levels was increased by one level and the the
new output giving the number of tests was inserted as the first verbose
level.  The verbose levels are now:

-v        shows the number of 1, 2, 3 and 4 operand tests that are generated
-v -v     shows IROps being tested
-v -v -v  extreme edition, shows input values

This patch is for bugzilla 309229

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@13124
2012-11-16 19:41:21 +00:00

135 lines
3.7 KiB
C

/* -*- mode: C; c-basic-offset: 3; -*- */
#ifndef VTEST_H
#define VTEST_H
/* Main header file for the V-bit tester */
#include <stdint.h> // uint64_t
#include "libvex.h" // IROp
#include "vbits.h" // vbits_t
/* How undefinedness propagates from input to output */
typedef enum {
// For any undefined input bit, all output bits are defined.
UNDEF_NONE,
// For any undefined input bit, all output bits are undefined.
UNDEF_ALL,
// For each undefined input bit, the corresponding output bit
// in the same position is undefined. No other bit is undefined.
UNDEF_SAME,
// For each undefined input bit, the corresponding output bit
// in the same position is undefined. No other bit is undefined.
// If the corresponding output bit does not exist, the input bit
// does not cause any output bits to be undefined.
UNDEF_TRUNC,
// For each undefined input bit, the corresponding output bit
// in the same position is undefined. No other bit is undefined.
// Output bits that do no not have a corresponding input bit are
// defined.
UNDEF_ZEXT,
// For each undefined input bit, the corresponding output bit
// in the same position is undefined. If the MSB of the input value
// is undefined, so are all output bits with higher significance
// than the MSB input bit.
UNDEF_SEXT,
// For each undefined input bit, the corresponding output bit
// and all output bits with higher significance are undefined.
UNDEF_LEFT,
UNDEF_CONCAT, // nHLto2n ops e.g. Iop_32HLto64
UNDEF_UPPER, // 2nHIton ops e.g. Iop_64HIto32
UNDEF_SHL, // shift-left
UNDEF_SHR, // logical shift-right
UNDEF_SAR, // arithmetic shift-right
UNDEF_OR, // bitwise OR operation
UNDEF_AND, // bitwise AND operation
UNDEF_ORD, // Iop_CmpORD compare
// For IROps I don't know anything about
UNDEF_UNKNOWN
} undef_t;
// Everything we want to know about an IROp
typedef struct {
IROp op;
const char *name;
undef_t undef_kind;
int shift_amount_is_immediate;
// Indicate whether IROp can be tested on a particular architecture
unsigned s390x : 1;
unsigned amd64 : 1;
unsigned ppc32 : 1;
unsigned ppc64 : 1;
unsigned arm : 1;
unsigned x86 : 1;
unsigned mips32 : 1;
} irop_t;
/* The maximum number of input operands */
#define MAX_OPERANDS 4
/* An operand of an IROp (also used for the result) */
typedef struct {
IRType type;
vbits_t vbits;
value_t value;
} opnd_t;
/* Carries the data needed to execute and evaluate a test. I.e.
inputs and results (V-bits and actual value). */
typedef struct {
opnd_t result;
opnd_t opnds[MAX_OPERANDS];
unsigned rounding_mode;
} test_data_t;
/* Function prototypes */
irop_t *get_irop(IROp);
int is_floating_point_op_with_rounding_mode(IROp);
int get_num_operands(IROp);
void print_opnd(FILE *, const opnd_t *);
int test_unary_op(const irop_t *, test_data_t *);
int test_binary_op(const irop_t *, test_data_t *);
int test_ternary_op(const irop_t *, test_data_t *);
int test_qernary_op(const irop_t *, test_data_t *);
void valgrind_vex_init_for_iri(IRICB *);
void valgrind_execute_test(const irop_t *, test_data_t *);
IRICB new_iricb(const irop_t *, test_data_t *);
void panic(const char *) __attribute__((noreturn));
void complain(const irop_t *, const test_data_t *, vbits_t expected);
/* Imported from VEX */
unsigned sizeof_irtype(IRType);
void typeof_primop(IROp, IRType *t_dst, IRType *t_arg1, IRType *t_arg2,
IRType *t_arg3, IRType *t_arg4);
static unsigned __inline__ bitsof_irtype(IRType type)
{
return type == Ity_I1 ? 1 : sizeof_irtype(type) * 8;
}
/* Exported variables */
extern int verbose;
#endif // VTEST_H