File: qrdmulh.c

package info (click to toggle)
simde 0.8.2-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie, trixie-backports
  • size: 58,264 kB
  • sloc: ansic: 817,393; sh: 315; makefile: 45; python: 26
file content (263 lines) | stat: -rw-r--r-- 15,200 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
#define SIMDE_TEST_ARM_NEON_INSN qrdmulh

#include "test-neon.h"
#include "../../../simde/arm/neon/qrdmulh.h"

static int
test_simde_vqrdmulh_s16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int16_t a[4];
    int16_t b[4];
    int16_t r[4];
  } test_vec[] = {
    { {  INT16_C( 24408),  INT16_C(  8011), -INT16_C( 30441), -INT16_C( 30215) },
      {  INT16_C(  4356),  INT16_C( 11308),  INT16_C(  3238), -INT16_C( 19917) },
      {  INT16_C(  3245),  INT16_C(  2765), -INT16_C(  3008),  INT16_C( 18365) } },
    { {  INT16_C( 11964),  INT16_C( 20417), -INT16_C(  7014),  INT16_C(  9797) },
      {  INT16_C(  3004),  INT16_C(  6963), -INT16_C( 19145), -INT16_C( 28864) },
      {  INT16_C(  1097),  INT16_C(  4338),  INT16_C(  4098), -INT16_C(  8630) } },
    { { -INT16_C( 29676),  INT16_C( 11183), -INT16_C( 22507),  INT16_C(  6580) },
      { -INT16_C(  7751),  INT16_C( 24645),  INT16_C( 30957), -INT16_C( 21998) },
      {  INT16_C(  7020),  INT16_C(  8411), -INT16_C( 21263), -INT16_C(  4417) } },
    { { -INT16_C( 11354),  INT16_C( 16889),  INT16_C( 16055),  INT16_C( 29799) },
      { -INT16_C( 26039), -INT16_C( 32625), -INT16_C( 12465),  INT16_C( 25360) },
      {  INT16_C(  9022), -INT16_C( 16815), -INT16_C(  6107),  INT16_C( 23062) } },
    { { -INT16_C( 16549),  INT16_C( 28814),  INT16_C( 17255),  INT16_C(  8329) },
      { -INT16_C( 12508),  INT16_C(  4480), -INT16_C( 28089), -INT16_C(  4421) },
      {  INT16_C(  6317),  INT16_C(  3939), -INT16_C( 14791), -INT16_C(  1124) } },
    { { -INT16_C( 19354),  INT16_C(  7471), -INT16_C( 26894),  INT16_C( 15249) },
      {  INT16_C(  8240), -INT16_C( 32580), -INT16_C( 13072),  INT16_C( 19427) },
      { -INT16_C(  4867), -INT16_C(  7428),  INT16_C( 10729),  INT16_C(  9041) } },
    { {  INT16_C( 29323), -INT16_C(  3396),  INT16_C( 17845), -INT16_C(  9966) },
      { -INT16_C( 27884),  INT16_C( 23786), -INT16_C( 23003), -INT16_C( 29878) },
      { -INT16_C( 24952), -INT16_C(  2465), -INT16_C( 12527),  INT16_C(  9087) } },
    { {  INT16_C( 31066),  INT16_C( 19881),  INT16_C( 14863),  INT16_C( 16264) },
      {  INT16_C( 17499),  INT16_C( 19391), -INT16_C( 23792), -INT16_C( 25706) },
      {  INT16_C( 16590),  INT16_C( 11765), -INT16_C( 10792), -INT16_C( 12759) } },
    { {        INT16_MIN,        INT16_MIN,       INT16_MIN,         INT16_MIN },
      {        INT16_MIN,        INT16_MIN,       INT16_MIN,         INT16_MIN },
      {        INT16_MAX,        INT16_MAX,       INT16_MAX,         INT16_MAX } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int16x4_t a = simde_vld1_s16(test_vec[i].a);
    simde_int16x4_t b = simde_vld1_s16(test_vec[i].b);
    simde_int16x4_t r = simde_vqrdmulh_s16(a, b);

    simde_test_arm_neon_assert_equal_i16x4(r, simde_vld1_s16(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_int16x4_t a = simde_test_arm_neon_random_i16x4();
    simde_int16x4_t b = simde_test_arm_neon_random_i16x4();
    simde_int16x4_t r = simde_vqrdmulh_s16(a, b);

    simde_test_arm_neon_write_i16x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i16x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i16x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vqrdmulh_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t a[2];
    int32_t b[2];
    int32_t r[2];
  } test_vec[] = {
    { {  INT32_C(  1899441268),  INT32_C(   839689240) },
      { -INT32_C(  1702480800), -INT32_C(  1555117258) },
      { -INT32_C(  1505837911), -INT32_C(   608067600) } },
    { { -INT32_C(   252180371), -INT32_C(    33985746) },
      {  INT32_C(  1179500889), -INT32_C(  1494958031) },
      { -INT32_C(   138509540),  INT32_C(    23658976) } },
    { {  INT32_C(    68623340),  INT32_C(   540419007) },
      { -INT32_C(  1900364456), -INT32_C(   181270136) },
      { -INT32_C(    60726589), -INT32_C(    45617030) } },
    { {  INT32_C(  1088760337), -INT32_C(   281157995) },
      { -INT32_C(   785020257),  INT32_C(   930552139) },
      { -INT32_C(   398000199), -INT32_C(   121831975) } },
    { { -INT32_C(   214135244),  INT32_C(   152269489) },
      { -INT32_C(  1214722513), -INT32_C(   391329065) },
      {  INT32_C(   121125440), -INT32_C(    27747581) } },
    { { -INT32_C(  1993829644),  INT32_C(   276325744) },
      {  INT32_C(  1004645872), -INT32_C(    93169466) },
      { -INT32_C(   932762735), -INT32_C(    11988507) } },
    { { -INT32_C(  1745965338),  INT32_C(  1352728865) },
      { -INT32_C(  1509410353), -INT32_C(   141577213) },
      {  INT32_C(  1227193585), -INT32_C(    89181393) } },
    { { -INT32_C(  1216301242),  INT32_C(   231209245) },
      {  INT32_C(  1833478310), -INT32_C(   429409792) },
      { -INT32_C(  1038453516), -INT32_C(    46232489) } },
    { {              INT32_MIN,              INT32_MIN },
      {              INT32_MIN,              INT32_MIN },
      {              INT32_MAX,              INT32_MAX } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int32x2_t a = simde_vld1_s32(test_vec[i].a);
    simde_int32x2_t b = simde_vld1_s32(test_vec[i].b);
    simde_int32x2_t r = simde_vqrdmulh_s32(a, b);

    simde_test_arm_neon_assert_equal_i32x2(r, simde_vld1_s32(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_int32x2_t a = simde_test_arm_neon_random_i32x2();
    simde_int32x2_t b = simde_test_arm_neon_random_i32x2();
    simde_int32x2_t r = simde_vqrdmulh_s32(a, b);

    simde_test_arm_neon_write_i32x2(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i32x2(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i32x2(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vqrdmulhq_s16 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int16_t a[8];
    int16_t b[8];
    int16_t r[8];
  } test_vec[] = {
    { {  INT16_C(   362),  INT16_C( 17724),  INT16_C(  9860), -INT16_C( 26948),  INT16_C( 19934),  INT16_C( 20294),  INT16_C( 24470),  INT16_C( 32030) },
      { -INT16_C( 27709),  INT16_C(  4190),  INT16_C(  5967), -INT16_C( 18116), -INT16_C(  5194), -INT16_C( 32603),  INT16_C( 21823), -INT16_C( 22254) },
      { -INT16_C(   306),  INT16_C(  2266),  INT16_C(  1795),  INT16_C( 14898), -INT16_C(  3160), -INT16_C( 20192),  INT16_C( 16297), -INT16_C( 21753) } },
    { {  INT16_C( 20311), -INT16_C(  9233), -INT16_C( 21643),  INT16_C( 21361), -INT16_C( 18440), -INT16_C( 29022), -INT16_C( 16105), -INT16_C(  9716) },
      {  INT16_C( 27220), -INT16_C( 23318),  INT16_C(  9857),  INT16_C( 14173),  INT16_C(   785),  INT16_C( 20664), -INT16_C( 13736), -INT16_C( 20486) },
      {  INT16_C( 16872),  INT16_C(  6570), -INT16_C(  6510),  INT16_C(  9239), -INT16_C(   442), -INT16_C( 18302),  INT16_C(  6751),  INT16_C(  6074) } },
    { { -INT16_C(  5863), -INT16_C( 28790), -INT16_C(   876), -INT16_C( 29470), -INT16_C( 31309), -INT16_C( 13797),  INT16_C( 10054), -INT16_C( 25948) },
      { -INT16_C( 29039),  INT16_C(  4670), -INT16_C( 25420), -INT16_C( 14774),  INT16_C(   671), -INT16_C(  2282),  INT16_C(  4300), -INT16_C(  6489) },
      {  INT16_C(  5196), -INT16_C(  4103),  INT16_C(   680),  INT16_C( 13287), -INT16_C(   641),  INT16_C(   961),  INT16_C(  1319),  INT16_C(  5138) } },
    { {  INT16_C( 12793), -INT16_C( 29323),  INT16_C( 22317), -INT16_C(  7910),  INT16_C( 13788),  INT16_C(  8875),  INT16_C( 20572), -INT16_C(  4675) },
      { -INT16_C(  1058), -INT16_C( 27649),  INT16_C( 18839),  INT16_C( 13913),  INT16_C( 28491),  INT16_C(  6190), -INT16_C( 10880),  INT16_C( 31230) },
      { -INT16_C(   413),  INT16_C( 24742),  INT16_C( 12831), -INT16_C(  3359),  INT16_C( 11988),  INT16_C(  1677), -INT16_C(  6831), -INT16_C(  4456) } },
    { {  INT16_C( 29446),  INT16_C( 13319),  INT16_C(  8650), -INT16_C( 22763), -INT16_C( 16298), -INT16_C( 19767), -INT16_C( 31216), -INT16_C(  4193) },
      { -INT16_C( 24958),  INT16_C(  6530), -INT16_C(  9240),  INT16_C( 13136),  INT16_C( 32330), -INT16_C( 13749),  INT16_C( 18771),  INT16_C( 22852) },
      { -INT16_C( 22428),  INT16_C(  2654), -INT16_C(  2439), -INT16_C(  9125), -INT16_C( 16080),  INT16_C(  8294), -INT16_C( 17882), -INT16_C(  2924) } },
    { {  INT16_C( 19388), -INT16_C( 30835), -INT16_C( 23956), -INT16_C( 15826), -INT16_C(  2205),  INT16_C( 29556),  INT16_C(  4990),  INT16_C(    98) },
      { -INT16_C(  6991), -INT16_C( 26343),  INT16_C( 27071),  INT16_C(  2765),  INT16_C(  6375),  INT16_C( 15060),  INT16_C(  6242),  INT16_C(  7828) },
      { -INT16_C(  4136),  INT16_C( 24789), -INT16_C( 19791), -INT16_C(  1335), -INT16_C(   429),  INT16_C( 13584),  INT16_C(   951),  INT16_C(    23) } },
    { {  INT16_C(  8547), -INT16_C( 12379), -INT16_C( 11324),  INT16_C( 10129),  INT16_C(  1483),  INT16_C( 18842), -INT16_C(   744), -INT16_C( 13751) },
      {  INT16_C( 25313), -INT16_C( 24221),  INT16_C( 12492), -INT16_C( 19541),  INT16_C( 32585), -INT16_C( 21522), -INT16_C( 32104), -INT16_C(  1079) },
      {  INT16_C(  6602),  INT16_C(  9150), -INT16_C(  4317), -INT16_C(  6040),  INT16_C(  1475), -INT16_C( 12375),  INT16_C(   729),  INT16_C(   453) } },
    { {  INT16_C( 28579),  INT16_C( 26571),  INT16_C( 23618),  INT16_C(  3470),  INT16_C( 10594),  INT16_C( 31318), -INT16_C( 24794),  INT16_C(  1860) },
      { -INT16_C( 22526), -INT16_C( 12632),  INT16_C( 21464),  INT16_C(  8577),  INT16_C( 28627),  INT16_C( 27596), -INT16_C( 26895), -INT16_C( 27290) },
      { -INT16_C( 19646), -INT16_C( 10243),  INT16_C( 15470),  INT16_C(   908),  INT16_C(  9255),  INT16_C( 26375),  INT16_C( 20350), -INT16_C(  1549) } },
#if !defined(SIMDE_X86_SSE_NATIVE) && !defined(SIMDE_X86_MMX_NATIVE)
    { {        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN },
      {        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN,        INT16_MIN },
      {        INT16_MAX,        INT16_MAX,        INT16_MAX,        INT16_MAX,        INT16_MAX,        INT16_MAX,        INT16_MAX,        INT16_MAX } },
#endif

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int16x8_t a = simde_vld1q_s16(test_vec[i].a);
    simde_int16x8_t b = simde_vld1q_s16(test_vec[i].b);
    simde_int16x8_t r = simde_vqrdmulhq_s16(a, b);

    simde_test_arm_neon_assert_equal_i16x8(r, simde_vld1q_s16(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_int16x8_t a = simde_test_arm_neon_random_i16x8();
    simde_int16x8_t b = simde_test_arm_neon_random_i16x8();
    simde_int16x8_t r = simde_vqrdmulhq_s16(a, b);

    simde_test_arm_neon_write_i16x8(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i16x8(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i16x8(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

static int
test_simde_vqrdmulhq_s32 (SIMDE_MUNIT_TEST_ARGS) {
#if 1
  static const struct {
    int32_t a[4];
    int32_t b[4];
    int32_t r[4];
  } test_vec[] = {
    { { -INT32_C(  1138864092),  INT32_C(   288563958), -INT32_C(  1259870191), -INT32_C(   155258730) },
      {  INT32_C(  2111102674),  INT32_C(  1634858731), -INT32_C(   551689891), -INT32_C(   930088541) },
      { -INT32_C(  1119570355),  INT32_C(   219680977),  INT32_C(   323661439),  INT32_C(    67243523) } },
    { {  INT32_C(  1082436937), -INT32_C(   531515185),  INT32_C(   915749280), -INT32_C(    80981207) },
      {  INT32_C(   494403890),  INT32_C(  1417603831),  INT32_C(  1848876235), -INT32_C(   566836587) },
      {  INT32_C(   249203775), -INT32_C(   350865518),  INT32_C(   788414423),  INT32_C(    21375302) } },
    { {  INT32_C(  1042201455),  INT32_C(   320827507), -INT32_C(   766921559),  INT32_C(   969766151) },
      {  INT32_C(  1834370678), -INT32_C(    71117520),  INT32_C(   107607409),  INT32_C(   669294776) },
      {  INT32_C(   890243701), -INT32_C(    10624741), -INT32_C(    38429369),  INT32_C(   302241845) } },
    { { -INT32_C(   832175269),  INT32_C(   484541811),  INT32_C(  1089350201),  INT32_C(   377142175) },
      {  INT32_C(   830722049),  INT32_C(   372000165), -INT32_C(   216230341), -INT32_C(  1860566730) },
      { -INT32_C(   321914602),  INT32_C(    83935276), -INT32_C(   109686780), -INT32_C(   326753679) } },
    { {  INT32_C(  2002747396),  INT32_C(  1049837573),  INT32_C(   159351146),  INT32_C(  1042282812) },
      {  INT32_C(  1869587401),  INT32_C(   595959016),  INT32_C(  1746313778), -INT32_C(  1476841053) },
      {  INT32_C(  1743580820),  INT32_C(   291345719),  INT32_C(   129582873), -INT32_C(   716785922) } },
    { { -INT32_C(  1222747983),  INT32_C(    49656216),  INT32_C(  1846244402),  INT32_C(   934030189) },
      { -INT32_C(  1230627634), -INT32_C(   354800712),  INT32_C(  1884483789), -INT32_C(   753448159) },
      {  INT32_C(   700702638), -INT32_C(     8204049),  INT32_C(  1620136968), -INT32_C(   327706023) } },
    { {  INT32_C(   998913443),  INT32_C(   406683622),  INT32_C(  1636255988),  INT32_C(  1100493683) },
      {  INT32_C(   133709391),  INT32_C(   938594922), -INT32_C(   458734654),  INT32_C(   834125710) },
      {  INT32_C(    62195635),  INT32_C(   177748121), -INT32_C(   349528773),  INT32_C(   427453813) } },
    { { -INT32_C(   613662219), -INT32_C(  1259034176),  INT32_C(  1695972338), -INT32_C(    22565202) },
      {  INT32_C(  1459986413),  INT32_C(   865007473), -INT32_C(   921225670), -INT32_C(   335884554) },
      { -INT32_C(   417203876), -INT32_C(   507139587), -INT32_C(   727536740),  INT32_C(     3529388) } },
    { {              INT32_MIN,              INT32_MIN,              INT32_MIN,              INT32_MIN },
      {              INT32_MIN,              INT32_MIN,              INT32_MIN,              INT32_MIN },
      {              INT32_MAX,              INT32_MAX,              INT32_MAX,              INT32_MAX } },

  };

  for (size_t i = 0 ; i < (sizeof(test_vec) / sizeof(test_vec[0])) ; i++) {
    simde_int32x4_t a = simde_vld1q_s32(test_vec[i].a);
    simde_int32x4_t b = simde_vld1q_s32(test_vec[i].b);
    simde_int32x4_t r = simde_vqrdmulhq_s32(a, b);
    simde_test_arm_neon_assert_equal_i32x4(r, simde_vld1q_s32(test_vec[i].r));
  }

  return 0;
#else
  fputc('\n', stdout);
  for (int i = 0 ; i < 8 ; i++) {
    simde_int32x4_t a = simde_test_arm_neon_random_i32x4();
    simde_int32x4_t b = simde_test_arm_neon_random_i32x4();
    simde_int32x4_t r = simde_vqrdmulhq_s32(a, b);

    simde_test_arm_neon_write_i32x4(2, a, SIMDE_TEST_VEC_POS_FIRST);
    simde_test_arm_neon_write_i32x4(2, b, SIMDE_TEST_VEC_POS_MIDDLE);
    simde_test_arm_neon_write_i32x4(2, r, SIMDE_TEST_VEC_POS_LAST);
  }
  return 1;
#endif
}

SIMDE_TEST_FUNC_LIST_BEGIN
SIMDE_TEST_FUNC_LIST_ENTRY(vqrdmulh_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vqrdmulh_s32)

SIMDE_TEST_FUNC_LIST_ENTRY(vqrdmulhq_s16)
SIMDE_TEST_FUNC_LIST_ENTRY(vqrdmulhq_s32)
SIMDE_TEST_FUNC_LIST_END

#include "test-neon-footer.h"