rv64a.cpp revision 11965
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#include <cstdint> 3211730Sar4jc@virginia.edu#include <limits> 3311730Sar4jc@virginia.edu 3411730Sar4jc@virginia.edu#include "insttest.h" 3511730Sar4jc@virginia.edu#include "rv64a.h" 3611730Sar4jc@virginia.edu 3711730Sar4jc@virginia.eduint main() 3811730Sar4jc@virginia.edu{ 3911730Sar4jc@virginia.edu using namespace std; 4011730Sar4jc@virginia.edu using namespace insttest; 4111730Sar4jc@virginia.edu 4211730Sar4jc@virginia.edu // Memory (LR.W, SC.W) 4311965Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({-1, 256}, []{ 4411730Sar4jc@virginia.edu int32_t mem = -1; 4511730Sar4jc@virginia.edu int64_t rs2 = 256; 4611965Sar4jc@virginia.edu int64_t rd; 4711965Sar4jc@virginia.edu pair<int64_t, uint64_t> result; 4811965Sar4jc@virginia.edu do { 4911965Sar4jc@virginia.edu rd = A::lr_w(mem); 5011965Sar4jc@virginia.edu result = A::sc_w(rs2, mem); 5111965Sar4jc@virginia.edu } while (result.second == 1); 5211965Sar4jc@virginia.edu return pair<int64_t, uint64_t>(rd, result.first); 5311730Sar4jc@virginia.edu }, "lr.w/sc.w"); 5411730Sar4jc@virginia.edu expect<pair<bool, int64_t>>({true, 200}, []{ 5511730Sar4jc@virginia.edu int32_t mem = 200; 5611730Sar4jc@virginia.edu pair<int64_t, uint64_t> result = A::sc_w(50, mem); 5711730Sar4jc@virginia.edu return pair<bool, int64_t>(result.second == 1, mem); 5811730Sar4jc@virginia.edu }, "sc.w, no preceding lr.d"); 5911730Sar4jc@virginia.edu 6011730Sar4jc@virginia.edu // AMOSWAP.W 6111730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({65535, 255}, 6211730Sar4jc@virginia.edu []{return A::amoswap_w(255, 65535);}, "amoswap.w"); 6311730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0xFFFFFFFF, -1}, 6411730Sar4jc@virginia.edu []{return A::amoswap_w(0xFFFFFFFF, 0xFFFFFFFF);}, 6511730Sar4jc@virginia.edu "amoswap.w, sign extend"); 6611730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0x0000000180000000LL, -1}, 6711730Sar4jc@virginia.edu []{return A::amoswap_w(0x00000001FFFFFFFFLL, 6811730Sar4jc@virginia.edu 0x7FFFFFFF80000000LL);}, 6911730Sar4jc@virginia.edu "amoswap.w, truncate"); 7011730Sar4jc@virginia.edu 7111730Sar4jc@virginia.edu // AMOADD.W 7211730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({256, 255}, 7311730Sar4jc@virginia.edu []{return A::amoadd_w(255, 1);}, "amoadd.w"); 7411730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0, -1}, 7511730Sar4jc@virginia.edu []{return A::amoadd_w(0xFFFFFFFF, 1);}, 7611730Sar4jc@virginia.edu "amoadd.w, truncate/overflow"); 7711730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0xFFFFFFFF, 0x7FFFFFFF}, 7811730Sar4jc@virginia.edu []{return A::amoadd_w(0x7FFFFFFF, 0x80000000);}, 7911730Sar4jc@virginia.edu "amoadd.w, sign extend"); 8011730Sar4jc@virginia.edu 8111730Sar4jc@virginia.edu // AMOXOR.W 8211730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({0xFFFFFFFFAAAAAAAALL, -1}, 8311730Sar4jc@virginia.edu []{return A::amoxor_w(-1, 0x5555555555555555LL);}, 8411730Sar4jc@virginia.edu "amoxor.w, truncate"); 8511730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({0x80000000, -1}, 8611730Sar4jc@virginia.edu []{return A::amoxor_w(0xFFFFFFFF, 0x7FFFFFFF);}, 8711730Sar4jc@virginia.edu "amoxor.w, sign extend"); 8811730Sar4jc@virginia.edu 8911730Sar4jc@virginia.edu // AMOAND.W 9011730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({0xFFFFFFFF00000000LL, -1}, 9111730Sar4jc@virginia.edu []{return A::amoand_w(-1, 0);}, "amoand.w, truncate"); 9211730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({0x0000000080000000LL, -1}, 9311730Sar4jc@virginia.edu []{return A::amoand_w(0xFFFFFFFF,numeric_limits<int32_t>::min());}, 9411730Sar4jc@virginia.edu "amoand.w, sign extend"); 9511730Sar4jc@virginia.edu 9611730Sar4jc@virginia.edu // AMOOR.W 9711730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({0x00000000FFFFFFFFLL, 0}, 9811730Sar4jc@virginia.edu []{return A::amoor_w(0, -1);}, "amoor.w, truncate"); 9911730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({0x0000000080000000LL, 0}, 10011730Sar4jc@virginia.edu []{return A::amoor_w(0, numeric_limits<int32_t>::min());}, 10111730Sar4jc@virginia.edu "amoor.w, sign extend"); 10211730Sar4jc@virginia.edu 10311730Sar4jc@virginia.edu // AMOMIN.W 10411730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0x7FFFFFFF00000001LL, 1}, 10511730Sar4jc@virginia.edu []{return A::amomin_w(0x7FFFFFFF00000001LL, 0xFFFFFFFF000000FF);}, 10611730Sar4jc@virginia.edu "amomin.w, truncate"); 10711730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0x00000000FFFFFFFELL, -1}, 10811730Sar4jc@virginia.edu []{return A::amomin_w(0xFFFFFFFF, -2);}, "amomin.w, sign extend"); 10911730Sar4jc@virginia.edu 11011730Sar4jc@virginia.edu // AMOMAX.W 11111730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0x70000000000000FFLL, 1}, 11211730Sar4jc@virginia.edu []{return A::amomax_w(0x7000000000000001LL,0x7FFFFFFF000000FFLL);}, 11311730Sar4jc@virginia.edu "amomax.w, truncate"); 11411730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({-1, numeric_limits<int32_t>::min()}, 11511730Sar4jc@virginia.edu []{return A::amomax_w(numeric_limits<int32_t>::min(), -1);}, 11611730Sar4jc@virginia.edu "amomax.w, sign extend"); 11711730Sar4jc@virginia.edu 11811730Sar4jc@virginia.edu // AMOMINU.W 11911730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({0x0FFFFFFF000000FFLL, -1}, 12011730Sar4jc@virginia.edu []{return A::amominu_w(0x0FFFFFFFFFFFFFFFLL, 0xFFFFFFFF000000FF);}, 12111730Sar4jc@virginia.edu "amominu.w, truncate"); 12211730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({0x0000000080000000LL, -1}, 12311730Sar4jc@virginia.edu []{return A::amominu_w(0x00000000FFFFFFFFLL, 0x80000000);}, 12411730Sar4jc@virginia.edu "amominu.w, sign extend"); 12511730Sar4jc@virginia.edu 12611730Sar4jc@virginia.edu // AMOMAXU.W 12711730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({-1, 0}, 12811730Sar4jc@virginia.edu []{return A::amomaxu_w(0xFFFFFFFF00000000LL, 12911730Sar4jc@virginia.edu 0x00000000FFFFFFFFLL);}, 13011730Sar4jc@virginia.edu "amomaxu.w, truncate"); 13111730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>( 13211730Sar4jc@virginia.edu {0xFFFFFFFF, numeric_limits<int32_t>::min()}, 13311730Sar4jc@virginia.edu []{return A::amomaxu_w(0x80000000, 0xFFFFFFFF);}, 13411730Sar4jc@virginia.edu "amomaxu.w, sign extend"); 13511730Sar4jc@virginia.edu 13611730Sar4jc@virginia.edu // Memory (LR.D, SC.D) 13711965Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({-1, 256}, []{ 13811730Sar4jc@virginia.edu int64_t mem = -1; 13911730Sar4jc@virginia.edu int64_t rs2 = 256; 14011965Sar4jc@virginia.edu int64_t rd; 14111965Sar4jc@virginia.edu pair<int64_t, uint64_t> result; 14211965Sar4jc@virginia.edu do { 14311965Sar4jc@virginia.edu rd = A::lr_d(mem); 14411965Sar4jc@virginia.edu result = A::sc_d(rs2, mem); 14511965Sar4jc@virginia.edu } while (result.second == 1); 14611965Sar4jc@virginia.edu return pair<int64_t, uint64_t>(rd, result.first); 14711730Sar4jc@virginia.edu }, "lr.d/sc.d"); 14811730Sar4jc@virginia.edu expect<pair<bool, int64_t>>({true, 200}, []{ 14911730Sar4jc@virginia.edu int64_t mem = 200; 15011730Sar4jc@virginia.edu pair<int64_t, uint64_t> result = A::sc_d(50, mem); 15111730Sar4jc@virginia.edu return pair<bool, int64_t>(result.second == 1, mem); 15211730Sar4jc@virginia.edu }, "sc.d, no preceding lr.d"); 15311730Sar4jc@virginia.edu 15411730Sar4jc@virginia.edu // AMOSWAP.D 15511730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({1, -1}, []{return A::amoswap_d(-1, 1);}, 15611730Sar4jc@virginia.edu "amoswap.d"); 15711730Sar4jc@virginia.edu 15811730Sar4jc@virginia.edu // AMOADD.D 15911730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0x7000000000000000LL,0x0FFFFFFFFFFFFFFFLL}, 16011730Sar4jc@virginia.edu []{return A::amoadd_d(0x0FFFFFFFFFFFFFFFLL,0x6000000000000001LL);}, 16111730Sar4jc@virginia.edu "amoadd.d"); 16211730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0, 0x7FFFFFFFFFFFFFFFLL}, 16311730Sar4jc@virginia.edu []{return A::amoadd_d(0x7FFFFFFFFFFFFFFFLL,0x8000000000000001LL);}, 16411730Sar4jc@virginia.edu "amoadd.d, overflow"); 16511730Sar4jc@virginia.edu 16611730Sar4jc@virginia.edu // AMOXOR.D 16711730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({-1, 0xAAAAAAAAAAAAAAAALL}, 16811730Sar4jc@virginia.edu []{return A::amoxor_d(0xAAAAAAAAAAAAAAAALL,0x5555555555555555LL);}, 16911730Sar4jc@virginia.edu "amoxor.d (1)"); 17011730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0, 0xAAAAAAAAAAAAAAAALL}, 17111730Sar4jc@virginia.edu []{return A::amoxor_d(0xAAAAAAAAAAAAAAAALL,0xAAAAAAAAAAAAAAAALL);}, 17211730Sar4jc@virginia.edu "amoxor.d (0)"); 17311730Sar4jc@virginia.edu 17411730Sar4jc@virginia.edu // AMOAND.D 17511730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0xAAAAAAAAAAAAAAAALL, -1}, 17611730Sar4jc@virginia.edu []{return A::amoand_d(-1, 0xAAAAAAAAAAAAAAAALL);}, "amoand.d"); 17711730Sar4jc@virginia.edu 17811730Sar4jc@virginia.edu // AMOOR.D 17911730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({-1, 0xAAAAAAAAAAAAAAAALL}, 18011730Sar4jc@virginia.edu []{return A::amoor_d(0xAAAAAAAAAAAAAAAALL, 0x5555555555555555LL);}, 18111730Sar4jc@virginia.edu "amoor.d"); 18211730Sar4jc@virginia.edu 18311730Sar4jc@virginia.edu // AMOMIN.D 18411730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({-1, -1}, 18511730Sar4jc@virginia.edu []{return A::amomin_d(-1, 0);}, "amomin.d"); 18611730Sar4jc@virginia.edu 18711730Sar4jc@virginia.edu // AMOMAX.D 18811730Sar4jc@virginia.edu expect<pair<int64_t, int64_t>>({0, -1}, []{return A::amomax_d(-1, 0);}, 18911730Sar4jc@virginia.edu "amomax.d"); 19011730Sar4jc@virginia.edu 19111730Sar4jc@virginia.edu // AMOMINU.D 19211730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({0, -1}, 19311730Sar4jc@virginia.edu []{return A::amominu_d(-1, 0);}, "amominu.d"); 19411730Sar4jc@virginia.edu 19511730Sar4jc@virginia.edu // AMOMAXU.D 19611730Sar4jc@virginia.edu expect<pair<uint64_t, uint64_t>>({-1, -1}, []{return A::amomaxu_d(-1, 0);}, 19711730Sar4jc@virginia.edu "amomaxu.d"); 19811730Sar4jc@virginia.edu 19911730Sar4jc@virginia.edu return 0; 20011730Sar4jc@virginia.edu} 201