1
Hi,
2
1
This patch series adds support for emulation of CRC32 instructions for
3
This patch series adds support for emulation of CRC32 instructions for
2
the Mips target in QEMU, skips NaN mode check for soft-float, adds a CLI
4
the Mips target in QEMU, skips NaN mode check for soft-float, and adds a
3
flag for enabling an MSA feature, and enables the MSA for
5
CLI flag for enabling an MSA feature.
4
MIPS64R2-generic.
5
6
6
There aren't tests for these improvements.
7
The CRC32 instructions are available in MD00087 Revision 6.06.
7
8
Since the disassembly for crc32 is hidden in commit 99029be1c28, the new
8
The patch 1/8 "Add CP0 MemoryMapID register implementation" from v2 has
9
version of the patch 1/3 is basically identical to v1, except tests
9
been dropped from v3 since it has been accepted and integrated into the
10
being added.
10
master branch.
11
12
The patch 3/8 "GTM19-448: Fix script to work without realpath" from v2
13
will be sent separately as it is a fix to a general bug and is intended
14
for other maintainers.
15
16
The patch 5/8 "Add micromips to P5600" from v2 has been dropped from v3
17
since the latest document for P5600 with eventually updated field
18
CP0_Config3_ISA that would support microMIPS hasn't been found.
19
20
The patch 6/8 "Revert use of clock_gettime for benchmarking" from v2 has
21
been dropped from v3 because it seems that clock_gettime and
22
CLOCK_MONOTONIC exist in MinGW headers and that QEMU builds with MinGW.
23
24
The patch 7/8 "target/mips: Enable MSA ASE for mips32r6-generic" from v2
25
has been dropped from v3 since it has been accepted and integrated into
26
the master branch.
27
28
When it comes to the patch 8/8 "target/mips: Enable MSA ASE for
29
mips64R2-generic" from v2, the cpu Loongson-3A4000 supports both
30
mips64r2 and the MSA, so I'm not sure whether to drop this patch.
31
32
Regarding the DSPRAM for I6500, I heard that the IP for the DSPRAM for
33
mips64r6 hasn't been published, but in the document "MIPS64® I6500
34
Multiprocessing System Programmer’s Guide" the DSPRAM is elaborated, so
35
I don't know whether to add support for the DSPRAM.
36
11
37
Most of the following patches are cherry-picked from the branch
12
Most of the following patches are cherry-picked from the branch
38
mips_rel/4_1_0/master on the MIPS' repository:
13
mips_rel/4_1_0/master on the MIPS' repository:
39
https://github.com/MIPS/gnutools-qemu/
14
https://github.com/MIPS/gnutools-qemu/
40
Further details on individual changes are included in the respective
15
Further details on individual changes are included in the respective
41
patches. An instance of a pipeline of QEMU CI jobs run with input
16
patches.
42
variable QEMU_CI=1 for this patch series is available here:
43
https://gitlab.com/rakicaleksandar1999/qemu/-/pipelines/1533819034
44
and for the master branch is available here:
45
https://gitlab.com/rakicaleksandar1999/qemu/-/pipelines/1533465414
46
17
47
We are open for a discussion.
18
Kind regards,
48
19
Aleksandar Rakic
diff view generated by jsdifflib
1
From: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
2
1
Add emulation of MIPS' CRC32 (Cyclic Redundancy Check) instructions.
3
Add emulation of MIPS' CRC32 (Cyclic Redundancy Check) instructions.
2
Reuse zlib crc32() and Linux crc32c().
4
Reuse zlib crc32() and Linux crc32c().
3
5
4
Cherry-picked 4cc974938aee1588f852590509004e340c072940
6
Cherry-picked 4cc974938aee1588f852590509004e340c072940
5
from https://github.com/MIPS/gnutools-qemu
7
from https://github.com/MIPS/gnutools-qemu
6
8
7
Signed-off-by: Yongbok Kim <yongbok.kim@mips.com>
9
Signed-off-by: Yongbok Kim <yongbok.kim@mips.com>
8
Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
10
Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
9
Signed-off-by: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
11
Signed-off-by: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
10
Reviewed-by: Aleksandar Rikalo <arikalo@gmail.com>
12
Reviewed-by: Aleksandar Rikalo <arikalo@gmail.com>
11
---
13
---
12
target/mips/helper.h | 2 ++
14
target/mips/helper.h | 2 +
13
target/mips/meson.build | 1 +
15
target/mips/meson.build | 1 +
14
target/mips/tcg/op_helper.c | 26 ++++++++++++++++++++++++++
16
target/mips/tcg/op_helper.c | 27 +++
15
target/mips/tcg/rel6.decode | 5 +++++
17
target/mips/tcg/translate.c | 37 +++++
16
target/mips/tcg/rel6_translate.c | 14 ++++++++++++++
18
target/mips/tcg/translate.h | 1 +
17
target/mips/tcg/translate.c | 25 +++++++++++++++++++++++++
19
tests/tcg/mips/include/wrappers_mips64r6.h | 35 ++++
18
target/mips/tcg/translate.h | 3 +++
20
tests/tcg/mips/user/isa/mips64r6/crc/Makefile | 34 ++++
19
7 files changed, 76 insertions(+)
21
.../isa/mips64r6/crc/test_mips64r6_crc32b.c | 154 ++++++++++++++++++
22
.../isa/mips64r6/crc/test_mips64r6_crc32cb.c | 154 ++++++++++++++++++
23
.../isa/mips64r6/crc/test_mips64r6_crc32cd.c | 154 ++++++++++++++++++
24
.../isa/mips64r6/crc/test_mips64r6_crc32ch.c | 154 ++++++++++++++++++
25
.../isa/mips64r6/crc/test_mips64r6_crc32cw.c | 154 ++++++++++++++++++
26
.../isa/mips64r6/crc/test_mips64r6_crc32d.c | 154 ++++++++++++++++++
27
.../isa/mips64r6/crc/test_mips64r6_crc32h.c | 154 ++++++++++++++++++
28
.../isa/mips64r6/crc/test_mips64r6_crc32w.c | 154 ++++++++++++++++++
29
15 files changed, 1369 insertions(+)
30
create mode 100644 tests/tcg/mips/user/isa/mips64r6/crc/Makefile
31
create mode 100644 tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32b.c
32
create mode 100644 tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cb.c
33
create mode 100644 tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cd.c
34
create mode 100644 tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32ch.c
35
create mode 100644 tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cw.c
36
create mode 100644 tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32d.c
37
create mode 100644 tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32h.c
38
create mode 100644 tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32w.c
20
39
21
diff --git a/target/mips/helper.h b/target/mips/helper.h
40
diff --git a/target/mips/helper.h b/target/mips/helper.h
22
index XXXXXXX..XXXXXXX 100644
41
index XXXXXXX..XXXXXXX 100644
23
--- a/target/mips/helper.h
42
--- a/target/mips/helper.h
24
+++ b/target/mips/helper.h
43
+++ b/target/mips/helper.h
...
...
77
+{
96
+{
78
+ uint8_t buf[8];
97
+ uint8_t buf[8];
79
+ target_ulong mask = ((sz * 8) == 64) ?
98
+ target_ulong mask = ((sz * 8) == 64) ?
80
+ (target_ulong) -1ULL :
99
+ (target_ulong) -1ULL :
81
+ ((1ULL << (sz * 8)) - 1);
100
+ ((1ULL << (sz * 8)) - 1);
101
+
82
+ m &= mask;
102
+ m &= mask;
83
+ stq_le_p(buf, m);
103
+ stq_le_p(buf, m);
84
+ return (int32_t) (crc32c(val, buf, sz) ^ 0xffffffff);
104
+ return (int32_t) (crc32c(val, buf, sz) ^ 0xffffffff);
85
+}
105
+}
86
+
106
+
87
void helper_fork(target_ulong arg1, target_ulong arg2)
107
void helper_fork(target_ulong arg1, target_ulong arg2)
88
{
108
{
89
/*
109
/*
90
diff --git a/target/mips/tcg/rel6.decode b/target/mips/tcg/rel6.decode
91
index XXXXXXX..XXXXXXX 100644
92
--- a/target/mips/tcg/rel6.decode
93
+++ b/target/mips/tcg/rel6.decode
94
@@ -XXX,XX +XXX,XX @@
95
96
&r rs rt rd sa
97
98
+&special3_crc rs rt c sz
99
+
100
@lsa ...... rs:5 rt:5 rd:5 ... sa:2 ...... &r
101
+@crc32 ...... rs:5 rt:5 ..... c:3 sz:2 ...... &special3_crc
102
103
LSA 000000 ..... ..... ..... 000 .. 000101 @lsa
104
DLSA 000000 ..... ..... ..... 000 .. 010101 @lsa
105
106
+CRC32 011111 ..... ..... 00000 ... .. 001111 @crc32
107
+
108
REMOVED 010011 ----- ----- ----- ----- ------ # COP1X (COP3)
109
110
REMOVED 011100 ----- ----- ----- ----- ------ # SPECIAL2
111
diff --git a/target/mips/tcg/rel6_translate.c b/target/mips/tcg/rel6_translate.c
112
index XXXXXXX..XXXXXXX 100644
113
--- a/target/mips/tcg/rel6_translate.c
114
+++ b/target/mips/tcg/rel6_translate.c
115
@@ -XXX,XX +XXX,XX @@ static bool trans_DLSA(DisasContext *ctx, arg_r *a)
116
}
117
return gen_dlsa(ctx, a->rd, a->rt, a->rs, a->sa);
118
}
119
+
120
+static bool trans_CRC32(DisasContext *ctx, arg_special3_crc *a)
121
+{
122
+ if (unlikely(!ctx->crcp) ||
123
+ unlikely((a->sz == 3) &&
124
+ (!(ctx->hflags & MIPS_HFLAG_64))) ||
125
+ unlikely((a->c >= 2))) {
126
+ gen_reserved_instruction(ctx);
127
+ return true;
128
+ }
129
+ gen_crc32(ctx, a->rt, a->rs, a->rt,
130
+ a->sz, a->c);
131
+ return true;
132
+}
133
diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c
110
diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c
134
index XXXXXXX..XXXXXXX 100644
111
index XXXXXXX..XXXXXXX 100644
135
--- a/target/mips/tcg/translate.c
112
--- a/target/mips/tcg/translate.c
136
+++ b/target/mips/tcg/translate.c
113
+++ b/target/mips/tcg/translate.c
114
@@ -XXX,XX +XXX,XX @@ enum {
115
OPC_LWE = 0x2F | OPC_SPECIAL3,
116
117
/* R6 */
118
+ OPC_CRC32 = 0x0F | OPC_SPECIAL3,
119
R6_OPC_PREF = 0x35 | OPC_SPECIAL3,
120
R6_OPC_CACHE = 0x25 | OPC_SPECIAL3,
121
R6_OPC_LL = 0x36 | OPC_SPECIAL3,
137
@@ -XXX,XX +XXX,XX @@ static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx)
122
@@ -XXX,XX +XXX,XX @@ static void decode_opc_special2_legacy(CPUMIPSState *env, DisasContext *ctx)
138
}
123
}
139
}
124
}
140
125
141
+void gen_crc32(DisasContext *ctx, int rd, int rs, int rt, int sz,
126
+static void gen_crc32(DisasContext *ctx, int rd, int rs, int rt, int sz,
142
+ int crc32c)
127
+ int crc32c)
143
+{
128
+{
144
+ TCGv t0;
129
+ TCGv t0;
145
+ TCGv t1;
130
+ TCGv t1;
146
+ TCGv_i32 tsz = tcg_constant_i32(1 << sz);
131
+ TCGv_i32 tsz = tcg_constant_i32(1 << sz);
...
...
163
+}
148
+}
164
+
149
+
165
static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
150
static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
166
{
151
{
167
int rs, rt, rd, sa;
152
int rs, rt, rd, sa;
153
@@ -XXX,XX +XXX,XX @@ static void decode_opc_special3_r6(CPUMIPSState *env, DisasContext *ctx)
154
155
op1 = MASK_SPECIAL3(ctx->opcode);
156
switch (op1) {
157
+ case OPC_CRC32:
158
+ if (unlikely(!ctx->crcp) ||
159
+ unlikely((extract32(ctx->opcode, 6, 2) == 3) &&
160
+ (!(ctx->hflags & MIPS_HFLAG_64))) ||
161
+ unlikely((extract32(ctx->opcode, 8, 3) >= 2))) {
162
+ gen_reserved_instruction(ctx);
163
+ }
164
+ gen_crc32(ctx, rt, rs, rt,
165
+ extract32(ctx->opcode, 6, 2),
166
+ extract32(ctx->opcode, 8, 3));
167
+ break;
168
case R6_OPC_PREF:
169
if (rt >= 24) {
170
/* hint codes 24-31 are reserved and signal RI */
168
@@ -XXX,XX +XXX,XX @@ static void mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
171
@@ -XXX,XX +XXX,XX @@ static void mips_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
169
ctx->abs2008 = (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1;
172
ctx->abs2008 = (env->active_fpu.fcr31 >> FCR31_ABS2008) & 1;
170
ctx->mi = (env->CP0_Config5 >> CP0C5_MI) & 1;
173
ctx->mi = (env->CP0_Config5 >> CP0C5_MI) & 1;
171
ctx->gi = (env->CP0_Config5 >> CP0C5_GI) & 3;
174
ctx->gi = (env->CP0_Config5 >> CP0C5_GI) & 3;
172
+ ctx->crcp = (env->CP0_Config5 >> CP0C5_CRCP) & 1;
175
+ ctx->crcp = (env->CP0_Config5 >> CP0C5_CRCP) & 1;
...
...
183
int gi;
186
int gi;
184
+ bool crcp;
187
+ bool crcp;
185
} DisasContext;
188
} DisasContext;
186
189
187
#define DISAS_STOP DISAS_TARGET_0
190
#define DISAS_STOP DISAS_TARGET_0
188
@@ -XXX,XX +XXX,XX @@ bool gen_lsa(DisasContext *ctx, int rd, int rt, int rs, int sa);
191
diff --git a/tests/tcg/mips/include/wrappers_mips64r6.h b/tests/tcg/mips/include/wrappers_mips64r6.h
189
bool gen_dlsa(DisasContext *ctx, int rd, int rt, int rs, int sa);
192
index XXXXXXX..XXXXXXX 100644
190
193
--- a/tests/tcg/mips/include/wrappers_mips64r6.h
191
void gen_rdhwr(DisasContext *ctx, int rt, int rd, int sel);
194
+++ b/tests/tcg/mips/include/wrappers_mips64r6.h
192
+void gen_crc32(DisasContext *ctx, int rd, int rs, int rt, int sz,
195
@@ -XXX,XX +XXX,XX @@
193
+ int crc32c);
196
#ifndef WRAPPERS_MIPS64R6_H
194
197
#define WRAPPERS_MIPS64R6_H
195
extern TCGv cpu_gpr[32], cpu_PC;
198
196
#if defined(TARGET_MIPS64)
199
+#include <string.h>
200
+
201
202
#define DO_MIPS64R6__RD__RS(suffix, mnemonic) \
203
static inline void do_mips64r6_##suffix(const void *input, \
204
@@ -XXX,XX +XXX,XX @@ DO_MIPS64R6__RD__RS_RT(DMULU, dmulu)
205
DO_MIPS64R6__RD__RS_RT(DMUHU, dmuhu)
206
207
208
+#define DO_MIPS64R6__RT__RS_RT(suffix, mnemonic) \
209
+static inline void do_mips64r6_##suffix(const void *input1, \
210
+ const void *input2, \
211
+ void *output) \
212
+{ \
213
+ if (strncmp(#mnemonic, "crc32", 5) == 0) \
214
+ __asm__ volatile ( \
215
+ ".set crc\n\t" \
216
+ ); \
217
+ \
218
+ __asm__ volatile ( \
219
+ "ld $t1, 0(%0)\n\t" \
220
+ "ld $t2, 0(%1)\n\t" \
221
+ #mnemonic " $t2, $t1, $t2\n\t" \
222
+ "sd $t2, 0(%2)\n\t" \
223
+ : \
224
+ : "r" (input1), "r" (input2), "r" (output) \
225
+ : "t0", "t1", "t2", "memory" \
226
+ ); \
227
+}
228
+
229
+DO_MIPS64R6__RT__RS_RT(CRC32B, crc32b)
230
+DO_MIPS64R6__RT__RS_RT(CRC32H, crc32h)
231
+DO_MIPS64R6__RT__RS_RT(CRC32W, crc32w)
232
+DO_MIPS64R6__RT__RS_RT(CRC32D, crc32d)
233
+
234
+DO_MIPS64R6__RT__RS_RT(CRC32CB, crc32cb)
235
+DO_MIPS64R6__RT__RS_RT(CRC32CH, crc32ch)
236
+DO_MIPS64R6__RT__RS_RT(CRC32CW, crc32cw)
237
+DO_MIPS64R6__RT__RS_RT(CRC32CD, crc32cd)
238
+
239
+
240
+
241
#endif
242
diff --git a/tests/tcg/mips/user/isa/mips64r6/crc/Makefile b/tests/tcg/mips/user/isa/mips64r6/crc/Makefile
243
new file mode 100644
244
index XXXXXXX..XXXXXXX
245
--- /dev/null
246
+++ b/tests/tcg/mips/user/isa/mips64r6/crc/Makefile
247
@@ -XXX,XX +XXX,XX @@
248
+ifndef PREFIX
249
+ $(error "PREFIX not set, please export GNU Toolchain install directory.")
250
+endif
251
+
252
+ifndef SYSROOT
253
+ $(error "SYSROOT not set, please export GNU Toolchain system root directory.")
254
+endif
255
+
256
+SIM = ../../../../../../../build/qemu-mips64
257
+SIM_FLAGS = -L $(SYSROOT)
258
+
259
+CC = $(PREFIX)/bin/mips64-r6-linux-gnu-gcc
260
+
261
+TESTCASES = test_mips64r6_crc32b.tst
262
+TESTCASES += test_mips64r6_crc32h.tst
263
+TESTCASES += test_mips64r6_crc32w.tst
264
+TESTCASES += test_mips64r6_crc32d.tst
265
+TESTCASES += test_mips64r6_crc32cb.tst
266
+TESTCASES += test_mips64r6_crc32ch.tst
267
+TESTCASES += test_mips64r6_crc32cw.tst
268
+TESTCASES += test_mips64r6_crc32cd.tst
269
+
270
+all: $(TESTCASES)
271
+    @for case in $(TESTCASES); do \
272
+ echo $(SIM) $(SIM_FLAGS) ./$$case; \
273
+ $(SIM) $(SIM_FLAGS) ./$$case; \
274
+ echo $(RM) -rf ./$$case; \
275
+ $(RM) -rf ./$$case; \
276
+    done
277
+
278
+%.tst: %.c
279
+    $(CC) $< -o $@
280
+
281
+
282
diff --git a/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32b.c b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32b.c
283
new file mode 100644
284
index XXXXXXX..XXXXXXX
285
--- /dev/null
286
+++ b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32b.c
287
@@ -XXX,XX +XXX,XX @@
288
+/*
289
+ * Test program for MIPS64R6 instruction CRC32B
290
+ *
291
+ * Copyright (C) 2019 Wave Computing, Inc.
292
+ * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com>
293
+ * Copyright (C) 2025 Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
294
+ *
295
+ * This program is free software: you can redistribute it and/or modify
296
+ * it under the terms of the GNU General Public License as published by
297
+ * the Free Software Foundation, either version 2 of the License, or
298
+ * (at your option) any later version.
299
+ *
300
+ * This program is distributed in the hope that it will be useful,
301
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
302
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
303
+ * GNU General Public License for more details.
304
+ *
305
+ * You should have received a copy of the GNU General Public License
306
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
307
+ *
308
+ */
309
+
310
+#include <sys/time.h>
311
+#include <stdint.h>
312
+
313
+#include "../../../../include/wrappers_mips64r6.h"
314
+#include "../../../../include/test_inputs_64.h"
315
+#include "../../../../include/test_utils_64.h"
316
+
317
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
318
+
319
+int32_t main(void)
320
+{
321
+ char *isa_ase_name = "mips64r6";
322
+ char *group_name = "CRC with reversed polynomial 0xEDB88320";
323
+ char *instruction_name = "CRC32B";
324
+ int32_t ret;
325
+ uint32_t i, j;
326
+ struct timeval start, end;
327
+ double elapsed_time;
328
+
329
+ uint64_t b64_result[TEST_COUNT_TOTAL];
330
+ uint64_t b64_expect[TEST_COUNT_TOTAL] = {
331
+ 0x0000000000ffffffULL, /* 0 */
332
+ 0x000000002d02ef8dULL,
333
+ 0x000000001bab0fd1ULL,
334
+ 0x0000000036561fa3ULL,
335
+ 0xffffffffbf1caddaULL,
336
+ 0xffffffff92e1bda8ULL,
337
+ 0x00000000278c7949ULL,
338
+ 0x000000000a71693bULL,
339
+ 0x000000002dfd1072ULL, /* 8 */
340
+ 0x0000000000000000ULL,
341
+ 0x0000000036a9e05cULL,
342
+ 0x000000001b54f02eULL,
343
+ 0xffffffff921e4257ULL,
344
+ 0xffffffffbfe35225ULL,
345
+ 0x000000000a8e96c4ULL,
346
+ 0x00000000277386b6ULL,
347
+ 0x000000001bfe5a84ULL, /* 16 */
348
+ 0x0000000036034af6ULL,
349
+ 0x0000000000aaaaaaULL,
350
+ 0x000000002d57bad8ULL,
351
+ 0xffffffffa41d08a1ULL,
352
+ 0xffffffff89e018d3ULL,
353
+ 0x000000003c8ddc32ULL,
354
+ 0x000000001170cc40ULL,
355
+ 0x0000000036fcb509ULL, /* 24 */
356
+ 0x000000001b01a57bULL,
357
+ 0x000000002da84527ULL,
358
+ 0x0000000000555555ULL,
359
+ 0xffffffff891fe72cULL,
360
+ 0xffffffffa4e2f75eULL,
361
+ 0x00000000118f33bfULL,
362
+ 0x000000003c7223cdULL,
363
+ 0xffffffffbf2f9ee9ULL, /* 32 */
364
+ 0xffffffff92d28e9bULL,
365
+ 0xffffffffa47b6ec7ULL,
366
+ 0xffffffff89867eb5ULL,
367
+ 0x0000000000ccccccULL,
368
+ 0x000000002d31dcbeULL,
369
+ 0xffffffff985c185fULL,
370
+ 0xffffffffb5a1082dULL,
371
+ 0xffffffff922d7164ULL, /* 40 */
372
+ 0xffffffffbfd06116ULL,
373
+ 0xffffffff8979814aULL,
374
+ 0xffffffffa4849138ULL,
375
+ 0x000000002dce2341ULL,
376
+ 0x0000000000333333ULL,
377
+ 0xffffffffb55ef7d2ULL,
378
+ 0xffffffff98a3e7a0ULL,
379
+ 0x0000000027fdbe55ULL, /* 48 */
380
+ 0x000000000a00ae27ULL,
381
+ 0x000000003ca94e7bULL,
382
+ 0x0000000011545e09ULL,
383
+ 0xffffffff981eec70ULL,
384
+ 0xffffffffb5e3fc02ULL,
385
+ 0x00000000008e38e3ULL,
386
+ 0x000000002d732891ULL,
387
+ 0x000000000aff51d8ULL, /* 56 */
388
+ 0x00000000270241aaULL,
389
+ 0x0000000011aba1f6ULL,
390
+ 0x000000003c56b184ULL,
391
+ 0xffffffffb51c03fdULL,
392
+ 0xffffffff98e1138fULL,
393
+ 0x000000002d8cd76eULL,
394
+ 0x000000000071c71cULL,
395
+ 0x0000000000286255ULL, /* 64 */
396
+ 0x00000000784a5a65ULL,
397
+ 0xffffffff9bdd0d3bULL,
398
+ 0xffffffffe7e61ce5ULL,
399
+ 0x00000000782fabf7ULL,
400
+ 0x00000000004d93c7ULL,
401
+ 0xffffffffe3dac499ULL,
402
+ 0xffffffff9fe1d547ULL,
403
+ 0xffffffff9b4ca0e5ULL, /* 72 */
404
+ 0xffffffffe32e98d5ULL,
405
+ 0x0000000000b9cf8bULL,
406
+ 0x000000007c82de55ULL,
407
+ 0xffffffffe7904f52ULL,
408
+ 0xffffffff9ff27762ULL,
409
+ 0x000000007c65203cULL,
410
+ 0x00000000005e31e2ULL,
411
+ };
412
+
413
+ gettimeofday(&start, NULL);
414
+
415
+ for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
416
+ for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
417
+ do_mips64r6_CRC32B(b64_pattern + i, b64_pattern + j,
418
+ b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
419
+ }
420
+ }
421
+
422
+ for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
423
+ for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
424
+ do_mips64r6_CRC32B(b64_random + i, b64_random + j,
425
+ b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
426
+ (PATTERN_INPUTS_64_SHORT_COUNT)) +
427
+ RANDOM_INPUTS_64_SHORT_COUNT * i + j));
428
+ }
429
+ }
430
+
431
+ gettimeofday(&end, NULL);
432
+
433
+ elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
434
+ elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
435
+
436
+ ret = check_results_64(isa_ase_name, group_name, instruction_name,
437
+ TEST_COUNT_TOTAL, elapsed_time, b64_result,
438
+ b64_expect);
439
+
440
+ return ret;
441
+}
442
diff --git a/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cb.c b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cb.c
443
new file mode 100644
444
index XXXXXXX..XXXXXXX
445
--- /dev/null
446
+++ b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cb.c
447
@@ -XXX,XX +XXX,XX @@
448
+/*
449
+ * Test program for MIPS64R6 instruction CRC32CB
450
+ *
451
+ * Copyright (C) 2019 Wave Computing, Inc.
452
+ * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com>
453
+ * Copyright (C) 2025 Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
454
+ *
455
+ * This program is free software: you can redistribute it and/or modify
456
+ * it under the terms of the GNU General Public License as published by
457
+ * the Free Software Foundation, either version 2 of the License, or
458
+ * (at your option) any later version.
459
+ *
460
+ * This program is distributed in the hope that it will be useful,
461
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
462
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
463
+ * GNU General Public License for more details.
464
+ *
465
+ * You should have received a copy of the GNU General Public License
466
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
467
+ *
468
+ */
469
+
470
+#include <sys/time.h>
471
+#include <stdint.h>
472
+
473
+#include "../../../../include/wrappers_mips64r6.h"
474
+#include "../../../../include/test_inputs_64.h"
475
+#include "../../../../include/test_utils_64.h"
476
+
477
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
478
+
479
+int32_t main(void)
480
+{
481
+ char *isa_ase_name = "mips64r6";
482
+ char *group_name = "CRC with reversed polynomial 0x82F63B78";
483
+ char *instruction_name = "CRC32CB";
484
+ int32_t ret;
485
+ uint32_t i, j;
486
+ struct timeval start, end;
487
+ double elapsed_time;
488
+
489
+ uint64_t b64_result[TEST_COUNT_TOTAL];
490
+ uint64_t b64_expect[TEST_COUNT_TOTAL] = {
491
+ 0x0000000000ffffffULL, /* 0 */
492
+ 0xffffffffad7d5351ULL,
493
+ 0x00000000647e6465ULL,
494
+ 0xffffffffc9fcc8cbULL,
495
+ 0x00000000237f7689ULL,
496
+ 0xffffffff8efdda27ULL,
497
+ 0xffffffff837defedULL,
498
+ 0x000000002eff4343ULL,
499
+ 0xffffffffad82acaeULL, /* 8 */
500
+ 0x0000000000000000ULL,
501
+ 0xffffffffc9033734ULL,
502
+ 0x0000000064819b9aULL,
503
+ 0xffffffff8e0225d8ULL,
504
+ 0x0000000023808976ULL,
505
+ 0x000000002e00bcbcULL,
506
+ 0xffffffff83821012ULL,
507
+ 0x00000000642b3130ULL, /* 16 */
508
+ 0xffffffffc9a99d9eULL,
509
+ 0x0000000000aaaaaaULL,
510
+ 0xffffffffad280604ULL,
511
+ 0x0000000047abb846ULL,
512
+ 0xffffffffea2914e8ULL,
513
+ 0xffffffffe7a92122ULL,
514
+ 0x000000004a2b8d8cULL,
515
+ 0xffffffffc9566261ULL, /* 24 */
516
+ 0x0000000064d4cecfULL,
517
+ 0xffffffffadd7f9fbULL,
518
+ 0x0000000000555555ULL,
519
+ 0xffffffffead6eb17ULL,
520
+ 0x00000000475447b9ULL,
521
+ 0x000000004ad47273ULL,
522
+ 0xffffffffe756deddULL,
523
+ 0x00000000234c45baULL, /* 32 */
524
+ 0xffffffff8ecee914ULL,
525
+ 0x0000000047cdde20ULL,
526
+ 0xffffffffea4f728eULL,
527
+ 0x0000000000ccccccULL,
528
+ 0xffffffffad4e6062ULL,
529
+ 0xffffffffa0ce55a8ULL,
530
+ 0x000000000d4cf906ULL,
531
+ 0xffffffff8e3116ebULL, /* 40 */
532
+ 0x0000000023b3ba45ULL,
533
+ 0xffffffffeab08d71ULL,
534
+ 0x00000000473221dfULL,
535
+ 0xffffffffadb19f9dULL,
536
+ 0x0000000000333333ULL,
537
+ 0x000000000db306f9ULL,
538
+ 0xffffffffa031aa57ULL,
539
+ 0xffffffff830c28f1ULL, /* 48 */
540
+ 0x000000002e8e845fULL,
541
+ 0xffffffffe78db36bULL,
542
+ 0x000000004a0f1fc5ULL,
543
+ 0xffffffffa08ca187ULL,
544
+ 0x000000000d0e0d29ULL,
545
+ 0x00000000008e38e3ULL,
546
+ 0xffffffffad0c944dULL,
547
+ 0x000000002e717ba0ULL, /* 56 */
548
+ 0xffffffff83f3d70eULL,
549
+ 0x000000004af0e03aULL,
550
+ 0xffffffffe7724c94ULL,
551
+ 0x000000000df1f2d6ULL,
552
+ 0xffffffffa0735e78ULL,
553
+ 0xffffffffadf36bb2ULL,
554
+ 0x000000000071c71cULL,
555
+ 0x0000000000286255ULL, /* 64 */
556
+ 0xffffffffcbefd6b4ULL,
557
+ 0xffffffffc334e94fULL,
558
+ 0xffffffffac268ec5ULL,
559
+ 0xffffffffcb8a2726ULL,
560
+ 0x00000000004d93c7ULL,
561
+ 0x000000000896ac3cULL,
562
+ 0x000000006784cbb6ULL,
563
+ 0xffffffffc3a54491ULL, /* 72 */
564
+ 0x000000000862f070ULL,
565
+ 0x0000000000b9cf8bULL,
566
+ 0x000000006faba801ULL,
567
+ 0xffffffffac50dd72ULL,
568
+ 0x0000000067976993ULL,
569
+ 0x000000006f4c5668ULL,
570
+ 0x00000000005e31e2ULL,
571
+ };
572
+
573
+ gettimeofday(&start, NULL);
574
+
575
+ for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
576
+ for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
577
+ do_mips64r6_CRC32CB(b64_pattern + i, b64_pattern + j,
578
+ b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
579
+ }
580
+ }
581
+
582
+ for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
583
+ for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
584
+ do_mips64r6_CRC32CB(b64_random + i, b64_random + j,
585
+ b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
586
+ (PATTERN_INPUTS_64_SHORT_COUNT)) +
587
+ RANDOM_INPUTS_64_SHORT_COUNT * i + j));
588
+ }
589
+ }
590
+
591
+ gettimeofday(&end, NULL);
592
+
593
+ elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
594
+ elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
595
+
596
+ ret = check_results_64(isa_ase_name, group_name, instruction_name,
597
+ TEST_COUNT_TOTAL, elapsed_time, b64_result,
598
+ b64_expect);
599
+
600
+ return ret;
601
+}
602
diff --git a/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cd.c b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cd.c
603
new file mode 100644
604
index XXXXXXX..XXXXXXX
605
--- /dev/null
606
+++ b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cd.c
607
@@ -XXX,XX +XXX,XX @@
608
+/*
609
+ * Test program for MIPS64R6 instruction CRC32CD
610
+ *
611
+ * Copyright (C) 2019 Wave Computing, Inc.
612
+ * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com>
613
+ * Copyright (C) 2025 Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
614
+ *
615
+ * This program is free software: you can redistribute it and/or modify
616
+ * it under the terms of the GNU General Public License as published by
617
+ * the Free Software Foundation, either version 2 of the License, or
618
+ * (at your option) any later version.
619
+ *
620
+ * This program is distributed in the hope that it will be useful,
621
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
622
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
623
+ * GNU General Public License for more details.
624
+ *
625
+ * You should have received a copy of the GNU General Public License
626
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
627
+ *
628
+ */
629
+
630
+#include <sys/time.h>
631
+#include <stdint.h>
632
+
633
+#include "../../../../include/wrappers_mips64r6.h"
634
+#include "../../../../include/test_inputs_64.h"
635
+#include "../../../../include/test_utils_64.h"
636
+
637
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
638
+
639
+int32_t main(void)
640
+{
641
+ char *isa_ase_name = "mips64r6";
642
+ char *group_name = "CRC with reversed polynomial 0x82F63B78";
643
+ char *instruction_name = "CRC32CD";
644
+ int32_t ret;
645
+ uint32_t i, j;
646
+ struct timeval start, end;
647
+ double elapsed_time;
648
+
649
+ uint64_t b64_result[TEST_COUNT_TOTAL];
650
+ uint64_t b64_expect[TEST_COUNT_TOTAL] = {
651
+ 0xffffffffb798b438ULL, /* 0 */
652
+ 0xffffffffc44ff94dULL,
653
+ 0xffffffff992a70ebULL,
654
+ 0xffffffffeafd3d9eULL,
655
+ 0x000000005152da26ULL,
656
+ 0x0000000022859753ULL,
657
+ 0x0000000015cb6d32ULL,
658
+ 0x00000000661c2047ULL,
659
+ 0x0000000073d74d75ULL, /* 8 */
660
+ 0x0000000000000000ULL,
661
+ 0x000000005d6589a6ULL,
662
+ 0x000000002eb2c4d3ULL,
663
+ 0xffffffff951d236bULL,
664
+ 0xffffffffe6ca6e1eULL,
665
+ 0xffffffffd184947fULL,
666
+ 0xffffffffa253d90aULL,
667
+ 0x0000000008f9ceacULL, /* 16 */
668
+ 0x000000007b2e83d9ULL,
669
+ 0x00000000264b0a7fULL,
670
+ 0x00000000559c470aULL,
671
+ 0xffffffffee33a0b2ULL,
672
+ 0xffffffff9de4edc7ULL,
673
+ 0xffffffffaaaa17a6ULL,
674
+ 0xffffffffd97d5ad3ULL,
675
+ 0xffffffffccb637e1ULL, /* 24 */
676
+ 0xffffffffbf617a94ULL,
677
+ 0xffffffffe204f332ULL,
678
+ 0xffffffff91d3be47ULL,
679
+ 0x000000002a7c59ffULL,
680
+ 0x0000000059ab148aULL,
681
+ 0x000000006ee5eeebULL,
682
+ 0x000000001d32a39eULL,
683
+ 0x0000000021e3b01bULL, /* 32 */
684
+ 0x000000005234fd6eULL,
685
+ 0x000000000f5174c8ULL,
686
+ 0x000000007c8639bdULL,
687
+ 0xffffffffc729de05ULL,
688
+ 0xffffffffb4fe9370ULL,
689
+ 0xffffffff83b06911ULL,
690
+ 0xfffffffff0672464ULL,
691
+ 0xffffffffe5ac4956ULL, /* 40 */
692
+ 0xffffffff967b0423ULL,
693
+ 0xffffffffcb1e8d85ULL,
694
+ 0xffffffffb8c9c0f0ULL,
695
+ 0x0000000003662748ULL,
696
+ 0x0000000070b16a3dULL,
697
+ 0x0000000047ff905cULL,
698
+ 0x000000003428dd29ULL,
699
+ 0xffffffffb89d59a6ULL, /* 48 */
700
+ 0xffffffffcb4a14d3ULL,
701
+ 0xffffffff962f9d75ULL,
702
+ 0xffffffffe5f8d000ULL,
703
+ 0x000000005e5737b8ULL,
704
+ 0x000000002d807acdULL,
705
+ 0x000000001ace80acULL,
706
+ 0x000000006919cdd9ULL,
707
+ 0x000000007cd2a0ebULL, /* 56 */
708
+ 0x000000000f05ed9eULL,
709
+ 0x0000000052606438ULL,
710
+ 0x0000000021b7294dULL,
711
+ 0xffffffff9a18cef5ULL,
712
+ 0xffffffffe9cf8380ULL,
713
+ 0xffffffffde8179e1ULL,
714
+ 0xffffffffad563494ULL,
715
+ 0x000000003a358bb3ULL, /* 64 */
716
+ 0xffffffff975446ebULL,
717
+ 0x0000000041d37ad6ULL,
718
+ 0x000000004be84fe1ULL,
719
+ 0xffffffff9671b1b3ULL,
720
+ 0x000000003b107cebULL,
721
+ 0xffffffffed9740d6ULL,
722
+ 0xffffffffe7ac75e1ULL,
723
+ 0xffffffffa1489696ULL, /* 72 */
724
+ 0x000000000c295bceULL,
725
+ 0xffffffffdaae67f3ULL,
726
+ 0xffffffffd09552c4ULL,
727
+ 0x0000000042bd7071ULL,
728
+ 0xffffffffefdcbd29ULL,
729
+ 0x00000000395b8114ULL,
730
+ 0x000000003360b423ULL,
731
+ };
732
+
733
+ gettimeofday(&start, NULL);
734
+
735
+ for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
736
+ for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
737
+ do_mips64r6_CRC32CD(b64_pattern + i, b64_pattern + j,
738
+ b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
739
+ }
740
+ }
741
+
742
+ for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
743
+ for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
744
+ do_mips64r6_CRC32CD(b64_random + i, b64_random + j,
745
+ b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
746
+ (PATTERN_INPUTS_64_SHORT_COUNT)) +
747
+ RANDOM_INPUTS_64_SHORT_COUNT * i + j));
748
+ }
749
+ }
750
+
751
+ gettimeofday(&end, NULL);
752
+
753
+ elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
754
+ elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
755
+
756
+ ret = check_results_64(isa_ase_name, group_name, instruction_name,
757
+ TEST_COUNT_TOTAL, elapsed_time, b64_result,
758
+ b64_expect);
759
+
760
+ return ret;
761
+}
762
diff --git a/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32ch.c b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32ch.c
763
new file mode 100644
764
index XXXXXXX..XXXXXXX
765
--- /dev/null
766
+++ b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32ch.c
767
@@ -XXX,XX +XXX,XX @@
768
+/*
769
+ * Test program for MIPS64R6 instruction CRC32CH
770
+ *
771
+ * Copyright (C) 2019 Wave Computing, Inc.
772
+ * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com>
773
+ * Copyright (C) 2025 Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
774
+ *
775
+ * This program is free software: you can redistribute it and/or modify
776
+ * it under the terms of the GNU General Public License as published by
777
+ * the Free Software Foundation, either version 2 of the License, or
778
+ * (at your option) any later version.
779
+ *
780
+ * This program is distributed in the hope that it will be useful,
781
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
782
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
783
+ * GNU General Public License for more details.
784
+ *
785
+ * You should have received a copy of the GNU General Public License
786
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
787
+ *
788
+ */
789
+
790
+#include <sys/time.h>
791
+#include <stdint.h>
792
+
793
+#include "../../../../include/wrappers_mips64r6.h"
794
+#include "../../../../include/test_inputs_64.h"
795
+#include "../../../../include/test_utils_64.h"
796
+
797
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
798
+
799
+int32_t main(void)
800
+{
801
+ char *isa_ase_name = "mips64r6";
802
+ char *group_name = "CRC with reversed polynomial 0x82F63B78";
803
+ char *instruction_name = "CRC32CH";
804
+ int32_t ret;
805
+ uint32_t i, j;
806
+ struct timeval start, end;
807
+ double elapsed_time;
808
+
809
+ uint64_t b64_result[TEST_COUNT_TOTAL];
810
+ uint64_t b64_expect[TEST_COUNT_TOTAL] = {
811
+ 0x000000000000ffffULL, /* 0 */
812
+ 0x000000000e9e77d2ULL,
813
+ 0xfffffffff92eaa4bULL,
814
+ 0xfffffffff7b02266ULL,
815
+ 0x00000000571acc93ULL,
816
+ 0x00000000598444beULL,
817
+ 0xfffffffff1e6ca77ULL,
818
+ 0xffffffffff78425aULL,
819
+ 0x000000000e9e882dULL, /* 8 */
820
+ 0x0000000000000000ULL,
821
+ 0xfffffffff7b0dd99ULL,
822
+ 0xfffffffff92e55b4ULL,
823
+ 0x000000005984bb41ULL,
824
+ 0x00000000571a336cULL,
825
+ 0xffffffffff78bda5ULL,
826
+ 0xfffffffff1e63588ULL,
827
+ 0xfffffffff92eff1eULL, /* 16 */
828
+ 0xfffffffff7b07733ULL,
829
+ 0x000000000000aaaaULL,
830
+ 0x000000000e9e2287ULL,
831
+ 0xffffffffae34cc72ULL,
832
+ 0xffffffffa0aa445fULL,
833
+ 0x0000000008c8ca96ULL,
834
+ 0x00000000065642bbULL,
835
+ 0xfffffffff7b088ccULL, /* 24 */
836
+ 0xfffffffff92e00e1ULL,
837
+ 0x000000000e9edd78ULL,
838
+ 0x0000000000005555ULL,
839
+ 0xffffffffa0aabba0ULL,
840
+ 0xffffffffae34338dULL,
841
+ 0x000000000656bd44ULL,
842
+ 0x0000000008c83569ULL,
843
+ 0x00000000571affa0ULL, /* 32 */
844
+ 0x000000005984778dULL,
845
+ 0xffffffffae34aa14ULL,
846
+ 0xffffffffa0aa2239ULL,
847
+ 0x000000000000ccccULL,
848
+ 0x000000000e9e44e1ULL,
849
+ 0xffffffffa6fcca28ULL,
850
+ 0xffffffffa8624205ULL,
851
+ 0x0000000059848872ULL, /* 40 */
852
+ 0x00000000571a005fULL,
853
+ 0xffffffffa0aaddc6ULL,
854
+ 0xffffffffae3455ebULL,
855
+ 0x000000000e9ebb1eULL,
856
+ 0x0000000000003333ULL,
857
+ 0xffffffffa862bdfaULL,
858
+ 0xffffffffa6fc35d7ULL,
859
+ 0xfffffffff1e6bbb0ULL, /* 48 */
860
+ 0xffffffffff78339dULL,
861
+ 0x0000000008c8ee04ULL,
862
+ 0x0000000006566629ULL,
863
+ 0xffffffffa6fc88dcULL,
864
+ 0xffffffffa86200f1ULL,
865
+ 0x0000000000008e38ULL,
866
+ 0x000000000e9e0615ULL,
867
+ 0xffffffffff78cc62ULL, /* 56 */
868
+ 0xfffffffff1e6444fULL,
869
+ 0x00000000065699d6ULL,
870
+ 0x0000000008c811fbULL,
871
+ 0xffffffffa862ff0eULL,
872
+ 0xffffffffa6fc7723ULL,
873
+ 0x000000000e9ef9eaULL,
874
+ 0x00000000000071c7ULL,
875
+ 0x0000000000002862ULL, /* 64 */
876
+ 0x000000001190c4cfULL,
877
+ 0x000000007b7fdbbeULL,
878
+ 0xffffffff9204da99ULL,
879
+ 0x000000001190a13eULL,
880
+ 0x0000000000004d93ULL,
881
+ 0x000000006aef52e2ULL,
882
+ 0xffffffff839453c5ULL,
883
+ 0x000000007b7f4a13ULL, /* 72 */
884
+ 0x000000006aefa6beULL,
885
+ 0x000000000000b9cfULL,
886
+ 0xffffffffe97bb8e8ULL,
887
+ 0xffffffff9204accaULL,
888
+ 0xffffffff83944067ULL,
889
+ 0xffffffffe97b5f16ULL,
890
+ 0x0000000000005e31ULL,
891
+ };
892
+
893
+ gettimeofday(&start, NULL);
894
+
895
+ for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
896
+ for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
897
+ do_mips64r6_CRC32CH(b64_pattern + i, b64_pattern + j,
898
+ b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
899
+ }
900
+ }
901
+
902
+ for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
903
+ for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
904
+ do_mips64r6_CRC32CH(b64_random + i, b64_random + j,
905
+ b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
906
+ (PATTERN_INPUTS_64_SHORT_COUNT)) +
907
+ RANDOM_INPUTS_64_SHORT_COUNT * i + j));
908
+ }
909
+ }
910
+
911
+ gettimeofday(&end, NULL);
912
+
913
+ elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
914
+ elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
915
+
916
+ ret = check_results_64(isa_ase_name, group_name, instruction_name,
917
+ TEST_COUNT_TOTAL, elapsed_time, b64_result,
918
+ b64_expect);
919
+
920
+ return ret;
921
+}
922
diff --git a/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cw.c b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cw.c
923
new file mode 100644
924
index XXXXXXX..XXXXXXX
925
--- /dev/null
926
+++ b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32cw.c
927
@@ -XXX,XX +XXX,XX @@
928
+/*
929
+ * Test program for MIPS64R6 instruction CRC32CW
930
+ *
931
+ * Copyright (C) 2019 Wave Computing, Inc.
932
+ * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com>
933
+ * Copyright (C) 2025 Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
934
+ *
935
+ * This program is free software: you can redistribute it and/or modify
936
+ * it under the terms of the GNU General Public License as published by
937
+ * the Free Software Foundation, either version 2 of the License, or
938
+ * (at your option) any later version.
939
+ *
940
+ * This program is distributed in the hope that it will be useful,
941
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
942
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
943
+ * GNU General Public License for more details.
944
+ *
945
+ * You should have received a copy of the GNU General Public License
946
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
947
+ *
948
+ */
949
+
950
+#include <sys/time.h>
951
+#include <stdint.h>
952
+
953
+#include "../../../../include/wrappers_mips64r6.h"
954
+#include "../../../../include/test_inputs_64.h"
955
+#include "../../../../include/test_utils_64.h"
956
+
957
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
958
+
959
+int32_t main(void)
960
+{
961
+ char *isa_ase_name = "mips64r6";
962
+ char *group_name = "CRC with reversed polynomial 0x82F63B78";
963
+ char *instruction_name = "CRC32CW";
964
+ int32_t ret;
965
+ uint32_t i, j;
966
+ struct timeval start, end;
967
+ double elapsed_time;
968
+
969
+ uint64_t b64_result[TEST_COUNT_TOTAL];
970
+ uint64_t b64_expect[TEST_COUNT_TOTAL] = {
971
+ 0x0000000000000000ULL, /* 0 */
972
+ 0xffffffffb798b438ULL,
973
+ 0xffffffff91d3be47ULL,
974
+ 0x00000000264b0a7fULL,
975
+ 0x0000000070b16a3dULL,
976
+ 0xffffffffc729de05ULL,
977
+ 0x0000000063c5950aULL,
978
+ 0xffffffffd45d2132ULL,
979
+ 0xffffffffb798b438ULL, /* 8 */
980
+ 0x0000000000000000ULL,
981
+ 0x00000000264b0a7fULL,
982
+ 0xffffffff91d3be47ULL,
983
+ 0xffffffffc729de05ULL,
984
+ 0x0000000070b16a3dULL,
985
+ 0xffffffffd45d2132ULL,
986
+ 0x0000000063c5950aULL,
987
+ 0xffffffff91d3be47ULL, /* 16 */
988
+ 0x00000000264b0a7fULL,
989
+ 0x0000000000000000ULL,
990
+ 0xffffffffb798b438ULL,
991
+ 0xffffffffe162d47aULL,
992
+ 0x0000000056fa6042ULL,
993
+ 0xfffffffff2162b4dULL,
994
+ 0x00000000458e9f75ULL,
995
+ 0x00000000264b0a7fULL, /* 24 */
996
+ 0xffffffff91d3be47ULL,
997
+ 0xffffffffb798b438ULL,
998
+ 0x0000000000000000ULL,
999
+ 0x0000000056fa6042ULL,
1000
+ 0xffffffffe162d47aULL,
1001
+ 0x00000000458e9f75ULL,
1002
+ 0xfffffffff2162b4dULL,
1003
+ 0x0000000070b16a3dULL, /* 32 */
1004
+ 0xffffffffc729de05ULL,
1005
+ 0xffffffffe162d47aULL,
1006
+ 0x0000000056fa6042ULL,
1007
+ 0x0000000000000000ULL,
1008
+ 0xffffffffb798b438ULL,
1009
+ 0x000000001374ff37ULL,
1010
+ 0xffffffffa4ec4b0fULL,
1011
+ 0xffffffffc729de05ULL, /* 40 */
1012
+ 0x0000000070b16a3dULL,
1013
+ 0x0000000056fa6042ULL,
1014
+ 0xffffffffe162d47aULL,
1015
+ 0xffffffffb798b438ULL,
1016
+ 0x0000000000000000ULL,
1017
+ 0xffffffffa4ec4b0fULL,
1018
+ 0x000000001374ff37ULL,
1019
+ 0x0000000063c5950aULL, /* 48 */
1020
+ 0xffffffffd45d2132ULL,
1021
+ 0xfffffffff2162b4dULL,
1022
+ 0x00000000458e9f75ULL,
1023
+ 0x000000001374ff37ULL,
1024
+ 0xffffffffa4ec4b0fULL,
1025
+ 0x0000000000000000ULL,
1026
+ 0xffffffffb798b438ULL,
1027
+ 0xffffffffd45d2132ULL, /* 56 */
1028
+ 0x0000000063c5950aULL,
1029
+ 0x00000000458e9f75ULL,
1030
+ 0xfffffffff2162b4dULL,
1031
+ 0xffffffffa4ec4b0fULL,
1032
+ 0x000000001374ff37ULL,
1033
+ 0xffffffffb798b438ULL,
1034
+ 0x0000000000000000ULL,
1035
+ 0x0000000000000000ULL, /* 64 */
1036
+ 0xffffffffea0755b2ULL,
1037
+ 0x0000000008b188e6ULL,
1038
+ 0xffffffffff3cc8d9ULL,
1039
+ 0xffffffffea0755b2ULL,
1040
+ 0x0000000000000000ULL,
1041
+ 0xffffffffe2b6dd54ULL,
1042
+ 0x00000000153b9d6bULL,
1043
+ 0x0000000008b188e6ULL, /* 72 */
1044
+ 0xffffffffe2b6dd54ULL,
1045
+ 0x0000000000000000ULL,
1046
+ 0xfffffffff78d403fULL,
1047
+ 0xffffffffff3cc8d9ULL,
1048
+ 0x00000000153b9d6bULL,
1049
+ 0xfffffffff78d403fULL,
1050
+ 0x0000000000000000ULL,
1051
+ };
1052
+
1053
+ gettimeofday(&start, NULL);
1054
+
1055
+ for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
1056
+ for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
1057
+ do_mips64r6_CRC32CW(b64_pattern + i, b64_pattern + j,
1058
+ b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
1059
+ }
1060
+ }
1061
+
1062
+ for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
1063
+ for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
1064
+ do_mips64r6_CRC32CW(b64_random + i, b64_random + j,
1065
+ b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
1066
+ (PATTERN_INPUTS_64_SHORT_COUNT)) +
1067
+ RANDOM_INPUTS_64_SHORT_COUNT * i + j));
1068
+ }
1069
+ }
1070
+
1071
+ gettimeofday(&end, NULL);
1072
+
1073
+ elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
1074
+ elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
1075
+
1076
+ ret = check_results_64(isa_ase_name, group_name, instruction_name,
1077
+ TEST_COUNT_TOTAL, elapsed_time, b64_result,
1078
+ b64_expect);
1079
+
1080
+ return ret;
1081
+}
1082
diff --git a/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32d.c b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32d.c
1083
new file mode 100644
1084
index XXXXXXX..XXXXXXX
1085
--- /dev/null
1086
+++ b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32d.c
1087
@@ -XXX,XX +XXX,XX @@
1088
+/*
1089
+ * Test program for MIPS64R6 instruction CRC32D
1090
+ *
1091
+ * Copyright (C) 2019 Wave Computing, Inc.
1092
+ * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com>
1093
+ * Copyright (C) 2025 Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
1094
+ *
1095
+ * This program is free software: you can redistribute it and/or modify
1096
+ * it under the terms of the GNU General Public License as published by
1097
+ * the Free Software Foundation, either version 2 of the License, or
1098
+ * (at your option) any later version.
1099
+ *
1100
+ * This program is distributed in the hope that it will be useful,
1101
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1102
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1103
+ * GNU General Public License for more details.
1104
+ *
1105
+ * You should have received a copy of the GNU General Public License
1106
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
1107
+ *
1108
+ */
1109
+
1110
+#include <sys/time.h>
1111
+#include <stdint.h>
1112
+
1113
+#include "../../../../include/wrappers_mips64r6.h"
1114
+#include "../../../../include/test_inputs_64.h"
1115
+#include "../../../../include/test_utils_64.h"
1116
+
1117
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
1118
+
1119
+int32_t main(void)
1120
+{
1121
+ char *isa_ase_name = "mips64r6";
1122
+ char *group_name = "CRC with reversed polynomial 0xEDB88320";
1123
+ char *instruction_name = "CRC32D";
1124
+ int32_t ret;
1125
+ uint32_t i, j;
1126
+ struct timeval start, end;
1127
+ double elapsed_time;
1128
+
1129
+ uint64_t b64_result[TEST_COUNT_TOTAL];
1130
+ uint64_t b64_expect[TEST_COUNT_TOTAL] = {
1131
+ 0xffffffffdebb20e3ULL, /* 0 */
1132
+ 0x0000000044660075ULL,
1133
+ 0x000000001e20c2aeULL,
1134
+ 0xffffffff84fde238ULL,
1135
+ 0x00000000281d7ce7ULL,
1136
+ 0xffffffffb2c05c71ULL,
1137
+ 0xffffffffd660a024ULL,
1138
+ 0x000000004cbd80b2ULL,
1139
+ 0xffffffff9add2096ULL, /* 8 */
1140
+ 0x0000000000000000ULL,
1141
+ 0x000000005a46c2dbULL,
1142
+ 0xffffffffc09be24dULL,
1143
+ 0x000000006c7b7c92ULL,
1144
+ 0xfffffffff6a65c04ULL,
1145
+ 0xffffffff9206a051ULL,
1146
+ 0x0000000008db80c7ULL,
1147
+ 0x000000005449dd0fULL, /* 16 */
1148
+ 0xffffffffce94fd99ULL,
1149
+ 0xffffffff94d23f42ULL,
1150
+ 0x000000000e0f1fd4ULL,
1151
+ 0xffffffffa2ef810bULL,
1152
+ 0x000000003832a19dULL,
1153
+ 0x000000005c925dc8ULL,
1154
+ 0xffffffffc64f7d5eULL,
1155
+ 0x00000000102fdd7aULL, /* 24 */
1156
+ 0xffffffff8af2fdecULL,
1157
+ 0xffffffffd0b43f37ULL,
1158
+ 0x000000004a691fa1ULL,
1159
+ 0xffffffffe689817eULL,
1160
+ 0x000000007c54a1e8ULL,
1161
+ 0x0000000018f45dbdULL,
1162
+ 0xffffffff82297d2bULL,
1163
+ 0xffffffffa7157447ULL, /* 32 */
1164
+ 0x000000003dc854d1ULL,
1165
+ 0x00000000678e960aULL,
1166
+ 0xfffffffffd53b69cULL,
1167
+ 0x0000000051b32843ULL,
1168
+ 0xffffffffcb6e08d5ULL,
1169
+ 0xffffffffafcef480ULL,
1170
+ 0x000000003513d416ULL,
1171
+ 0xffffffffe3737432ULL, /* 40 */
1172
+ 0x0000000079ae54a4ULL,
1173
+ 0x0000000023e8967fULL,
1174
+ 0xffffffffb935b6e9ULL,
1175
+ 0x0000000015d52836ULL,
1176
+ 0xffffffff8f0808a0ULL,
1177
+ 0xffffffffeba8f4f5ULL,
1178
+ 0x000000007175d463ULL,
1179
+ 0x000000007a6adc3eULL, /* 48 */
1180
+ 0xffffffffe0b7fca8ULL,
1181
+ 0xffffffffbaf13e73ULL,
1182
+ 0x00000000202c1ee5ULL,
1183
+ 0xffffffff8ccc803aULL,
1184
+ 0x000000001611a0acULL,
1185
+ 0x0000000072b15cf9ULL,
1186
+ 0xffffffffe86c7c6fULL,
1187
+ 0x000000003e0cdc4bULL, /* 56 */
1188
+ 0xffffffffa4d1fcddULL,
1189
+ 0xfffffffffe973e06ULL,
1190
+ 0x00000000644a1e90ULL,
1191
+ 0xffffffffc8aa804fULL,
1192
+ 0x000000005277a0d9ULL,
1193
+ 0x0000000036d75c8cULL,
1194
+ 0xffffffffac0a7c1aULL,
1195
+ 0xffffffffed857593ULL, /* 64 */
1196
+ 0xffffffffe0b6f95fULL,
1197
+ 0x00000000253b462cULL,
1198
+ 0xffffffffe15579b9ULL,
1199
+ 0x0000000074897c83ULL,
1200
+ 0x0000000079baf04fULL,
1201
+ 0xffffffffbc374f3cULL,
1202
+ 0x00000000785970a9ULL,
1203
+ 0xffffffffa6bae0a9ULL, /* 72 */
1204
+ 0xffffffffab896c65ULL,
1205
+ 0x000000006e04d316ULL,
1206
+ 0xffffffffaa6aec83ULL,
1207
+ 0x000000005ae171feULL,
1208
+ 0x0000000057d2fd32ULL,
1209
+ 0xffffffff925f4241ULL,
1210
+ 0x0000000056317dd4ULL,
1211
+ };
1212
+
1213
+ gettimeofday(&start, NULL);
1214
+
1215
+ for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
1216
+ for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
1217
+ do_mips64r6_CRC32D(b64_pattern + i, b64_pattern + j,
1218
+ b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
1219
+ }
1220
+ }
1221
+
1222
+ for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
1223
+ for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
1224
+ do_mips64r6_CRC32D(b64_random + i, b64_random + j,
1225
+ b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
1226
+ (PATTERN_INPUTS_64_SHORT_COUNT)) +
1227
+ RANDOM_INPUTS_64_SHORT_COUNT * i + j));
1228
+ }
1229
+ }
1230
+
1231
+ gettimeofday(&end, NULL);
1232
+
1233
+ elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
1234
+ elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
1235
+
1236
+ ret = check_results_64(isa_ase_name, group_name, instruction_name,
1237
+ TEST_COUNT_TOTAL, elapsed_time, b64_result,
1238
+ b64_expect);
1239
+
1240
+ return ret;
1241
+}
1242
diff --git a/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32h.c b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32h.c
1243
new file mode 100644
1244
index XXXXXXX..XXXXXXX
1245
--- /dev/null
1246
+++ b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32h.c
1247
@@ -XXX,XX +XXX,XX @@
1248
+/*
1249
+ * Test program for MIPS64R6 instruction CRC32H
1250
+ *
1251
+ * Copyright (C) 2019 Wave Computing, Inc.
1252
+ * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com>
1253
+ * Copyright (C) 2025 Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
1254
+ *
1255
+ * This program is free software: you can redistribute it and/or modify
1256
+ * it under the terms of the GNU General Public License as published by
1257
+ * the Free Software Foundation, either version 2 of the License, or
1258
+ * (at your option) any later version.
1259
+ *
1260
+ * This program is distributed in the hope that it will be useful,
1261
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1262
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1263
+ * GNU General Public License for more details.
1264
+ *
1265
+ * You should have received a copy of the GNU General Public License
1266
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
1267
+ *
1268
+ */
1269
+
1270
+#include <sys/time.h>
1271
+#include <stdint.h>
1272
+
1273
+#include "../../../../include/wrappers_mips64r6.h"
1274
+#include "../../../../include/test_inputs_64.h"
1275
+#include "../../../../include/test_utils_64.h"
1276
+
1277
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
1278
+
1279
+int32_t main(void)
1280
+{
1281
+ char *isa_ase_name = "mips64r6";
1282
+ char *group_name = "CRC with reversed polynomial 0xEDB88320";
1283
+ char *instruction_name = "CRC32H";
1284
+ int32_t ret;
1285
+ uint32_t i, j;
1286
+ struct timeval start, end;
1287
+ double elapsed_time;
1288
+
1289
+ uint64_t b64_result[TEST_COUNT_TOTAL];
1290
+ uint64_t b64_expect[TEST_COUNT_TOTAL] = {
1291
+ 0x000000000000ffffULL, /* 0 */
1292
+ 0xffffffffbe2612ffULL,
1293
+ 0xffffffffdccda6c0ULL,
1294
+ 0x0000000062eb4bc0ULL,
1295
+ 0x000000004bbbc8eaULL,
1296
+ 0xfffffffff59d25eaULL,
1297
+ 0x0000000022259ac0ULL,
1298
+ 0xffffffff9c0377c0ULL,
1299
+ 0xffffffffbe26ed00ULL, /* 8 */
1300
+ 0x0000000000000000ULL,
1301
+ 0x0000000062ebb43fULL,
1302
+ 0xffffffffdccd593fULL,
1303
+ 0xfffffffff59dda15ULL,
1304
+ 0x000000004bbb3715ULL,
1305
+ 0xffffffff9c03883fULL,
1306
+ 0x000000002225653fULL,
1307
+ 0xffffffffdccdf395ULL, /* 16 */
1308
+ 0x0000000062eb1e95ULL,
1309
+ 0x000000000000aaaaULL,
1310
+ 0xffffffffbe2647aaULL,
1311
+ 0xffffffff9776c480ULL,
1312
+ 0x0000000029502980ULL,
1313
+ 0xfffffffffee896aaULL,
1314
+ 0x0000000040ce7baaULL,
1315
+ 0x0000000062ebe16aULL, /* 24 */
1316
+ 0xffffffffdccd0c6aULL,
1317
+ 0xffffffffbe26b855ULL,
1318
+ 0x0000000000005555ULL,
1319
+ 0x000000002950d67fULL,
1320
+ 0xffffffff97763b7fULL,
1321
+ 0x0000000040ce8455ULL,
1322
+ 0xfffffffffee86955ULL,
1323
+ 0x000000004bbbfbd9ULL, /* 32 */
1324
+ 0xfffffffff59d16d9ULL,
1325
+ 0xffffffff9776a2e6ULL,
1326
+ 0x0000000029504fe6ULL,
1327
+ 0x000000000000ccccULL,
1328
+ 0xffffffffbe2621ccULL,
1329
+ 0x00000000699e9ee6ULL,
1330
+ 0xffffffffd7b873e6ULL,
1331
+ 0xfffffffff59de926ULL, /* 40 */
1332
+ 0x000000004bbb0426ULL,
1333
+ 0x000000002950b019ULL,
1334
+ 0xffffffff97765d19ULL,
1335
+ 0xffffffffbe26de33ULL,
1336
+ 0x0000000000003333ULL,
1337
+ 0xffffffffd7b88c19ULL,
1338
+ 0x00000000699e6119ULL,
1339
+ 0x000000002225eb07ULL, /* 48 */
1340
+ 0xffffffff9c030607ULL,
1341
+ 0xfffffffffee8b238ULL,
1342
+ 0x0000000040ce5f38ULL,
1343
+ 0x00000000699edc12ULL,
1344
+ 0xffffffffd7b83112ULL,
1345
+ 0x0000000000008e38ULL,
1346
+ 0xffffffffbe266338ULL,
1347
+ 0xffffffff9c03f9f8ULL, /* 56 */
1348
+ 0x00000000222514f8ULL,
1349
+ 0x0000000040cea0c7ULL,
1350
+ 0xfffffffffee84dc7ULL,
1351
+ 0xffffffffd7b8ceedULL,
1352
+ 0x00000000699e23edULL,
1353
+ 0xffffffffbe269cc7ULL,
1354
+ 0x00000000000071c7ULL,
1355
+ 0x0000000000002862ULL, /* 64 */
1356
+ 0x0000000026a17af6ULL,
1357
+ 0xffffffffaa919152ULL,
1358
+ 0xffffffffcb865590ULL,
1359
+ 0x0000000026a11f07ULL,
1360
+ 0x0000000000004d93ULL,
1361
+ 0xffffffff8c30a637ULL,
1362
+ 0xffffffffed2762f5ULL,
1363
+ 0xffffffffaa9100ffULL, /* 72 */
1364
+ 0xffffffff8c30526bULL,
1365
+ 0x000000000000b9cfULL,
1366
+ 0x0000000061177d0dULL,
1367
+ 0xffffffffcb8623c3ULL,
1368
+ 0xffffffffed277157ULL,
1369
+ 0x0000000061179af3ULL,
1370
+ 0x0000000000005e31ULL
1371
+ };
1372
+
1373
+ gettimeofday(&start, NULL);
1374
+
1375
+ for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
1376
+ for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
1377
+ do_mips64r6_CRC32H(b64_pattern + i, b64_pattern + j,
1378
+ b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
1379
+ }
1380
+ }
1381
+
1382
+ for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
1383
+ for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
1384
+ do_mips64r6_CRC32H(b64_random + i, b64_random + j,
1385
+ b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
1386
+ (PATTERN_INPUTS_64_SHORT_COUNT)) +
1387
+ RANDOM_INPUTS_64_SHORT_COUNT * i + j));
1388
+ }
1389
+ }
1390
+
1391
+ gettimeofday(&end, NULL);
1392
+
1393
+ elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
1394
+ elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
1395
+
1396
+ ret = check_results_64(isa_ase_name, group_name, instruction_name,
1397
+ TEST_COUNT_TOTAL, elapsed_time, b64_result,
1398
+ b64_expect);
1399
+
1400
+ return ret;
1401
+}
1402
diff --git a/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32w.c b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32w.c
1403
new file mode 100644
1404
index XXXXXXX..XXXXXXX
1405
--- /dev/null
1406
+++ b/tests/tcg/mips/user/isa/mips64r6/crc/test_mips64r6_crc32w.c
1407
@@ -XXX,XX +XXX,XX @@
1408
+/*
1409
+ * Test program for MIPS64R6 instruction CRC32W
1410
+ *
1411
+ * Copyright (C) 2019 Wave Computing, Inc.
1412
+ * Copyright (C) 2019 Aleksandar Markovic <amarkovic@wavecomp.com>
1413
+ * Copyright (C) 2025 Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
1414
+ *
1415
+ * This program is free software: you can redistribute it and/or modify
1416
+ * it under the terms of the GNU General Public License as published by
1417
+ * the Free Software Foundation, either version 2 of the License, or
1418
+ * (at your option) any later version.
1419
+ *
1420
+ * This program is distributed in the hope that it will be useful,
1421
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
1422
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1423
+ * GNU General Public License for more details.
1424
+ *
1425
+ * You should have received a copy of the GNU General Public License
1426
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
1427
+ *
1428
+ */
1429
+
1430
+#include <sys/time.h>
1431
+#include <stdint.h>
1432
+
1433
+#include "../../../../include/wrappers_mips64r6.h"
1434
+#include "../../../../include/test_inputs_64.h"
1435
+#include "../../../../include/test_utils_64.h"
1436
+
1437
+#define TEST_COUNT_TOTAL (PATTERN_INPUTS_64_COUNT + RANDOM_INPUTS_64_COUNT)
1438
+
1439
+int32_t main(void)
1440
+{
1441
+ char *isa_ase_name = "mips64r6";
1442
+ char *group_name = "CRC with reversed polynomial 0xEDB88320";
1443
+ char *instruction_name = "CRC32W";
1444
+ int32_t ret;
1445
+ uint32_t i, j;
1446
+ struct timeval start, end;
1447
+ double elapsed_time;
1448
+
1449
+ uint64_t b64_result[TEST_COUNT_TOTAL];
1450
+ uint64_t b64_expect[TEST_COUNT_TOTAL] = {
1451
+ 0x0000000000000000ULL, /* 0 */
1452
+ 0xffffffffdebb20e3ULL,
1453
+ 0x000000004a691fa1ULL,
1454
+ 0xffffffff94d23f42ULL,
1455
+ 0xffffffff8f0808a0ULL,
1456
+ 0x0000000051b32843ULL,
1457
+ 0x0000000065069dceULL,
1458
+ 0xffffffffbbbdbd2dULL,
1459
+ 0xffffffffdebb20e3ULL, /* 8 */
1460
+ 0x0000000000000000ULL,
1461
+ 0xffffffff94d23f42ULL,
1462
+ 0x000000004a691fa1ULL,
1463
+ 0x0000000051b32843ULL,
1464
+ 0xffffffff8f0808a0ULL,
1465
+ 0xffffffffbbbdbd2dULL,
1466
+ 0x0000000065069dceULL,
1467
+ 0x000000004a691fa1ULL, /* 16 */
1468
+ 0xffffffff94d23f42ULL,
1469
+ 0x0000000000000000ULL,
1470
+ 0xffffffffdebb20e3ULL,
1471
+ 0xffffffffc5611701ULL,
1472
+ 0x000000001bda37e2ULL,
1473
+ 0x000000002f6f826fULL,
1474
+ 0xfffffffff1d4a28cULL,
1475
+ 0xffffffff94d23f42ULL, /* 24 */
1476
+ 0x000000004a691fa1ULL,
1477
+ 0xffffffffdebb20e3ULL,
1478
+ 0x0000000000000000ULL,
1479
+ 0x000000001bda37e2ULL,
1480
+ 0xffffffffc5611701ULL,
1481
+ 0xfffffffff1d4a28cULL,
1482
+ 0x000000002f6f826fULL,
1483
+ 0xffffffff8f0808a0ULL, /* 32 */
1484
+ 0x0000000051b32843ULL,
1485
+ 0xffffffffc5611701ULL,
1486
+ 0x000000001bda37e2ULL,
1487
+ 0x0000000000000000ULL,
1488
+ 0xffffffffdebb20e3ULL,
1489
+ 0xffffffffea0e956eULL,
1490
+ 0x0000000034b5b58dULL,
1491
+ 0x0000000051b32843ULL, /* 40 */
1492
+ 0xffffffff8f0808a0ULL,
1493
+ 0x000000001bda37e2ULL,
1494
+ 0xffffffffc5611701ULL,
1495
+ 0xffffffffdebb20e3ULL,
1496
+ 0x0000000000000000ULL,
1497
+ 0x0000000034b5b58dULL,
1498
+ 0xffffffffea0e956eULL,
1499
+ 0x0000000065069dceULL, /* 48 */
1500
+ 0xffffffffbbbdbd2dULL,
1501
+ 0x000000002f6f826fULL,
1502
+ 0xfffffffff1d4a28cULL,
1503
+ 0xffffffffea0e956eULL,
1504
+ 0x0000000034b5b58dULL,
1505
+ 0x0000000000000000ULL,
1506
+ 0xffffffffdebb20e3ULL,
1507
+ 0xffffffffbbbdbd2dULL, /* 56 */
1508
+ 0x0000000065069dceULL,
1509
+ 0xfffffffff1d4a28cULL,
1510
+ 0x000000002f6f826fULL,
1511
+ 0x0000000034b5b58dULL,
1512
+ 0xffffffffea0e956eULL,
1513
+ 0xffffffffdebb20e3ULL,
1514
+ 0x0000000000000000ULL,
1515
+ 0x0000000000000000ULL, /* 64 */
1516
+ 0xffffffff90485967ULL,
1517
+ 0x000000006dfb974aULL,
1518
+ 0x00000000083e4538ULL,
1519
+ 0xffffffff90485967ULL,
1520
+ 0x0000000000000000ULL,
1521
+ 0xfffffffffdb3ce2dULL,
1522
+ 0xffffffff98761c5fULL,
1523
+ 0x000000006dfb974aULL, /* 72 */
1524
+ 0xfffffffffdb3ce2dULL,
1525
+ 0x0000000000000000ULL,
1526
+ 0x0000000065c5d272ULL,
1527
+ 0x00000000083e4538ULL,
1528
+ 0xffffffff98761c5fULL,
1529
+ 0x0000000065c5d272ULL,
1530
+ 0x0000000000000000ULL,
1531
+ };
1532
+
1533
+ gettimeofday(&start, NULL);
1534
+
1535
+ for (i = 0; i < PATTERN_INPUTS_64_SHORT_COUNT; i++) {
1536
+ for (j = 0; j < PATTERN_INPUTS_64_SHORT_COUNT; j++) {
1537
+ do_mips64r6_CRC32W(b64_pattern + i, b64_pattern + j,
1538
+ b64_result + (PATTERN_INPUTS_64_SHORT_COUNT * i + j));
1539
+ }
1540
+ }
1541
+
1542
+ for (i = 0; i < RANDOM_INPUTS_64_SHORT_COUNT; i++) {
1543
+ for (j = 0; j < RANDOM_INPUTS_64_SHORT_COUNT; j++) {
1544
+ do_mips64r6_CRC32W(b64_random + i, b64_random + j,
1545
+ b64_result + (((PATTERN_INPUTS_64_SHORT_COUNT) *
1546
+ (PATTERN_INPUTS_64_SHORT_COUNT)) +
1547
+ RANDOM_INPUTS_64_SHORT_COUNT * i + j));
1548
+ }
1549
+ }
1550
+
1551
+ gettimeofday(&end, NULL);
1552
+
1553
+ elapsed_time = (end.tv_sec - start.tv_sec) * 1000.0;
1554
+ elapsed_time += (end.tv_usec - start.tv_usec) / 1000.0;
1555
+
1556
+ ret = check_results_64(isa_ase_name, group_name, instruction_name,
1557
+ TEST_COUNT_TOTAL, elapsed_time, b64_result,
1558
+ b64_expect);
1559
+
1560
+ return ret;
1561
+}
197
--
1562
--
198
2.34.1
1563
2.34.1
diff view generated by jsdifflib
1
From: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
2
1
Skip NaN mode check for soft-float since NaN mode is irrelevant if an ELF
3
Skip NaN mode check for soft-float since NaN mode is irrelevant if an ELF
2
binary's FPU mode is soft-float, i.e. it doesn't utilize a FPU.
4
binary's FPU mode is soft-float, i.e. it doesn't utilize a FPU.
3
5
4
Cherry-picked 63492a56485f6b755fccf7ad623f7a189bfc79b6
6
Cherry-picked 63492a56485f6b755fccf7ad623f7a189bfc79b6
5
from https://github.com/MIPS/gnutools-qemu
7
from https://github.com/MIPS/gnutools-qemu
...
...
diff view generated by jsdifflib
1
From: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
2
1
Enable MSA ASE using a CLI flag -cpu <cpu>,msa=on.
3
Enable MSA ASE using a CLI flag -cpu <cpu>,msa=on.
2
4
3
Signed-off-by: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
5
Signed-off-by: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
4
---
6
---
5
target/mips/cpu.c | 16 ++++++++++++++++
7
target/mips/cpu.c | 16 ++++++++++++++++
...
...
diff view generated by jsdifflib
Deleted patch
1
Enable MSA ASE for mips64R2-generic CPU.
2
1
3
Cherry-picked 60f6ae8d3d685ba1ea5d301222fb72b67f39264f
4
from https://github.com/MIPS/gnutools-qemu
5
6
Signed-off-by: Faraz Shahbazker <fshahbazker@wavecomp.com>
7
Signed-off-by: Aleksandar Rakic <aleksandar.rakic@htecgroup.com>
8
---
9
target/mips/cpu-defs.c.inc | 4 +++-
10
1 file changed, 3 insertions(+), 1 deletion(-)
11
12
diff --git a/target/mips/cpu-defs.c.inc b/target/mips/cpu-defs.c.inc
13
index XXXXXXX..XXXXXXX 100644
14
--- a/target/mips/cpu-defs.c.inc
15
+++ b/target/mips/cpu-defs.c.inc
16
@@ -XXX,XX +XXX,XX @@ const mips_def_t mips_defs[] =
17
(2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
18
(1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
19
.CP0_Config2 = MIPS_CONFIG2,
20
- .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_LPA),
21
+ .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_LPA) |
22
+ (1 << CP0C3_VInt) | (1 << CP0C3_MSAP),
23
+ .CP0_Config5_rw_bitmask = (1 << CP0C5_MSAEn),
24
.CP0_LLAddr_rw_bitmask = 0,
25
.CP0_LLAddr_shift = 0,
26
.SYNCI_Step = 32,
27
--
28
2.34.1
diff view generated by jsdifflib