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;
575092Sgblack@eecs.umich.edu    return ((src1 ^ ~src2) & (src1 ^ dest)) & (1ULL << 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) {
665098Sgblack@eecs.umich.edu    dest &= mask(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