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 <assert.h>
28bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#include <string.h>  // memset
29bb913cd4cc1e56d7d7798a8b754361a05d01f916florian#include "vtest.h"
30bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
31bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
32bb913cd4cc1e56d7d7798a8b754361a05d01f916florian/* A convenience function to compute either v1 & ~v2 & val2  or
33bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   v1 & ~v2 & ~val2  depending on INVERT_VAL2. */
34bb913cd4cc1e56d7d7798a8b754361a05d01f916florianstatic vbits_t
35bb913cd4cc1e56d7d7798a8b754361a05d01f916florianand_combine(vbits_t v1, vbits_t v2, value_t val2, int invert_val2)
36bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{
37bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   assert(v1.num_bits == v2.num_bits);
38bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
39bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   vbits_t new = { .num_bits = v2.num_bits };
40bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
41bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   if (invert_val2) {
42bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      switch (v2.num_bits) {
43bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      case 8:  val2.u8  = ~val2.u8  & 0xff;   break;
44bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      case 16: val2.u16 = ~val2.u16 & 0xffff; break;
45bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      case 32: val2.u32 = ~val2.u32;          break;
46bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      case 64: val2.u64 = ~val2.u64;          break;
47bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      default:
48bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         panic(__func__);
49bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      }
50bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
51bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
52bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   switch (v2.num_bits) {
53bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 8:
54bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      new.bits.u8  = (v1.bits.u8 & ~v2.bits.u8  & val2.u8)  & 0xff;
55bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
56bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 16:
57bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      new.bits.u16 = (v1.bits.u16 & ~v2.bits.u16 & val2.u16) & 0xffff;
58bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
59bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 32:
60bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      new.bits.u32 = (v1.bits.u32 & ~v2.bits.u32 & val2.u32);
61bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
62bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 64:
63bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      new.bits.u64 = (v1.bits.u64 & ~v2.bits.u64 & val2.u64);
64bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
65bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   default:
66bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      panic(__func__);
67bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
68bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   return new;
69bb913cd4cc1e56d7d7798a8b754361a05d01f916florian}
70bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
71bb913cd4cc1e56d7d7798a8b754361a05d01f916florian/* Check the result of a binary operation. */
72bb913cd4cc1e56d7d7798a8b754361a05d01f916florianstatic void
73bb913cd4cc1e56d7d7798a8b754361a05d01f916floriancheck_result_for_binary(const irop_t *op, const test_data_t *data)
74bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{
75bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   const opnd_t *result = &data->result;
76bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   const opnd_t *opnd1  = &data->opnds[0];
77bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   const opnd_t *opnd2  = &data->opnds[1];
78bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   vbits_t expected_vbits;
79bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
80bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   /* Only handle those undef-kinds that actually occur. */
81bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   switch (op->undef_kind) {
82bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_NONE:
83bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      expected_vbits = defined_vbits(result->vbits.num_bits);
84bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
85bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
86bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_ALL:
87bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      expected_vbits = undefined_vbits(result->vbits.num_bits);
88bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
89bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
90bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_LEFT:
91bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      // LEFT with respect to the leftmost 1-bit in both operands
92bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      expected_vbits = left_vbits(or_vbits(opnd1->vbits, opnd2->vbits),
93bb913cd4cc1e56d7d7798a8b754361a05d01f916florian                                  result->vbits.num_bits);
94bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
95bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
96bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_SAME:
97bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      assert(opnd1->vbits.num_bits == opnd2->vbits.num_bits);
98bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      assert(opnd1->vbits.num_bits == result->vbits.num_bits);
99bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
100bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      // SAME with respect to the 1-bits in both operands
101bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      expected_vbits = or_vbits(opnd1->vbits, opnd2->vbits);
102bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
103bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
104bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_CONCAT:
105bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      assert(opnd1->vbits.num_bits == opnd2->vbits.num_bits);
106bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      assert(result->vbits.num_bits == 2 * opnd1->vbits.num_bits);
107bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      expected_vbits = concat_vbits(opnd1->vbits, opnd2->vbits);
108bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
109bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
110bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_SHL:
111bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      /* If any bit in the 2nd operand is undefined, so are all bits
112bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         of the result. */
113bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      if (! completely_defined_vbits(opnd2->vbits)) {
114bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         expected_vbits = undefined_vbits(result->vbits.num_bits);
115bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      } else {
116bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         assert(opnd2->vbits.num_bits == 8);
117bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         unsigned shift_amount = opnd2->value.u8;
118bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
119bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         expected_vbits = shl_vbits(opnd1->vbits, shift_amount);
120bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      }
121bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
122bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
123bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_SHR:
124bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      /* If any bit in the 2nd operand is undefined, so are all bits
125bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         of the result. */
126bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      if (! completely_defined_vbits(opnd2->vbits)) {
127bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         expected_vbits = undefined_vbits(result->vbits.num_bits);
128bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      } else {
129bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         assert(opnd2->vbits.num_bits == 8);
130bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         unsigned shift_amount = opnd2->value.u8;
131bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
132bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         expected_vbits = shr_vbits(opnd1->vbits, shift_amount);
133bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      }
134bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
135bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
136bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_SAR:
137bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      /* If any bit in the 2nd operand is undefined, so are all bits
138bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         of the result. */
139bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      if (! completely_defined_vbits(opnd2->vbits)) {
140bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         expected_vbits = undefined_vbits(result->vbits.num_bits);
141bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      } else {
142bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         assert(opnd2->vbits.num_bits == 8);
143bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         unsigned shift_amount = opnd2->value.u8;
144bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
145bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         expected_vbits = sar_vbits(opnd1->vbits, shift_amount);
146bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      }
147bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
148bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
149bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_AND: {
150bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      /* Let v1, v2 be the V-bits of the 1st and 2nd operand, respectively
151bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         Let b1, b2 be the actual value of the 1st and 2nd operand, respect.
152bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         And output bit is undefined (i.e. its V-bit == 1), iff
153bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         (1) (v1 == 1) && (v2 == 1)   OR
154bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         (2) (v1 == 1) && (v2 == 0 && b2 == 1) OR
155bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         (3) (v2 == 1) && (v1 == 0 && b1 == 1)
156bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      */
157bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      vbits_t term1, term2, term3;
158bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      term1 = and_vbits(opnd1->vbits, opnd2->vbits);
159bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      term2 = and_combine(opnd1->vbits, opnd2->vbits, opnd2->value, 0);
160bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      term3 = and_combine(opnd2->vbits, opnd1->vbits, opnd1->value, 0);
161bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      expected_vbits = or_vbits(term1, or_vbits(term2, term3));
162bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
163bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
164bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
165bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_OR: {
166bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      /* Let v1, v2 be the V-bits of the 1st and 2nd operand, respectively
167bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         Let b1, b2 be the actual value of the 1st and 2nd operand, respect.
168bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         And output bit is undefined (i.e. its V-bit == 1), iff
169bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         (1) (v1 == 1) && (v2 == 1)   OR
170bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         (2) (v1 == 1) && (v2 == 0 && b2 == 0) OR
171bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         (3) (v2 == 1) && (v1 == 0 && b1 == 0)
172bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      */
173bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      vbits_t term1, term2, term3;
174bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      term1 = and_vbits(opnd1->vbits, opnd2->vbits);
175bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      term2 = and_combine(opnd1->vbits, opnd2->vbits, opnd2->value, 1);
176bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      term3 = and_combine(opnd2->vbits, opnd1->vbits, opnd1->value, 1);
177bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      expected_vbits = or_vbits(term1, or_vbits(term2, term3));
178bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
179bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
180bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
181686b17f4e39e143dd75528e032aee405af86cd8ccarll   case UNDEF_ORD:
182686b17f4e39e143dd75528e032aee405af86cd8ccarll      /* Set expected_vbits for the Iop_CmpORD category of iops.
183686b17f4e39e143dd75528e032aee405af86cd8ccarll       * If any of the input bits is undefined the least significant
184686b17f4e39e143dd75528e032aee405af86cd8ccarll       * three bits in the result will be set, i.e. 0xe.
185686b17f4e39e143dd75528e032aee405af86cd8ccarll       */
186686b17f4e39e143dd75528e032aee405af86cd8ccarll      expected_vbits = cmpord_vbits(opnd1->vbits.num_bits,
187686b17f4e39e143dd75528e032aee405af86cd8ccarll                                    opnd2->vbits.num_bits);
188686b17f4e39e143dd75528e032aee405af86cd8ccarll      break;
189686b17f4e39e143dd75528e032aee405af86cd8ccarll
190bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   default:
191bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      panic(__func__);
192bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
193bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
194bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   if (! equal_vbits(result->vbits, expected_vbits))
195bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      complain(op, data, expected_vbits);
196bb913cd4cc1e56d7d7798a8b754361a05d01f916florian}
197bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
198bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
19924c9e7f8a22971d9eb0987539ca3a4269b805e1acarllstatic int
200bb913cd4cc1e56d7d7798a8b754361a05d01f916floriantest_shift(const irop_t *op, test_data_t *data)
201bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{
202bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   unsigned num_input_bits, i;
203bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnd_t *opnds = data->opnds;
20424c9e7f8a22971d9eb0987539ca3a4269b805e1acarll   int tests_done = 0;
205bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
206bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   /* When testing the 1st operand's undefinedness propagation,
207bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      do so with all possible shift amnounts */
208bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (unsigned amount = 0; amount < bitsof_irtype(opnds[0].type); ++amount) {
209bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].value.u8 = amount;
210bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
211bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      // 1st (left) operand
212bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      num_input_bits = bitsof_irtype(opnds[0].type);
213bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
214bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      for (i = 0; i < num_input_bits; ++i) {
215bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         opnds[0].vbits = onehot_vbits(i, bitsof_irtype(opnds[0].type));
216bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         opnds[1].vbits = defined_vbits(bitsof_irtype(opnds[1].type));
217bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
218bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         valgrind_execute_test(op, data);
219bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
220bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         check_result_for_binary(op, data);
22124c9e7f8a22971d9eb0987539ca3a4269b805e1acarll         tests_done++;
222bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      }
223bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
224bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
225bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   // 2nd (right) operand
226f74f5426e8f96ccba3b39994fb596603bf0421e1florian
227f74f5426e8f96ccba3b39994fb596603bf0421e1florian   /* If the operand is an immediate value, there are no v-bits to set. */
22824c9e7f8a22971d9eb0987539ca3a4269b805e1acarll   if (op->shift_amount_is_immediate) return tests_done;
229f74f5426e8f96ccba3b39994fb596603bf0421e1florian
230bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   num_input_bits = bitsof_irtype(opnds[1].type);
231bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
232bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (i = 0; i < num_input_bits; ++i) {
233bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].vbits = defined_vbits(bitsof_irtype(opnds[0].type));
234bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].vbits = onehot_vbits(i, bitsof_irtype(opnds[1].type));
235bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
236bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      valgrind_execute_test(op, data);
237bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
238bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      check_result_for_binary(op, data);
23924c9e7f8a22971d9eb0987539ca3a4269b805e1acarll
24024c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      tests_done++;
241bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
24224c9e7f8a22971d9eb0987539ca3a4269b805e1acarll   return tests_done;
243bb913cd4cc1e56d7d7798a8b754361a05d01f916florian}
244bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
245bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
246bb913cd4cc1e56d7d7798a8b754361a05d01f916florianstatic value_t
247bb913cd4cc1e56d7d7798a8b754361a05d01f916florianall_bits_zero_value(unsigned num_bits)
248bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{
249bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   value_t val;
250bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
251bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   switch (num_bits) {
252bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 8:  val.u8  = 0; break;
253bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 16: val.u16 = 0; break;
254bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 32: val.u32 = 0; break;
255bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 64: val.u64 = 0; break;
256bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   default:
257bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      panic(__func__);
258bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
259bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   return val;
260bb913cd4cc1e56d7d7798a8b754361a05d01f916florian}
261bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
262bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
263bb913cd4cc1e56d7d7798a8b754361a05d01f916florianstatic value_t
264bb913cd4cc1e56d7d7798a8b754361a05d01f916florianall_bits_one_value(unsigned num_bits)
265bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{
266bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   value_t val;
267bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
268bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   switch (num_bits) {
269bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 8:  val.u8  = 0xff;   break;
270bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 16: val.u16 = 0xffff; break;
271bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 32: val.u32 = ~0u;    break;
272bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case 64: val.u64 = ~0ull;  break;
273bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   default:
274bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      panic(__func__);
275bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
276bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   return val;
277bb913cd4cc1e56d7d7798a8b754361a05d01f916florian}
278bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
279bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
28024c9e7f8a22971d9eb0987539ca3a4269b805e1acarllstatic int
281bb913cd4cc1e56d7d7798a8b754361a05d01f916floriantest_and(const irop_t *op, test_data_t *data)
282bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{
283bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   unsigned num_input_bits, bitpos;
284bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnd_t *opnds = data->opnds;
28524c9e7f8a22971d9eb0987539ca3a4269b805e1acarll   int tests_done = 0;
286bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
287bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   /* Undefinedness does not propagate if the other operand is 0.
288bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      Use an all-bits-zero operand and test the other operand in
289bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      the usual way (one bit undefined at a time). */
290bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
291bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   // 1st (left) operand variable, 2nd operand all-bits-zero
292bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   num_input_bits = bitsof_irtype(opnds[0].type);
293bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
294bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (bitpos = 0; bitpos < num_input_bits; ++bitpos) {
295bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].vbits = onehot_vbits(bitpos, bitsof_irtype(opnds[0].type));
296bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].vbits = defined_vbits(bitsof_irtype(opnds[1].type));
297bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].value = all_bits_zero_value(bitsof_irtype(opnds[1].type));
298bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
299bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      valgrind_execute_test(op, data);
300bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
301bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      check_result_for_binary(op, data);
30224c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      tests_done++;
303bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
304bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
305bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   // 2nd (right) operand variable, 1st operand all-bits-zero
306bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   num_input_bits = bitsof_irtype(opnds[1].type);
307bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
308bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (bitpos = 0; bitpos < num_input_bits; ++bitpos) {
309bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].vbits = onehot_vbits(bitpos, bitsof_irtype(opnds[1].type));
310bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].vbits = defined_vbits(bitsof_irtype(opnds[0].type));
311bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].value = all_bits_zero_value(bitsof_irtype(opnds[0].type));
312bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
313bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      valgrind_execute_test(op, data);
314bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
315bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      check_result_for_binary(op, data);
31624c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      tests_done++;
317bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
318bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
319bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   /* Undefinedness propagates if the other operand is 1.
320bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      Use an all-bits-one operand and test the other operand in
321bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      the usual way (one bit undefined at a time). */
322bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
323bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   // 1st (left) operand variable, 2nd operand all-bits-one
324bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   num_input_bits = bitsof_irtype(opnds[0].type);
325bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
326bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (bitpos = 0; bitpos < num_input_bits; ++bitpos) {
327bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].vbits = onehot_vbits(bitpos, bitsof_irtype(opnds[0].type));
328bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].vbits = defined_vbits(bitsof_irtype(opnds[1].type));
329bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].value = all_bits_one_value(bitsof_irtype(opnds[1].type));
330bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
331bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      valgrind_execute_test(op, data);
332bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
333bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      check_result_for_binary(op, data);
33424c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      tests_done++;
335bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
336bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
337bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   // 2nd (right) operand variable, 1st operand all-bits-one
338bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   num_input_bits = bitsof_irtype(opnds[1].type);
339bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
340bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (bitpos = 0; bitpos < num_input_bits; ++bitpos) {
341bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].vbits = onehot_vbits(bitpos, bitsof_irtype(opnds[1].type));
342bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].vbits = defined_vbits(bitsof_irtype(opnds[0].type));
343bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].value = all_bits_one_value(bitsof_irtype(opnds[0].type));
344bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
345bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      valgrind_execute_test(op, data);
346bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
347bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      check_result_for_binary(op, data);
34824c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      tests_done++;
349bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
35024c9e7f8a22971d9eb0987539ca3a4269b805e1acarll   return tests_done;
351bb913cd4cc1e56d7d7798a8b754361a05d01f916florian}
352bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
353bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
35424c9e7f8a22971d9eb0987539ca3a4269b805e1acarllstatic int
355bb913cd4cc1e56d7d7798a8b754361a05d01f916floriantest_or(const irop_t *op, test_data_t *data)
356bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{
357bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   unsigned num_input_bits, bitpos;
358bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnd_t *opnds = data->opnds;
35924c9e7f8a22971d9eb0987539ca3a4269b805e1acarll   int tests_done = 0;
360bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
361bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   /* Undefinedness does not propagate if the other operand is 1.
362bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      Use an all-bits-one operand and test the other operand in
363bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      the usual way (one bit undefined at a time). */
364bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
365bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   // 1st (left) operand variable, 2nd operand all-bits-one
366bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   num_input_bits = bitsof_irtype(opnds[0].type);
367bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
368bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[0].vbits = defined_vbits(bitsof_irtype(opnds[0].type));
369bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[1].vbits = defined_vbits(bitsof_irtype(opnds[1].type));
370bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[1].value = all_bits_one_value(bitsof_irtype(opnds[1].type));
371bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
372bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (bitpos = 0; bitpos < num_input_bits; ++bitpos) {
373bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].vbits = onehot_vbits(bitpos, bitsof_irtype(opnds[0].type));
374bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
375bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      valgrind_execute_test(op, data);
376bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
377bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      check_result_for_binary(op, data);
37824c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      tests_done++;
379bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
380bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
381bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   // 2nd (right) operand variable, 1st operand all-bits-one
382bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   num_input_bits = bitsof_irtype(opnds[1].type);
383bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
384bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[0].vbits = defined_vbits(bitsof_irtype(opnds[0].type));
385bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[1].vbits = defined_vbits(bitsof_irtype(opnds[1].type));
386bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[0].value = all_bits_one_value(bitsof_irtype(opnds[0].type));
387bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
388bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (bitpos = 0; bitpos < num_input_bits; ++bitpos) {
389bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].vbits = onehot_vbits(bitpos, bitsof_irtype(opnds[1].type));
390bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
391bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      valgrind_execute_test(op, data);
392bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
393bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      check_result_for_binary(op, data);
39424c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      tests_done++;
395bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
396bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
397bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   /* Undefinedness propagates if the other operand is 0.
398bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      Use an all-bits-zero operand and test the other operand in
399bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      the usual way (one bit undefined at a time). */
400bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
401bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   // 1st (left) operand variable, 2nd operand all-bits-zero
402bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   num_input_bits = bitsof_irtype(opnds[0].type);
403bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
404bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[0].vbits = defined_vbits(bitsof_irtype(opnds[0].type));
405bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[1].vbits = defined_vbits(bitsof_irtype(opnds[1].type));
406bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[1].value = all_bits_zero_value(bitsof_irtype(opnds[1].type));
407bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
408bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (bitpos = 0; bitpos < num_input_bits; ++bitpos) {
409bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].vbits = onehot_vbits(bitpos, bitsof_irtype(opnds[0].type));
410bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
411bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      valgrind_execute_test(op, data);
412bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
413bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      check_result_for_binary(op, data);
41424c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      tests_done++;
415bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
416bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
417bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   // 2nd (right) operand variable, 1st operand all-bits-zero
418bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   num_input_bits = bitsof_irtype(opnds[1].type);
419bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
420bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[0].vbits = defined_vbits(bitsof_irtype(opnds[0].type));
421bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[1].vbits = defined_vbits(bitsof_irtype(opnds[1].type));
422bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnds[0].value = all_bits_zero_value(bitsof_irtype(opnds[0].type));
423bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
424bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (bitpos = 0; bitpos < num_input_bits; ++bitpos) {
425bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].vbits = onehot_vbits(bitpos, bitsof_irtype(opnds[1].type));
426bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
427bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      valgrind_execute_test(op, data);
428bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
429bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      check_result_for_binary(op, data);
43024c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      tests_done++;
431bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
43224c9e7f8a22971d9eb0987539ca3a4269b805e1acarll   return tests_done;
433bb913cd4cc1e56d7d7798a8b754361a05d01f916florian}
434bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
435bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
43624c9e7f8a22971d9eb0987539ca3a4269b805e1acarllint
437bb913cd4cc1e56d7d7798a8b754361a05d01f916floriantest_binary_op(const irop_t *op, test_data_t *data)
438bb913cd4cc1e56d7d7798a8b754361a05d01f916florian{
439bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   unsigned num_input_bits, i, bitpos;
440bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   opnd_t *opnds = data->opnds;
44124c9e7f8a22971d9eb0987539ca3a4269b805e1acarll   int tests_done = 0;
442bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
443bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   /* Handle special cases upfront */
444bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   switch (op->undef_kind) {
445bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_SHL:
446bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_SHR:
447bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_SAR:
44824c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      return test_shift(op, data);
449bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
450bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_AND:
45124c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      return test_and(op, data);
452bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
453bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   case UNDEF_OR:
45424c9e7f8a22971d9eb0987539ca3a4269b805e1acarll      return test_or(op, data);
455bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
456bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   default:
457bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      break;
458bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
459bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
460bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   /* For each operand, set a single bit to undefined and observe how
461bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      that propagates to the output. Do this for all bits in each
462bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      operand. */
463bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   for (i = 0; i < 2; ++i) {
464f74f5426e8f96ccba3b39994fb596603bf0421e1florian
465f74f5426e8f96ccba3b39994fb596603bf0421e1florian      /* If this is a shift op that requires an immediate shift amount,
466f74f5426e8f96ccba3b39994fb596603bf0421e1florian         do not iterate the v-bits of the 2nd operand */
467f74f5426e8f96ccba3b39994fb596603bf0421e1florian      if (i == 1 && op->shift_amount_is_immediate) break;
468f74f5426e8f96ccba3b39994fb596603bf0421e1florian
469bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      num_input_bits = bitsof_irtype(opnds[i].type);
470bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[0].vbits = defined_vbits(bitsof_irtype(opnds[0].type));
471bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      opnds[1].vbits = defined_vbits(bitsof_irtype(opnds[1].type));
472bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
473bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      /* Set the value of the 2nd operand to something != 0. So division
474bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         won't crash. */
475bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      memset(&opnds[1].value, 0xff, sizeof opnds[1].value);
476bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
4775c00a614bf53df64ff6460df830b8a17b4d026daflorian      /* For immediate shift amounts choose a value of '1'. That value should
4785c00a614bf53df64ff6460df830b8a17b4d026daflorian         not cause a problem. Note: we always assign to the u64 member here.
4795c00a614bf53df64ff6460df830b8a17b4d026daflorian         The reason is that in ir_inject.c the value_t type is not visible.
4805c00a614bf53df64ff6460df830b8a17b4d026daflorian         The value is picked up there by interpreting the memory as an
4815c00a614bf53df64ff6460df830b8a17b4d026daflorian         ULong value. So, we rely on
4825c00a614bf53df64ff6460df830b8a17b4d026daflorian         union {
4835c00a614bf53df64ff6460df830b8a17b4d026daflorian           ULong   v1;   // value picked up in ir_inject.c
4845c00a614bf53df64ff6460df830b8a17b4d026daflorian           value_t v2;   // value assigned here
4855c00a614bf53df64ff6460df830b8a17b4d026daflorian         } xx;
4865c00a614bf53df64ff6460df830b8a17b4d026daflorian         assert(sizeof xx.v1 == sizeof xx.v2.u64);
4875c00a614bf53df64ff6460df830b8a17b4d026daflorian         assert(xx.v1 == xx.v2.u64);
4885c00a614bf53df64ff6460df830b8a17b4d026daflorian      */
489f74f5426e8f96ccba3b39994fb596603bf0421e1florian      if (op->shift_amount_is_immediate)
4905c00a614bf53df64ff6460df830b8a17b4d026daflorian         opnds[1].value.u64 = 1;
491f74f5426e8f96ccba3b39994fb596603bf0421e1florian
492bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      for (bitpos = 0; bitpos < num_input_bits; ++bitpos) {
493bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         opnds[i].vbits = onehot_vbits(bitpos, bitsof_irtype(opnds[i].type));
494bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
495bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         valgrind_execute_test(op, data);
496bb913cd4cc1e56d7d7798a8b754361a05d01f916florian
497bb913cd4cc1e56d7d7798a8b754361a05d01f916florian         check_result_for_binary(op, data);
49824c9e7f8a22971d9eb0987539ca3a4269b805e1acarll
49924c9e7f8a22971d9eb0987539ca3a4269b805e1acarll         tests_done++;
500bb913cd4cc1e56d7d7798a8b754361a05d01f916florian      }
501bb913cd4cc1e56d7d7798a8b754361a05d01f916florian   }
50224c9e7f8a22971d9eb0987539ca3a4269b805e1acarll   return tests_done;
503bb913cd4cc1e56d7d7798a8b754361a05d01f916florian}
504