1*9880d681SAndroid Build Coastguard Worker //===- unittests/Support/EndianTest.cpp - Endian.h tests ------------------===//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker // The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/Endian.h"
11*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/DataTypes.h"
12*9880d681SAndroid Build Coastguard Worker #include "gtest/gtest.h"
13*9880d681SAndroid Build Coastguard Worker #include <cstdlib>
14*9880d681SAndroid Build Coastguard Worker #include <ctime>
15*9880d681SAndroid Build Coastguard Worker using namespace llvm;
16*9880d681SAndroid Build Coastguard Worker using namespace support;
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Worker #undef max
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker namespace {
21*9880d681SAndroid Build Coastguard Worker
TEST(Endian,Read)22*9880d681SAndroid Build Coastguard Worker TEST(Endian, Read) {
23*9880d681SAndroid Build Coastguard Worker // These are 5 bytes so we can be sure at least one of the reads is unaligned.
24*9880d681SAndroid Build Coastguard Worker unsigned char bigval[] = {0x00, 0x01, 0x02, 0x03, 0x04};
25*9880d681SAndroid Build Coastguard Worker unsigned char littleval[] = {0x00, 0x04, 0x03, 0x02, 0x01};
26*9880d681SAndroid Build Coastguard Worker int32_t BigAsHost = 0x00010203;
27*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(BigAsHost, (endian::read<int32_t, big, unaligned>(bigval)));
28*9880d681SAndroid Build Coastguard Worker int32_t LittleAsHost = 0x02030400;
29*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(LittleAsHost,(endian::read<int32_t, little, unaligned>(littleval)));
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Worker EXPECT_EQ((endian::read<int32_t, big, unaligned>(bigval + 1)),
32*9880d681SAndroid Build Coastguard Worker (endian::read<int32_t, little, unaligned>(littleval + 1)));
33*9880d681SAndroid Build Coastguard Worker }
34*9880d681SAndroid Build Coastguard Worker
TEST(Endian,ReadBitAligned)35*9880d681SAndroid Build Coastguard Worker TEST(Endian, ReadBitAligned) {
36*9880d681SAndroid Build Coastguard Worker // Simple test to make sure we properly pull out the 0x0 word.
37*9880d681SAndroid Build Coastguard Worker unsigned char littleval[] = {0x3f, 0x00, 0x00, 0x00, 0xc0, 0xff, 0xff, 0xff};
38*9880d681SAndroid Build Coastguard Worker unsigned char bigval[] = {0x00, 0x00, 0x00, 0x3f, 0xff, 0xff, 0xff, 0xc0};
39*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
40*9880d681SAndroid Build Coastguard Worker (endian::readAtBitAlignment<int, little, unaligned>(&littleval[0], 6)),
41*9880d681SAndroid Build Coastguard Worker 0x0);
42*9880d681SAndroid Build Coastguard Worker EXPECT_EQ((endian::readAtBitAlignment<int, big, unaligned>(&bigval[0], 6)),
43*9880d681SAndroid Build Coastguard Worker 0x0);
44*9880d681SAndroid Build Coastguard Worker // Test to make sure that signed right shift of 0xf0000000 is masked
45*9880d681SAndroid Build Coastguard Worker // properly.
46*9880d681SAndroid Build Coastguard Worker unsigned char littleval2[] = {0x00, 0x00, 0x00, 0xf0, 0x00, 0x00, 0x00, 0x00};
47*9880d681SAndroid Build Coastguard Worker unsigned char bigval2[] = {0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
48*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
49*9880d681SAndroid Build Coastguard Worker (endian::readAtBitAlignment<int, little, unaligned>(&littleval2[0], 4)),
50*9880d681SAndroid Build Coastguard Worker 0x0f000000);
51*9880d681SAndroid Build Coastguard Worker EXPECT_EQ((endian::readAtBitAlignment<int, big, unaligned>(&bigval2[0], 4)),
52*9880d681SAndroid Build Coastguard Worker 0x0f000000);
53*9880d681SAndroid Build Coastguard Worker // Test to make sure left shift of start bit doesn't overflow.
54*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
55*9880d681SAndroid Build Coastguard Worker (endian::readAtBitAlignment<int, little, unaligned>(&littleval2[0], 1)),
56*9880d681SAndroid Build Coastguard Worker 0x78000000);
57*9880d681SAndroid Build Coastguard Worker EXPECT_EQ((endian::readAtBitAlignment<int, big, unaligned>(&bigval2[0], 1)),
58*9880d681SAndroid Build Coastguard Worker 0x78000000);
59*9880d681SAndroid Build Coastguard Worker // Test to make sure 64-bit int doesn't overflow.
60*9880d681SAndroid Build Coastguard Worker unsigned char littleval3[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0,
61*9880d681SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
62*9880d681SAndroid Build Coastguard Worker unsigned char bigval3[] = {0xf0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
63*9880d681SAndroid Build Coastguard Worker 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
64*9880d681SAndroid Build Coastguard Worker EXPECT_EQ((endian::readAtBitAlignment<int64_t, little, unaligned>(
65*9880d681SAndroid Build Coastguard Worker &littleval3[0], 4)),
66*9880d681SAndroid Build Coastguard Worker 0x0f00000000000000);
67*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(
68*9880d681SAndroid Build Coastguard Worker (endian::readAtBitAlignment<int64_t, big, unaligned>(&bigval3[0], 4)),
69*9880d681SAndroid Build Coastguard Worker 0x0f00000000000000);
70*9880d681SAndroid Build Coastguard Worker }
71*9880d681SAndroid Build Coastguard Worker
TEST(Endian,WriteBitAligned)72*9880d681SAndroid Build Coastguard Worker TEST(Endian, WriteBitAligned) {
73*9880d681SAndroid Build Coastguard Worker // This test ensures that signed right shift of 0xffffaa is masked
74*9880d681SAndroid Build Coastguard Worker // properly.
75*9880d681SAndroid Build Coastguard Worker unsigned char bigval[8] = {0x00};
76*9880d681SAndroid Build Coastguard Worker endian::writeAtBitAlignment<int32_t, big, unaligned>(bigval, (int)0xffffaaaa,
77*9880d681SAndroid Build Coastguard Worker 4);
78*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval[0], 0xff);
79*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval[1], 0xfa);
80*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval[2], 0xaa);
81*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval[3], 0xa0);
82*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval[4], 0x00);
83*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval[5], 0x00);
84*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval[6], 0x00);
85*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval[7], 0x0f);
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker unsigned char littleval[8] = {0x00};
88*9880d681SAndroid Build Coastguard Worker endian::writeAtBitAlignment<int32_t, little, unaligned>(littleval,
89*9880d681SAndroid Build Coastguard Worker (int)0xffffaaaa, 4);
90*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval[0], 0xa0);
91*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval[1], 0xaa);
92*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval[2], 0xfa);
93*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval[3], 0xff);
94*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval[4], 0x0f);
95*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval[5], 0x00);
96*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval[6], 0x00);
97*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval[7], 0x00);
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Worker // This test makes sure 1<<31 doesn't overflow.
100*9880d681SAndroid Build Coastguard Worker // Test to make sure left shift of start bit doesn't overflow.
101*9880d681SAndroid Build Coastguard Worker unsigned char bigval2[8] = {0x00};
102*9880d681SAndroid Build Coastguard Worker endian::writeAtBitAlignment<int32_t, big, unaligned>(bigval2, (int)0xffffffff,
103*9880d681SAndroid Build Coastguard Worker 1);
104*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval2[0], 0xff);
105*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval2[1], 0xff);
106*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval2[2], 0xff);
107*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval2[3], 0xfe);
108*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval2[4], 0x00);
109*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval2[5], 0x00);
110*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval2[6], 0x00);
111*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval2[7], 0x01);
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker unsigned char littleval2[8] = {0x00};
114*9880d681SAndroid Build Coastguard Worker endian::writeAtBitAlignment<int32_t, little, unaligned>(littleval2,
115*9880d681SAndroid Build Coastguard Worker (int)0xffffffff, 1);
116*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval2[0], 0xfe);
117*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval2[1], 0xff);
118*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval2[2], 0xff);
119*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval2[3], 0xff);
120*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval2[4], 0x01);
121*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval2[5], 0x00);
122*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval2[6], 0x00);
123*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval2[7], 0x00);
124*9880d681SAndroid Build Coastguard Worker
125*9880d681SAndroid Build Coastguard Worker // Test to make sure 64-bit int doesn't overflow.
126*9880d681SAndroid Build Coastguard Worker unsigned char bigval64[16] = {0x00};
127*9880d681SAndroid Build Coastguard Worker endian::writeAtBitAlignment<int64_t, big, unaligned>(
128*9880d681SAndroid Build Coastguard Worker bigval64, (int64_t)0xffffffffffffffff, 1);
129*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[0], 0xff);
130*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[1], 0xff);
131*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[2], 0xff);
132*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[3], 0xff);
133*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[4], 0xff);
134*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[5], 0xff);
135*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[6], 0xff);
136*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[7], 0xfe);
137*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[8], 0x00);
138*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[9], 0x00);
139*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[10], 0x00);
140*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[11], 0x00);
141*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[12], 0x00);
142*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[13], 0x00);
143*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[14], 0x00);
144*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(bigval64[15], 0x01);
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker unsigned char littleval64[16] = {0x00};
147*9880d681SAndroid Build Coastguard Worker endian::writeAtBitAlignment<int64_t, little, unaligned>(
148*9880d681SAndroid Build Coastguard Worker littleval64, (int64_t)0xffffffffffffffff, 1);
149*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[0], 0xfe);
150*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[1], 0xff);
151*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[2], 0xff);
152*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[3], 0xff);
153*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[4], 0xff);
154*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[5], 0xff);
155*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[6], 0xff);
156*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[7], 0xff);
157*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[8], 0x01);
158*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[9], 0x00);
159*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[10], 0x00);
160*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[11], 0x00);
161*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[12], 0x00);
162*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[13], 0x00);
163*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[14], 0x00);
164*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(littleval64[15], 0x00);
165*9880d681SAndroid Build Coastguard Worker }
166*9880d681SAndroid Build Coastguard Worker
TEST(Endian,Write)167*9880d681SAndroid Build Coastguard Worker TEST(Endian, Write) {
168*9880d681SAndroid Build Coastguard Worker unsigned char data[5];
169*9880d681SAndroid Build Coastguard Worker endian::write<int32_t, big, unaligned>(data, -1362446643);
170*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[0], 0xAE);
171*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[1], 0xCA);
172*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[2], 0xB6);
173*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[3], 0xCD);
174*9880d681SAndroid Build Coastguard Worker endian::write<int32_t, big, unaligned>(data + 1, -1362446643);
175*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[1], 0xAE);
176*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[2], 0xCA);
177*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[3], 0xB6);
178*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[4], 0xCD);
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Worker endian::write<int32_t, little, unaligned>(data, -1362446643);
181*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[0], 0xCD);
182*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[1], 0xB6);
183*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[2], 0xCA);
184*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[3], 0xAE);
185*9880d681SAndroid Build Coastguard Worker endian::write<int32_t, little, unaligned>(data + 1, -1362446643);
186*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[1], 0xCD);
187*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[2], 0xB6);
188*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[3], 0xCA);
189*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(data[4], 0xAE);
190*9880d681SAndroid Build Coastguard Worker }
191*9880d681SAndroid Build Coastguard Worker
TEST(Endian,PackedEndianSpecificIntegral)192*9880d681SAndroid Build Coastguard Worker TEST(Endian, PackedEndianSpecificIntegral) {
193*9880d681SAndroid Build Coastguard Worker // These are 5 bytes so we can be sure at least one of the reads is unaligned.
194*9880d681SAndroid Build Coastguard Worker unsigned char big[] = {0x00, 0x01, 0x02, 0x03, 0x04};
195*9880d681SAndroid Build Coastguard Worker unsigned char little[] = {0x00, 0x04, 0x03, 0x02, 0x01};
196*9880d681SAndroid Build Coastguard Worker big32_t *big_val =
197*9880d681SAndroid Build Coastguard Worker reinterpret_cast<big32_t *>(big + 1);
198*9880d681SAndroid Build Coastguard Worker little32_t *little_val =
199*9880d681SAndroid Build Coastguard Worker reinterpret_cast<little32_t *>(little + 1);
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Worker EXPECT_EQ(*big_val, *little_val);
202*9880d681SAndroid Build Coastguard Worker }
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Worker } // end anon namespace
205