condcodes.hh revision 4715
14683Sgblack@eecs.umich.edu/* 24683Sgblack@eecs.umich.edu * Copyright (c) 2003-2005 The Regents of The University of Michigan 34683Sgblack@eecs.umich.edu * All rights reserved. 44683Sgblack@eecs.umich.edu * 54683Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 64683Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are 74683Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright 84683Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 94683Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 104683Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 114683Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 124683Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 134683Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 144683Sgblack@eecs.umich.edu * this software without specific prior written permission. 154683Sgblack@eecs.umich.edu * 164683Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 174683Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 184683Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 194683Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 204683Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 214683Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224683Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 234683Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244683Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254683Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264683Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274683Sgblack@eecs.umich.edu * 284683Sgblack@eecs.umich.edu * Authors: Gabe Black 294683Sgblack@eecs.umich.edu */ 304683Sgblack@eecs.umich.edu 314683Sgblack@eecs.umich.edu#ifndef __BASE_CONDCODE_HH__ 324683Sgblack@eecs.umich.edu#define __BASE_CONDCODE_HH__ 334683Sgblack@eecs.umich.edu 344683Sgblack@eecs.umich.edu#include "base/bitfield.hh" 354715Sgblack@eecs.umich.edu#include "base/trace.hh" 364683Sgblack@eecs.umich.edu 374683Sgblack@eecs.umich.edu/** 384683Sgblack@eecs.umich.edu * Calculate the carry flag from an addition. This should work even when 394683Sgblack@eecs.umich.edu * a carry value is also added in. 404683Sgblack@eecs.umich.edu */ 414683Sgblack@eecs.umich.eduinline 424683Sgblack@eecs.umich.edubool 434683Sgblack@eecs.umich.edufindCarry(int width, uint64_t dest, uint64_t src1, uint64_t src2) { 444683Sgblack@eecs.umich.edu int shift = width - 1; 454715Sgblack@eecs.umich.edu return ((~(dest >> shift) & 1) + 464715Sgblack@eecs.umich.edu ((src1 >> shift) & 1) + 474715Sgblack@eecs.umich.edu ((src2 >> shift) & 1)) & 0x2; 484683Sgblack@eecs.umich.edu} 494683Sgblack@eecs.umich.edu 504683Sgblack@eecs.umich.edu/** 514683Sgblack@eecs.umich.edu * Calculate the overflow flag from an addition. 524683Sgblack@eecs.umich.edu */ 534683Sgblack@eecs.umich.eduinline 544683Sgblack@eecs.umich.edubool 554683Sgblack@eecs.umich.edufindOverflow(int width, uint64_t dest, uint64_t src1, uint64_t src2) { 564683Sgblack@eecs.umich.edu int shift = width - 1; 574683Sgblack@eecs.umich.edu return ((src1 ^ ~src2) & (src1 ^ dest)) & (1 << shift); 584683Sgblack@eecs.umich.edu} 594683Sgblack@eecs.umich.edu 604683Sgblack@eecs.umich.edu/** 614683Sgblack@eecs.umich.edu * Calculate the parity of a value. 1 is for odd parity and 0 is for even. 624683Sgblack@eecs.umich.edu */ 634683Sgblack@eecs.umich.eduinline 644683Sgblack@eecs.umich.edubool 654683Sgblack@eecs.umich.edufindParity(int width, uint64_t dest) { 664683Sgblack@eecs.umich.edu dest &= width; 674683Sgblack@eecs.umich.edu dest ^= (dest >> 32); 684683Sgblack@eecs.umich.edu dest ^= (dest >> 16); 694683Sgblack@eecs.umich.edu dest ^= (dest >> 8); 704683Sgblack@eecs.umich.edu dest ^= (dest >> 4); 714683Sgblack@eecs.umich.edu dest ^= (dest >> 2); 724683Sgblack@eecs.umich.edu dest ^= (dest >> 1); 734683Sgblack@eecs.umich.edu return dest & 1; 744683Sgblack@eecs.umich.edu} 754683Sgblack@eecs.umich.edu 764683Sgblack@eecs.umich.edu/** 774683Sgblack@eecs.umich.edu * Calculate the negative flag. 784683Sgblack@eecs.umich.edu */ 794683Sgblack@eecs.umich.eduinline 804683Sgblack@eecs.umich.edubool 814683Sgblack@eecs.umich.edufindNegative(int width, uint64_t dest) { 824683Sgblack@eecs.umich.edu return bits(dest, width - 1, width - 1); 834683Sgblack@eecs.umich.edu} 844683Sgblack@eecs.umich.edu 854683Sgblack@eecs.umich.edu/** 864683Sgblack@eecs.umich.edu * Calculate the zero flag. 874683Sgblack@eecs.umich.edu */ 884683Sgblack@eecs.umich.eduinline 894683Sgblack@eecs.umich.edubool 904683Sgblack@eecs.umich.edufindZero(int width, uint64_t dest) { 914683Sgblack@eecs.umich.edu return !(dest & mask(width)); 924683Sgblack@eecs.umich.edu} 934683Sgblack@eecs.umich.edu 944683Sgblack@eecs.umich.edu#endif // __BASE_CONDCODE_HH__ 95