14f330b7fSKazushi Marukawa //===- MachineInstrTest.cpp -----------------------------------------------===// 24f330b7fSKazushi Marukawa // 34f330b7fSKazushi Marukawa // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 44f330b7fSKazushi Marukawa // See https://llvm.org/LICENSE.txt for license information. 54f330b7fSKazushi Marukawa // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 64f330b7fSKazushi Marukawa // 74f330b7fSKazushi Marukawa //===----------------------------------------------------------------------===// 84f330b7fSKazushi Marukawa 94f330b7fSKazushi Marukawa #include "VEInstrInfo.h" 104f330b7fSKazushi Marukawa #include "VESubtarget.h" 114f330b7fSKazushi Marukawa #include "VETargetMachine.h" 124f330b7fSKazushi Marukawa #include "llvm/MC/TargetRegistry.h" 134f330b7fSKazushi Marukawa #include "llvm/Support/TargetSelect.h" 144f330b7fSKazushi Marukawa #include "llvm/Target/TargetMachine.h" 154f330b7fSKazushi Marukawa #include "llvm/Target/TargetOptions.h" 164f330b7fSKazushi Marukawa 174f330b7fSKazushi Marukawa #include "gtest/gtest.h" 184f330b7fSKazushi Marukawa 194f330b7fSKazushi Marukawa using namespace llvm; 204f330b7fSKazushi Marukawa 214f330b7fSKazushi Marukawa TEST(VETest, VLIndex) { 224f330b7fSKazushi Marukawa using namespace VE; 234f330b7fSKazushi Marukawa 244f330b7fSKazushi Marukawa // Return expected VL register index in each MI's operands. Aurora VE has 254f330b7fSKazushi Marukawa // multiple instruction formats for each instruction. So, we define 264f330b7fSKazushi Marukawa // instructions hierarchically and tests parts of the whole instructions. 274f330b7fSKazushi Marukawa // This function returns -1 to N as expected index, or -2 as default. 284f330b7fSKazushi Marukawa // We skip a test on an instruction that this function returns -2. 294f330b7fSKazushi Marukawa auto VLIndex = [](unsigned Opcode) { 304f330b7fSKazushi Marukawa switch (Opcode) { 314f330b7fSKazushi Marukawa default: 324f330b7fSKazushi Marukawa break; 334f330b7fSKazushi Marukawa case VLDNCrz: 344f330b7fSKazushi Marukawa return -1; 354f330b7fSKazushi Marukawa case VLDUNCrzl: 364f330b7fSKazushi Marukawa case VLDLSXrzl_v: 374f330b7fSKazushi Marukawa case VLDLZXNCirL: 384f330b7fSKazushi Marukawa case VLD2DNCrrL_v: 394f330b7fSKazushi Marukawa case VLDU2DNCrzL_v: 404f330b7fSKazushi Marukawa case VLDL2DSXizL_v: 414f330b7fSKazushi Marukawa case VLDL2DZXNCirl: 424f330b7fSKazushi Marukawa return 3; 434f330b7fSKazushi Marukawa case VSTOTrrv: 444f330b7fSKazushi Marukawa return -1; 454f330b7fSKazushi Marukawa case VSTUNCrzvl: 464f330b7fSKazushi Marukawa case VSTLNCOTizvL: 474f330b7fSKazushi Marukawa case VST2Dirvl: 484f330b7fSKazushi Marukawa return 3; 494f330b7fSKazushi Marukawa case VSTU2DNCrzvml: 504f330b7fSKazushi Marukawa case VSTL2DNCOTrzvml: 514f330b7fSKazushi Marukawa return 4; 524f330b7fSKazushi Marukawa case VGTNCsrzm_v: 534f330b7fSKazushi Marukawa return -1; 544f330b7fSKazushi Marukawa case VGTUNCvrzl: 554f330b7fSKazushi Marukawa case VGTLSXvrzl_v: 564f330b7fSKazushi Marukawa case VGTLZXNCsirL: 574f330b7fSKazushi Marukawa return 4; 584f330b7fSKazushi Marukawa case VGTNCsrrmL_v: 594f330b7fSKazushi Marukawa case VGTUNCvrzmL: 604f330b7fSKazushi Marukawa case VGTLSXsizml_v: 614f330b7fSKazushi Marukawa return 5; 624f330b7fSKazushi Marukawa case VSCNCsrzvm: 634f330b7fSKazushi Marukawa return -1; 644f330b7fSKazushi Marukawa case VSCUNCvrzvl: 654f330b7fSKazushi Marukawa case VSCLNCsirvL: 664f330b7fSKazushi Marukawa return 4; 674f330b7fSKazushi Marukawa case VSCOTsrrvmL: 684f330b7fSKazushi Marukawa case VSCUNCOTvrzvmL: 694f330b7fSKazushi Marukawa case VSCLsizvml: 704f330b7fSKazushi Marukawa return 5; 714f330b7fSKazushi Marukawa case PFCHVrr: 724f330b7fSKazushi Marukawa return -1; 734f330b7fSKazushi Marukawa case PFCHVrrl: 744f330b7fSKazushi Marukawa case PFCHVNCrzL: 754f330b7fSKazushi Marukawa return 2; 764f330b7fSKazushi Marukawa case VBRDrm: 774f330b7fSKazushi Marukawa return -1; 784f330b7fSKazushi Marukawa case VBRDrl: 794f330b7fSKazushi Marukawa return 2; 804f330b7fSKazushi Marukawa case VBRDimL_v: 814f330b7fSKazushi Marukawa return 3; 824f330b7fSKazushi Marukawa case VMVrvm_v: 834f330b7fSKazushi Marukawa return -1; 844f330b7fSKazushi Marukawa case VMVivl: 854f330b7fSKazushi Marukawa return 3; 864f330b7fSKazushi Marukawa case VMVrvmL_v: 874f330b7fSKazushi Marukawa return 4; 884f330b7fSKazushi Marukawa case VADDULvv_v: 894f330b7fSKazushi Marukawa case PVADDULOrvm: 904f330b7fSKazushi Marukawa return -1; 914f330b7fSKazushi Marukawa case VADDUWvvl_v: 924f330b7fSKazushi Marukawa case PVADDUUPrvL: 934f330b7fSKazushi Marukawa return 3; 944f330b7fSKazushi Marukawa case PVADDUvvmL_v: 954f330b7fSKazushi Marukawa case VADDSWSXivml: 964f330b7fSKazushi Marukawa case VADDSLivml: 974f330b7fSKazushi Marukawa return 4; 984f330b7fSKazushi Marukawa case VDIVULvv_v: 994f330b7fSKazushi Marukawa case VDIVSWSXrvm: 1004f330b7fSKazushi Marukawa return -1; 1014f330b7fSKazushi Marukawa case VDIVUWvrl_v: 1024f330b7fSKazushi Marukawa case VDIVSWZXviL: 1034f330b7fSKazushi Marukawa return 3; 1044f330b7fSKazushi Marukawa case VDIVSLivmL_v: 1054f330b7fSKazushi Marukawa case VDIVSWSXivml: 1064f330b7fSKazushi Marukawa return 4; 1074f330b7fSKazushi Marukawa // We test casually if instructions are defined using a multiclass already 1084f330b7fSKazushi Marukawa // tested. 1094f330b7fSKazushi Marukawa case VSUBSLivml: 1104f330b7fSKazushi Marukawa case VMULSLivml: 1114f330b7fSKazushi Marukawa case VCMPSLivml: 1124f330b7fSKazushi Marukawa case VMAXSLivml: 1134f330b7fSKazushi Marukawa return 4; 1144f330b7fSKazushi Marukawa case VANDvv_v: 1154f330b7fSKazushi Marukawa case PVANDLOrvm: 1164f330b7fSKazushi Marukawa return -1; 1174f330b7fSKazushi Marukawa case PVANDvvl_v: 1184f330b7fSKazushi Marukawa case PVANDUPrvL: 1194f330b7fSKazushi Marukawa return 3; 1204f330b7fSKazushi Marukawa case VORvvmL_v: 1214f330b7fSKazushi Marukawa case PVORLOmvml: 1224f330b7fSKazushi Marukawa case VXORmvml: 1234f330b7fSKazushi Marukawa case VEQVmvml: 1244f330b7fSKazushi Marukawa return 4; 1254f330b7fSKazushi Marukawa case VLDZv: 1264f330b7fSKazushi Marukawa return -1; 1274f330b7fSKazushi Marukawa case VPCNTvL: 1284f330b7fSKazushi Marukawa return 2; 1294f330b7fSKazushi Marukawa case VBRVvml: 1304f330b7fSKazushi Marukawa return 3; 1314f330b7fSKazushi Marukawa case VSEQ: 1324f330b7fSKazushi Marukawa return -1; 1334f330b7fSKazushi Marukawa case VSEQL: 1344f330b7fSKazushi Marukawa return 1; 1354f330b7fSKazushi Marukawa case VSEQml: 1364f330b7fSKazushi Marukawa return 2; 1374f330b7fSKazushi Marukawa case VSLLvv_v: 1384f330b7fSKazushi Marukawa case PVSLLLOvrm: 1394f330b7fSKazushi Marukawa return -1; 1404f330b7fSKazushi Marukawa case PVSLLvvl_v: 1414f330b7fSKazushi Marukawa case PVSRLUPvrL: 1424f330b7fSKazushi Marukawa return 3; 1434f330b7fSKazushi Marukawa case VSLLvimL_v: 1444f330b7fSKazushi Marukawa case PVSRLLOvrml: 1454f330b7fSKazushi Marukawa case VSLALvimL_v: 1464f330b7fSKazushi Marukawa case VSRALvimL_v: 1474f330b7fSKazushi Marukawa return 4; 1484f330b7fSKazushi Marukawa case VSLDvvr_v: 1494f330b7fSKazushi Marukawa case VSLDvvim: 1504f330b7fSKazushi Marukawa return -1; 1514f330b7fSKazushi Marukawa case VSLDvvrl_v: 1524f330b7fSKazushi Marukawa case VSRDvviL: 1534f330b7fSKazushi Marukawa return 4; 1544f330b7fSKazushi Marukawa case VSLDvvimL_v: 1554f330b7fSKazushi Marukawa case VSRDvvrml: 1564f330b7fSKazushi Marukawa return 5; 1574f330b7fSKazushi Marukawa case VSFAvrr_v: 1584f330b7fSKazushi Marukawa case VSFAvrmm_v: 1594f330b7fSKazushi Marukawa return -1; 1604f330b7fSKazushi Marukawa case VSFAvirl_v: 1614f330b7fSKazushi Marukawa case VSFAvirL: 1624f330b7fSKazushi Marukawa return 4; 1634f330b7fSKazushi Marukawa case VSFAvimml: 1644f330b7fSKazushi Marukawa case VSFAvimmL_v: 1654f330b7fSKazushi Marukawa return 5; 1664f330b7fSKazushi Marukawa case VFADDDivml: 1674f330b7fSKazushi Marukawa case VFSUBDivml: 1684f330b7fSKazushi Marukawa case VFMULDivml: 1694f330b7fSKazushi Marukawa case VFDIVDivml: 1704f330b7fSKazushi Marukawa case VFCMPDivml: 1714f330b7fSKazushi Marukawa case VFMAXDivml: 1724f330b7fSKazushi Marukawa return 4; 1734f330b7fSKazushi Marukawa case VFSQRTDv_v: 1744f330b7fSKazushi Marukawa case VFSQRTSvm: 1754f330b7fSKazushi Marukawa return -1; 1764f330b7fSKazushi Marukawa case VFSQRTDvl_v: 1774f330b7fSKazushi Marukawa case VFSQRTDvL: 1784f330b7fSKazushi Marukawa return 2; 1794f330b7fSKazushi Marukawa case VFSQRTDvmL_v: 1804f330b7fSKazushi Marukawa case VFSQRTDvml: 1814f330b7fSKazushi Marukawa case VFSQRTDvmL: 1824f330b7fSKazushi Marukawa return 3; 1834f330b7fSKazushi Marukawa case VFMADDvvv_v: 1844f330b7fSKazushi Marukawa case PVFMADLOvrvm: 1854f330b7fSKazushi Marukawa return -1; 1864f330b7fSKazushi Marukawa case PVFMADvivl_v: 1874f330b7fSKazushi Marukawa case PVFMADUPvrvL: 1884f330b7fSKazushi Marukawa return 4; 1894f330b7fSKazushi Marukawa case VFMADSivvmL_v: 1904f330b7fSKazushi Marukawa case PVFMADLOvrvml: 1914f330b7fSKazushi Marukawa case VFMSBDivvmL_v: 1924f330b7fSKazushi Marukawa case VFNMADDivvmL_v: 1934f330b7fSKazushi Marukawa case VFNMSBDivvmL_v: 1944f330b7fSKazushi Marukawa return 5; 1954f330b7fSKazushi Marukawa case VRCPDvmL: 1964f330b7fSKazushi Marukawa case VRSQRTDvmL: 1974f330b7fSKazushi Marukawa case VRSQRTDNEXvmL: 1984f330b7fSKazushi Marukawa return 3; 1994f330b7fSKazushi Marukawa case VCVTWDSXv: 2004f330b7fSKazushi Marukawa case VCVTWDZXvm_v: 2014f330b7fSKazushi Marukawa return -1; 2024f330b7fSKazushi Marukawa case VCVTWSSXvl_v: 2034f330b7fSKazushi Marukawa case VCVTWSZXvL: 2044f330b7fSKazushi Marukawa return 3; 2054f330b7fSKazushi Marukawa case PVCVTWSLOvmL_v: 2064f330b7fSKazushi Marukawa case PVCVTWSUPvml: 2074f330b7fSKazushi Marukawa case PVCVTWSvmL: 2084f330b7fSKazushi Marukawa case VCVTLDvml: 2094f330b7fSKazushi Marukawa return 4; 2104f330b7fSKazushi Marukawa case VCVTDWvml: 2114f330b7fSKazushi Marukawa case VCVTDLvml: 2124f330b7fSKazushi Marukawa case VCVTSDvml: 2134f330b7fSKazushi Marukawa case VCVTDSvml: 2144f330b7fSKazushi Marukawa case VSUMWSXvml: 2154f330b7fSKazushi Marukawa case VSUMLvml: 2164f330b7fSKazushi Marukawa case VFSUMDvml: 2174f330b7fSKazushi Marukawa case VRMAXSWFSTSXvml: 2184f330b7fSKazushi Marukawa case VRMAXSLFSTvml: 2194f330b7fSKazushi Marukawa case VFRMAXDFSTvml: 2204f330b7fSKazushi Marukawa case VRANDvml: 2214f330b7fSKazushi Marukawa case VRORvml: 2224f330b7fSKazushi Marukawa case VRXORvml: 2234f330b7fSKazushi Marukawa return 3; 2244f330b7fSKazushi Marukawa case VFIADvr_v: 2254f330b7fSKazushi Marukawa case VFIASvi_v: 2264f330b7fSKazushi Marukawa return -1; 2274f330b7fSKazushi Marukawa case VFIADvrl_v: 2284f330b7fSKazushi Marukawa case VFIASviL_v: 2294f330b7fSKazushi Marukawa case VFISDviL_v: 2304f330b7fSKazushi Marukawa case VFIMDviL_v: 2314f330b7fSKazushi Marukawa return 3; 2324f330b7fSKazushi Marukawa case VFIAMDvvr_v: 2334f330b7fSKazushi Marukawa case VFIAMSvvi_v: 2344f330b7fSKazushi Marukawa return -1; 2354f330b7fSKazushi Marukawa case VFISMDvvrl_v: 2364f330b7fSKazushi Marukawa case VFISMSvviL_v: 2374f330b7fSKazushi Marukawa case VFIMADvviL_v: 2384f330b7fSKazushi Marukawa case VFIMSDvviL_v: 2394f330b7fSKazushi Marukawa return 4; 2404f330b7fSKazushi Marukawa case VMRGivml: 2414f330b7fSKazushi Marukawa return 4; 2424f330b7fSKazushi Marukawa case VCPvml: 2434f330b7fSKazushi Marukawa case VEXvml: 2444f330b7fSKazushi Marukawa return 3; 2454f330b7fSKazushi Marukawa case VSHFvvr: 2464f330b7fSKazushi Marukawa case VSHFvvr_v: 2474f330b7fSKazushi Marukawa return -1; 2484f330b7fSKazushi Marukawa case VSHFvvrl: 2494f330b7fSKazushi Marukawa case VSHFvvrL_v: 2504f330b7fSKazushi Marukawa return 4; 2514f330b7fSKazushi Marukawa case VFMKLv: 2524f330b7fSKazushi Marukawa case VFMKLvm: 2534f330b7fSKazushi Marukawa return -1; 2544f330b7fSKazushi Marukawa case VFMKLvl: 2554f330b7fSKazushi Marukawa case VFMKLvL: 2564f330b7fSKazushi Marukawa return 3; 2574f330b7fSKazushi Marukawa case VFMKLvml: 2584f330b7fSKazushi Marukawa case VFMKLvmL: 2594f330b7fSKazushi Marukawa return 4; 2604f330b7fSKazushi Marukawa case VFMKLal: 2614f330b7fSKazushi Marukawa case VFMKLnaL: 2624f330b7fSKazushi Marukawa return 1; 2634f330b7fSKazushi Marukawa case VFMKLaml: 2644f330b7fSKazushi Marukawa case VFMKLnamL: 2654f330b7fSKazushi Marukawa case VFMKWnamL: 2664f330b7fSKazushi Marukawa case VFMKDnamL: 2674f330b7fSKazushi Marukawa return 2; 2684f330b7fSKazushi Marukawa case TOVMm: 2694f330b7fSKazushi Marukawa case PCVMm: 2704f330b7fSKazushi Marukawa case LZVMm: 2714f330b7fSKazushi Marukawa return -1; 2724f330b7fSKazushi Marukawa case TOVMml: 2734f330b7fSKazushi Marukawa case PCVMmL: 2744f330b7fSKazushi Marukawa case LZVMml: 2754f330b7fSKazushi Marukawa return 2; 2764f330b7fSKazushi Marukawa } 2774f330b7fSKazushi Marukawa return -2; 2784f330b7fSKazushi Marukawa }; 2794f330b7fSKazushi Marukawa 2804f330b7fSKazushi Marukawa LLVMInitializeVETargetInfo(); 2814f330b7fSKazushi Marukawa LLVMInitializeVETarget(); 2824f330b7fSKazushi Marukawa LLVMInitializeVETargetMC(); 2834f330b7fSKazushi Marukawa 2844f330b7fSKazushi Marukawa auto TT(Triple::normalize("ve-unknown-linux-gnu")); 2854f330b7fSKazushi Marukawa std::string Error; 2864f330b7fSKazushi Marukawa const Target *T = TargetRegistry::lookupTarget(TT, Error); 2874f330b7fSKazushi Marukawa if (!T) { 2884f330b7fSKazushi Marukawa dbgs() << Error; 2894f330b7fSKazushi Marukawa return; 2904f330b7fSKazushi Marukawa } 2914f330b7fSKazushi Marukawa 2924f330b7fSKazushi Marukawa TargetOptions Options; 293*bb3f5e1fSMatin Raayai auto TM = std::unique_ptr<TargetMachine>( 2944f330b7fSKazushi Marukawa T->createTargetMachine(TT, "", "", Options, std::nullopt, std::nullopt, 295*bb3f5e1fSMatin Raayai CodeGenOptLevel::Default)); 2964f330b7fSKazushi Marukawa VESubtarget ST(TM->getTargetTriple(), std::string(TM->getTargetCPU()), 2974f330b7fSKazushi Marukawa std::string(TM->getTargetFeatureString()), 2984f330b7fSKazushi Marukawa *static_cast<const VETargetMachine *>(TM.get())); 2994f330b7fSKazushi Marukawa const VEInstrInfo *TII = ST.getInstrInfo(); 3004f330b7fSKazushi Marukawa auto MII = TM->getMCInstrInfo(); 3014f330b7fSKazushi Marukawa 3024f330b7fSKazushi Marukawa for (unsigned i = 0; i < VE::INSTRUCTION_LIST_END; ++i) { 3034f330b7fSKazushi Marukawa // Skip -2 (default value) 3044f330b7fSKazushi Marukawa if (VLIndex(i) == -2) 3054f330b7fSKazushi Marukawa continue; 3064f330b7fSKazushi Marukawa 3074f330b7fSKazushi Marukawa const MCInstrDesc &Desc = TII->get(i); 3084f330b7fSKazushi Marukawa 3094f330b7fSKazushi Marukawa uint64_t Flags = Desc.TSFlags; 3104f330b7fSKazushi Marukawa ASSERT_EQ(VLIndex(i), GET_VLINDEX(Flags)) 3114f330b7fSKazushi Marukawa << MII->getName(i) 3124f330b7fSKazushi Marukawa << ": mismatched expected VL register index in its argument\n"; 3134f330b7fSKazushi Marukawa } 3144f330b7fSKazushi Marukawa } 315