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