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 <tuple> 3511730Sar4jc@virginia.edu 3611730Sar4jc@virginia.edu#include "insttest.h" 3711730Sar4jc@virginia.edu 3811730Sar4jc@virginia.edunamespace A 3911730Sar4jc@virginia.edu{ 4011730Sar4jc@virginia.edu 4111730Sar4jc@virginia.eduinline int64_t 4211730Sar4jc@virginia.edulr_w(int32_t& mem) 4311730Sar4jc@virginia.edu{ 4411730Sar4jc@virginia.edu int64_t r = 0; 4511730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 4611730Sar4jc@virginia.edu asm volatile("lr.w %0,(%1)" : "=r" (r) : "r" (addr) : "memory"); 4711730Sar4jc@virginia.edu return r; 4811730Sar4jc@virginia.edu} 4911730Sar4jc@virginia.edu 5011730Sar4jc@virginia.eduinline std::pair<int64_t, uint64_t> 5111730Sar4jc@virginia.edusc_w(int64_t rs2, int32_t& mem) 5211730Sar4jc@virginia.edu{ 5311730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 5411730Sar4jc@virginia.edu uint64_t rd = -1; 5511730Sar4jc@virginia.edu asm volatile("sc.w %0,%2,(%1)" 5611730Sar4jc@virginia.edu : "=r" (rd) 5711730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 5811730Sar4jc@virginia.edu : "memory"); 5911730Sar4jc@virginia.edu return {mem, rd}; 6011730Sar4jc@virginia.edu} 6111730Sar4jc@virginia.edu 6211730Sar4jc@virginia.eduinline std::pair<int64_t, int64_t> 6311730Sar4jc@virginia.eduamoswap_w(int64_t mem, int64_t rs2) 6411730Sar4jc@virginia.edu{ 6511730Sar4jc@virginia.edu int64_t rd = 0; 6611730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 6711730Sar4jc@virginia.edu asm volatile("amoswap.w %0,%2,(%1)" 6811730Sar4jc@virginia.edu : "=r" (rd) 6911730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 7011730Sar4jc@virginia.edu : "memory"); 7111730Sar4jc@virginia.edu return {mem, rd}; 7211730Sar4jc@virginia.edu} 7311730Sar4jc@virginia.edu 7411730Sar4jc@virginia.eduinline std::pair<int64_t, int64_t> 7511730Sar4jc@virginia.eduamoadd_w(int64_t mem, int64_t rs2) 7611730Sar4jc@virginia.edu{ 7711730Sar4jc@virginia.edu int64_t rd = 0; 7811730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 7911730Sar4jc@virginia.edu asm volatile("amoadd.w %0,%2,(%1)" 8011730Sar4jc@virginia.edu : "=r" (rd) 8111730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 8211730Sar4jc@virginia.edu : "memory"); 8311730Sar4jc@virginia.edu return {mem, rd}; 8411730Sar4jc@virginia.edu} 8511730Sar4jc@virginia.edu 8611730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 8711730Sar4jc@virginia.eduamoxor_w(uint64_t mem, uint64_t rs2) 8811730Sar4jc@virginia.edu{ 8911730Sar4jc@virginia.edu uint64_t rd = 0; 9011730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 9111730Sar4jc@virginia.edu asm volatile("amoxor.w %0,%2,(%1)" 9211730Sar4jc@virginia.edu : "=r" (rd) 9311730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 9411730Sar4jc@virginia.edu : "memory"); 9511730Sar4jc@virginia.edu return {mem, rd}; 9611730Sar4jc@virginia.edu} 9711730Sar4jc@virginia.edu 9811730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 9911730Sar4jc@virginia.eduamoand_w(uint64_t mem, uint64_t rs2) 10011730Sar4jc@virginia.edu{ 10111730Sar4jc@virginia.edu uint64_t rd = 0; 10211730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 10311730Sar4jc@virginia.edu asm volatile("amoand.w %0,%2,(%1)" 10411730Sar4jc@virginia.edu : "=r" (rd) 10511730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 10611730Sar4jc@virginia.edu : "memory"); 10711730Sar4jc@virginia.edu return {mem, rd}; 10811730Sar4jc@virginia.edu} 10911730Sar4jc@virginia.edu 11011730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 11111730Sar4jc@virginia.eduamoor_w(uint64_t mem, uint64_t rs2) 11211730Sar4jc@virginia.edu{ 11311730Sar4jc@virginia.edu uint64_t rd = 0; 11411730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 11511730Sar4jc@virginia.edu asm volatile("amoor.w %0,%2,(%1)" 11611730Sar4jc@virginia.edu : "=r" (rd) 11711730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 11811730Sar4jc@virginia.edu : "memory"); 11911730Sar4jc@virginia.edu return {mem, rd}; 12011730Sar4jc@virginia.edu} 12111730Sar4jc@virginia.edu 12211730Sar4jc@virginia.eduinline std::pair<int64_t, int64_t> 12311730Sar4jc@virginia.eduamomin_w(int64_t mem, int64_t rs2) 12411730Sar4jc@virginia.edu{ 12511730Sar4jc@virginia.edu int64_t rd = 0; 12611730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 12711730Sar4jc@virginia.edu asm volatile("amomin.w %0,%2,(%1)" 12811730Sar4jc@virginia.edu : "=r" (rd) 12911730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 13011730Sar4jc@virginia.edu : "memory"); 13111730Sar4jc@virginia.edu return {mem, rd}; 13211730Sar4jc@virginia.edu} 13311730Sar4jc@virginia.edu 13411730Sar4jc@virginia.eduinline std::pair<int64_t, int64_t> 13511730Sar4jc@virginia.eduamomax_w(int64_t mem, int64_t rs2) 13611730Sar4jc@virginia.edu{ 13711730Sar4jc@virginia.edu int64_t rd = 0; 13811730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 13911730Sar4jc@virginia.edu asm volatile("amomax.w %0,%2,(%1)" 14011730Sar4jc@virginia.edu : "=r" (rd) 14111730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 14211730Sar4jc@virginia.edu : "memory"); 14311730Sar4jc@virginia.edu return {mem, rd}; 14411730Sar4jc@virginia.edu} 14511730Sar4jc@virginia.edu 14611730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 14711730Sar4jc@virginia.eduamominu_w(uint64_t mem, uint64_t rs2) 14811730Sar4jc@virginia.edu{ 14911730Sar4jc@virginia.edu uint64_t rd = 0; 15011730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 15111730Sar4jc@virginia.edu asm volatile("amominu.w %0,%2,(%1)" 15211730Sar4jc@virginia.edu : "=r" (rd) 15311730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 15411730Sar4jc@virginia.edu : "memory"); 15511730Sar4jc@virginia.edu return {mem, rd}; 15611730Sar4jc@virginia.edu} 15711730Sar4jc@virginia.edu 15811730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 15911730Sar4jc@virginia.eduamomaxu_w(uint64_t mem, uint64_t rs2) 16011730Sar4jc@virginia.edu{ 16111730Sar4jc@virginia.edu uint64_t rd = 0; 16211730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 16311730Sar4jc@virginia.edu asm volatile("amomaxu.w %0,%2,(%1)" 16411730Sar4jc@virginia.edu : "=r" (rd) 16511730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 16611730Sar4jc@virginia.edu : "memory"); 16711730Sar4jc@virginia.edu return {mem, rd}; 16811730Sar4jc@virginia.edu} 16911730Sar4jc@virginia.edu 17011730Sar4jc@virginia.eduinline int64_t 17111730Sar4jc@virginia.edulr_d(int64_t& mem) 17211730Sar4jc@virginia.edu{ 17311730Sar4jc@virginia.edu int64_t r = 0; 17411730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 17511730Sar4jc@virginia.edu asm volatile("lr.d %0,(%1)" : "=r" (r) : "r" (addr) : "memory"); 17611730Sar4jc@virginia.edu return r; 17711730Sar4jc@virginia.edu} 17811730Sar4jc@virginia.edu 17911730Sar4jc@virginia.eduinline std::pair<int64_t, uint64_t> 18011730Sar4jc@virginia.edusc_d(int64_t rs2, int64_t& mem) 18111730Sar4jc@virginia.edu{ 18211730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 18311730Sar4jc@virginia.edu uint64_t rd = -1; 18411730Sar4jc@virginia.edu asm volatile("sc.d %0,%2,(%1)" 18511730Sar4jc@virginia.edu : "=r" (rd) 18611730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 18711730Sar4jc@virginia.edu : "memory"); 18811730Sar4jc@virginia.edu return {mem, rd}; 18911730Sar4jc@virginia.edu} 19011730Sar4jc@virginia.edu 19111730Sar4jc@virginia.eduinline std::pair<int64_t, int64_t> 19211730Sar4jc@virginia.eduamoswap_d(int64_t mem, int64_t rs2) 19311730Sar4jc@virginia.edu{ 19411730Sar4jc@virginia.edu int64_t rd = 0; 19511730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 19611730Sar4jc@virginia.edu asm volatile("amoswap.d %0,%2,(%1)" 19711730Sar4jc@virginia.edu : "=r" (rd) 19811730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 19911730Sar4jc@virginia.edu : "memory"); 20011730Sar4jc@virginia.edu return {mem, rd}; 20111730Sar4jc@virginia.edu} 20211730Sar4jc@virginia.edu 20311730Sar4jc@virginia.eduinline std::pair<int64_t, int64_t> 20411730Sar4jc@virginia.eduamoadd_d(int64_t mem, int64_t rs2) 20511730Sar4jc@virginia.edu{ 20611730Sar4jc@virginia.edu int64_t rd = 0; 20711730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 20811730Sar4jc@virginia.edu asm volatile("amoadd.d %0,%2,(%1)" 20911730Sar4jc@virginia.edu : "=r" (rd) 21011730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 21111730Sar4jc@virginia.edu : "memory"); 21211730Sar4jc@virginia.edu return {mem, rd}; 21311730Sar4jc@virginia.edu} 21411730Sar4jc@virginia.edu 21511730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 21611730Sar4jc@virginia.eduamoxor_d(uint64_t mem, uint64_t rs2) 21711730Sar4jc@virginia.edu{ 21811730Sar4jc@virginia.edu uint64_t rd = 0; 21911730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 22011730Sar4jc@virginia.edu asm volatile("amoxor.d %0,%2,(%1)" 22111730Sar4jc@virginia.edu : "=r" (rd) 22211730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 22311730Sar4jc@virginia.edu : "memory"); 22411730Sar4jc@virginia.edu return {mem, rd}; 22511730Sar4jc@virginia.edu} 22611730Sar4jc@virginia.edu 22711730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 22811730Sar4jc@virginia.eduamoand_d(uint64_t mem, uint64_t rs2) 22911730Sar4jc@virginia.edu{ 23011730Sar4jc@virginia.edu uint64_t rd = 0; 23111730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 23211730Sar4jc@virginia.edu asm volatile("amoand.d %0,%2,(%1)" 23311730Sar4jc@virginia.edu : "=r" (rd) 23411730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 23511730Sar4jc@virginia.edu : "memory"); 23611730Sar4jc@virginia.edu return {mem, rd}; 23711730Sar4jc@virginia.edu} 23811730Sar4jc@virginia.edu 23911730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 24011730Sar4jc@virginia.eduamoor_d(uint64_t mem, uint64_t rs2) 24111730Sar4jc@virginia.edu{ 24211730Sar4jc@virginia.edu uint64_t rd = 0; 24311730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 24411730Sar4jc@virginia.edu asm volatile("amoor.d %0,%2,(%1)" 24511730Sar4jc@virginia.edu : "=r" (rd) 24611730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 24711730Sar4jc@virginia.edu : "memory"); 24811730Sar4jc@virginia.edu return {mem, rd}; 24911730Sar4jc@virginia.edu} 25011730Sar4jc@virginia.edu 25111730Sar4jc@virginia.eduinline std::pair<int64_t, int64_t> 25211730Sar4jc@virginia.eduamomin_d(int64_t mem, int64_t rs2) 25311730Sar4jc@virginia.edu{ 25411730Sar4jc@virginia.edu int64_t rd = 0; 25511730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 25611730Sar4jc@virginia.edu asm volatile("amomin.d %0,%2,(%1)" 25711730Sar4jc@virginia.edu : "=r" (rd) 25811730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 25911730Sar4jc@virginia.edu : "memory"); 26011730Sar4jc@virginia.edu return {mem, rd}; 26111730Sar4jc@virginia.edu} 26211730Sar4jc@virginia.edu 26311730Sar4jc@virginia.eduinline std::pair<int64_t, int64_t> 26411730Sar4jc@virginia.eduamomax_d(int64_t mem, int64_t rs2) 26511730Sar4jc@virginia.edu{ 26611730Sar4jc@virginia.edu int64_t rd = 0; 26711730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 26811730Sar4jc@virginia.edu asm volatile("amomax.d %0,%2,(%1)" 26911730Sar4jc@virginia.edu : "=r" (rd) 27011730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 27111730Sar4jc@virginia.edu : "memory"); 27211730Sar4jc@virginia.edu return {mem, rd}; 27311730Sar4jc@virginia.edu} 27411730Sar4jc@virginia.edu 27511730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 27611730Sar4jc@virginia.eduamominu_d(uint64_t mem, uint64_t rs2) 27711730Sar4jc@virginia.edu{ 27811730Sar4jc@virginia.edu uint64_t rd = 0; 27911730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 28011730Sar4jc@virginia.edu asm volatile("amominu.d %0,%2,(%1)" 28111730Sar4jc@virginia.edu : "=r" (rd) 28211730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 28311730Sar4jc@virginia.edu : "memory"); 28411730Sar4jc@virginia.edu return {mem, rd}; 28511730Sar4jc@virginia.edu} 28611730Sar4jc@virginia.edu 28711730Sar4jc@virginia.eduinline std::pair<uint64_t, uint64_t> 28811730Sar4jc@virginia.eduamomaxu_d(uint64_t mem, uint64_t rs2) 28911730Sar4jc@virginia.edu{ 29011730Sar4jc@virginia.edu uint64_t rd = 0; 29111730Sar4jc@virginia.edu uint64_t addr = (uint64_t)&mem; 29211730Sar4jc@virginia.edu asm volatile("amomaxu.d %0,%2,(%1)" 29311730Sar4jc@virginia.edu : "=r" (rd) 29411730Sar4jc@virginia.edu : "r" (addr), "r" (rs2) 29511730Sar4jc@virginia.edu : "memory"); 29611730Sar4jc@virginia.edu return {mem, rd}; 29711730Sar4jc@virginia.edu} 29811730Sar4jc@virginia.edu 29911730Sar4jc@virginia.edu} // namespace A 300