111730Sar4jc@virginia.edu/* 211730Sar4jc@virginia.edu * Copyright (c) 2016 The University of Virginia 311730Sar4jc@virginia.edu * All rights reserved. 411730Sar4jc@virginia.edu * 511730Sar4jc@virginia.edu * Redistribution and use in source and binary forms, with or without 611730Sar4jc@virginia.edu * modification, are permitted provided that the following conditions are 711730Sar4jc@virginia.edu * met: redistributions of source code must retain the above copyright 811730Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer; 911730Sar4jc@virginia.edu * redistributions in binary form must reproduce the above copyright 1011730Sar4jc@virginia.edu * notice, this list of conditions and the following disclaimer in the 1111730Sar4jc@virginia.edu * documentation and/or other materials provided with the distribution; 1211730Sar4jc@virginia.edu * neither the name of the copyright holders nor the names of its 1311730Sar4jc@virginia.edu * contributors may be used to endorse or promote products derived from 1411730Sar4jc@virginia.edu * this software without specific prior written permission. 1511730Sar4jc@virginia.edu * 1611730Sar4jc@virginia.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1711730Sar4jc@virginia.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1811730Sar4jc@virginia.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1911730Sar4jc@virginia.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2011730Sar4jc@virginia.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2111730Sar4jc@virginia.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2211730Sar4jc@virginia.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2311730Sar4jc@virginia.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2411730Sar4jc@virginia.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2511730Sar4jc@virginia.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2611730Sar4jc@virginia.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2711730Sar4jc@virginia.edu * 2811730Sar4jc@virginia.edu * Authors: Alec Roelke 2911730Sar4jc@virginia.edu */ 3011730Sar4jc@virginia.edu 3111730Sar4jc@virginia.edu#pragma once 3211730Sar4jc@virginia.edu 3311730Sar4jc@virginia.edu#include <cmath> 3411730Sar4jc@virginia.edu#include <cstdlib> 3511730Sar4jc@virginia.edu#include <functional> 3611730Sar4jc@virginia.edu#include <iostream> 3711730Sar4jc@virginia.edu#include <string> 3811730Sar4jc@virginia.edu 3911730Sar4jc@virginia.edu#define IOP(inst, rd, rs1, imm) \ 4011730Sar4jc@virginia.edu asm volatile(inst " %0,%1,%2" : "=r" (rd) : "r" (rs1), "i" (imm)) 4111730Sar4jc@virginia.edu 4211730Sar4jc@virginia.edu#define ROP(inst, rd, rs1, rs2) \ 4311730Sar4jc@virginia.edu asm volatile(inst " %0,%1,%2" : "=r" (rd) : "r" (rs1), "r" (rs2)) 4411730Sar4jc@virginia.edu 4511730Sar4jc@virginia.edu#define FROP(inst, fd, fs1, fs2) \ 4611730Sar4jc@virginia.edu asm volatile(inst " %0,%1,%2" : "=f" (fd) : "f" (fs1), "f" (fs2)) 4711730Sar4jc@virginia.edu 4811730Sar4jc@virginia.edu#define FR4OP(inst, fd, fs1, fs2, fs3) \ 4911730Sar4jc@virginia.edu asm volatile(inst " %0,%1,%2,%3" \ 5011730Sar4jc@virginia.edu : "=f" (fd) \ 5111730Sar4jc@virginia.edu : "f" (fs1), "f" (fs2), "f" (fs3)) 5211730Sar4jc@virginia.edu 5311730Sar4jc@virginia.edutemplate<typename A, typename B> std::ostream& 5411730Sar4jc@virginia.eduoperator<<(std::ostream& os, const std::pair<A, B>& p) 5511730Sar4jc@virginia.edu{ 5611730Sar4jc@virginia.edu return os << '(' << p.first << ", " << p.second << ')'; 5711730Sar4jc@virginia.edu} 5811730Sar4jc@virginia.edu 5911730Sar4jc@virginia.edunamespace insttest 6011730Sar4jc@virginia.edu{ 6111730Sar4jc@virginia.edu 6211730Sar4jc@virginia.edutemplate<typename T> void 6311730Sar4jc@virginia.eduexpect(const T& expected, std::function<T()> func, 6411730Sar4jc@virginia.edu const std::string& test) 6511730Sar4jc@virginia.edu{ 6611730Sar4jc@virginia.edu using namespace std; 6711730Sar4jc@virginia.edu 6811730Sar4jc@virginia.edu T result = func(); 6911730Sar4jc@virginia.edu cout << test << ": "; 7011730Sar4jc@virginia.edu if (result == expected) { 7111730Sar4jc@virginia.edu cout << "PASS" << endl; 7211730Sar4jc@virginia.edu } else { 7311730Sar4jc@virginia.edu cout << "\033[1;31mFAIL\033[0m (expected " << expected << "; found " << 7411730Sar4jc@virginia.edu result << ")" << endl; 7511730Sar4jc@virginia.edu } 7611730Sar4jc@virginia.edu} 7711730Sar4jc@virginia.edu 7811730Sar4jc@virginia.edu} // namespace insttest 79