1 /*
2 * Copyright (C) 2014 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17 #ifdef __ARM_NEON__
18
19 #include "gtest/gtest.h"
20
21 #include <arm_neon.h>
22
TEST(Neon,VSRI)23 TEST(Neon, VSRI) {
24 uint32x2_t d = {0x11223344, 0x55667788};
25 uint32x2_t m = {0x99AABBCC, 0xDDEEFF00};
26 uint32x2_t r = vsri_n_u32(d, m, 8);
27 EXPECT_EQ(reinterpret_cast<uint32_t*>(&r)[0], 0x1199AABBu);
28 EXPECT_EQ(reinterpret_cast<uint32_t*>(&r)[1], 0x55DDEEFFu);
29
30 uint64x2_t a = {0x1122334455667788, 0x8877665544332211};
31 uint64x2_t b = {0x99AABBCCDDEEFF00, 0x00FFEEDDCCBBAA99};
32 uint64x2_t c = vsriq_n_u64(a, b, 40);
33 EXPECT_EQ(reinterpret_cast<uint64_t*>(&c)[0], 0x112233445599AABBu);
34 EXPECT_EQ(reinterpret_cast<uint64_t*>(&c)[1], 0x887766554400FFEEu);
35 }
36
TEST(Neon,VTBL)37 TEST(Neon, VTBL) {
38 int8x8x4_t table;
39 for (size_t i = 0; i < sizeof(table); i++) reinterpret_cast<uint8_t*>(&table)[i] = i * 2;
40
41 int8x8_t control = {10, 0, 31, 32, -1, 127, 1, 2};
42 int8x8_t r = vtbl4_s8(table, control);
43 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[0], 20);
44 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[1], 0);
45 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[2], 62);
46 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[3], 0);
47 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[4], 0);
48 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[5], 0);
49 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[6], 2);
50 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[7], 4);
51
52 int8x8_t a = {100, 101, 102, 103, 104, 105, 106, 107};
53 r = vtbx4_s8(a, table, control);
54 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[0], 20);
55 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[1], 0);
56 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[2], 62);
57 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[3], 103);
58 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[4], 104);
59 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[5], 105);
60 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[6], 2);
61 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[7], 4);
62 }
63
TEST(Neon,VTRN)64 TEST(Neon, VTRN) {
65 uint8x8_t d = {11, 22, 33, 44, 55, 66, 77, 88};
66 uint8x8_t m = {1, 2, 3, 4, 5, 6, 7, 8};
67 uint8x8x2_t r = vtrn_u8(d, m);
68 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[0], 11);
69 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[1], 1);
70 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[2], 33);
71 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[3], 3);
72 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[4], 55);
73 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[5], 5);
74 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[6], 77);
75 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[7], 7);
76 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[8], 22);
77 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[9], 2);
78 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[10], 44);
79 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[11], 4);
80 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[12], 66);
81 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[13], 6);
82 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[14], 88);
83 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[15], 8);
84 }
85
TEST(Neon,VZIP)86 TEST(Neon, VZIP) {
87 uint8x8_t d = {11, 22, 33, 44, 55, 66, 77, 88};
88 uint8x8_t m = {1, 2, 3, 4, 5, 6, 7, 8};
89 uint8x8x2_t r = vzip_u8(d, m);
90 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[0], 11);
91 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[1], 1);
92 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[2], 22);
93 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[3], 2);
94 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[4], 33);
95 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[5], 3);
96 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[6], 44);
97 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[7], 4);
98 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[8], 55);
99 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[9], 5);
100 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[10], 66);
101 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[11], 6);
102 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[12], 77);
103 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[13], 7);
104 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[14], 88);
105 EXPECT_EQ(reinterpret_cast<uint8_t*>(&r)[15], 8);
106 }
107
108 #endif // __ARM_NEON__
109