blob: 15d4dff232046aea3744930489037bed0ea86b89 [file]
// Copyright 2023 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// https://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
#include "riscv/riscv32gv_bin_decoder.h"
#include <cstdint>
#include "googlemock/include/gmock/gmock.h"
#include "riscv/riscv32gv_enums.h"
namespace {
// This file contains tests for verifying that the vector instructions in
// RiscV32GV are decoded properly by the generated decoder, thus validating
// the binary coder descriptions.
using OpcodeEnum = mpact::sim::riscv::isa32v::OpcodeEnum;
using mpact::sim::riscv::encoding::DecodeRiscV32GV;
// Constexpr for vector instruction opcodes for RV32GV instructions grouped by
// isa group.
// RV32V
// Vector config instructions
constexpr uint32_t kVsetvli_xn = 0b0'00000000000'00001'111'00000'1010111;
constexpr uint32_t kVsetvli_nz = 0b0'00000000000'00000'111'00001'1010111;
constexpr uint32_t kVsetvli_zz = 0b0'00000000000'00000'111'00000'1010111;
constexpr uint32_t kVsetivli = 0b11'0000000000'00000'111'00000'1010111;
constexpr uint32_t kVsetvl_xn = 0b1000000'00000'00001'111'00000'1010111;
constexpr uint32_t kVsetvl_nz = 0b1000000'00000'00000'111'00001'1010111;
constexpr uint32_t kVsetvl_zz = 0b1000000'00000'00000'111'00000'1010111;
// Vector load instructions
// Unit stride.
constexpr uint32_t kVle8 = 0b0000000'00000'00000'000'00000'000'0111;
constexpr uint32_t kVle16 = 0b0000000'00000'00000'101'00000'000'0111;
constexpr uint32_t kVle32 = 0b0000000'00000'00000'110'00000'000'0111;
constexpr uint32_t kVle64 = 0b0000000'00000'00000'111'00000'000'0111;
// Load vector mask.
constexpr uint32_t kVlm = 0b0000000'01011'00000'000'00000'000'0111;
// Load unit stride, fault first.
constexpr uint32_t kVle8ff = 0b0000000'10000'00000'000'00000'000'0111;
constexpr uint32_t kVle16ff = 0b0000000'10000'00000'101'00000'000'0111;
constexpr uint32_t kVle32ff = 0b0000000'10000'00000'110'00000'000'0111;
constexpr uint32_t kVle64ff = 0b0000000'10000'00000'111'00000'000'0111;
// Load whole register.
constexpr uint32_t kVl1re8 = 0b000'000'1'01000'00000'000'00000'000'0111;
constexpr uint32_t kVl1re16 = 0b000'000'1'01000'00000'101'00000'000'0111;
constexpr uint32_t kVl1re32 = 0b000'000'1'01000'00000'110'00000'000'0111;
constexpr uint32_t kVl1re64 = 0b000'000'1'01000'00000'111'00000'000'0111;
constexpr uint32_t kVl2re8 = 0b001'000'1'01000'00000'000'00000'000'0111;
constexpr uint32_t kVl2re16 = 0b001'000'1'01000'00000'101'00000'000'0111;
constexpr uint32_t kVl2re32 = 0b001'000'1'01000'00000'110'00000'000'0111;
constexpr uint32_t kVl2re64 = 0b001'000'1'01000'00000'111'00000'000'0111;
constexpr uint32_t kVl4re8 = 0b011'000'1'01000'00000'000'00000'000'0111;
constexpr uint32_t kVl4re16 = 0b011'000'1'01000'00000'101'00000'000'0111;
constexpr uint32_t kVl4re32 = 0b011'000'1'01000'00000'110'00000'000'0111;
constexpr uint32_t kVl4re64 = 0b011'000'1'01000'00000'111'00000'000'0111;
constexpr uint32_t kVl8re8 = 0b111'000'1'01000'00000'000'00000'000'0111;
constexpr uint32_t kVl8re16 = 0b111'000'1'01000'00000'101'00000'000'0111;
constexpr uint32_t kVl8re32 = 0b111'000'1'01000'00000'110'00000'000'0111;
constexpr uint32_t kVl8re64 = 0b111'000'1'01000'00000'111'00000'000'0111;
// Load strided.
constexpr uint32_t kVlse8 = 0b0000'10'0'00000'00000'000'00000'000'0111;
constexpr uint32_t kVlse16 = 0b0000'10'0'00000'00000'101'00000'000'0111;
constexpr uint32_t kVlse32 = 0b0000'10'0'00000'00000'110'00000'000'0111;
constexpr uint32_t kVlse64 = 0b0000'10'0'00000'00000'111'00000'000'0111;
// Load indexed, unordered.
constexpr uint32_t kVluxei8 = 0b0000'01'0'00000'00000'000'00000'000'0111;
constexpr uint32_t kVluxei16 = 0b0000'01'0'00000'00000'101'00000'000'0111;
constexpr uint32_t kVluxei32 = 0b0000'01'0'00000'00000'110'00000'000'0111;
constexpr uint32_t kVluxei64 = 0b0000'01'0'00000'00000'111'00000'000'0111;
// Load indexed, ordered.
constexpr uint32_t kVloxei8 = 0b0000'11'0'00000'00000'000'00000'000'0111;
constexpr uint32_t kVloxei16 = 0b0000'11'0'00000'00000'101'00000'000'0111;
constexpr uint32_t kVloxei32 = 0b0000'11'0'00000'00000'110'00000'000'0111;
constexpr uint32_t kVloxei64 = 0b0000'11'0'00000'00000'111'00000'000'0111;
// Load segment, unit stride.
constexpr uint32_t kVlsegNFe8 = 0b000'0'00'1'00000'00000'000'00000'000'0111;
constexpr uint32_t kVlsegNFe16 = 0b000'0'00'1'00000'00000'101'00000'000'0111;
constexpr uint32_t kVlsegNFe32 = 0b000'0'00'1'00000'00000'110'00000'000'0111;
constexpr uint32_t kVlsegNFe64 = 0b000'0'00'1'00000'00000'111'00000'000'0111;
// Load segment, strided.
constexpr uint32_t kVlssegNFe8 = 0b000'0'10'1'00000'00000'000'00000'000'0111;
constexpr uint32_t kVlssegNFe16 = 0b000'0'10'1'00000'00000'101'00000'000'0111;
constexpr uint32_t kVlssegNFe32 = 0b000'0'10'1'00000'00000'110'00000'000'0111;
constexpr uint32_t kVlssegNFe64 = 0b000'0'10'1'00000'00000'111'00000'000'0111;
// Load segment, indexed, unordered.
constexpr uint32_t kVluxsegNFei8 = 0b000'0'01'1'00000'00000'000'00000'000'0111;
constexpr uint32_t kVluxsegNFei16 = 0b000'0'01'1'00000'00000'101'00000'000'0111;
constexpr uint32_t kVluxsegNFei32 = 0b000'0'01'1'00000'00000'110'00000'000'0111;
constexpr uint32_t kVluxsegNFei64 = 0b000'0'01'1'00000'00000'111'00000'000'0111;
// Load segment, indexed, ordered.
constexpr uint32_t kVloxsegNFei8 = 0b000'0'11'1'00000'00000'000'00000'000'0111;
constexpr uint32_t kVloxsegNFei16 = 0b000'0'11'1'00000'00000'101'00000'000'0111;
constexpr uint32_t kVloxsegNFei32 = 0b000'0'11'1'00000'00000'110'00000'000'0111;
constexpr uint32_t kVloxsegNFei64 = 0b000'0'11'1'00000'00000'111'00000'000'0111;
// Vector store instructions
// Unit stride.
constexpr uint32_t kVse8 = 0b0000000'00000'00000'000'00000'0100111;
constexpr uint32_t kVse16 = 0b0000000'00000'00000'101'00000'0100111;
constexpr uint32_t kVse32 = 0b0000000'00000'00000'110'00000'0100111;
constexpr uint32_t kVse64 = 0b0000000'00000'00000'111'00000'0100111;
// Store vector mask.
constexpr uint32_t kVsm = 0b0000000'01011'00000'000'00000'0100111;
// Store, unit stride, fault first.
constexpr uint32_t kVse8ff = 0b0000000'10000'00000'000'00000'0100111;
constexpr uint32_t kVse16ff = 0b0000000'10000'00000'101'00000'0100111;
constexpr uint32_t kVse32ff = 0b0000000'10000'00000'110'00000'0100111;
constexpr uint32_t kVse64ff = 0b0000000'10000'00000'111'00000'0100111;
// Store whole register.
constexpr uint32_t kVs1re8 = 0b000'000'1'01000'00000'000'00000'010'0111;
constexpr uint32_t kVs1re16 = 0b000'000'1'01000'00000'101'00000'010'0111;
constexpr uint32_t kVs1re32 = 0b000'000'1'01000'00000'110'00000'010'0111;
constexpr uint32_t kVs1re64 = 0b000'000'1'01000'00000'111'00000'010'0111;
constexpr uint32_t kVs2re8 = 0b001'000'1'01000'00000'000'00000'010'0111;
constexpr uint32_t kVs2re16 = 0b001'000'1'01000'00000'101'00000'010'0111;
constexpr uint32_t kVs2re32 = 0b001'000'1'01000'00000'110'00000'010'0111;
constexpr uint32_t kVs2re64 = 0b001'000'1'01000'00000'111'00000'010'0111;
constexpr uint32_t kVs4re8 = 0b011'000'1'01000'00000'000'00000'010'0111;
constexpr uint32_t kVs4re16 = 0b011'000'1'01000'00000'101'00000'010'0111;
constexpr uint32_t kVs4re32 = 0b011'000'1'01000'00000'110'00000'010'0111;
constexpr uint32_t kVs4re64 = 0b011'000'1'01000'00000'111'00000'010'0111;
constexpr uint32_t kVs8re8 = 0b111'000'1'01000'00000'000'00000'010'0111;
constexpr uint32_t kVs8re16 = 0b111'000'1'01000'00000'101'00000'010'0111;
constexpr uint32_t kVs8re32 = 0b111'000'1'01000'00000'110'00000'010'0111;
constexpr uint32_t kVs8re64 = 0b111'000'1'01000'00000'111'00000'010'0111;
// Store strided.
constexpr uint32_t kVsse8 = 0b0000'10'0'00000'00000'000'00000'0100111;
constexpr uint32_t kVsse16 = 0b0000'10'0'00000'00000'101'00000'0100111;
constexpr uint32_t kVsse32 = 0b0000'10'0'00000'00000'110'00000'0100111;
constexpr uint32_t kVsse64 = 0b0000'10'0'00000'00000'111'00000'0100111;
// Store indexed, unordered.
constexpr uint32_t kVsuxei8 = 0b0000'01'0'00000'00000'000'00000'0100111;
constexpr uint32_t kVsuxei16 = 0b0000'01'0'00000'00000'101'00000'0100111;
constexpr uint32_t kVsuxei32 = 0b0000'01'0'00000'00000'110'00000'0100111;
constexpr uint32_t kVsuxei64 = 0b0000'01'0'00000'00000'111'00000'0100111;
// Stored indexed, ordered.
constexpr uint32_t kVsoxei8 = 0b0000'11'0'00000'00000'000'00000'0100111;
constexpr uint32_t kVsoxei16 = 0b0000'11'0'00000'00000'101'00000'0100111;
constexpr uint32_t kVsoxei32 = 0b0000'11'0'00000'00000'110'00000'0100111;
constexpr uint32_t kVsoxei64 = 0b0000'11'0'00000'00000'111'00000'0100111;
// Store segment, unit stride.
// Store segment, strided.
// Store segment, indexed, unordered.
// Store segment, indexed, ordered.
// Integer vector-vector, vector-scalar OPIVV, OPIVX, OPIVI
constexpr uint32_t kVaddVv = 0b000000'0'0000000000'000'00000'1010111;
constexpr uint32_t kVaddVx = 0b000000'0'0000000000'100'00000'1010111;
constexpr uint32_t kVaddVi = 0b000000'0'0000000000'011'00000'1010111;
constexpr uint32_t kVsubVv = 0b000010'0'0000000000'000'00000'1010111;
constexpr uint32_t kVsubVx = 0b000010'0'0000000000'100'00000'1010111;
constexpr uint32_t kVrsubVx = 0b000011'0'0000000000'100'00000'1010111;
constexpr uint32_t kVrsubVi = 0b000011'0'0000000000'011'00000'1010111;
constexpr uint32_t kVminuVv = 0b000100'0'0000000000'000'00000'1010111;
constexpr uint32_t kVminuVx = 0b000100'0'0000000000'100'00000'1010111;
constexpr uint32_t kVminVv = 0b000101'0'0000000000'000'00000'1010111;
constexpr uint32_t kVminVx = 0b000101'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmaxuVv = 0b000110'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmaxuVx = 0b000110'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmaxVv = 0b000111'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmaxVx = 0b000111'0'0000000000'100'00000'1010111;
constexpr uint32_t kVandVv = 0b001001'0'0000000000'000'00000'1010111;
constexpr uint32_t kVandVx = 0b001001'0'0000000000'100'00000'1010111;
constexpr uint32_t kVandVi = 0b001001'0'0000000000'011'00000'1010111;
constexpr uint32_t kVorVv = 0b001010'0'0000000000'000'00000'1010111;
constexpr uint32_t kVorVx = 0b001010'0'0000000000'100'00000'1010111;
constexpr uint32_t kVorVi = 0b001010'0'0000000000'011'00000'1010111;
constexpr uint32_t kVxorVv = 0b001011'0'0000000000'000'00000'1010111;
constexpr uint32_t kVxorVx = 0b001011'0'0000000000'100'00000'1010111;
constexpr uint32_t kVxorVi = 0b001011'0'0000000000'011'00000'1010111;
constexpr uint32_t kVrgatherVv = 0b001100'0'0000000000'000'00000'1010111;
constexpr uint32_t kVrgatherVx = 0b001100'0'0000000000'100'00000'1010111;
constexpr uint32_t kVrgatherVi = 0b001100'0'0000000000'011'00000'1010111;
constexpr uint32_t kVrgatherei16Vv = 0b001110'0'0000000000'000'00000'1010111;
constexpr uint32_t kVslideupVx = 0b001110'0'0000000000'100'00000'1010111;
constexpr uint32_t kVslideupVi = 0b001110'0'0000000000'011'00000'1010111;
constexpr uint32_t kVslidedownVx = 0b001111'0'0000000000'100'00000'1010111;
constexpr uint32_t kVslidedownVi = 0b001111'0'0000000000'011'00000'1010111;
constexpr uint32_t kVadcVv = 0b010000'0'0000000000'000'00001'1010111;
constexpr uint32_t kVadcVx = 0b010000'0'0000000000'100'00001'1010111;
constexpr uint32_t kVadcVi = 0b010000'0'0000000000'011'00001'1010111;
constexpr uint32_t kVmadcVv = 0b010001'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmadcVx = 0b010001'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmadcVi = 0b010001'0'0000000000'011'00000'1010111;
constexpr uint32_t kVsbcVv = 0b010010'0'0000000000'000'00001'1010111;
constexpr uint32_t kVsbcVx = 0b010010'0'0000000000'100'00001'1010111;
constexpr uint32_t kVmsbcVv = 0b010011'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmsbcVx = 0b010011'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmergeVv = 0b010111'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmergeVx = 0b010111'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmergeVi = 0b010111'0'0000000000'011'00000'1010111;
constexpr uint32_t kVmvVv = 0b010111'1'0000000000'000'00000'1010111;
constexpr uint32_t kVmvVx = 0b010111'1'0000000000'100'00000'1010111;
constexpr uint32_t kVmvVi = 0b010111'1'0000000000'011'00000'1010111;
constexpr uint32_t kVmseqVv = 0b011000'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmseqVx = 0b011000'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmseqVi = 0b011000'0'0000000000'011'00000'1010111;
constexpr uint32_t kVmsneVv = 0b011001'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmsneVx = 0b011001'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmsneVi = 0b011001'0'0000000000'011'00000'1010111;
constexpr uint32_t kVmsltuVv = 0b011010'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmsltuVx = 0b011010'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmsltVv = 0b011011'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmsltVx = 0b011011'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmsleuVv = 0b011100'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmsleuVx = 0b011100'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmsleuVi = 0b011100'0'0000000000'011'00000'1010111;
constexpr uint32_t kVmsleVv = 0b011101'0'0000000000'000'00000'1010111;
constexpr uint32_t kVmsleVx = 0b011101'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmsleVi = 0b011101'0'0000000000'011'00000'1010111;
constexpr uint32_t kVmsgtuVx = 0b011110'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmsgtuVi = 0b011110'0'0000000000'011'00000'1010111;
constexpr uint32_t kVmsgtVx = 0b011111'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmsgtVi = 0b011111'0'0000000000'011'00000'1010111;
constexpr uint32_t kVsadduVv = 0b100000'0'0000000000'000'00000'1010111;
constexpr uint32_t kVsadduVx = 0b100000'0'0000000000'100'00000'1010111;
constexpr uint32_t kVsadduVi = 0b100000'0'0000000000'011'00000'1010111;
constexpr uint32_t kVsaddVv = 0b100001'0'0000000000'000'00000'1010111;
constexpr uint32_t kVsaddVx = 0b100001'0'0000000000'100'00000'1010111;
constexpr uint32_t kVsaddVi = 0b100001'0'0000000000'011'00000'1010111;
constexpr uint32_t kVssubuVv = 0b100010'0'0000000000'000'00000'1010111;
constexpr uint32_t kVssubuVx = 0b100010'0'0000000000'100'00000'1010111;
constexpr uint32_t kVssubVv = 0b100011'0'0000000000'000'00000'1010111;
constexpr uint32_t kVssubVx = 0b100011'0'0000000000'100'00000'1010111;
constexpr uint32_t kVsllVv = 0b100101'0'0000000000'000'00000'1010111;
constexpr uint32_t kVsllVx = 0b100101'0'0000000000'100'00000'1010111;
constexpr uint32_t kVsllVi = 0b100101'0'0000000000'011'00000'1010111;
constexpr uint32_t kVsmulVv = 0b100111'0'0000000000'000'00000'1010111;
constexpr uint32_t kVsmulVx = 0b100111'0'0000000000'100'00000'1010111;
constexpr uint32_t kVmv1rVi = 0b100111'0'00000'00000'011'00000'1010111;
constexpr uint32_t kVmv2rVi = 0b100111'0'00000'00001'011'00000'1010111;
constexpr uint32_t kVmv4rVi = 0b100111'0'00000'00011'011'00000'1010111;
constexpr uint32_t kVmv8rVi = 0b100111'0'00000'00111'011'00000'1010111;
constexpr uint32_t kVsrlVv = 0b101000'0'0000000000'000'00000'1010111;
constexpr uint32_t kVsrlVx = 0b101000'0'0000000000'100'00000'1010111;
constexpr uint32_t kVsrlVi = 0b101000'0'0000000000'011'00000'1010111;
constexpr uint32_t kVsraVv = 0b101001'0'0000000000'000'00000'1010111;
constexpr uint32_t kVsraVx = 0b101001'0'0000000000'100'00000'1010111;
constexpr uint32_t kVsraVi = 0b101001'0'0000000000'011'00000'1010111;
constexpr uint32_t kVssrlVv = 0b101010'0'0000000000'000'00000'1010111;
constexpr uint32_t kVssrlVx = 0b101010'0'0000000000'100'00000'1010111;
constexpr uint32_t kVssrlVi = 0b101010'0'0000000000'011'00000'1010111;
constexpr uint32_t kVssraVv = 0b101011'0'0000000000'000'00000'1010111;
constexpr uint32_t kVssraVx = 0b101011'0'0000000000'100'00000'1010111;
constexpr uint32_t kVssraVi = 0b101011'0'0000000000'011'00000'1010111;
constexpr uint32_t kVnsrlVv = 0b101100'0'0000000000'000'00000'1010111;
constexpr uint32_t kVnsrlVx = 0b101100'0'0000000000'100'00000'1010111;
constexpr uint32_t kVnsrlVi = 0b101100'0'0000000000'011'00000'1010111;
constexpr uint32_t kVnsraVv = 0b101101'0'0000000000'000'00000'1010111;
constexpr uint32_t kVnsraVx = 0b101101'0'0000000000'100'00000'1010111;
constexpr uint32_t kVnsraVi = 0b101101'0'0000000000'011'00000'1010111;
constexpr uint32_t kVnclipuVv = 0b101110'0'0000000000'000'00000'1010111;
constexpr uint32_t kVnclipuVx = 0b101110'0'0000000000'100'00000'1010111;
constexpr uint32_t kVnclipuVi = 0b101110'0'0000000000'011'00000'1010111;
constexpr uint32_t kVnclipVv = 0b101111'0'0000000000'000'00000'1010111;
constexpr uint32_t kVnclipVx = 0b101111'0'0000000000'100'00000'1010111;
constexpr uint32_t kVnclipVi = 0b101111'0'0000000000'011'00000'1010111;
constexpr uint32_t kVwredsumuVv = 0b110000'0'0000000000'000'00000'1010111;
constexpr uint32_t kVwredsumVv = 0b110001'0'0000000000'000'00000'1010111;
// Integer Vector OPMVV, OPMVX
constexpr uint32_t kVredsumVv = 0b000000'0'0000000000'010'00000'1010111;
constexpr uint32_t kVredandVv = 0b000001'0'0000000000'010'00000'1010111;
constexpr uint32_t kVredorVv = 0b000010'0'0000000000'010'00000'1010111;
constexpr uint32_t kVredxorVv = 0b000011'0'0000000000'010'00000'1010111;
constexpr uint32_t kVredminuVv = 0b000100'0'0000000000'010'00000'1010111;
constexpr uint32_t kVredminVv = 0b000101'0'0000000000'010'00000'1010111;
constexpr uint32_t kVredmaxuVv = 0b000110'0'0000000000'010'00000'1010111;
constexpr uint32_t kVredmaxVv = 0b000111'0'0000000000'010'00000'1010111;
constexpr uint32_t kVaadduVv = 0b001000'0'0000000000'010'00000'1010111;
constexpr uint32_t kVaadduVx = 0b001000'0'0000000000'110'00000'1010111;
constexpr uint32_t kVaaddVv = 0b001001'0'0000000000'010'00000'1010111;
constexpr uint32_t kVaaddVx = 0b001001'0'0000000000'110'00000'1010111;
constexpr uint32_t kVasubuVv = 0b001010'0'0000000000'010'00000'1010111;
constexpr uint32_t kVasubuVx = 0b001010'0'0000000000'110'00000'1010111;
constexpr uint32_t kVasubVv = 0b001011'0'0000000000'010'00000'1010111;
constexpr uint32_t kVasubVx = 0b001011'0'0000000000'110'00000'1010111;
constexpr uint32_t kVslide1upVx = 0b001110'0'0000000000'110'00000'1010111;
constexpr uint32_t kVslide1downVx = 0b001111'0'0000000000'110'00000'1010111;
constexpr uint32_t kVcompressVv = 0b010111'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmandnotVv = 0b011000'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmandVv = 0b011001'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmorVv = 0b011010'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmxorVv = 0b011011'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmornotVv = 0b011100'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmnandVv = 0b011101'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmnorVv = 0b011110'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmxnorVv = 0b011111'0'0000000000'010'00000'1010111;
constexpr uint32_t kVdivuVv = 0b100000'0'0000000000'010'00000'1010111;
constexpr uint32_t kVdivuVx = 0b100000'0'0000000000'110'00000'1010111;
constexpr uint32_t kVdivVv = 0b100001'0'0000000000'010'00000'1010111;
constexpr uint32_t kVdivVx = 0b100001'0'0000000000'110'00000'1010111;
constexpr uint32_t kVremuVv = 0b100010'0'0000000000'010'00000'1010111;
constexpr uint32_t kVremuVx = 0b100010'0'0000000000'110'00000'1010111;
constexpr uint32_t kVremVv = 0b100011'0'0000000000'010'00000'1010111;
constexpr uint32_t kVremVx = 0b100011'0'0000000000'110'00000'1010111;
constexpr uint32_t kVmulhuVv = 0b100100'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmulhuVx = 0b100100'0'0000000000'110'00000'1010111;
constexpr uint32_t kVmulVv = 0b100101'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmulVx = 0b100101'0'0000000000'110'00000'1010111;
constexpr uint32_t kVmulhsuVv = 0b100110'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmulhsuVx = 0b100110'0'0000000000'110'00000'1010111;
constexpr uint32_t kVmulhVv = 0b100111'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmulhVx = 0b100111'0'0000000000'110'00000'1010111;
constexpr uint32_t kVmaddVv = 0b101001'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmaddVx = 0b101001'0'0000000000'110'00000'1010111;
constexpr uint32_t kVnmsubVv = 0b101011'0'0000000000'010'00000'1010111;
constexpr uint32_t kVnmsubVx = 0b101011'0'0000000000'110'00000'1010111;
constexpr uint32_t kVmaccVv = 0b101101'0'0000000000'010'00000'1010111;
constexpr uint32_t kVmaccVx = 0b101101'0'0000000000'110'00000'1010111;
constexpr uint32_t kVnmsacVv = 0b101111'0'0000000000'010'00000'1010111;
constexpr uint32_t kVnmsacVx = 0b101111'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwadduVv = 0b110000'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwadduVx = 0b110000'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwaddVv = 0b110001'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwaddVx = 0b110001'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwsubuVv = 0b110010'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwsubuVx = 0b110010'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwsubVv = 0b110011'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwsubVx = 0b110011'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwadduWVv = 0b110100'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwadduWVx = 0b110100'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwaddWVv = 0b110101'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwaddWVx = 0b110101'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwsubuWVv = 0b110110'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwsubuWVx = 0b110110'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwsubWVv = 0b110111'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwsubWVx = 0b110111'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwmuluVv = 0b111000'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwmuluVx = 0b111000'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwmulsuVv = 0b111010'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwmulsuVx = 0b111010'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwmulVv = 0b111011'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwmulVx = 0b111011'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwmaccuVv = 0b111100'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwmaccuVx = 0b111100'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwmaccVv = 0b111101'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwmaccVx = 0b111101'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwmaccusVv = 0b111110'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwmaccusVx = 0b111110'0'0000000000'110'00000'1010111;
constexpr uint32_t kVwmaccsuVv = 0b111111'0'0000000000'010'00000'1010111;
constexpr uint32_t kVwmaccsuVx = 0b111111'0'0000000000'110'00000'1010111;
// FP Vector OPFVV, OPFVF
constexpr uint32_t kVfaddVv = 0b000000'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfaddVf = 0b000000'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfredusumVv = 0b000001'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfsubVv = 0b000010'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfsubVf = 0b000010'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfredosumVv = 0b000011'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfminVv = 0b000100'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfminVf = 0b000100'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfredminVv = 0b000101'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfmaxVv = 0b000110'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfmaxVf = 0b000110'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfredmaxVv = 0b000111'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfsgnjVv = 0b001000'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfsgnjVf = 0b001000'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfsgnjnVv = 0b001001'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfsgnjnVf = 0b001001'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfsgnjxVv = 0b001010'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfsgnjxVf = 0b001010'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfslide1upVf = 0b001110'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfslide1downVf = 0b001111'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfmergeVf = 0b010111'0'0000000000'101'00000'1010111;
constexpr uint32_t kVmfeqVv = 0b011000'0'0000000000'001'00000'1010111;
constexpr uint32_t kVmfeqVf = 0b011000'0'0000000000'101'00000'1010111;
constexpr uint32_t kVmfleVv = 0b011001'0'0000000000'001'00000'1010111;
constexpr uint32_t kVmfleVf = 0b011001'0'0000000000'101'00000'1010111;
constexpr uint32_t kVmfltVv = 0b011011'0'0000000000'001'00000'1010111;
constexpr uint32_t kVmfltVf = 0b011011'0'0000000000'101'00000'1010111;
constexpr uint32_t kVmfneVv = 0b011100'0'0000000000'001'00000'1010111;
constexpr uint32_t kVmfneVf = 0b011100'0'0000000000'101'00000'1010111;
constexpr uint32_t kVmfgtVf = 0b011101'0'0000000000'101'00000'1010111;
constexpr uint32_t kVmfgeVf = 0b011111'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfdivVv = 0b100000'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfdivVf = 0b100000'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfrdivVf = 0b100001'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfmulVv = 0b100100'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfmulVf = 0b100100'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfrsubVf = 0b100111'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfmaddVv = 0b101000'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfmaddVf = 0b101000'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfnmaddVv = 0b101001'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfnmaddVf = 0b101001'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfmsubVv = 0b101010'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfmsubVf = 0b101010'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfnmsubVv = 0b101011'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfnmsubVf = 0b101011'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfmaccVv = 0b101100'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfmaccVf = 0b101100'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfnmaccVv = 0b101101'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfnmaccVf = 0b101101'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfmsacVv = 0b101110'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfmsacVf = 0b101110'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfnmsacVv = 0b101111'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfnmsacVf = 0b101111'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfwaddVv = 0b110000'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwaddVf = 0b110000'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfwredusumVv = 0b110001'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwsubVv = 0b110010'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwsubVf = 0b110010'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfwredosumVv = 0b110011'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwaddWVv = 0b110100'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwaddWVf = 0b110100'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfwsubWVv = 0b110110'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwsubWVf = 0b110110'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfwmulVv = 0b111000'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwmulVf = 0b111000'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfwmaccVv = 0b111100'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwmaccVf = 0b111100'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfwnmaccVv = 0b111101'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwnmaccVf = 0b111101'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfwmsacVv = 0b111110'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwmsacVf = 0b111110'0'0000000000'101'00000'1010111;
constexpr uint32_t kVfwnmsacVv = 0b111111'0'0000000000'001'00000'1010111;
constexpr uint32_t kVfwnmsacVf = 0b111111'0'0000000000'101'00000'1010111;
// VWXUNARY0
constexpr uint32_t kVmvXS = 0b010000'0'00000'00000'010'00000'1010111;
constexpr uint32_t kVcpop = 0b010000'0'00000'10000'010'00000'1010111;
constexpr uint32_t kVfirst = 0b010000'0'00000'10001'010'00000'1010111;
// VRXUNARY0
constexpr uint32_t kVmvSX = 0b010000'0'00000'00000'110'00000'1010111;
// VXUNARY0
constexpr uint32_t kVzextVf8 = 0b010010'0'00000'00010'010'00000'1010111;
constexpr uint32_t kVsextVf8 = 0b010010'0'00000'00011'010'00000'1010111;
constexpr uint32_t kVzextVf4 = 0b010010'0'00000'00100'010'00000'1010111;
constexpr uint32_t kVsextVf4 = 0b010010'0'00000'00101'010'00000'1010111;
constexpr uint32_t kVzextVf2 = 0b010010'0'00000'00110'010'00000'1010111;
constexpr uint32_t kVsextVf2 = 0b010010'0'00000'00111'010'00000'1010111;
// VMUNARY0
constexpr uint32_t kVmsbf = 0b010100'0'00000'00001'010'00000'1010111;
constexpr uint32_t kVmsof = 0b010100'0'00000'00010'010'00000'1010111;
constexpr uint32_t kVmsif = 0b010100'0'00000'00011'010'00000'1010111;
constexpr uint32_t kViota = 0b010100'0'00000'10000'010'00000'1010111;
constexpr uint32_t kVid = 0b010100'0'00000'10001'010'00000'1010111;
// VWFUNARY0
constexpr uint32_t kVfmvFS = 0b010000'0'00000'00000'001'00000'1010111;
// VRFUNARY0
constexpr uint32_t kVfmvSF = 0b010000'0'00000'00000'101'00000'1010111;
// VFUNARY0
constexpr uint32_t kVfcvtXuFV = 0b010010'0'00000'00000'001'00000'1010111;
constexpr uint32_t kVfcvtXFV = 0b010010'0'00000'00001'001'00000'1010111;
constexpr uint32_t kVfcvtFXuV = 0b010010'0'00000'00010'001'00000'1010111;
constexpr uint32_t kVfcvtFXV = 0b010010'0'00000'00011'001'00000'1010111;
constexpr uint32_t kVfcvtRtzXuFV = 0b010010'0'00000'00110'001'00000'1010111;
constexpr uint32_t kVfcvtRtzXFV = 0b010010'0'00000'00111'001'00000'1010111;
constexpr uint32_t kVfwcvtXuFV = 0b010010'0'00000'01000'001'00000'1010111;
constexpr uint32_t kVfwcvtXFV = 0b010010'0'00000'01001'001'00000'1010111;
constexpr uint32_t kVfwcvtFXuV = 0b010010'0'00000'01010'001'00000'1010111;
constexpr uint32_t kVfwcvtFXV = 0b010010'0'00000'01011'001'00000'1010111;
constexpr uint32_t kVfwcvtFFV = 0b010010'0'00000'01100'001'00000'1010111;
constexpr uint32_t kVfwcvtRtzXuFV = 0b010010'0'00000'01110'001'00000'1010111;
constexpr uint32_t kVfwcvtRtzXFV = 0b010010'0'00000'01111'001'00000'1010111;
constexpr uint32_t kVfncvtXuFW = 0b010010'0'00000'10000'001'00000'1010111;
constexpr uint32_t kVfncvtXFW = 0b010010'0'00000'10001'001'00000'1010111;
constexpr uint32_t kVfncvtFXuW = 0b010010'0'00000'10010'001'00000'1010111;
constexpr uint32_t kVfncvtFXW = 0b010010'0'00000'10011'001'00000'1010111;
constexpr uint32_t kVfncvtFFW = 0b010010'0'00000'10100'001'00000'1010111;
constexpr uint32_t kVfncvtRodFFW = 0b010010'0'00000'10101'001'00000'1010111;
constexpr uint32_t kVfncvtRtzXuFW = 0b010010'0'00000'10110'001'00000'1010111;
constexpr uint32_t kVfncvtRtzXFW = 0b010010'0'00000'10111'001'00000'1010111;
// VFUNARY1
constexpr uint32_t kVfsqrtV = 0b010011'0'00000'00000'001'00000'1010111;
constexpr uint32_t kVfrsqrt7V = 0b010011'0'00000'00100'001'00000'1010111;
constexpr uint32_t kVfrec7V = 0b010011'0'00000'00101'001'00000'1010111;
constexpr uint32_t kVfclassV = 0b010011'0'00000'10000'001'00000'1010111;
constexpr int kRdValue = 1;
constexpr int kSuccValue = 0xf;
constexpr int kPredValue = 0xf;
static uint32_t SetRd(uint32_t iword, uint32_t rdval) {
return (iword | ((rdval & 0x1f) << 7));
}
static uint32_t SetRs1(uint32_t iword, uint32_t rsval) {
return (iword | ((rsval & 0x1f) << 15));
}
static uint32_t SetPred(uint32_t iword, uint32_t pred) {
return (iword | ((pred & 0xf) << 24));
}
static uint32_t SetSucc(uint32_t iword, uint32_t succ) {
return (iword | ((succ & 0xf) << 20));
}
static uint32_t Set16Rd(uint32_t iword, uint32_t val) {
return (iword | ((val & 0x1f) << 7));
}
static uint32_t Set16Rs2(uint32_t iword, uint32_t val) {
return (iword | ((val & 0x1f) << 2));
}
static uint32_t SetNf(uint32_t iword, uint32_t nf) {
return (iword | ((nf & 0x7) << 29));
}
// This test is only used to make sure all functions and variables are used,
// instead of deleting them and then having to put them back later as more
// encodings are added.
TEST(RiscV32GVBinDecoderTest, None) {
(void)kRdValue;
(void)kSuccValue;
(void)kPredValue;
(void)SetRd(0, 0);
(void)SetRs1(0, 0);
(void)SetPred(0, 0);
(void)SetSucc(0, 0);
(void)Set16Rd(0, 0);
(void)Set16Rs2(0, 0);
}
TEST(RiscV32GVBinDecoderTest, VectorConfig) {
EXPECT_EQ(DecodeRiscV32GV(kVsetvli_xn), OpcodeEnum::kVsetvliXn);
EXPECT_EQ(DecodeRiscV32GV(kVsetvli_nz), OpcodeEnum::kVsetvliNz);
EXPECT_EQ(DecodeRiscV32GV(kVsetvli_zz), OpcodeEnum::kVsetvliZz);
EXPECT_EQ(DecodeRiscV32GV(kVsetivli), OpcodeEnum::kVsetivli);
EXPECT_EQ(DecodeRiscV32GV(kVsetvl_xn), OpcodeEnum::kVsetvlXn);
EXPECT_EQ(DecodeRiscV32GV(kVsetvl_nz), OpcodeEnum::kVsetvlNz);
EXPECT_EQ(DecodeRiscV32GV(kVsetvl_zz), OpcodeEnum::kVsetvlZz);
}
TEST(RiscV32GVBinDecoderTest, VectorLoads) {
EXPECT_EQ(DecodeRiscV32GV(kVle8), OpcodeEnum::kVle8);
EXPECT_EQ(DecodeRiscV32GV(kVle16), OpcodeEnum::kVle16);
EXPECT_EQ(DecodeRiscV32GV(kVle32), OpcodeEnum::kVle32);
EXPECT_EQ(DecodeRiscV32GV(kVle64), OpcodeEnum::kVle64);
EXPECT_EQ(DecodeRiscV32GV(kVlm), OpcodeEnum::kVlm);
EXPECT_EQ(DecodeRiscV32GV(kVle8ff), OpcodeEnum::kVle8ff);
EXPECT_EQ(DecodeRiscV32GV(kVle16ff), OpcodeEnum::kVle16ff);
EXPECT_EQ(DecodeRiscV32GV(kVle32ff), OpcodeEnum::kVle32ff);
EXPECT_EQ(DecodeRiscV32GV(kVle64ff), OpcodeEnum::kVle64ff);
EXPECT_EQ(DecodeRiscV32GV(kVl1re8), OpcodeEnum::kVl1re8);
EXPECT_EQ(DecodeRiscV32GV(kVl1re16), OpcodeEnum::kVl1re16);
EXPECT_EQ(DecodeRiscV32GV(kVl1re32), OpcodeEnum::kVl1re32);
EXPECT_EQ(DecodeRiscV32GV(kVl1re64), OpcodeEnum::kVl1re64);
EXPECT_EQ(DecodeRiscV32GV(kVl2re8), OpcodeEnum::kVl2re8);
EXPECT_EQ(DecodeRiscV32GV(kVl2re16), OpcodeEnum::kVl2re16);
EXPECT_EQ(DecodeRiscV32GV(kVl2re32), OpcodeEnum::kVl2re32);
EXPECT_EQ(DecodeRiscV32GV(kVl2re64), OpcodeEnum::kVl2re64);
EXPECT_EQ(DecodeRiscV32GV(kVl4re8), OpcodeEnum::kVl4re8);
EXPECT_EQ(DecodeRiscV32GV(kVl4re16), OpcodeEnum::kVl4re16);
EXPECT_EQ(DecodeRiscV32GV(kVl4re32), OpcodeEnum::kVl4re32);
EXPECT_EQ(DecodeRiscV32GV(kVl4re64), OpcodeEnum::kVl4re64);
EXPECT_EQ(DecodeRiscV32GV(kVl8re8), OpcodeEnum::kVl8re8);
EXPECT_EQ(DecodeRiscV32GV(kVl8re16), OpcodeEnum::kVl8re16);
EXPECT_EQ(DecodeRiscV32GV(kVl8re32), OpcodeEnum::kVl8re32);
EXPECT_EQ(DecodeRiscV32GV(kVl8re64), OpcodeEnum::kVl8re64);
EXPECT_EQ(DecodeRiscV32GV(kVlse8), OpcodeEnum::kVlse8);
EXPECT_EQ(DecodeRiscV32GV(kVlse16), OpcodeEnum::kVlse16);
EXPECT_EQ(DecodeRiscV32GV(kVlse32), OpcodeEnum::kVlse32);
EXPECT_EQ(DecodeRiscV32GV(kVlse64), OpcodeEnum::kVlse64);
EXPECT_EQ(DecodeRiscV32GV(kVluxei8), OpcodeEnum::kVluxei8);
EXPECT_EQ(DecodeRiscV32GV(kVluxei16), OpcodeEnum::kVluxei16);
EXPECT_EQ(DecodeRiscV32GV(kVluxei32), OpcodeEnum::kVluxei32);
EXPECT_EQ(DecodeRiscV32GV(kVluxei64), OpcodeEnum::kVluxei64);
EXPECT_EQ(DecodeRiscV32GV(kVloxei8), OpcodeEnum::kVloxei8);
EXPECT_EQ(DecodeRiscV32GV(kVloxei16), OpcodeEnum::kVloxei16);
EXPECT_EQ(DecodeRiscV32GV(kVloxei32), OpcodeEnum::kVloxei32);
EXPECT_EQ(DecodeRiscV32GV(kVloxei64), OpcodeEnum::kVloxei64);
for (int nf = 1; nf < 8; nf++) {
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVlsegNFe8, nf)), OpcodeEnum::kVlsege8);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVlsegNFe16, nf)), OpcodeEnum::kVlsege16);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVlsegNFe32, nf)), OpcodeEnum::kVlsege32);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVlsegNFe64, nf)), OpcodeEnum::kVlsege64);
}
for (int nf = 1; nf < 8; nf++) {
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVlssegNFe8, nf)), OpcodeEnum::kVlssege8);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVlssegNFe16, nf)), OpcodeEnum::kVlssege16);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVlssegNFe32, nf)), OpcodeEnum::kVlssege32);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVlssegNFe64, nf)), OpcodeEnum::kVlssege64);
}
for (int nf = 1; nf < 8; nf++) {
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVluxsegNFei8, nf)),
OpcodeEnum::kVluxsegei8);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVluxsegNFei16, nf)),
OpcodeEnum::kVluxsegei16);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVluxsegNFei32, nf)),
OpcodeEnum::kVluxsegei32);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVluxsegNFei64, nf)),
OpcodeEnum::kVluxsegei64);
}
for (int nf = 1; nf < 8; nf++) {
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVloxsegNFei8, nf)),
OpcodeEnum::kVloxsegei8);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVloxsegNFei16, nf)),
OpcodeEnum::kVloxsegei16);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVloxsegNFei32, nf)),
OpcodeEnum::kVloxsegei32);
EXPECT_EQ(DecodeRiscV32GV(SetNf(kVloxsegNFei64, nf)),
OpcodeEnum::kVloxsegei64);
}
}
TEST(RiscV32GVBinDecoderTest, VectorStores) {
// Unit stride.
EXPECT_EQ(DecodeRiscV32GV(kVse8), OpcodeEnum::kVse8);
EXPECT_EQ(DecodeRiscV32GV(kVse16), OpcodeEnum::kVse16);
EXPECT_EQ(DecodeRiscV32GV(kVse32), OpcodeEnum::kVse32);
EXPECT_EQ(DecodeRiscV32GV(kVse64), OpcodeEnum::kVse64);
// Store mask.
EXPECT_EQ(DecodeRiscV32GV(kVsm), OpcodeEnum::kVsm);
// Unit stride, fail first.
EXPECT_EQ(DecodeRiscV32GV(kVse8ff), OpcodeEnum::kVse8ff);
EXPECT_EQ(DecodeRiscV32GV(kVse16ff), OpcodeEnum::kVse16ff);
EXPECT_EQ(DecodeRiscV32GV(kVse32ff), OpcodeEnum::kVse32ff);
EXPECT_EQ(DecodeRiscV32GV(kVse64ff), OpcodeEnum::kVse64ff);
// Store whole register.
EXPECT_EQ(DecodeRiscV32GV(kVs1re8), OpcodeEnum::kVs1re8);
EXPECT_EQ(DecodeRiscV32GV(kVs1re16), OpcodeEnum::kVs1re16);
EXPECT_EQ(DecodeRiscV32GV(kVs1re32), OpcodeEnum::kVs1re32);
EXPECT_EQ(DecodeRiscV32GV(kVs1re64), OpcodeEnum::kVs1re64);
EXPECT_EQ(DecodeRiscV32GV(kVs2re8), OpcodeEnum::kVs2re8);
EXPECT_EQ(DecodeRiscV32GV(kVs2re16), OpcodeEnum::kVs2re16);
EXPECT_EQ(DecodeRiscV32GV(kVs2re32), OpcodeEnum::kVs2re32);
EXPECT_EQ(DecodeRiscV32GV(kVs2re64), OpcodeEnum::kVs2re64);
EXPECT_EQ(DecodeRiscV32GV(kVs4re8), OpcodeEnum::kVs4re8);
EXPECT_EQ(DecodeRiscV32GV(kVs4re16), OpcodeEnum::kVs4re16);
EXPECT_EQ(DecodeRiscV32GV(kVs4re32), OpcodeEnum::kVs4re32);
EXPECT_EQ(DecodeRiscV32GV(kVs4re64), OpcodeEnum::kVs4re64);
EXPECT_EQ(DecodeRiscV32GV(kVs8re8), OpcodeEnum::kVs8re8);
EXPECT_EQ(DecodeRiscV32GV(kVs8re16), OpcodeEnum::kVs8re16);
EXPECT_EQ(DecodeRiscV32GV(kVs8re32), OpcodeEnum::kVs8re32);
EXPECT_EQ(DecodeRiscV32GV(kVs8re64), OpcodeEnum::kVs8re64);
// Store strided.
EXPECT_EQ(DecodeRiscV32GV(kVsse8), OpcodeEnum::kVsse8);
EXPECT_EQ(DecodeRiscV32GV(kVsse16), OpcodeEnum::kVsse16);
EXPECT_EQ(DecodeRiscV32GV(kVsse32), OpcodeEnum::kVsse32);
EXPECT_EQ(DecodeRiscV32GV(kVsse64), OpcodeEnum::kVsse64);
// Store indexed, unordered.
EXPECT_EQ(DecodeRiscV32GV(kVsuxei8), OpcodeEnum::kVsuxei8);
EXPECT_EQ(DecodeRiscV32GV(kVsuxei16), OpcodeEnum::kVsuxei16);
EXPECT_EQ(DecodeRiscV32GV(kVsuxei32), OpcodeEnum::kVsuxei32);
EXPECT_EQ(DecodeRiscV32GV(kVsuxei64), OpcodeEnum::kVsuxei64);
// Store indexed, ordered.
EXPECT_EQ(DecodeRiscV32GV(kVsoxei8), OpcodeEnum::kVsoxei8);
EXPECT_EQ(DecodeRiscV32GV(kVsoxei16), OpcodeEnum::kVsoxei16);
EXPECT_EQ(DecodeRiscV32GV(kVsoxei32), OpcodeEnum::kVsoxei32);
EXPECT_EQ(DecodeRiscV32GV(kVsoxei64), OpcodeEnum::kVsoxei64);
}
TEST(RiscV32GVBinDecoderTest, OPIVV_OPIVX_OPIVI) {
EXPECT_EQ(DecodeRiscV32GV(kVaddVv), OpcodeEnum::kVaddVv);
EXPECT_EQ(DecodeRiscV32GV(kVaddVx), OpcodeEnum::kVaddVx);
EXPECT_EQ(DecodeRiscV32GV(kVaddVi), OpcodeEnum::kVaddVi);
EXPECT_EQ(DecodeRiscV32GV(kVsubVv), OpcodeEnum::kVsubVv);
EXPECT_EQ(DecodeRiscV32GV(kVsubVx), OpcodeEnum::kVsubVx);
EXPECT_EQ(DecodeRiscV32GV(kVrsubVx), OpcodeEnum::kVrsubVx);
EXPECT_EQ(DecodeRiscV32GV(kVrsubVi), OpcodeEnum::kVrsubVi);
EXPECT_EQ(DecodeRiscV32GV(kVminuVv), OpcodeEnum::kVminuVv);
EXPECT_EQ(DecodeRiscV32GV(kVminuVx), OpcodeEnum::kVminuVx);
EXPECT_EQ(DecodeRiscV32GV(kVminVv), OpcodeEnum::kVminVv);
EXPECT_EQ(DecodeRiscV32GV(kVminVx), OpcodeEnum::kVminVx);
EXPECT_EQ(DecodeRiscV32GV(kVmaxuVv), OpcodeEnum::kVmaxuVv);
EXPECT_EQ(DecodeRiscV32GV(kVmaxuVx), OpcodeEnum::kVmaxuVx);
EXPECT_EQ(DecodeRiscV32GV(kVmaxVv), OpcodeEnum::kVmaxVv);
EXPECT_EQ(DecodeRiscV32GV(kVmaxVx), OpcodeEnum::kVmaxVx);
EXPECT_EQ(DecodeRiscV32GV(kVandVv), OpcodeEnum::kVandVv);
EXPECT_EQ(DecodeRiscV32GV(kVandVx), OpcodeEnum::kVandVx);
EXPECT_EQ(DecodeRiscV32GV(kVandVi), OpcodeEnum::kVandVi);
EXPECT_EQ(DecodeRiscV32GV(kVorVv), OpcodeEnum::kVorVv);
EXPECT_EQ(DecodeRiscV32GV(kVorVx), OpcodeEnum::kVorVx);
EXPECT_EQ(DecodeRiscV32GV(kVorVi), OpcodeEnum::kVorVi);
EXPECT_EQ(DecodeRiscV32GV(kVxorVv), OpcodeEnum::kVxorVv);
EXPECT_EQ(DecodeRiscV32GV(kVxorVx), OpcodeEnum::kVxorVx);
EXPECT_EQ(DecodeRiscV32GV(kVxorVi), OpcodeEnum::kVxorVi);
EXPECT_EQ(DecodeRiscV32GV(kVrgatherVv), OpcodeEnum::kVrgatherVv);
EXPECT_EQ(DecodeRiscV32GV(kVrgatherVx), OpcodeEnum::kVrgatherVx);
EXPECT_EQ(DecodeRiscV32GV(kVrgatherVi), OpcodeEnum::kVrgatherVi);
EXPECT_EQ(DecodeRiscV32GV(kVrgatherei16Vv), OpcodeEnum::kVrgatherei16Vv);
EXPECT_EQ(DecodeRiscV32GV(kVslideupVx), OpcodeEnum::kVslideupVx);
EXPECT_EQ(DecodeRiscV32GV(kVslideupVi), OpcodeEnum::kVslideupVi);
EXPECT_EQ(DecodeRiscV32GV(kVslidedownVx), OpcodeEnum::kVslidedownVx);
EXPECT_EQ(DecodeRiscV32GV(kVslidedownVi), OpcodeEnum::kVslidedownVi);
EXPECT_EQ(DecodeRiscV32GV(kVadcVv), OpcodeEnum::kVadcVv);
EXPECT_EQ(DecodeRiscV32GV(kVadcVx), OpcodeEnum::kVadcVx);
EXPECT_EQ(DecodeRiscV32GV(kVadcVi), OpcodeEnum::kVadcVi);
EXPECT_EQ(DecodeRiscV32GV(kVmadcVv), OpcodeEnum::kVmadcVv);
EXPECT_EQ(DecodeRiscV32GV(kVmadcVx), OpcodeEnum::kVmadcVx);
EXPECT_EQ(DecodeRiscV32GV(kVmadcVi), OpcodeEnum::kVmadcVi);
EXPECT_EQ(DecodeRiscV32GV(kVsbcVv), OpcodeEnum::kVsbcVv);
EXPECT_EQ(DecodeRiscV32GV(kVsbcVx), OpcodeEnum::kVsbcVx);
EXPECT_EQ(DecodeRiscV32GV(kVmsbcVv), OpcodeEnum::kVmsbcVv);
EXPECT_EQ(DecodeRiscV32GV(kVmsbcVx), OpcodeEnum::kVmsbcVx);
EXPECT_EQ(DecodeRiscV32GV(kVmergeVv), OpcodeEnum::kVmergeVv);
EXPECT_EQ(DecodeRiscV32GV(kVmergeVx), OpcodeEnum::kVmergeVx);
EXPECT_EQ(DecodeRiscV32GV(kVmergeVi), OpcodeEnum::kVmergeVi);
EXPECT_EQ(DecodeRiscV32GV(kVmvVv), OpcodeEnum::kVmvVv);
EXPECT_EQ(DecodeRiscV32GV(kVmvVx), OpcodeEnum::kVmvVx);
EXPECT_EQ(DecodeRiscV32GV(kVmvVi), OpcodeEnum::kVmvVi);
EXPECT_EQ(DecodeRiscV32GV(kVmseqVv), OpcodeEnum::kVmseqVv);
EXPECT_EQ(DecodeRiscV32GV(kVmseqVx), OpcodeEnum::kVmseqVx);
EXPECT_EQ(DecodeRiscV32GV(kVmseqVi), OpcodeEnum::kVmseqVi);
EXPECT_EQ(DecodeRiscV32GV(kVmsneVv), OpcodeEnum::kVmsneVv);
EXPECT_EQ(DecodeRiscV32GV(kVmsneVx), OpcodeEnum::kVmsneVx);
EXPECT_EQ(DecodeRiscV32GV(kVmsneVi), OpcodeEnum::kVmsneVi);
EXPECT_EQ(DecodeRiscV32GV(kVmsltuVv), OpcodeEnum::kVmsltuVv);
EXPECT_EQ(DecodeRiscV32GV(kVmsltuVx), OpcodeEnum::kVmsltuVx);
EXPECT_EQ(DecodeRiscV32GV(kVmsltVv), OpcodeEnum::kVmsltVv);
EXPECT_EQ(DecodeRiscV32GV(kVmsltVx), OpcodeEnum::kVmsltVx);
EXPECT_EQ(DecodeRiscV32GV(kVmsleuVv), OpcodeEnum::kVmsleuVv);
EXPECT_EQ(DecodeRiscV32GV(kVmsleuVx), OpcodeEnum::kVmsleuVx);
EXPECT_EQ(DecodeRiscV32GV(kVmsleuVi), OpcodeEnum::kVmsleuVi);
EXPECT_EQ(DecodeRiscV32GV(kVmsleVv), OpcodeEnum::kVmsleVv);
EXPECT_EQ(DecodeRiscV32GV(kVmsleVx), OpcodeEnum::kVmsleVx);
EXPECT_EQ(DecodeRiscV32GV(kVmsleVi), OpcodeEnum::kVmsleVi);
EXPECT_EQ(DecodeRiscV32GV(kVmsgtuVx), OpcodeEnum::kVmsgtuVx);
EXPECT_EQ(DecodeRiscV32GV(kVmsgtuVi), OpcodeEnum::kVmsgtuVi);
EXPECT_EQ(DecodeRiscV32GV(kVmsgtVx), OpcodeEnum::kVmsgtVx);
EXPECT_EQ(DecodeRiscV32GV(kVmsgtVi), OpcodeEnum::kVmsgtVi);
EXPECT_EQ(DecodeRiscV32GV(kVsadduVv), OpcodeEnum::kVsadduVv);
EXPECT_EQ(DecodeRiscV32GV(kVsadduVx), OpcodeEnum::kVsadduVx);
EXPECT_EQ(DecodeRiscV32GV(kVsadduVi), OpcodeEnum::kVsadduVi);
EXPECT_EQ(DecodeRiscV32GV(kVsaddVv), OpcodeEnum::kVsaddVv);
EXPECT_EQ(DecodeRiscV32GV(kVsaddVx), OpcodeEnum::kVsaddVx);
EXPECT_EQ(DecodeRiscV32GV(kVsaddVi), OpcodeEnum::kVsaddVi);
EXPECT_EQ(DecodeRiscV32GV(kVssubuVv), OpcodeEnum::kVssubuVv);
EXPECT_EQ(DecodeRiscV32GV(kVssubuVx), OpcodeEnum::kVssubuVx);
EXPECT_EQ(DecodeRiscV32GV(kVssubVv), OpcodeEnum::kVssubVv);
EXPECT_EQ(DecodeRiscV32GV(kVssubVx), OpcodeEnum::kVssubVx);
EXPECT_EQ(DecodeRiscV32GV(kVsllVv), OpcodeEnum::kVsllVv);
EXPECT_EQ(DecodeRiscV32GV(kVsllVx), OpcodeEnum::kVsllVx);
EXPECT_EQ(DecodeRiscV32GV(kVsllVi), OpcodeEnum::kVsllVi);
EXPECT_EQ(DecodeRiscV32GV(kVsmulVv), OpcodeEnum::kVsmulVv);
EXPECT_EQ(DecodeRiscV32GV(kVsmulVx), OpcodeEnum::kVsmulVx);
EXPECT_EQ(DecodeRiscV32GV(kVmv1rVi), OpcodeEnum::kVmv1rVi);
EXPECT_EQ(DecodeRiscV32GV(kVmv2rVi), OpcodeEnum::kVmv2rVi);
EXPECT_EQ(DecodeRiscV32GV(kVmv4rVi), OpcodeEnum::kVmv4rVi);
EXPECT_EQ(DecodeRiscV32GV(kVmv8rVi), OpcodeEnum::kVmv8rVi);
EXPECT_EQ(DecodeRiscV32GV(kVsrlVv), OpcodeEnum::kVsrlVv);
EXPECT_EQ(DecodeRiscV32GV(kVsrlVx), OpcodeEnum::kVsrlVx);
EXPECT_EQ(DecodeRiscV32GV(kVsrlVi), OpcodeEnum::kVsrlVi);
EXPECT_EQ(DecodeRiscV32GV(kVsraVv), OpcodeEnum::kVsraVv);
EXPECT_EQ(DecodeRiscV32GV(kVsraVx), OpcodeEnum::kVsraVx);
EXPECT_EQ(DecodeRiscV32GV(kVsraVi), OpcodeEnum::kVsraVi);
EXPECT_EQ(DecodeRiscV32GV(kVssrlVv), OpcodeEnum::kVssrlVv);
EXPECT_EQ(DecodeRiscV32GV(kVssrlVx), OpcodeEnum::kVssrlVx);
EXPECT_EQ(DecodeRiscV32GV(kVssrlVi), OpcodeEnum::kVssrlVi);
EXPECT_EQ(DecodeRiscV32GV(kVssraVv), OpcodeEnum::kVssraVv);
EXPECT_EQ(DecodeRiscV32GV(kVssraVx), OpcodeEnum::kVssraVx);
EXPECT_EQ(DecodeRiscV32GV(kVssraVi), OpcodeEnum::kVssraVi);
EXPECT_EQ(DecodeRiscV32GV(kVnsrlVv), OpcodeEnum::kVnsrlVv);
EXPECT_EQ(DecodeRiscV32GV(kVnsrlVx), OpcodeEnum::kVnsrlVx);
EXPECT_EQ(DecodeRiscV32GV(kVnsrlVi), OpcodeEnum::kVnsrlVi);
EXPECT_EQ(DecodeRiscV32GV(kVnsraVv), OpcodeEnum::kVnsraVv);
EXPECT_EQ(DecodeRiscV32GV(kVnsraVx), OpcodeEnum::kVnsraVx);
EXPECT_EQ(DecodeRiscV32GV(kVnsraVi), OpcodeEnum::kVnsraVi);
EXPECT_EQ(DecodeRiscV32GV(kVnclipuVv), OpcodeEnum::kVnclipuVv);
EXPECT_EQ(DecodeRiscV32GV(kVnclipuVx), OpcodeEnum::kVnclipuVx);
EXPECT_EQ(DecodeRiscV32GV(kVnclipuVi), OpcodeEnum::kVnclipuVi);
EXPECT_EQ(DecodeRiscV32GV(kVnclipVv), OpcodeEnum::kVnclipVv);
EXPECT_EQ(DecodeRiscV32GV(kVnclipVx), OpcodeEnum::kVnclipVx);
EXPECT_EQ(DecodeRiscV32GV(kVnclipVi), OpcodeEnum::kVnclipVi);
EXPECT_EQ(DecodeRiscV32GV(kVwredsumuVv), OpcodeEnum::kVwredsumuVv);
EXPECT_EQ(DecodeRiscV32GV(kVwredsumVv), OpcodeEnum::kVwredsumVv);
}
TEST(RiscV32GVBinDecoderTest, OPPMVV_OPMVX) {
EXPECT_EQ(DecodeRiscV32GV(kVredsumVv), OpcodeEnum::kVredsumVv);
EXPECT_EQ(DecodeRiscV32GV(kVredandVv), OpcodeEnum::kVredandVv);
EXPECT_EQ(DecodeRiscV32GV(kVredorVv), OpcodeEnum::kVredorVv);
EXPECT_EQ(DecodeRiscV32GV(kVredxorVv), OpcodeEnum::kVredxorVv);
EXPECT_EQ(DecodeRiscV32GV(kVredminuVv), OpcodeEnum::kVredminuVv);
EXPECT_EQ(DecodeRiscV32GV(kVredminVv), OpcodeEnum::kVredminVv);
EXPECT_EQ(DecodeRiscV32GV(kVredmaxuVv), OpcodeEnum::kVredmaxuVv);
EXPECT_EQ(DecodeRiscV32GV(kVredmaxVv), OpcodeEnum::kVredmaxVv);
EXPECT_EQ(DecodeRiscV32GV(kVaadduVv), OpcodeEnum::kVaadduVv);
EXPECT_EQ(DecodeRiscV32GV(kVaadduVx), OpcodeEnum::kVaadduVx);
EXPECT_EQ(DecodeRiscV32GV(kVaaddVv), OpcodeEnum::kVaaddVv);
EXPECT_EQ(DecodeRiscV32GV(kVaaddVx), OpcodeEnum::kVaaddVx);
EXPECT_EQ(DecodeRiscV32GV(kVasubuVv), OpcodeEnum::kVasubuVv);
EXPECT_EQ(DecodeRiscV32GV(kVasubuVx), OpcodeEnum::kVasubuVx);
EXPECT_EQ(DecodeRiscV32GV(kVasubVv), OpcodeEnum::kVasubVv);
EXPECT_EQ(DecodeRiscV32GV(kVasubVx), OpcodeEnum::kVasubVx);
EXPECT_EQ(DecodeRiscV32GV(kVslide1upVx), OpcodeEnum::kVslide1upVx);
EXPECT_EQ(DecodeRiscV32GV(kVslide1downVx), OpcodeEnum::kVslide1downVx);
EXPECT_EQ(DecodeRiscV32GV(kVcompressVv), OpcodeEnum::kVcompressVv);
EXPECT_EQ(DecodeRiscV32GV(kVmandnotVv), OpcodeEnum::kVmandnotVv);
EXPECT_EQ(DecodeRiscV32GV(kVmandVv), OpcodeEnum::kVmandVv);
EXPECT_EQ(DecodeRiscV32GV(kVmorVv), OpcodeEnum::kVmorVv);
EXPECT_EQ(DecodeRiscV32GV(kVmxorVv), OpcodeEnum::kVmxorVv);
EXPECT_EQ(DecodeRiscV32GV(kVmornotVv), OpcodeEnum::kVmornotVv);
EXPECT_EQ(DecodeRiscV32GV(kVmnandVv), OpcodeEnum::kVmnandVv);
EXPECT_EQ(DecodeRiscV32GV(kVmnorVv), OpcodeEnum::kVmnorVv);
EXPECT_EQ(DecodeRiscV32GV(kVmxnorVv), OpcodeEnum::kVmxnorVv);
EXPECT_EQ(DecodeRiscV32GV(kVdivuVv), OpcodeEnum::kVdivuVv);
EXPECT_EQ(DecodeRiscV32GV(kVdivuVx), OpcodeEnum::kVdivuVx);
EXPECT_EQ(DecodeRiscV32GV(kVdivVv), OpcodeEnum::kVdivVv);
EXPECT_EQ(DecodeRiscV32GV(kVdivVx), OpcodeEnum::kVdivVx);
EXPECT_EQ(DecodeRiscV32GV(kVremuVv), OpcodeEnum::kVremuVv);
EXPECT_EQ(DecodeRiscV32GV(kVremuVx), OpcodeEnum::kVremuVx);
EXPECT_EQ(DecodeRiscV32GV(kVremVv), OpcodeEnum::kVremVv);
EXPECT_EQ(DecodeRiscV32GV(kVremVx), OpcodeEnum::kVremVx);
EXPECT_EQ(DecodeRiscV32GV(kVmulhuVv), OpcodeEnum::kVmulhuVv);
EXPECT_EQ(DecodeRiscV32GV(kVmulhuVx), OpcodeEnum::kVmulhuVx);
EXPECT_EQ(DecodeRiscV32GV(kVmulVv), OpcodeEnum::kVmulVv);
EXPECT_EQ(DecodeRiscV32GV(kVmulVx), OpcodeEnum::kVmulVx);
EXPECT_EQ(DecodeRiscV32GV(kVmulhsuVv), OpcodeEnum::kVmulhsuVv);
EXPECT_EQ(DecodeRiscV32GV(kVmulhsuVx), OpcodeEnum::kVmulhsuVx);
EXPECT_EQ(DecodeRiscV32GV(kVmulhVv), OpcodeEnum::kVmulhVv);
EXPECT_EQ(DecodeRiscV32GV(kVmulhVx), OpcodeEnum::kVmulhVx);
EXPECT_EQ(DecodeRiscV32GV(kVmaddVv), OpcodeEnum::kVmaddVv);
EXPECT_EQ(DecodeRiscV32GV(kVmaddVx), OpcodeEnum::kVmaddVx);
EXPECT_EQ(DecodeRiscV32GV(kVnmsubVv), OpcodeEnum::kVnmsubVv);
EXPECT_EQ(DecodeRiscV32GV(kVnmsubVx), OpcodeEnum::kVnmsubVx);
EXPECT_EQ(DecodeRiscV32GV(kVmaccVv), OpcodeEnum::kVmaccVv);
EXPECT_EQ(DecodeRiscV32GV(kVmaccVx), OpcodeEnum::kVmaccVx);
EXPECT_EQ(DecodeRiscV32GV(kVnmsacVv), OpcodeEnum::kVnmsacVv);
EXPECT_EQ(DecodeRiscV32GV(kVnmsacVx), OpcodeEnum::kVnmsacVx);
EXPECT_EQ(DecodeRiscV32GV(kVwadduVv), OpcodeEnum::kVwadduVv);
EXPECT_EQ(DecodeRiscV32GV(kVwadduVx), OpcodeEnum::kVwadduVx);
EXPECT_EQ(DecodeRiscV32GV(kVwaddVv), OpcodeEnum::kVwaddVv);
EXPECT_EQ(DecodeRiscV32GV(kVwaddVx), OpcodeEnum::kVwaddVx);
EXPECT_EQ(DecodeRiscV32GV(kVwsubuVv), OpcodeEnum::kVwsubuVv);
EXPECT_EQ(DecodeRiscV32GV(kVwsubuVx), OpcodeEnum::kVwsubuVx);
EXPECT_EQ(DecodeRiscV32GV(kVwsubVv), OpcodeEnum::kVwsubVv);
EXPECT_EQ(DecodeRiscV32GV(kVwsubVx), OpcodeEnum::kVwsubVx);
EXPECT_EQ(DecodeRiscV32GV(kVwadduWVv), OpcodeEnum::kVwadduWVv);
EXPECT_EQ(DecodeRiscV32GV(kVwadduWVx), OpcodeEnum::kVwadduWVx);
EXPECT_EQ(DecodeRiscV32GV(kVwaddWVv), OpcodeEnum::kVwaddWVv);
EXPECT_EQ(DecodeRiscV32GV(kVwaddWVx), OpcodeEnum::kVwaddWVx);
EXPECT_EQ(DecodeRiscV32GV(kVwsubuWVv), OpcodeEnum::kVwsubuWVv);
EXPECT_EQ(DecodeRiscV32GV(kVwsubuWVx), OpcodeEnum::kVwsubuWVx);
EXPECT_EQ(DecodeRiscV32GV(kVwsubWVv), OpcodeEnum::kVwsubWVv);
EXPECT_EQ(DecodeRiscV32GV(kVwsubWVx), OpcodeEnum::kVwsubWVx);
EXPECT_EQ(DecodeRiscV32GV(kVwmuluVv), OpcodeEnum::kVwmuluVv);
EXPECT_EQ(DecodeRiscV32GV(kVwmuluVx), OpcodeEnum::kVwmuluVx);
EXPECT_EQ(DecodeRiscV32GV(kVwmulsuVv), OpcodeEnum::kVwmulsuVv);
EXPECT_EQ(DecodeRiscV32GV(kVwmulsuVx), OpcodeEnum::kVwmulsuVx);
EXPECT_EQ(DecodeRiscV32GV(kVwmulVv), OpcodeEnum::kVwmulVv);
EXPECT_EQ(DecodeRiscV32GV(kVwmulVx), OpcodeEnum::kVwmulVx);
EXPECT_EQ(DecodeRiscV32GV(kVwmaccuVv), OpcodeEnum::kVwmaccuVv);
EXPECT_EQ(DecodeRiscV32GV(kVwmaccuVx), OpcodeEnum::kVwmaccuVx);
EXPECT_EQ(DecodeRiscV32GV(kVwmaccVv), OpcodeEnum::kVwmaccVv);
EXPECT_EQ(DecodeRiscV32GV(kVwmaccVx), OpcodeEnum::kVwmaccVx);
EXPECT_EQ(DecodeRiscV32GV(kVwmaccusVv), OpcodeEnum::kVwmaccusVv);
EXPECT_EQ(DecodeRiscV32GV(kVwmaccusVx), OpcodeEnum::kVwmaccusVx);
EXPECT_EQ(DecodeRiscV32GV(kVwmaccsuVv), OpcodeEnum::kVwmaccsuVv);
EXPECT_EQ(DecodeRiscV32GV(kVwmaccsuVx), OpcodeEnum::kVwmaccsuVx);
}
TEST(RiscV32GVBinDecoderTest, OPPFVV_OPFVF) {
EXPECT_EQ(DecodeRiscV32GV(kVfaddVv), OpcodeEnum::kVfaddVv);
EXPECT_EQ(DecodeRiscV32GV(kVfaddVf), OpcodeEnum::kVfaddVf);
EXPECT_EQ(DecodeRiscV32GV(kVfredusumVv), OpcodeEnum::kVfredusumVv);
EXPECT_EQ(DecodeRiscV32GV(kVfsubVv), OpcodeEnum::kVfsubVv);
EXPECT_EQ(DecodeRiscV32GV(kVfsubVf), OpcodeEnum::kVfsubVf);
EXPECT_EQ(DecodeRiscV32GV(kVfredosumVv), OpcodeEnum::kVfredosumVv);
EXPECT_EQ(DecodeRiscV32GV(kVfminVv), OpcodeEnum::kVfminVv);
EXPECT_EQ(DecodeRiscV32GV(kVfminVf), OpcodeEnum::kVfminVf);
EXPECT_EQ(DecodeRiscV32GV(kVfredminVv), OpcodeEnum::kVfredminVv);
EXPECT_EQ(DecodeRiscV32GV(kVfmaxVv), OpcodeEnum::kVfmaxVv);
EXPECT_EQ(DecodeRiscV32GV(kVfmaxVf), OpcodeEnum::kVfmaxVf);
EXPECT_EQ(DecodeRiscV32GV(kVfredmaxVv), OpcodeEnum::kVfredmaxVv);
EXPECT_EQ(DecodeRiscV32GV(kVfsgnjVv), OpcodeEnum::kVfsgnjVv);
EXPECT_EQ(DecodeRiscV32GV(kVfsgnjVf), OpcodeEnum::kVfsgnjVf);
EXPECT_EQ(DecodeRiscV32GV(kVfsgnjnVv), OpcodeEnum::kVfsgnjnVv);
EXPECT_EQ(DecodeRiscV32GV(kVfsgnjnVf), OpcodeEnum::kVfsgnjnVf);
EXPECT_EQ(DecodeRiscV32GV(kVfsgnjxVv), OpcodeEnum::kVfsgnjxVv);
EXPECT_EQ(DecodeRiscV32GV(kVfsgnjxVf), OpcodeEnum::kVfsgnjxVf);
EXPECT_EQ(DecodeRiscV32GV(kVfslide1upVf), OpcodeEnum::kVfslide1upVf);
EXPECT_EQ(DecodeRiscV32GV(kVfslide1downVf), OpcodeEnum::kVfslide1downVf);
EXPECT_EQ(DecodeRiscV32GV(kVfmergeVf), OpcodeEnum::kVfmergeVf);
EXPECT_EQ(DecodeRiscV32GV(kVmfeqVv), OpcodeEnum::kVmfeqVv);
EXPECT_EQ(DecodeRiscV32GV(kVmfeqVf), OpcodeEnum::kVmfeqVf);
EXPECT_EQ(DecodeRiscV32GV(kVmfleVv), OpcodeEnum::kVmfleVv);
EXPECT_EQ(DecodeRiscV32GV(kVmfleVf), OpcodeEnum::kVmfleVf);
EXPECT_EQ(DecodeRiscV32GV(kVmfltVv), OpcodeEnum::kVmfltVv);
EXPECT_EQ(DecodeRiscV32GV(kVmfltVf), OpcodeEnum::kVmfltVf);
EXPECT_EQ(DecodeRiscV32GV(kVmfneVv), OpcodeEnum::kVmfneVv);
EXPECT_EQ(DecodeRiscV32GV(kVmfneVf), OpcodeEnum::kVmfneVf);
EXPECT_EQ(DecodeRiscV32GV(kVmfgtVf), OpcodeEnum::kVmfgtVf);
EXPECT_EQ(DecodeRiscV32GV(kVmfgeVf), OpcodeEnum::kVmfgeVf);
EXPECT_EQ(DecodeRiscV32GV(kVfdivVv), OpcodeEnum::kVfdivVv);
EXPECT_EQ(DecodeRiscV32GV(kVfdivVf), OpcodeEnum::kVfdivVf);
EXPECT_EQ(DecodeRiscV32GV(kVfrdivVf), OpcodeEnum::kVfrdivVf);
EXPECT_EQ(DecodeRiscV32GV(kVfmulVv), OpcodeEnum::kVfmulVv);
EXPECT_EQ(DecodeRiscV32GV(kVfmulVf), OpcodeEnum::kVfmulVf);
EXPECT_EQ(DecodeRiscV32GV(kVfrsubVf), OpcodeEnum::kVfrsubVf);
EXPECT_EQ(DecodeRiscV32GV(kVfmaddVv), OpcodeEnum::kVfmaddVv);
EXPECT_EQ(DecodeRiscV32GV(kVfmaddVf), OpcodeEnum::kVfmaddVf);
EXPECT_EQ(DecodeRiscV32GV(kVfnmaddVv), OpcodeEnum::kVfnmaddVv);
EXPECT_EQ(DecodeRiscV32GV(kVfnmaddVf), OpcodeEnum::kVfnmaddVf);
EXPECT_EQ(DecodeRiscV32GV(kVfmsubVv), OpcodeEnum::kVfmsubVv);
EXPECT_EQ(DecodeRiscV32GV(kVfmsubVf), OpcodeEnum::kVfmsubVf);
EXPECT_EQ(DecodeRiscV32GV(kVfnmsubVv), OpcodeEnum::kVfnmsubVv);
EXPECT_EQ(DecodeRiscV32GV(kVfnmsubVf), OpcodeEnum::kVfnmsubVf);
EXPECT_EQ(DecodeRiscV32GV(kVfmaccVv), OpcodeEnum::kVfmaccVv);
EXPECT_EQ(DecodeRiscV32GV(kVfmaccVf), OpcodeEnum::kVfmaccVf);
EXPECT_EQ(DecodeRiscV32GV(kVfnmaccVv), OpcodeEnum::kVfnmaccVv);
EXPECT_EQ(DecodeRiscV32GV(kVfnmaccVf), OpcodeEnum::kVfnmaccVf);
EXPECT_EQ(DecodeRiscV32GV(kVfmsacVv), OpcodeEnum::kVfmsacVv);
EXPECT_EQ(DecodeRiscV32GV(kVfmsacVf), OpcodeEnum::kVfmsacVf);
EXPECT_EQ(DecodeRiscV32GV(kVfnmsacVv), OpcodeEnum::kVfnmsacVv);
EXPECT_EQ(DecodeRiscV32GV(kVfnmsacVf), OpcodeEnum::kVfnmsacVf);
EXPECT_EQ(DecodeRiscV32GV(kVfwaddVv), OpcodeEnum::kVfwaddVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwaddVf), OpcodeEnum::kVfwaddVf);
EXPECT_EQ(DecodeRiscV32GV(kVfwredusumVv), OpcodeEnum::kVfwredusumVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwsubVv), OpcodeEnum::kVfwsubVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwsubVf), OpcodeEnum::kVfwsubVf);
EXPECT_EQ(DecodeRiscV32GV(kVfwredosumVv), OpcodeEnum::kVfwredosumVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwaddWVv), OpcodeEnum::kVfwaddWVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwaddWVf), OpcodeEnum::kVfwaddWVf);
EXPECT_EQ(DecodeRiscV32GV(kVfwsubWVv), OpcodeEnum::kVfwsubWVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwsubWVf), OpcodeEnum::kVfwsubWVf);
EXPECT_EQ(DecodeRiscV32GV(kVfwmulVv), OpcodeEnum::kVfwmulVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwmulVf), OpcodeEnum::kVfwmulVf);
EXPECT_EQ(DecodeRiscV32GV(kVfwmaccVv), OpcodeEnum::kVfwmaccVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwmaccVf), OpcodeEnum::kVfwmaccVf);
EXPECT_EQ(DecodeRiscV32GV(kVfwnmaccVv), OpcodeEnum::kVfwnmaccVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwnmaccVf), OpcodeEnum::kVfwnmaccVf);
EXPECT_EQ(DecodeRiscV32GV(kVfwmsacVv), OpcodeEnum::kVfwmsacVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwmsacVf), OpcodeEnum::kVfwmsacVf);
EXPECT_EQ(DecodeRiscV32GV(kVfwnmsacVv), OpcodeEnum::kVfwnmsacVv);
EXPECT_EQ(DecodeRiscV32GV(kVfwnmsacVf), OpcodeEnum::kVfwnmsacVf);
}
TEST(RiscV32GVBinDecoderTest, VWXUNARY0) {
EXPECT_EQ(DecodeRiscV32GV(kVmvXS), OpcodeEnum::kVmvXS);
EXPECT_EQ(DecodeRiscV32GV(kVcpop), OpcodeEnum::kVcpop);
EXPECT_EQ(DecodeRiscV32GV(kVfirst), OpcodeEnum::kVfirst);
}
TEST(RiscV32GVBinDecoderTest, VRXUNARY0) {
EXPECT_EQ(DecodeRiscV32GV(kVmvSX), OpcodeEnum::kVmvSX);
}
TEST(RiscV32GVBinDecoderTest, VXUNARY0) {
EXPECT_EQ(DecodeRiscV32GV(kVzextVf8), OpcodeEnum::kVzextVf8);
EXPECT_EQ(DecodeRiscV32GV(kVsextVf8), OpcodeEnum::kVsextVf8);
EXPECT_EQ(DecodeRiscV32GV(kVzextVf4), OpcodeEnum::kVzextVf4);
EXPECT_EQ(DecodeRiscV32GV(kVsextVf4), OpcodeEnum::kVsextVf4);
EXPECT_EQ(DecodeRiscV32GV(kVzextVf2), OpcodeEnum::kVzextVf2);
EXPECT_EQ(DecodeRiscV32GV(kVsextVf2), OpcodeEnum::kVsextVf2);
}
TEST(RiscV32GVBinDecoderTest, VMUNARY) {
EXPECT_EQ(DecodeRiscV32GV(kVmsbf), OpcodeEnum::kVmsbf);
EXPECT_EQ(DecodeRiscV32GV(kVmsof), OpcodeEnum::kVmsof);
EXPECT_EQ(DecodeRiscV32GV(kVmsif), OpcodeEnum::kVmsif);
EXPECT_EQ(DecodeRiscV32GV(kViota), OpcodeEnum::kViota);
EXPECT_EQ(DecodeRiscV32GV(kVid), OpcodeEnum::kVid);
}
TEST(RiscV32GVBinDecoderTest, VWFUNARY0) {
EXPECT_EQ(DecodeRiscV32GV(kVfmvFS), OpcodeEnum::kVfmvFS);
}
TEST(RiscV32GVBinDecoderTest, VRFUNARY0) {
EXPECT_EQ(DecodeRiscV32GV(kVfmvSF), OpcodeEnum::kVfmvSF);
}
TEST(RiscV32GVBinDecoderTest, VFUNARY0) {
EXPECT_EQ(DecodeRiscV32GV(kVfcvtXuFV), OpcodeEnum::kVfcvtXuFV);
EXPECT_EQ(DecodeRiscV32GV(kVfcvtXFV), OpcodeEnum::kVfcvtXFV);
EXPECT_EQ(DecodeRiscV32GV(kVfcvtFXuV), OpcodeEnum::kVfcvtFXuV);
EXPECT_EQ(DecodeRiscV32GV(kVfcvtFXV), OpcodeEnum::kVfcvtFXV);
EXPECT_EQ(DecodeRiscV32GV(kVfcvtRtzXuFV), OpcodeEnum::kVfcvtRtzXuFV);
EXPECT_EQ(DecodeRiscV32GV(kVfcvtRtzXFV), OpcodeEnum::kVfcvtRtzXFV);
EXPECT_EQ(DecodeRiscV32GV(kVfwcvtXuFV), OpcodeEnum::kVfwcvtXuFV);
EXPECT_EQ(DecodeRiscV32GV(kVfwcvtXFV), OpcodeEnum::kVfwcvtXFV);
EXPECT_EQ(DecodeRiscV32GV(kVfwcvtFXuV), OpcodeEnum::kVfwcvtFXuV);
EXPECT_EQ(DecodeRiscV32GV(kVfwcvtFXV), OpcodeEnum::kVfwcvtFXV);
EXPECT_EQ(DecodeRiscV32GV(kVfwcvtFFV), OpcodeEnum::kVfwcvtFFV);
EXPECT_EQ(DecodeRiscV32GV(kVfwcvtRtzXuFV), OpcodeEnum::kVfwcvtRtzXuFV);
EXPECT_EQ(DecodeRiscV32GV(kVfwcvtRtzXFV), OpcodeEnum::kVfwcvtRtzXFV);
EXPECT_EQ(DecodeRiscV32GV(kVfncvtXuFW), OpcodeEnum::kVfncvtXuFW);
EXPECT_EQ(DecodeRiscV32GV(kVfncvtXFW), OpcodeEnum::kVfncvtXFW);
EXPECT_EQ(DecodeRiscV32GV(kVfncvtFXuW), OpcodeEnum::kVfncvtFXuW);
EXPECT_EQ(DecodeRiscV32GV(kVfncvtFXW), OpcodeEnum::kVfncvtFXW);
EXPECT_EQ(DecodeRiscV32GV(kVfncvtFFW), OpcodeEnum::kVfncvtFFW);
EXPECT_EQ(DecodeRiscV32GV(kVfncvtRodFFW), OpcodeEnum::kVfncvtRodFFW);
EXPECT_EQ(DecodeRiscV32GV(kVfncvtRtzXuFW), OpcodeEnum::kVfncvtRtzXuFW);
EXPECT_EQ(DecodeRiscV32GV(kVfncvtRtzXFW), OpcodeEnum::kVfncvtRtzXFW);
}
TEST(RiscV32GVBinDecoderTest, VFUNARY1) {
EXPECT_EQ(DecodeRiscV32GV(kVfsqrtV), OpcodeEnum::kVfsqrtV);
EXPECT_EQ(DecodeRiscV32GV(kVfrsqrt7V), OpcodeEnum::kVfrsqrt7V);
EXPECT_EQ(DecodeRiscV32GV(kVfrec7V), OpcodeEnum::kVfrec7V);
EXPECT_EQ(DecodeRiscV32GV(kVfclassV), OpcodeEnum::kVfclassV);
}
} // namespace