xref: /llvm-project/llvm/unittests/Target/VE/MachineInstrTest.cpp (revision bb3f5e1fed7c6ba733b7f273e93f5d3930976185)
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