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