1bb913cd4cc1e56d7d7798a8b754361a05d01f916florian/* -*- mode: C; c-basic-offset: 3; -*- */ 2bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 35aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian/* 45aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian This file is part of MemCheck, a heavyweight Valgrind tool for 55aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian detecting memory errors. 65aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian 75aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian Copyright (C) 2012-2015 Florian Krohm 85aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian 95aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian This program is free software; you can redistribute it and/or 105aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian modify it under the terms of the GNU General Public License as 115aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian published by the Free Software Foundation; either version 2 of the 125aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian License, or (at your option) any later version. 135aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian 145aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian This program is distributed in the hope that it will be useful, but 155aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian WITHOUT ANY WARRANTY; without even the implied warranty of 165aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 175aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian General Public License for more details. 185aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian 195aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian You should have received a copy of the GNU General Public License 205aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian along with this program; if not, write to the Free Software 215aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 225aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian 02111-1307, USA. 235aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian 245aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian The GNU General Public License is contained in the file COPYING. 255aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian*/ 265aa9d1ed1857d401087cf55b4c68ab6eb3ffbc56florian 27bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#include <stdio.h> // fprintf 28bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#include <stdlib.h> // exit 29bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#include <assert.h> // assert 30909e0fc928ddb0b04ba301a4895d653f3a91d114florian#if defined(__APPLE__) 31909e0fc928ddb0b04ba301a4895d653f3a91d114florian#include <machine/endian.h> 32909e0fc928ddb0b04ba301a4895d653f3a91d114florian#define __BYTE_ORDER BYTE_ORDER 33909e0fc928ddb0b04ba301a4895d653f3a91d114florian#define __LITTLE_ENDIAN LITTLE_ENDIAN 348eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#elif defined(__sun) 358eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#define __LITTLE_ENDIAN 1234 368eb8bab992e3998c33770b0cdb16059a8b918a06sewardj#define __BIG_ENDIAN 4321 378eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# if defined(_LITTLE_ENDIAN) 388eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# define __BYTE_ORDER __LITTLE_ENDIAN 398eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# else 408eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# define __BYTE_ORDER __BIG_ENDIAN 418eb8bab992e3998c33770b0cdb16059a8b918a06sewardj# endif 42909e0fc928ddb0b04ba301a4895d653f3a91d114florian#else 43bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#include <endian.h> 44909e0fc928ddb0b04ba301a4895d653f3a91d114florian#endif 45504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian#include <inttypes.h> 46bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#include "vtest.h" 47bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 48bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 49bb913cd4cc1e56d7d7798a8b754361a05d01f916florian/* Something bad happened. Cannot continue. */ 50bb913cd4cc1e56d7d7798a8b754361a05d01f916florianvoid __attribute__((noreturn)) 51bb913cd4cc1e56d7d7798a8b754361a05d01f916florianpanic(const char *string) 52bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{ 53bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(stderr, "*** OOPS: %s\n", string); 54bb913cd4cc1e56d7d7798a8b754361a05d01f916florian exit(1); 55bb913cd4cc1e56d7d7798a8b754361a05d01f916florian} 56bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 57bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 58bb913cd4cc1e56d7d7798a8b754361a05d01f916florian/* Issue a complaint because the V-bits of the result of an operation 59bb913cd4cc1e56d7d7798a8b754361a05d01f916florian differ from what was expected. */ 60bb913cd4cc1e56d7d7798a8b754361a05d01f916florianvoid 61bb913cd4cc1e56d7d7798a8b754361a05d01f916floriancomplain(const irop_t *op, const test_data_t *data, vbits_t expected) 62bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{ 63bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(stderr, "*** Incorrect result for operator %s\n", op->name); 64bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 65bb913cd4cc1e56d7d7798a8b754361a05d01f916florian int num_operands = get_num_operands(op->op); 66bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 67bb913cd4cc1e56d7d7798a8b754361a05d01f916florian for (unsigned i = 0; i < num_operands; ++i) { 68bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(stderr, " opnd %u: ", i); 69bb913cd4cc1e56d7d7798a8b754361a05d01f916florian print_opnd(stderr, &data->opnds[i]); 70bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(stderr, "\n"); 71bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } 72bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(stderr, " result: "); 73bb913cd4cc1e56d7d7798a8b754361a05d01f916florian print_opnd(stderr, &data->result); 74bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(stderr, "\n"); 75bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(stderr, " expect: vbits = "); 76bb913cd4cc1e56d7d7798a8b754361a05d01f916florian print_vbits(stderr, expected); 77bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(stderr, "\n"); 78bb913cd4cc1e56d7d7798a8b754361a05d01f916florian} 79bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 80bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 81bb913cd4cc1e56d7d7798a8b754361a05d01f916florianstatic void 82bb913cd4cc1e56d7d7798a8b754361a05d01f916florianprint_value(FILE *fp, value_t val, unsigned num_bits) 83bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{ 84bb913cd4cc1e56d7d7798a8b754361a05d01f916florian switch (num_bits) { 85bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case 1: fprintf(fp, "%02x", val.u8); break; 86bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case 8: fprintf(fp, "%02x", val.u8); break; 87bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case 16: fprintf(fp, "%04x", val.u16); break; 88bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case 32: fprintf(fp, "%08x", val.u32); break; 89504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian case 64: fprintf(fp, "%016"PRIx64, val.u64); break; 90bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case 128: 91bb913cd4cc1e56d7d7798a8b754361a05d01f916florian if (__BYTE_ORDER == __LITTLE_ENDIAN) { 92504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u128[1]); 93504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u128[0]); 94bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } else { 95504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u128[0]); 96504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u128[1]); 97bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } 98bb913cd4cc1e56d7d7798a8b754361a05d01f916florian break; 99bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case 256: 100bb913cd4cc1e56d7d7798a8b754361a05d01f916florian if (__BYTE_ORDER == __LITTLE_ENDIAN) { 101504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u256[3]); 102504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u256[2]); 103504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u256[1]); 104504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u256[0]); 105bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } else { 106504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u256[0]); 107504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u256[1]); 108504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u256[2]); 109504f829bfb9dbf2258edbbe6ad892f1605d679fbflorian fprintf(fp, "%016"PRIx64, val.u256[3]); 110bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } 111bb913cd4cc1e56d7d7798a8b754361a05d01f916florian break; 112bb913cd4cc1e56d7d7798a8b754361a05d01f916florian default: 113bb913cd4cc1e56d7d7798a8b754361a05d01f916florian panic(__func__); 114bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } 115bb913cd4cc1e56d7d7798a8b754361a05d01f916florian} 116bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 117bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 118bb913cd4cc1e56d7d7798a8b754361a05d01f916florianvoid 119bb913cd4cc1e56d7d7798a8b754361a05d01f916florianprint_opnd(FILE *fp, const opnd_t *opnd) 120bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{ 121bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(fp, "vbits = "); 122bb913cd4cc1e56d7d7798a8b754361a05d01f916florian print_vbits(fp, opnd->vbits); 123bb913cd4cc1e56d7d7798a8b754361a05d01f916florian /* Write the value only if it is defined. Otherwise, there will be error 124bb913cd4cc1e56d7d7798a8b754361a05d01f916florian messages about it being undefined */ 125bb913cd4cc1e56d7d7798a8b754361a05d01f916florian if (equal_vbits(opnd->vbits, defined_vbits(opnd->vbits.num_bits))) { 126bb913cd4cc1e56d7d7798a8b754361a05d01f916florian fprintf(fp, " value = "); 127bb913cd4cc1e56d7d7798a8b754361a05d01f916florian print_value(fp, opnd->value, opnd->vbits.num_bits); 128bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } 129bb913cd4cc1e56d7d7798a8b754361a05d01f916florian} 130bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 131bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 132bb913cd4cc1e56d7d7798a8b754361a05d01f916florianstatic int 133bb913cd4cc1e56d7d7798a8b754361a05d01f916florianis_floating_point_type(IRType type) 134bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{ 135bb913cd4cc1e56d7d7798a8b754361a05d01f916florian switch (type) { 136bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case Ity_F32: 137bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case Ity_F64: 138bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case Ity_F128: 139bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case Ity_D32: 140bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case Ity_D64: 141bb913cd4cc1e56d7d7798a8b754361a05d01f916florian case Ity_D128: 142bb913cd4cc1e56d7d7798a8b754361a05d01f916florian return 1; 143bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 144bb913cd4cc1e56d7d7798a8b754361a05d01f916florian default: 145bb913cd4cc1e56d7d7798a8b754361a05d01f916florian return 0; 146bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } 147bb913cd4cc1e56d7d7798a8b754361a05d01f916florian} 148bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 149bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 150bb913cd4cc1e56d7d7798a8b754361a05d01f916florianint 151bb913cd4cc1e56d7d7798a8b754361a05d01f916florianis_floating_point_op_with_rounding_mode(IROp op) 152bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{ 153bb913cd4cc1e56d7d7798a8b754361a05d01f916florian IRType t_dst, t_arg1, t_arg2, t_arg3, t_arg4; 154bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 155bb913cd4cc1e56d7d7798a8b754361a05d01f916florian typeof_primop(op, &t_dst, &t_arg1, &t_arg2, &t_arg3, &t_arg4); 156bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 157bb913cd4cc1e56d7d7798a8b754361a05d01f916florian // A unary operator cannot have a rounding mode 158bb913cd4cc1e56d7d7798a8b754361a05d01f916florian if (t_arg2 == Ity_INVALID) return 0; 159bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 160bb913cd4cc1e56d7d7798a8b754361a05d01f916florian if (is_floating_point_type(t_dst) || 161bb913cd4cc1e56d7d7798a8b754361a05d01f916florian is_floating_point_type(t_arg1) || 162bb913cd4cc1e56d7d7798a8b754361a05d01f916florian is_floating_point_type(t_arg2) || 163bb913cd4cc1e56d7d7798a8b754361a05d01f916florian is_floating_point_type(t_arg3) || 164bb913cd4cc1e56d7d7798a8b754361a05d01f916florian is_floating_point_type(t_arg4)) { 165bb913cd4cc1e56d7d7798a8b754361a05d01f916florian // Rounding mode, if present, is the 1st operand 166bb913cd4cc1e56d7d7798a8b754361a05d01f916florian return t_arg1 == Ity_I32; 167bb913cd4cc1e56d7d7798a8b754361a05d01f916florian } 168bb913cd4cc1e56d7d7798a8b754361a05d01f916florian return 0; 169bb913cd4cc1e56d7d7798a8b754361a05d01f916florian} 170bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 171bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 172bb913cd4cc1e56d7d7798a8b754361a05d01f916florian/* Return the number of operands for which input values can 173bb913cd4cc1e56d7d7798a8b754361a05d01f916florian be freely chosen. For floating point ops, the rounding mode 174bb913cd4cc1e56d7d7798a8b754361a05d01f916florian is not counted here, as it is restricted. */ 175bb913cd4cc1e56d7d7798a8b754361a05d01f916florianint 176bb913cd4cc1e56d7d7798a8b754361a05d01f916florianget_num_operands(IROp op) 177bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{ 178bb913cd4cc1e56d7d7798a8b754361a05d01f916florian IRType unused, t1, t2, t3, t4; 179bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 180bb913cd4cc1e56d7d7798a8b754361a05d01f916florian typeof_primop(op, &unused, &t1, &t2, &t3, &t4); 181bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 182bb913cd4cc1e56d7d7798a8b754361a05d01f916florian int num_operands = 4; 183bb913cd4cc1e56d7d7798a8b754361a05d01f916florian if (t4 == Ity_INVALID) num_operands = 3; 184bb913cd4cc1e56d7d7798a8b754361a05d01f916florian if (t3 == Ity_INVALID) num_operands = 2; 185bb913cd4cc1e56d7d7798a8b754361a05d01f916florian if (t2 == Ity_INVALID) num_operands = 1; 186bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 187bb913cd4cc1e56d7d7798a8b754361a05d01f916florian if (is_floating_point_op_with_rounding_mode(op)) 188bb913cd4cc1e56d7d7798a8b754361a05d01f916florian -- num_operands; 189bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 190bb913cd4cc1e56d7d7798a8b754361a05d01f916florian return num_operands; 191bb913cd4cc1e56d7d7798a8b754361a05d01f916florian} 192bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 193bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 194bb913cd4cc1e56d7d7798a8b754361a05d01f916florianunsigned 195bb913cd4cc1e56d7d7798a8b754361a05d01f916floriansizeof_irtype(IRType ty) 196bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{ 197137e3e719d675c168ae1acc6e15438e62e117fdbflorian return sizeofIRType(ty); 198bb913cd4cc1e56d7d7798a8b754361a05d01f916florian} 199bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 200bb913cd4cc1e56d7d7798a8b754361a05d01f916florian 201bb913cd4cc1e56d7d7798a8b754361a05d01f916florianvoid 202bb913cd4cc1e56d7d7798a8b754361a05d01f916floriantypeof_primop(IROp op, IRType *t_dst, IRType *t_arg1, IRType *t_arg2, 203bb913cd4cc1e56d7d7798a8b754361a05d01f916florian IRType *t_arg3, IRType *t_arg4) 204bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{ 205137e3e719d675c168ae1acc6e15438e62e117fdbflorian return typeOfPrimop(op, t_dst, t_arg1, t_arg2, t_arg3, t_arg4); 206bb913cd4cc1e56d7d7798a8b754361a05d01f916florian} 207