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