19f986bf3SAhmed Bougacha //===- llvm/unittest/CodeGen/GlobalISel/LowLevelTypeTest.cpp --------------===//
29f986bf3SAhmed Bougacha //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69f986bf3SAhmed Bougacha //
79f986bf3SAhmed Bougacha //===----------------------------------------------------------------------===//
89f986bf3SAhmed Bougacha 
99f986bf3SAhmed Bougacha #include "llvm/CodeGen/LowLevelType.h"
105ae8350aSTim Northover #include "llvm/IR/DataLayout.h"
119f986bf3SAhmed Bougacha #include "llvm/IR/DerivedTypes.h"
129f986bf3SAhmed Bougacha #include "llvm/IR/LLVMContext.h"
139f986bf3SAhmed Bougacha #include "llvm/IR/Type.h"
14bd7f7e2eSSander de Smalen #include "llvm/Support/TypeSize.h"
159f986bf3SAhmed Bougacha #include "gtest/gtest.h"
169f986bf3SAhmed Bougacha 
179f986bf3SAhmed Bougacha using namespace llvm;
189f986bf3SAhmed Bougacha 
199f986bf3SAhmed Bougacha namespace {
209f986bf3SAhmed Bougacha 
TEST(LowLevelTypeTest,Scalar)219f986bf3SAhmed Bougacha TEST(LowLevelTypeTest, Scalar) {
229f986bf3SAhmed Bougacha   LLVMContext C;
235ae8350aSTim Northover   DataLayout DL("");
249f986bf3SAhmed Bougacha 
25842e718bSPaulo Matos   for (unsigned S : {0U, 1U, 17U, 32U, 64U, 0xfffffU}) {
269f986bf3SAhmed Bougacha     const LLT Ty = LLT::scalar(S);
279f986bf3SAhmed Bougacha 
289f986bf3SAhmed Bougacha     // Test kind.
29af9814a1SKristof Beyls     ASSERT_TRUE(Ty.isValid());
30af9814a1SKristof Beyls     ASSERT_TRUE(Ty.isScalar());
319f986bf3SAhmed Bougacha 
32af9814a1SKristof Beyls     ASSERT_FALSE(Ty.isPointer());
33af9814a1SKristof Beyls     ASSERT_FALSE(Ty.isVector());
349f986bf3SAhmed Bougacha 
359f986bf3SAhmed Bougacha     // Test sizes.
369f986bf3SAhmed Bougacha     EXPECT_EQ(S, Ty.getSizeInBits());
379f986bf3SAhmed Bougacha     EXPECT_EQ(S, Ty.getScalarSizeInBits());
389f986bf3SAhmed Bougacha 
399f986bf3SAhmed Bougacha     // Test equality operators.
409f986bf3SAhmed Bougacha     EXPECT_TRUE(Ty == Ty);
419d955571SAhmed Bougacha     EXPECT_FALSE(Ty != Ty);
429d955571SAhmed Bougacha 
439f986bf3SAhmed Bougacha     // Test Type->LLT conversion.
44842e718bSPaulo Matos     if (S != 0) {
4528fdc427STim Northover       Type *IRTy = IntegerType::get(C, S);
4652b4ce72SDaniel Sanders       EXPECT_EQ(Ty, getLLTForType(*IRTy, DL));
479f986bf3SAhmed Bougacha     }
489f986bf3SAhmed Bougacha   }
49842e718bSPaulo Matos }
509f986bf3SAhmed Bougacha 
TEST(LowLevelTypeTest,Vector)519f986bf3SAhmed Bougacha TEST(LowLevelTypeTest, Vector) {
529f986bf3SAhmed Bougacha   LLVMContext C;
535ae8350aSTim Northover   DataLayout DL("");
549f986bf3SAhmed Bougacha 
55842e718bSPaulo Matos   for (unsigned S : {0U, 1U, 17U, 32U, 64U, 0xfffU}) {
56bd7f7e2eSSander de Smalen     for (auto EC :
57bd7f7e2eSSander de Smalen          {ElementCount::getFixed(2), ElementCount::getFixed(3),
58bd7f7e2eSSander de Smalen           ElementCount::getFixed(4), ElementCount::getFixed(32),
59bd7f7e2eSSander de Smalen           ElementCount::getFixed(0xff), ElementCount::getScalable(2),
60bd7f7e2eSSander de Smalen           ElementCount::getScalable(3), ElementCount::getScalable(4),
61bd7f7e2eSSander de Smalen           ElementCount::getScalable(32), ElementCount::getScalable(0xff)}) {
629f986bf3SAhmed Bougacha       const LLT STy = LLT::scalar(S);
63d5e14ba8SSander de Smalen       const LLT VTy = LLT::vector(EC, S);
649f986bf3SAhmed Bougacha 
659f986bf3SAhmed Bougacha       // Test the alternative vector().
669f986bf3SAhmed Bougacha       {
67d5e14ba8SSander de Smalen         const LLT VSTy = LLT::vector(EC, STy);
689f986bf3SAhmed Bougacha         EXPECT_EQ(VTy, VSTy);
699f986bf3SAhmed Bougacha       }
709f986bf3SAhmed Bougacha 
719f986bf3SAhmed Bougacha       // Test getElementType().
729f986bf3SAhmed Bougacha       EXPECT_EQ(STy, VTy.getElementType());
739f986bf3SAhmed Bougacha 
749f986bf3SAhmed Bougacha       // Test kind.
75af9814a1SKristof Beyls       ASSERT_TRUE(VTy.isValid());
76af9814a1SKristof Beyls       ASSERT_TRUE(VTy.isVector());
779f986bf3SAhmed Bougacha 
78af9814a1SKristof Beyls       ASSERT_FALSE(VTy.isScalar());
79af9814a1SKristof Beyls       ASSERT_FALSE(VTy.isPointer());
809f986bf3SAhmed Bougacha 
819f986bf3SAhmed Bougacha       // Test sizes.
829f986bf3SAhmed Bougacha       EXPECT_EQ(S, VTy.getScalarSizeInBits());
83bd7f7e2eSSander de Smalen       EXPECT_EQ(EC, VTy.getElementCount());
84bd7f7e2eSSander de Smalen       if (!EC.isScalable())
85bd7f7e2eSSander de Smalen         EXPECT_EQ(S * EC.getFixedValue(), VTy.getSizeInBits());
860e09d18cSSander de Smalen       else
870e09d18cSSander de Smalen         EXPECT_EQ(TypeSize::Scalable(S * EC.getKnownMinValue()),
880e09d18cSSander de Smalen                   VTy.getSizeInBits());
899f986bf3SAhmed Bougacha 
909f986bf3SAhmed Bougacha       // Test equality operators.
919f986bf3SAhmed Bougacha       EXPECT_TRUE(VTy == VTy);
929d955571SAhmed Bougacha       EXPECT_FALSE(VTy != VTy);
939d955571SAhmed Bougacha 
949d955571SAhmed Bougacha       // Test inequality operators on..
959d955571SAhmed Bougacha       // ..different kind.
969d955571SAhmed Bougacha       EXPECT_NE(VTy, STy);
979f986bf3SAhmed Bougacha 
989f986bf3SAhmed Bougacha       // Test Type->LLT conversion.
99842e718bSPaulo Matos       if (S != 0) {
1009f986bf3SAhmed Bougacha         Type *IRSTy = IntegerType::get(C, S);
101bd7f7e2eSSander de Smalen         Type *IRTy = VectorType::get(IRSTy, EC);
10252b4ce72SDaniel Sanders         EXPECT_EQ(VTy, getLLTForType(*IRTy, DL));
1039f986bf3SAhmed Bougacha       }
1049f986bf3SAhmed Bougacha     }
1059f986bf3SAhmed Bougacha   }
106842e718bSPaulo Matos }
1079f986bf3SAhmed Bougacha 
TEST(LowLevelTypeTest,ScalarOrVector)1087ba2d82cSMatt Arsenault TEST(LowLevelTypeTest, ScalarOrVector) {
1097ba2d82cSMatt Arsenault   // Test version with number of bits for scalar type.
110968980efSSander de Smalen   EXPECT_EQ(LLT::scalar(32),
111968980efSSander de Smalen             LLT::scalarOrVector(ElementCount::getFixed(1), 32));
112968980efSSander de Smalen   EXPECT_EQ(LLT::fixed_vector(2, 32),
113968980efSSander de Smalen             LLT::scalarOrVector(ElementCount::getFixed(2), 32));
114968980efSSander de Smalen   EXPECT_EQ(LLT::scalable_vector(1, 32),
115968980efSSander de Smalen             LLT::scalarOrVector(ElementCount::getScalable(1), 32));
1167ba2d82cSMatt Arsenault 
1177ba2d82cSMatt Arsenault   // Test version with LLT for scalar type.
118968980efSSander de Smalen   EXPECT_EQ(LLT::scalar(32),
119968980efSSander de Smalen             LLT::scalarOrVector(ElementCount::getFixed(1), LLT::scalar(32)));
120968980efSSander de Smalen   EXPECT_EQ(LLT::fixed_vector(2, 32),
121968980efSSander de Smalen             LLT::scalarOrVector(ElementCount::getFixed(2), LLT::scalar(32)));
1227ba2d82cSMatt Arsenault 
1237ba2d82cSMatt Arsenault   // Test with pointer elements.
124968980efSSander de Smalen   EXPECT_EQ(LLT::pointer(1, 32), LLT::scalarOrVector(ElementCount::getFixed(1),
125968980efSSander de Smalen                                                      LLT::pointer(1, 32)));
126968980efSSander de Smalen   EXPECT_EQ(
127968980efSSander de Smalen       LLT::fixed_vector(2, LLT::pointer(1, 32)),
128968980efSSander de Smalen       LLT::scalarOrVector(ElementCount::getFixed(2), LLT::pointer(1, 32)));
1297ba2d82cSMatt Arsenault }
1307ba2d82cSMatt Arsenault 
TEST(LowLevelTypeTest,ChangeElementType)13191be65beSMatt Arsenault TEST(LowLevelTypeTest, ChangeElementType) {
13291be65beSMatt Arsenault   const LLT P0 = LLT::pointer(0, 32);
13391be65beSMatt Arsenault   const LLT P1 = LLT::pointer(1, 64);
13491be65beSMatt Arsenault 
13591be65beSMatt Arsenault   const LLT S32 = LLT::scalar(32);
13691be65beSMatt Arsenault   const LLT S64 = LLT::scalar(64);
13791be65beSMatt Arsenault 
138d5e14ba8SSander de Smalen   const LLT V2S32 = LLT::fixed_vector(2, 32);
139d5e14ba8SSander de Smalen   const LLT V2S64 = LLT::fixed_vector(2, 64);
14091be65beSMatt Arsenault 
141d5e14ba8SSander de Smalen   const LLT V2P0 = LLT::fixed_vector(2, P0);
142d5e14ba8SSander de Smalen   const LLT V2P1 = LLT::fixed_vector(2, P1);
14391be65beSMatt Arsenault 
14491be65beSMatt Arsenault   EXPECT_EQ(S64, S32.changeElementType(S64));
14591be65beSMatt Arsenault   EXPECT_EQ(S32, S32.changeElementType(S32));
14691be65beSMatt Arsenault 
14791be65beSMatt Arsenault   EXPECT_EQ(S32, S64.changeElementSize(32));
14891be65beSMatt Arsenault   EXPECT_EQ(S32, S32.changeElementSize(32));
14991be65beSMatt Arsenault 
15091be65beSMatt Arsenault   EXPECT_EQ(V2S64, V2S32.changeElementType(S64));
15191be65beSMatt Arsenault   EXPECT_EQ(V2S32, V2S64.changeElementType(S32));
15291be65beSMatt Arsenault 
15391be65beSMatt Arsenault   EXPECT_EQ(V2S64, V2S32.changeElementSize(64));
15491be65beSMatt Arsenault   EXPECT_EQ(V2S32, V2S64.changeElementSize(32));
15591be65beSMatt Arsenault 
15691be65beSMatt Arsenault   EXPECT_EQ(P0, S32.changeElementType(P0));
15791be65beSMatt Arsenault   EXPECT_EQ(S32, P0.changeElementType(S32));
15891be65beSMatt Arsenault 
15991be65beSMatt Arsenault   EXPECT_EQ(V2P1, V2P0.changeElementType(P1));
16091be65beSMatt Arsenault   EXPECT_EQ(V2S32, V2P0.changeElementType(S32));
161bd7f7e2eSSander de Smalen 
162bd7f7e2eSSander de Smalen   // Similar tests for for scalable vectors.
163d5e14ba8SSander de Smalen   const LLT NXV2S32 = LLT::scalable_vector(2, 32);
164d5e14ba8SSander de Smalen   const LLT NXV2S64 = LLT::scalable_vector(2, 64);
165bd7f7e2eSSander de Smalen 
166d5e14ba8SSander de Smalen   const LLT NXV2P0 = LLT::scalable_vector(2, P0);
167d5e14ba8SSander de Smalen   const LLT NXV2P1 = LLT::scalable_vector(2, P1);
168bd7f7e2eSSander de Smalen 
169bd7f7e2eSSander de Smalen   EXPECT_EQ(NXV2S64, NXV2S32.changeElementType(S64));
170bd7f7e2eSSander de Smalen   EXPECT_EQ(NXV2S32, NXV2S64.changeElementType(S32));
171bd7f7e2eSSander de Smalen 
172bd7f7e2eSSander de Smalen   EXPECT_EQ(NXV2S64, NXV2S32.changeElementSize(64));
173bd7f7e2eSSander de Smalen   EXPECT_EQ(NXV2S32, NXV2S64.changeElementSize(32));
174bd7f7e2eSSander de Smalen 
175bd7f7e2eSSander de Smalen   EXPECT_EQ(NXV2P1, NXV2P0.changeElementType(P1));
176bd7f7e2eSSander de Smalen   EXPECT_EQ(NXV2S32, NXV2P0.changeElementType(S32));
17791be65beSMatt Arsenault }
17891be65beSMatt Arsenault 
TEST(LowLevelTypeTest,ChangeNumElements)17924ab761aSMatt Arsenault TEST(LowLevelTypeTest, ChangeNumElements) {
18024ab761aSMatt Arsenault   const LLT P0 = LLT::pointer(0, 32);
181d5e14ba8SSander de Smalen   const LLT V2P0 = LLT::fixed_vector(2, P0);
182d5e14ba8SSander de Smalen   const LLT V3P0 = LLT::fixed_vector(3, P0);
18324ab761aSMatt Arsenault 
18424ab761aSMatt Arsenault   const LLT S64 = LLT::scalar(64);
185d5e14ba8SSander de Smalen   const LLT V2S64 = LLT::fixed_vector(2, 64);
186d5e14ba8SSander de Smalen   const LLT V3S64 = LLT::fixed_vector(3, 64);
18724ab761aSMatt Arsenault 
18824ab761aSMatt Arsenault   // Vector to scalar
189c9acd2f3SSander de Smalen   EXPECT_EQ(S64, V2S64.changeElementCount(ElementCount::getFixed(1)));
19024ab761aSMatt Arsenault 
19124ab761aSMatt Arsenault   // Vector to vector
192c9acd2f3SSander de Smalen   EXPECT_EQ(V3S64, V2S64.changeElementCount(ElementCount::getFixed(3)));
19324ab761aSMatt Arsenault 
19424ab761aSMatt Arsenault   // Scalar to vector
195c9acd2f3SSander de Smalen   EXPECT_EQ(V2S64, S64.changeElementCount(ElementCount::getFixed(2)));
19624ab761aSMatt Arsenault 
197c9acd2f3SSander de Smalen   EXPECT_EQ(P0, V2P0.changeElementCount(ElementCount::getFixed(1)));
198c9acd2f3SSander de Smalen   EXPECT_EQ(V3P0, V2P0.changeElementCount(ElementCount::getFixed(3)));
199c9acd2f3SSander de Smalen   EXPECT_EQ(V2P0, P0.changeElementCount(ElementCount::getFixed(2)));
200c9acd2f3SSander de Smalen 
201c9acd2f3SSander de Smalen   const LLT NXV2S64 = LLT::scalable_vector(2, 64);
202c9acd2f3SSander de Smalen   const LLT NXV3S64 = LLT::scalable_vector(3, 64);
203c9acd2f3SSander de Smalen   const LLT NXV2P0 = LLT::scalable_vector(2, P0);
204c9acd2f3SSander de Smalen 
205c9acd2f3SSander de Smalen   // Scalable vector to scalar
206c9acd2f3SSander de Smalen   EXPECT_EQ(S64, NXV2S64.changeElementCount(ElementCount::getFixed(1)));
207c9acd2f3SSander de Smalen   EXPECT_EQ(P0, NXV2P0.changeElementCount(ElementCount::getFixed(1)));
208c9acd2f3SSander de Smalen 
209c9acd2f3SSander de Smalen   // Fixed-width vector to scalable vector
210c9acd2f3SSander de Smalen   EXPECT_EQ(NXV3S64, V2S64.changeElementCount(ElementCount::getScalable(3)));
211c9acd2f3SSander de Smalen 
212c9acd2f3SSander de Smalen   // Scalable vector to fixed-width vector
213c9acd2f3SSander de Smalen   EXPECT_EQ(V3P0, NXV2P0.changeElementCount(ElementCount::getFixed(3)));
214c9acd2f3SSander de Smalen 
215c9acd2f3SSander de Smalen   // Scalar to scalable vector
216c9acd2f3SSander de Smalen   EXPECT_EQ(NXV2S64, S64.changeElementCount(ElementCount::getScalable(2)));
217c9acd2f3SSander de Smalen   EXPECT_EQ(NXV2P0, P0.changeElementCount(ElementCount::getScalable(2)));
21824ab761aSMatt Arsenault }
21924ab761aSMatt Arsenault 
22091be65beSMatt Arsenault #ifdef GTEST_HAS_DEATH_TEST
22191be65beSMatt Arsenault #ifndef NDEBUG
22291be65beSMatt Arsenault 
22391be65beSMatt Arsenault // Invalid to directly change the element size for pointers.
TEST(LowLevelTypeTest,ChangeElementTypeDeath)22491be65beSMatt Arsenault TEST(LowLevelTypeTest, ChangeElementTypeDeath) {
22591be65beSMatt Arsenault   const LLT P0 = LLT::pointer(0, 32);
226d5e14ba8SSander de Smalen   const LLT V2P0 = LLT::fixed_vector(2, P0);
22791be65beSMatt Arsenault 
22891be65beSMatt Arsenault   EXPECT_DEATH(P0.changeElementSize(64),
22991be65beSMatt Arsenault                "invalid to directly change element size for pointers");
23091be65beSMatt Arsenault   EXPECT_DEATH(V2P0.changeElementSize(64),
23191be65beSMatt Arsenault                "invalid to directly change element size for pointers");
23291be65beSMatt Arsenault 
23391be65beSMatt Arsenault   // Make sure this still fails even without a change in size.
23491be65beSMatt Arsenault   EXPECT_DEATH(P0.changeElementSize(32),
23591be65beSMatt Arsenault                "invalid to directly change element size for pointers");
23691be65beSMatt Arsenault   EXPECT_DEATH(V2P0.changeElementSize(32),
23791be65beSMatt Arsenault                "invalid to directly change element size for pointers");
23891be65beSMatt Arsenault }
23991be65beSMatt Arsenault 
24091be65beSMatt Arsenault #endif
24191be65beSMatt Arsenault #endif
24291be65beSMatt Arsenault 
TEST(LowLevelTypeTest,Pointer)2439f986bf3SAhmed Bougacha TEST(LowLevelTypeTest, Pointer) {
2449f986bf3SAhmed Bougacha   LLVMContext C;
245cdc201fcSMatt Arsenault   DataLayout DL("p64:64:64-p127:512:512:512-p16777215:65528:8");
2469f986bf3SAhmed Bougacha 
247cdc201fcSMatt Arsenault   for (unsigned AS : {0U, 1U, 127U, 0xffffU,
248cdc201fcSMatt Arsenault         static_cast<unsigned>(maxUIntN(23)),
249cdc201fcSMatt Arsenault         static_cast<unsigned>(maxUIntN(24))}) {
250bd7f7e2eSSander de Smalen     for (ElementCount EC :
251bd7f7e2eSSander de Smalen          {ElementCount::getFixed(2), ElementCount::getFixed(3),
252bd7f7e2eSSander de Smalen           ElementCount::getFixed(4), ElementCount::getFixed(256),
253bd7f7e2eSSander de Smalen           ElementCount::getFixed(65535), ElementCount::getScalable(2),
254bd7f7e2eSSander de Smalen           ElementCount::getScalable(3), ElementCount::getScalable(4),
255bd7f7e2eSSander de Smalen           ElementCount::getScalable(256), ElementCount::getScalable(65535)}) {
2565ae8350aSTim Northover       const LLT Ty = LLT::pointer(AS, DL.getPointerSizeInBits(AS));
257d5e14ba8SSander de Smalen       const LLT VTy = LLT::vector(EC, Ty);
2589f986bf3SAhmed Bougacha 
2599f986bf3SAhmed Bougacha       // Test kind.
2609f986bf3SAhmed Bougacha       ASSERT_TRUE(Ty.isValid());
2619f986bf3SAhmed Bougacha       ASSERT_TRUE(Ty.isPointer());
2629f986bf3SAhmed Bougacha 
2639f986bf3SAhmed Bougacha       ASSERT_FALSE(Ty.isScalar());
2649f986bf3SAhmed Bougacha       ASSERT_FALSE(Ty.isVector());
2659f986bf3SAhmed Bougacha 
2660f36e68fSKristof Beyls       ASSERT_TRUE(VTy.isValid());
2670f36e68fSKristof Beyls       ASSERT_TRUE(VTy.isVector());
2680f36e68fSKristof Beyls       ASSERT_TRUE(VTy.getElementType().isPointer());
2690f36e68fSKristof Beyls 
270cdc201fcSMatt Arsenault       EXPECT_EQ(Ty, VTy.getElementType());
271cdc201fcSMatt Arsenault       EXPECT_EQ(Ty.getSizeInBits(), VTy.getScalarSizeInBits());
272cdc201fcSMatt Arsenault 
2739f986bf3SAhmed Bougacha       // Test address space.
2749f986bf3SAhmed Bougacha       EXPECT_EQ(AS, Ty.getAddressSpace());
2750f36e68fSKristof Beyls       EXPECT_EQ(AS, VTy.getElementType().getAddressSpace());
2769f986bf3SAhmed Bougacha 
2779f986bf3SAhmed Bougacha       // Test equality operators.
2789f986bf3SAhmed Bougacha       EXPECT_TRUE(Ty == Ty);
2799d955571SAhmed Bougacha       EXPECT_FALSE(Ty != Ty);
2800f36e68fSKristof Beyls       EXPECT_TRUE(VTy == VTy);
2810f36e68fSKristof Beyls       EXPECT_FALSE(VTy != VTy);
2829f986bf3SAhmed Bougacha 
2839f986bf3SAhmed Bougacha       // Test Type->LLT conversion.
28428fdc427STim Northover       Type *IRTy = PointerType::get(IntegerType::get(C, 8), AS);
28552b4ce72SDaniel Sanders       EXPECT_EQ(Ty, getLLTForType(*IRTy, DL));
286bd7f7e2eSSander de Smalen       Type *IRVTy =
287bd7f7e2eSSander de Smalen           VectorType::get(PointerType::get(IntegerType::get(C, 8), AS), EC);
2880f36e68fSKristof Beyls       EXPECT_EQ(VTy, getLLTForType(*IRVTy, DL));
2899f986bf3SAhmed Bougacha     }
2909f986bf3SAhmed Bougacha   }
291cdc201fcSMatt Arsenault }
2929f986bf3SAhmed Bougacha 
TEST(LowLevelTypeTest,Invalid)2939f986bf3SAhmed Bougacha TEST(LowLevelTypeTest, Invalid) {
2949f986bf3SAhmed Bougacha   const LLT Ty;
2959f986bf3SAhmed Bougacha 
2969f986bf3SAhmed Bougacha   ASSERT_FALSE(Ty.isValid());
2979f986bf3SAhmed Bougacha   ASSERT_FALSE(Ty.isScalar());
2989f986bf3SAhmed Bougacha   ASSERT_FALSE(Ty.isPointer());
2999f986bf3SAhmed Bougacha   ASSERT_FALSE(Ty.isVector());
3009f986bf3SAhmed Bougacha }
3019f986bf3SAhmed Bougacha 
TEST(LowLevelTypeTest,Divide)302f48fe2c3SMatt Arsenault TEST(LowLevelTypeTest, Divide) {
303f48fe2c3SMatt Arsenault   // Test basic scalar->scalar cases.
304f48fe2c3SMatt Arsenault   EXPECT_EQ(LLT::scalar(16), LLT::scalar(32).divide(2));
305f48fe2c3SMatt Arsenault   EXPECT_EQ(LLT::scalar(8), LLT::scalar(32).divide(4));
306f48fe2c3SMatt Arsenault   EXPECT_EQ(LLT::scalar(8), LLT::scalar(32).divide(4));
307f48fe2c3SMatt Arsenault 
308f48fe2c3SMatt Arsenault   // Test pointer->scalar
309f48fe2c3SMatt Arsenault   EXPECT_EQ(LLT::scalar(32), LLT::pointer(0, 64).divide(2));
310f48fe2c3SMatt Arsenault 
311f48fe2c3SMatt Arsenault   // Test dividing vectors.
312d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::scalar(32), LLT::fixed_vector(2, 32).divide(2));
313d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(2, 32), LLT::fixed_vector(4, 32).divide(2));
314f48fe2c3SMatt Arsenault 
315f48fe2c3SMatt Arsenault   // Test vector of pointers
316f48fe2c3SMatt Arsenault   EXPECT_EQ(LLT::pointer(1, 64),
317d5e14ba8SSander de Smalen             LLT::fixed_vector(4, LLT::pointer(1, 64)).divide(4));
318d5e14ba8SSander de Smalen   EXPECT_EQ(LLT::fixed_vector(2, LLT::pointer(1, 64)),
319d5e14ba8SSander de Smalen             LLT::fixed_vector(4, LLT::pointer(1, 64)).divide(2));
320f48fe2c3SMatt Arsenault }
321f48fe2c3SMatt Arsenault 
TEST(LowLevelTypeTest,MultiplyElements)322*12d79b15SMatt Arsenault TEST(LowLevelTypeTest, MultiplyElements) {
323*12d79b15SMatt Arsenault   // Basic scalar->vector cases
324*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(2, 16), LLT::scalar(16).multiplyElements(2));
325*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(3, 16), LLT::scalar(16).multiplyElements(3));
326*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(4, 32), LLT::scalar(32).multiplyElements(4));
327*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(4, 7), LLT::scalar(7).multiplyElements(4));
328*12d79b15SMatt Arsenault 
329*12d79b15SMatt Arsenault   // Basic vector to vector cases
330*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(4, 32),
331*12d79b15SMatt Arsenault             LLT::fixed_vector(2, 32).multiplyElements(2));
332*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(9, 32),
333*12d79b15SMatt Arsenault             LLT::fixed_vector(3, 32).multiplyElements(3));
334*12d79b15SMatt Arsenault 
335*12d79b15SMatt Arsenault   // Pointer to vector of pointers
336*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(2, LLT::pointer(0, 32)),
337*12d79b15SMatt Arsenault             LLT::pointer(0, 32).multiplyElements(2));
338*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(3, LLT::pointer(1, 32)),
339*12d79b15SMatt Arsenault             LLT::pointer(1, 32).multiplyElements(3));
340*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(4, LLT::pointer(1, 64)),
341*12d79b15SMatt Arsenault             LLT::pointer(1, 64).multiplyElements(4));
342*12d79b15SMatt Arsenault 
343*12d79b15SMatt Arsenault   // Vector of pointers to vector of pointers
344*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(8, LLT::pointer(1, 64)),
345*12d79b15SMatt Arsenault             LLT::fixed_vector(2, LLT::pointer(1, 64)).multiplyElements(4));
346*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::fixed_vector(9, LLT::pointer(1, 32)),
347*12d79b15SMatt Arsenault             LLT::fixed_vector(3, LLT::pointer(1, 32)).multiplyElements(3));
348*12d79b15SMatt Arsenault 
349*12d79b15SMatt Arsenault   // Scalable vectors
350*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::scalable_vector(4, 16),
351*12d79b15SMatt Arsenault             LLT::scalable_vector(2, 16).multiplyElements(2));
352*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::scalable_vector(6, 16),
353*12d79b15SMatt Arsenault             LLT::scalable_vector(2, 16).multiplyElements(3));
354*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::scalable_vector(9, 16),
355*12d79b15SMatt Arsenault             LLT::scalable_vector(3, 16).multiplyElements(3));
356*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::scalable_vector(4, 32),
357*12d79b15SMatt Arsenault             LLT::scalable_vector(2, 32).multiplyElements(2));
358*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::scalable_vector(256, 32),
359*12d79b15SMatt Arsenault             LLT::scalable_vector(8, 32).multiplyElements(32));
360*12d79b15SMatt Arsenault 
361*12d79b15SMatt Arsenault   // Scalable vectors of pointers
362*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::scalable_vector(4, LLT::pointer(0, 32)),
363*12d79b15SMatt Arsenault             LLT::scalable_vector(2, LLT::pointer(0, 32)).multiplyElements(2));
364*12d79b15SMatt Arsenault   EXPECT_EQ(LLT::scalable_vector(32, LLT::pointer(1, 64)),
365*12d79b15SMatt Arsenault             LLT::scalable_vector(8, LLT::pointer(1, 64)).multiplyElements(4));
366*12d79b15SMatt Arsenault }
3679f986bf3SAhmed Bougacha }
368