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 <cstdint> 3411730Sar4jc@virginia.edu#include <iostream> 3511730Sar4jc@virginia.edu 3611730Sar4jc@virginia.edu#include "insttest.h" 3711730Sar4jc@virginia.edu 3811730Sar4jc@virginia.edunamespace I 3911730Sar4jc@virginia.edu{ 4011730Sar4jc@virginia.edu 4111730Sar4jc@virginia.eduinline uint64_t 4211730Sar4jc@virginia.edului(const uint32_t imm) 4311730Sar4jc@virginia.edu{ 4411730Sar4jc@virginia.edu int64_t rd = -1; 4511730Sar4jc@virginia.edu asm volatile("lui %0,%1" : "=r" (rd) : "i" (imm)); 4611730Sar4jc@virginia.edu return rd; 4711730Sar4jc@virginia.edu} 4811730Sar4jc@virginia.edu 4911730Sar4jc@virginia.eduinline bool 5011730Sar4jc@virginia.eduauipc(const uint64_t imm) 5111730Sar4jc@virginia.edu{ 5211730Sar4jc@virginia.edu int64_t rd = -1; 5311730Sar4jc@virginia.edu asm volatile("auipc %0,%1" : "=r" (rd) : "i" (imm)); 5411730Sar4jc@virginia.edu std::cout << "auipc: 0x" << std::hex << std::uppercase << rd << 5511730Sar4jc@virginia.edu std::nouppercase << std::dec << std::endl; 5611730Sar4jc@virginia.edu return rd >= imm; 5711730Sar4jc@virginia.edu} 5811730Sar4jc@virginia.edu 5911730Sar4jc@virginia.eduinline bool 6011730Sar4jc@virginia.edujal() 6111730Sar4jc@virginia.edu{ 6211730Sar4jc@virginia.edu asm volatile goto("jal zero,%l[jallabel]" : : : : jallabel); 6311730Sar4jc@virginia.edu return false; 6411730Sar4jc@virginia.edu jallabel: 6511730Sar4jc@virginia.edu return true; 6611730Sar4jc@virginia.edu} 6711730Sar4jc@virginia.edu 6811730Sar4jc@virginia.eduinline bool 6911730Sar4jc@virginia.edujalr() 7011730Sar4jc@virginia.edu{ 7111730Sar4jc@virginia.edu int a = 0; 7211730Sar4jc@virginia.edu asm volatile("auipc %0,0;" 7311730Sar4jc@virginia.edu "jalr t0,%0,12;" 7411730Sar4jc@virginia.edu "addi %0,zero,0;" 7511730Sar4jc@virginia.edu "sub %0,t0,%0;" 7611730Sar4jc@virginia.edu : "+r" (a) 7711730Sar4jc@virginia.edu : 7811730Sar4jc@virginia.edu : "t0"); 7911730Sar4jc@virginia.edu return a == 8; 8011730Sar4jc@virginia.edu} 8111730Sar4jc@virginia.edu 8211730Sar4jc@virginia.eduinline bool 8311730Sar4jc@virginia.edubeq(int64_t a, int64_t b) 8411730Sar4jc@virginia.edu{ 8511730Sar4jc@virginia.edu asm volatile goto("beq %0,%1,%l[beqlabel]" 8611730Sar4jc@virginia.edu : 8711730Sar4jc@virginia.edu : "r" (a), "r" (b) 8811730Sar4jc@virginia.edu : 8911730Sar4jc@virginia.edu : beqlabel); 9011730Sar4jc@virginia.edu return false; 9111730Sar4jc@virginia.edu beqlabel: 9211730Sar4jc@virginia.edu return true; 9311730Sar4jc@virginia.edu} 9411730Sar4jc@virginia.edu 9511730Sar4jc@virginia.eduinline bool 9611730Sar4jc@virginia.edubne(int64_t a, int64_t b) 9711730Sar4jc@virginia.edu{ 9811730Sar4jc@virginia.edu asm volatile goto("bne %0,%1,%l[bnelabel]" 9911730Sar4jc@virginia.edu : 10011730Sar4jc@virginia.edu : "r" (a), "r" (b) 10111730Sar4jc@virginia.edu : 10211730Sar4jc@virginia.edu : bnelabel); 10311730Sar4jc@virginia.edu return false; 10411730Sar4jc@virginia.edu bnelabel: 10511730Sar4jc@virginia.edu return true; 10611730Sar4jc@virginia.edu} 10711730Sar4jc@virginia.edu 10811730Sar4jc@virginia.eduinline bool 10911730Sar4jc@virginia.edublt(int64_t a, int64_t b) 11011730Sar4jc@virginia.edu{ 11111730Sar4jc@virginia.edu asm volatile goto("blt %0,%1,%l[bltlabel]" 11211730Sar4jc@virginia.edu : 11311730Sar4jc@virginia.edu : "r" (a), "r" (b) 11411730Sar4jc@virginia.edu : 11511730Sar4jc@virginia.edu : bltlabel); 11611730Sar4jc@virginia.edu return false; 11711730Sar4jc@virginia.edu bltlabel: 11811730Sar4jc@virginia.edu return true; 11911730Sar4jc@virginia.edu} 12011730Sar4jc@virginia.edu 12111730Sar4jc@virginia.eduinline bool 12211730Sar4jc@virginia.edubge(int64_t a, int64_t b) 12311730Sar4jc@virginia.edu{ 12411730Sar4jc@virginia.edu asm volatile goto("bge %0,%1,%l[bgelabel]" 12511730Sar4jc@virginia.edu : 12611730Sar4jc@virginia.edu : "r" (a), "r" (b) 12711730Sar4jc@virginia.edu : 12811730Sar4jc@virginia.edu : bgelabel); 12911730Sar4jc@virginia.edu return false; 13011730Sar4jc@virginia.edu bgelabel: 13111730Sar4jc@virginia.edu return true; 13211730Sar4jc@virginia.edu} 13311730Sar4jc@virginia.edu 13411730Sar4jc@virginia.eduinline bool 13511730Sar4jc@virginia.edubltu(uint64_t a, uint64_t b) 13611730Sar4jc@virginia.edu{ 13711730Sar4jc@virginia.edu asm volatile goto("bltu %0,%1,%l[bltulabel]" 13811730Sar4jc@virginia.edu : 13911730Sar4jc@virginia.edu : "r" (a), "r" (b) 14011730Sar4jc@virginia.edu : 14111730Sar4jc@virginia.edu : bltulabel); 14211730Sar4jc@virginia.edu return false; 14311730Sar4jc@virginia.edu bltulabel: 14411730Sar4jc@virginia.edu return true; 14511730Sar4jc@virginia.edu} 14611730Sar4jc@virginia.edu 14711730Sar4jc@virginia.eduinline bool 14811730Sar4jc@virginia.edubgeu(uint64_t a, uint64_t b) 14911730Sar4jc@virginia.edu{ 15011730Sar4jc@virginia.edu asm volatile goto("bgeu %0,%1,%l[bgeulabel]" 15111730Sar4jc@virginia.edu : 15211730Sar4jc@virginia.edu : "r" (a), "r" (b) 15311730Sar4jc@virginia.edu : 15411730Sar4jc@virginia.edu : bgeulabel); 15511730Sar4jc@virginia.edu return false; 15611730Sar4jc@virginia.edu bgeulabel: 15711730Sar4jc@virginia.edu return true; 15811730Sar4jc@virginia.edu} 15911730Sar4jc@virginia.edu 16011730Sar4jc@virginia.edutemplate<typename M, typename R> inline R 16111730Sar4jc@virginia.eduload(const M& b) 16211730Sar4jc@virginia.edu{ 16311730Sar4jc@virginia.edu R a = 0; 16411730Sar4jc@virginia.edu switch(sizeof(M)) 16511730Sar4jc@virginia.edu { 16611730Sar4jc@virginia.edu case 1: 16711730Sar4jc@virginia.edu if (std::is_signed<M>::value) { 16811730Sar4jc@virginia.edu asm volatile("lb %0,%1" : "=r" (a) : "m" (b)); 16911730Sar4jc@virginia.edu } else { 17011730Sar4jc@virginia.edu asm volatile("lbu %0,%1" : "=r" (a) : "m" (b)); 17111730Sar4jc@virginia.edu } 17211730Sar4jc@virginia.edu break; 17311730Sar4jc@virginia.edu case 2: 17411730Sar4jc@virginia.edu if (std::is_signed<M>::value) { 17511730Sar4jc@virginia.edu asm volatile("lh %0,%1" : "=r" (a) : "m" (b)); 17611730Sar4jc@virginia.edu } else { 17711730Sar4jc@virginia.edu asm volatile("lhu %0,%1" : "=r" (a) : "m" (b)); 17811730Sar4jc@virginia.edu } 17911730Sar4jc@virginia.edu break; 18011730Sar4jc@virginia.edu case 4: 18111730Sar4jc@virginia.edu if (std::is_signed<M>::value) { 18211730Sar4jc@virginia.edu asm volatile("lw %0,%1" : "=r" (a) : "m" (b)); 18311730Sar4jc@virginia.edu } else { 18411730Sar4jc@virginia.edu asm volatile("lwu %0,%1" : "=r" (a) : "m" (b)); 18511730Sar4jc@virginia.edu } 18611730Sar4jc@virginia.edu break; 18711730Sar4jc@virginia.edu case 8: 18811730Sar4jc@virginia.edu asm volatile("ld %0,%1" : "=r" (a) : "m" (b)); 18911730Sar4jc@virginia.edu break; 19011730Sar4jc@virginia.edu } 19111730Sar4jc@virginia.edu return a; 19211730Sar4jc@virginia.edu} 19311730Sar4jc@virginia.edu 19411730Sar4jc@virginia.edutemplate<typename M> inline M 19511730Sar4jc@virginia.edustore(const M& rs2) 19611730Sar4jc@virginia.edu{ 19711730Sar4jc@virginia.edu M mem = 0; 19811730Sar4jc@virginia.edu switch (sizeof(M)) 19911730Sar4jc@virginia.edu { 20011730Sar4jc@virginia.edu case 1: 20111730Sar4jc@virginia.edu asm volatile("sb %1,%0" : "=m" (mem) : "r" (rs2)); 20211730Sar4jc@virginia.edu break; 20311730Sar4jc@virginia.edu case 2: 20411730Sar4jc@virginia.edu asm volatile("sh %1,%0" : "=m" (mem) : "r" (rs2)); 20511730Sar4jc@virginia.edu break; 20611730Sar4jc@virginia.edu case 4: 20711730Sar4jc@virginia.edu asm volatile("sw %1,%0" : "=m" (mem) : "r" (rs2)); 20811730Sar4jc@virginia.edu break; 20911730Sar4jc@virginia.edu case 8: 21011730Sar4jc@virginia.edu asm volatile("sd %1,%0" : "=m" (mem) : "r" (rs2)); 21111730Sar4jc@virginia.edu break; 21211730Sar4jc@virginia.edu } 21311730Sar4jc@virginia.edu return mem; 21411730Sar4jc@virginia.edu} 21511730Sar4jc@virginia.edu 21611730Sar4jc@virginia.eduinline int64_t 21711730Sar4jc@virginia.eduaddi(int64_t rs1, const int16_t imm) 21811730Sar4jc@virginia.edu{ 21911730Sar4jc@virginia.edu int64_t rd = 0; 22011730Sar4jc@virginia.edu IOP("addi", rd, rs1, imm); 22111730Sar4jc@virginia.edu return rd; 22211730Sar4jc@virginia.edu} 22311730Sar4jc@virginia.edu 22411730Sar4jc@virginia.eduinline bool 22511730Sar4jc@virginia.eduslti(int64_t rs1, const int16_t imm) 22611730Sar4jc@virginia.edu{ 22711730Sar4jc@virginia.edu bool rd = false; 22811730Sar4jc@virginia.edu IOP("slti", rd, rs1, imm); 22911730Sar4jc@virginia.edu return rd; 23011730Sar4jc@virginia.edu} 23111730Sar4jc@virginia.edu 23211730Sar4jc@virginia.eduinline bool 23311730Sar4jc@virginia.edusltiu(uint64_t rs1, const uint16_t imm) 23411730Sar4jc@virginia.edu{ 23511730Sar4jc@virginia.edu bool rd = false; 23611730Sar4jc@virginia.edu IOP("sltiu", rd, rs1, imm); 23711730Sar4jc@virginia.edu return rd; 23811730Sar4jc@virginia.edu} 23911730Sar4jc@virginia.edu 24011730Sar4jc@virginia.eduinline uint64_t 24111730Sar4jc@virginia.eduxori(uint64_t rs1, const uint16_t imm) 24211730Sar4jc@virginia.edu{ 24311730Sar4jc@virginia.edu uint64_t rd = 0; 24411730Sar4jc@virginia.edu IOP("xori", rd, rs1, imm); 24511730Sar4jc@virginia.edu return rd; 24611730Sar4jc@virginia.edu} 24711730Sar4jc@virginia.edu 24811730Sar4jc@virginia.eduinline uint64_t 24911730Sar4jc@virginia.eduori(uint64_t rs1, const uint16_t imm) 25011730Sar4jc@virginia.edu{ 25111730Sar4jc@virginia.edu uint64_t rd = 0; 25211730Sar4jc@virginia.edu IOP("ori", rd, rs1, imm); 25311730Sar4jc@virginia.edu return rd; 25411730Sar4jc@virginia.edu} 25511730Sar4jc@virginia.edu 25611730Sar4jc@virginia.eduinline uint64_t 25711730Sar4jc@virginia.eduandi(uint64_t rs1, const uint16_t imm) 25811730Sar4jc@virginia.edu{ 25911730Sar4jc@virginia.edu uint64_t rd = 0; 26011730Sar4jc@virginia.edu IOP("andi", rd, rs1, imm); 26111730Sar4jc@virginia.edu return rd; 26211730Sar4jc@virginia.edu} 26311730Sar4jc@virginia.edu 26411730Sar4jc@virginia.eduinline int64_t 26511730Sar4jc@virginia.eduslli(int64_t rs1, const uint16_t imm) 26611730Sar4jc@virginia.edu{ 26711730Sar4jc@virginia.edu int64_t rd = 0; 26811730Sar4jc@virginia.edu IOP("slli", rd, rs1, imm); 26911730Sar4jc@virginia.edu return rd; 27011730Sar4jc@virginia.edu} 27111730Sar4jc@virginia.edu 27211730Sar4jc@virginia.eduinline uint64_t 27311730Sar4jc@virginia.edusrli(uint64_t rs1, const uint16_t imm) 27411730Sar4jc@virginia.edu{ 27511730Sar4jc@virginia.edu uint64_t rd = 0; 27611730Sar4jc@virginia.edu IOP("srli", rd, rs1, imm); 27711730Sar4jc@virginia.edu return rd; 27811730Sar4jc@virginia.edu} 27911730Sar4jc@virginia.edu 28011730Sar4jc@virginia.eduinline int64_t 28111730Sar4jc@virginia.edusrai(int64_t rs1, const uint16_t imm) 28211730Sar4jc@virginia.edu{ 28311730Sar4jc@virginia.edu int64_t rd = 0; 28411730Sar4jc@virginia.edu IOP("srai", rd, rs1, imm); 28511730Sar4jc@virginia.edu return rd; 28611730Sar4jc@virginia.edu} 28711730Sar4jc@virginia.edu 28811730Sar4jc@virginia.eduinline int64_t 28911730Sar4jc@virginia.eduadd(int64_t rs1, int64_t rs2) 29011730Sar4jc@virginia.edu{ 29111730Sar4jc@virginia.edu int64_t rd = 0; 29211730Sar4jc@virginia.edu ROP("add", rd, rs1, rs2); 29311730Sar4jc@virginia.edu return rd; 29411730Sar4jc@virginia.edu} 29511730Sar4jc@virginia.edu 29611730Sar4jc@virginia.eduinline int64_t 29711730Sar4jc@virginia.edusub(int64_t rs1, int64_t rs2) 29811730Sar4jc@virginia.edu{ 29911730Sar4jc@virginia.edu int64_t rd = 0; 30011730Sar4jc@virginia.edu ROP("sub", rd, rs1, rs2); 30111730Sar4jc@virginia.edu return rd; 30211730Sar4jc@virginia.edu} 30311730Sar4jc@virginia.edu 30411730Sar4jc@virginia.eduinline int64_t 30511730Sar4jc@virginia.edusll(int64_t rs1, int64_t rs2) 30611730Sar4jc@virginia.edu{ 30711730Sar4jc@virginia.edu int64_t rd = 0; 30811730Sar4jc@virginia.edu ROP("sll", rd, rs1, rs2); 30911730Sar4jc@virginia.edu return rd; 31011730Sar4jc@virginia.edu} 31111730Sar4jc@virginia.edu 31211730Sar4jc@virginia.eduinline bool 31311730Sar4jc@virginia.eduslt(int64_t rs1, int64_t rs2) 31411730Sar4jc@virginia.edu{ 31511730Sar4jc@virginia.edu bool rd = false; 31611730Sar4jc@virginia.edu ROP("slt", rd, rs1, rs2); 31711730Sar4jc@virginia.edu return rd; 31811730Sar4jc@virginia.edu} 31911730Sar4jc@virginia.edu 32011730Sar4jc@virginia.eduinline bool 32111730Sar4jc@virginia.edusltu(uint64_t rs1, uint64_t rs2) 32211730Sar4jc@virginia.edu{ 32311730Sar4jc@virginia.edu bool rd = false; 32411730Sar4jc@virginia.edu ROP("sltu", rd, rs1, rs2); 32511730Sar4jc@virginia.edu return rd; 32611730Sar4jc@virginia.edu} 32711730Sar4jc@virginia.edu 32811730Sar4jc@virginia.eduinline uint64_t 32911730Sar4jc@virginia.eduxor_inst(uint64_t rs1, uint64_t rs2) 33011730Sar4jc@virginia.edu{ 33111730Sar4jc@virginia.edu uint64_t rd = 0; 33211730Sar4jc@virginia.edu ROP("xor", rd, rs1, rs2); 33311730Sar4jc@virginia.edu return rd; 33411730Sar4jc@virginia.edu} 33511730Sar4jc@virginia.edu 33611730Sar4jc@virginia.eduinline uint64_t 33711730Sar4jc@virginia.edusrl(uint64_t rs1, uint64_t rs2) 33811730Sar4jc@virginia.edu{ 33911730Sar4jc@virginia.edu uint64_t rd = 0; 34011730Sar4jc@virginia.edu ROP("srl", rd, rs1, rs2); 34111730Sar4jc@virginia.edu return rd; 34211730Sar4jc@virginia.edu} 34311730Sar4jc@virginia.edu 34411730Sar4jc@virginia.eduinline int64_t 34511730Sar4jc@virginia.edusra(int64_t rs1, int64_t rs2) 34611730Sar4jc@virginia.edu{ 34711730Sar4jc@virginia.edu int64_t rd = 0; 34811730Sar4jc@virginia.edu ROP("sra", rd, rs1, rs2); 34911730Sar4jc@virginia.edu return rd; 35011730Sar4jc@virginia.edu} 35111730Sar4jc@virginia.edu 35211730Sar4jc@virginia.eduinline uint64_t 35311730Sar4jc@virginia.eduor_inst(uint64_t rs1, uint64_t rs2) 35411730Sar4jc@virginia.edu{ 35511730Sar4jc@virginia.edu uint64_t rd = 0; 35611730Sar4jc@virginia.edu ROP("or", rd, rs1, rs2); 35711730Sar4jc@virginia.edu return rd; 35811730Sar4jc@virginia.edu} 35911730Sar4jc@virginia.edu 36011730Sar4jc@virginia.eduinline uint64_t 36111730Sar4jc@virginia.eduand_inst(uint64_t rs1, uint64_t rs2) 36211730Sar4jc@virginia.edu{ 36311730Sar4jc@virginia.edu uint64_t rd = 0; 36411730Sar4jc@virginia.edu ROP("and", rd, rs1, rs2); 36511730Sar4jc@virginia.edu return rd; 36611730Sar4jc@virginia.edu} 36711730Sar4jc@virginia.edu 36811730Sar4jc@virginia.eduinline int64_t 36911730Sar4jc@virginia.eduaddiw(int64_t rs1, const int16_t imm) 37011730Sar4jc@virginia.edu{ 37111730Sar4jc@virginia.edu int64_t rd = 0; 37211730Sar4jc@virginia.edu IOP("addiw", rd, rs1, imm); 37311730Sar4jc@virginia.edu return rd; 37411730Sar4jc@virginia.edu} 37511730Sar4jc@virginia.edu 37611730Sar4jc@virginia.eduinline int64_t 37711730Sar4jc@virginia.eduslliw(int64_t rs1, const uint16_t imm) 37811730Sar4jc@virginia.edu{ 37911730Sar4jc@virginia.edu int64_t rd = 0; 38011730Sar4jc@virginia.edu IOP("slliw", rd, rs1, imm); 38111730Sar4jc@virginia.edu return rd; 38211730Sar4jc@virginia.edu} 38311730Sar4jc@virginia.edu 38411730Sar4jc@virginia.eduinline uint64_t 38511730Sar4jc@virginia.edusrliw(uint64_t rs1, const uint16_t imm) 38611730Sar4jc@virginia.edu{ 38711730Sar4jc@virginia.edu uint64_t rd = 0; 38811730Sar4jc@virginia.edu IOP("srliw", rd, rs1, imm); 38911730Sar4jc@virginia.edu return rd; 39011730Sar4jc@virginia.edu} 39111730Sar4jc@virginia.edu 39211730Sar4jc@virginia.eduinline int64_t 39311730Sar4jc@virginia.edusraiw(int64_t rs1, const uint16_t imm) 39411730Sar4jc@virginia.edu{ 39511730Sar4jc@virginia.edu int64_t rd = 0; 39611730Sar4jc@virginia.edu IOP("sraiw", rd, rs1, imm); 39711730Sar4jc@virginia.edu return rd; 39811730Sar4jc@virginia.edu} 39911730Sar4jc@virginia.edu 40011730Sar4jc@virginia.eduinline int64_t 40111730Sar4jc@virginia.eduaddw(int64_t rs1, int64_t rs2) 40211730Sar4jc@virginia.edu{ 40311730Sar4jc@virginia.edu int64_t rd = 0; 40411730Sar4jc@virginia.edu ROP("addw", rd, rs1, rs2); 40511730Sar4jc@virginia.edu return rd; 40611730Sar4jc@virginia.edu} 40711730Sar4jc@virginia.edu 40811730Sar4jc@virginia.eduinline int64_t 40911730Sar4jc@virginia.edusubw(int64_t rs1, int64_t rs2) 41011730Sar4jc@virginia.edu{ 41111730Sar4jc@virginia.edu int64_t rd = 0; 41211730Sar4jc@virginia.edu ROP("subw", rd, rs1, rs2); 41311730Sar4jc@virginia.edu return rd; 41411730Sar4jc@virginia.edu} 41511730Sar4jc@virginia.edu 41611730Sar4jc@virginia.eduinline int64_t 41711730Sar4jc@virginia.edusllw(int64_t rs1, int64_t rs2) 41811730Sar4jc@virginia.edu{ 41911730Sar4jc@virginia.edu int64_t rd = 0; 42011730Sar4jc@virginia.edu ROP("sllw", rd, rs1, rs2); 42111730Sar4jc@virginia.edu return rd; 42211730Sar4jc@virginia.edu} 42311730Sar4jc@virginia.edu 42411730Sar4jc@virginia.eduinline uint64_t 42511730Sar4jc@virginia.edusrlw(uint64_t rs1, uint64_t rs2) 42611730Sar4jc@virginia.edu{ 42711730Sar4jc@virginia.edu uint64_t rd = 0; 42811730Sar4jc@virginia.edu ROP("srlw", rd, rs1, rs2); 42911730Sar4jc@virginia.edu return rd; 43011730Sar4jc@virginia.edu} 43111730Sar4jc@virginia.edu 43211730Sar4jc@virginia.eduinline int64_t 43311730Sar4jc@virginia.edusraw(int64_t rs1, int64_t rs2) 43411730Sar4jc@virginia.edu{ 43511730Sar4jc@virginia.edu int64_t rd = 0; 43611730Sar4jc@virginia.edu ROP("sraw", rd, rs1, rs2); 43711730Sar4jc@virginia.edu return rd; 43811730Sar4jc@virginia.edu} 43911730Sar4jc@virginia.edu 44011730Sar4jc@virginia.edu} // namespace I 441