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