1/* 2 * Copyright (c) 2016 The University of Virginia 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions are 7 * met: redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer; 9 * redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution; 12 * neither the name of the copyright holders nor the names of its 13 * contributors may be used to endorse or promote products derived from 14 * this software without specific prior written permission. 15 * 16 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 17 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 18 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 19 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 20 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 21 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 22 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 23 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 24 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 * 28 * Authors: Alec Roelke 29 */ 30 31#pragma once 32 33#include <cmath> 34#include <cstdlib> 35#include <functional> 36#include <iostream> 37#include <string> 38 39#define IOP(inst, rd, rs1, imm) \ 40 asm volatile(inst " %0,%1,%2" : "=r" (rd) : "r" (rs1), "i" (imm)) 41 42#define ROP(inst, rd, rs1, rs2) \ 43 asm volatile(inst " %0,%1,%2" : "=r" (rd) : "r" (rs1), "r" (rs2)) 44 45#define FROP(inst, fd, fs1, fs2) \ 46 asm volatile(inst " %0,%1,%2" : "=f" (fd) : "f" (fs1), "f" (fs2)) 47 48#define FR4OP(inst, fd, fs1, fs2, fs3) \ 49 asm volatile(inst " %0,%1,%2,%3" \ 50 : "=f" (fd) \ 51 : "f" (fs1), "f" (fs2), "f" (fs3)) 52 53template<typename A, typename B> std::ostream& 54operator<<(std::ostream& os, const std::pair<A, B>& p) 55{ 56 return os << '(' << p.first << ", " << p.second << ')'; 57} 58 59namespace insttest 60{ 61 62template<typename T> void 63expect(const T& expected, std::function<T()> func, 64 const std::string& test) 65{ 66 using namespace std; 67 68 T result = func(); 69 cout << test << ": "; 70 if (result == expected) { 71 cout << "PASS" << endl; 72 } else { 73 cout << "\033[1;31mFAIL\033[0m (expected " << expected << "; found " << 74 result << ")" << endl; 75 } 76} 77 78} // namespace insttest 79