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