Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/amd/common/ac_surface_meta_address_test.c
7286 views
1
/*
2
* Copyright © 2021 Advanced Micro Devices, Inc.
3
* All Rights Reserved.
4
*
5
* Permission is hereby granted, free of charge, to any person obtaining
6
* a copy of this software and associated documentation files (the
7
* "Software"), to deal in the Software without restriction, including
8
* without limitation the rights to use, copy, modify, merge, publish,
9
* distribute, sub license, and/or sell copies of the Software, and to
10
* permit persons to whom the Software is furnished to do so, subject to
11
* the following conditions:
12
*
13
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
14
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
15
* OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
16
* NON-INFRINGEMENT. IN NO EVENT SHALL THE COPYRIGHT HOLDERS, AUTHORS
17
* AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
20
* USE OR OTHER DEALINGS IN THE SOFTWARE.
21
*
22
* The above copyright notice and this permission notice (including the
23
* next paragraph) shall be included in all copies or substantial portions
24
* of the Software.
25
*/
26
27
/* Make the test not meaningless when asserts are disabled. */
28
#undef NDEBUG
29
30
#include <assert.h>
31
#include <inttypes.h>
32
#include <stdio.h>
33
#include <stdlib.h>
34
35
#include <amdgpu.h>
36
#include "drm-uapi/amdgpu_drm.h"
37
#include "drm-uapi/drm_fourcc.h"
38
39
#include "ac_surface.h"
40
#include "util/macros.h"
41
#include "util/u_atomic.h"
42
#include "util/u_math.h"
43
#include "util/u_vector.h"
44
#include "util/mesa-sha1.h"
45
#include "addrlib/inc/addrinterface.h"
46
47
#include "ac_surface_test_common.h"
48
49
/*
50
* The main goal of this test is to validate that our dcc/htile addressing
51
* functions match addrlib behavior.
52
*/
53
54
/* DCC address computation without mipmapping. */
55
static unsigned gfx9_dcc_addr_from_coord(const struct radeon_info *info,
56
/* Shader key inputs: */
57
/* equation varies with resource_type, swizzle_mode,
58
* bpp, number of fragments, pipe_aligned, rb_aligned */
59
ADDR2_COMPUTE_DCCINFO_OUTPUT *eq,
60
unsigned meta_block_width, unsigned meta_block_height,
61
unsigned meta_block_depth,
62
/* Shader inputs: */
63
unsigned dcc_pitch, unsigned dcc_height,
64
unsigned x, unsigned y, unsigned z,
65
unsigned sample, unsigned pipe_xor)
66
{
67
/* The compiled shader shouldn't be complicated considering there are a lot of constants here. */
68
unsigned meta_block_width_log2 = util_logbase2(meta_block_width);
69
unsigned meta_block_height_log2 = util_logbase2(meta_block_height);
70
unsigned meta_block_depth_log2 = util_logbase2(meta_block_depth);
71
72
unsigned m_pipeInterleaveLog2 = 8 + G_0098F8_PIPE_INTERLEAVE_SIZE_GFX9(info->gb_addr_config);
73
unsigned numPipeBits = eq->equation.gfx9.numPipeBits;
74
unsigned pitchInBlock = dcc_pitch >> meta_block_width_log2;
75
unsigned sliceSizeInBlock = (dcc_height >> meta_block_height_log2) * pitchInBlock;
76
77
unsigned xb = x >> meta_block_width_log2;
78
unsigned yb = y >> meta_block_height_log2;
79
unsigned zb = z >> meta_block_depth_log2;
80
81
unsigned blockIndex = zb * sliceSizeInBlock + yb * pitchInBlock + xb;
82
unsigned coords[] = {x, y, z, sample, blockIndex};
83
84
unsigned address = 0;
85
unsigned num_bits = eq->equation.gfx9.num_bits;
86
assert(num_bits <= 32);
87
88
/* Compute the address up until the last bit that doesn't use the block index. */
89
for (unsigned b = 0; b < num_bits - 1; b++) {
90
unsigned xor = 0;
91
for (unsigned c = 0; c < 5; c++) {
92
if (eq->equation.gfx9.bit[b].coord[c].dim >= 5)
93
continue;
94
95
assert(eq->equation.gfx9.bit[b].coord[c].ord < 32);
96
unsigned ison = (coords[eq->equation.gfx9.bit[b].coord[c].dim] >>
97
eq->equation.gfx9.bit[b].coord[c].ord) & 0x1;
98
99
xor ^= ison;
100
}
101
address |= xor << b;
102
}
103
104
/* Fill the remaining bits with the block index. */
105
unsigned last = num_bits - 1;
106
address |= (blockIndex >> eq->equation.gfx9.bit[last].coord[0].ord) << last;
107
108
unsigned pipeXor = pipe_xor & ((1 << numPipeBits) - 1);
109
return (address >> 1) ^ (pipeXor << m_pipeInterleaveLog2);
110
}
111
112
/* DCC/HTILE address computation for GFX10. */
113
static unsigned gfx10_meta_addr_from_coord(const struct radeon_info *info,
114
/* Shader key inputs: */
115
const uint16_t *equation,
116
unsigned meta_block_width, unsigned meta_block_height,
117
unsigned blkSizeLog2,
118
/* Shader inputs: */
119
unsigned meta_pitch, unsigned meta_slice_size,
120
unsigned x, unsigned y, unsigned z,
121
unsigned pipe_xor)
122
{
123
/* The compiled shader shouldn't be complicated considering there are a lot of constants here. */
124
unsigned meta_block_width_log2 = util_logbase2(meta_block_width);
125
unsigned meta_block_height_log2 = util_logbase2(meta_block_height);
126
127
unsigned coord[] = {x, y, z, 0};
128
unsigned address = 0;
129
130
for (unsigned i = 0; i < blkSizeLog2 + 1; i++) {
131
unsigned v = 0;
132
133
for (unsigned c = 0; c < 4; c++) {
134
if (equation[i*4+c] != 0) {
135
unsigned mask = equation[i*4+c];
136
unsigned bits = coord[c];
137
138
while (mask)
139
v ^= (bits >> u_bit_scan(&mask)) & 0x1;
140
}
141
}
142
143
address |= v << i;
144
}
145
146
unsigned blkMask = (1 << blkSizeLog2) - 1;
147
unsigned pipeMask = (1 << G_0098F8_NUM_PIPES(info->gb_addr_config)) - 1;
148
unsigned m_pipeInterleaveLog2 = 8 + G_0098F8_PIPE_INTERLEAVE_SIZE_GFX9(info->gb_addr_config);
149
unsigned xb = x >> meta_block_width_log2;
150
unsigned yb = y >> meta_block_height_log2;
151
unsigned pb = meta_pitch >> meta_block_width_log2;
152
unsigned blkIndex = (yb * pb) + xb;
153
unsigned pipeXor = ((pipe_xor & pipeMask) << m_pipeInterleaveLog2) & blkMask;
154
155
return (meta_slice_size * z) +
156
(blkIndex * (1 << blkSizeLog2)) +
157
((address >> 1) ^ pipeXor);
158
}
159
160
/* DCC address computation without mipmapping and MSAA. */
161
static unsigned gfx10_dcc_addr_from_coord(const struct radeon_info *info,
162
/* Shader key inputs: */
163
/* equation varies with bpp and pipe_aligned */
164
const uint16_t *equation, unsigned bpp,
165
unsigned meta_block_width, unsigned meta_block_height,
166
/* Shader inputs: */
167
unsigned dcc_pitch, unsigned dcc_slice_size,
168
unsigned x, unsigned y, unsigned z,
169
unsigned pipe_xor)
170
{
171
unsigned bpp_log2 = util_logbase2(bpp >> 3);
172
unsigned meta_block_width_log2 = util_logbase2(meta_block_width);
173
unsigned meta_block_height_log2 = util_logbase2(meta_block_height);
174
unsigned blkSizeLog2 = meta_block_width_log2 + meta_block_height_log2 + bpp_log2 - 8;
175
176
return gfx10_meta_addr_from_coord(info, equation,
177
meta_block_width, meta_block_height,
178
blkSizeLog2,
179
dcc_pitch, dcc_slice_size,
180
x, y, z, pipe_xor);
181
}
182
183
static bool one_dcc_address_test(const char *name, const char *test, ADDR_HANDLE addrlib,
184
const struct radeon_info *info, unsigned width, unsigned height,
185
unsigned depth, unsigned samples, unsigned bpp,
186
unsigned swizzle_mode, bool pipe_aligned, bool rb_aligned,
187
unsigned mrt_index,
188
unsigned start_x, unsigned start_y, unsigned start_z,
189
unsigned start_sample)
190
{
191
ADDR2_COMPUTE_PIPEBANKXOR_INPUT xin = {sizeof(ADDR2_COMPUTE_PIPEBANKXOR_INPUT)};
192
ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT xout = {sizeof(ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT)};
193
ADDR2_COMPUTE_DCCINFO_INPUT din = {sizeof(din)};
194
ADDR2_COMPUTE_DCCINFO_OUTPUT dout = {sizeof(dout)};
195
ADDR2_COMPUTE_DCC_ADDRFROMCOORD_INPUT in = {sizeof(in)};
196
ADDR2_COMPUTE_DCC_ADDRFROMCOORD_OUTPUT out = {sizeof(out)};
197
ADDR2_META_MIP_INFO meta_mip_info[RADEON_SURF_MAX_LEVELS] = {0};
198
199
dout.pMipInfo = meta_mip_info;
200
201
/* Compute DCC info. */
202
in.dccKeyFlags.pipeAligned = din.dccKeyFlags.pipeAligned = pipe_aligned;
203
in.dccKeyFlags.rbAligned = din.dccKeyFlags.rbAligned = rb_aligned;
204
xin.resourceType = in.resourceType = din.resourceType = ADDR_RSRC_TEX_2D;
205
xin.swizzleMode = in.swizzleMode = din.swizzleMode = swizzle_mode;
206
in.bpp = din.bpp = bpp;
207
xin.numFrags = xin.numSamples = in.numFrags = din.numFrags = samples;
208
in.numMipLevels = din.numMipLevels = 1; /* addrlib can't do DccAddrFromCoord with mipmapping */
209
din.unalignedWidth = width;
210
din.unalignedHeight = height;
211
din.numSlices = depth;
212
din.firstMipIdInTail = 1;
213
214
int ret = Addr2ComputeDccInfo(addrlib, &din, &dout);
215
assert(ret == ADDR_OK);
216
217
/* Compute xor. */
218
static AddrFormat format[] = {
219
ADDR_FMT_8,
220
ADDR_FMT_16,
221
ADDR_FMT_32,
222
ADDR_FMT_32_32,
223
ADDR_FMT_32_32_32_32,
224
};
225
xin.flags.color = 1;
226
xin.flags.texture = 1;
227
xin.flags.opt4space = 1;
228
xin.flags.metaRbUnaligned = !rb_aligned;
229
xin.flags.metaPipeUnaligned = !pipe_aligned;
230
xin.format = format[util_logbase2(bpp / 8)];
231
xin.surfIndex = mrt_index;
232
233
ret = Addr2ComputePipeBankXor(addrlib, &xin, &xout);
234
assert(ret == ADDR_OK);
235
236
/* Compute addresses */
237
in.compressBlkWidth = dout.compressBlkWidth;
238
in.compressBlkHeight = dout.compressBlkHeight;
239
in.compressBlkDepth = dout.compressBlkDepth;
240
in.metaBlkWidth = dout.metaBlkWidth;
241
in.metaBlkHeight = dout.metaBlkHeight;
242
in.metaBlkDepth = dout.metaBlkDepth;
243
in.dccRamSliceSize = dout.dccRamSliceSize;
244
245
in.mipId = 0;
246
in.pitch = dout.pitch;
247
in.height = dout.height;
248
in.pipeXor = xout.pipeBankXor;
249
250
/* Validate that the packed gfx9_meta_equation structure can fit all fields. */
251
const struct gfx9_meta_equation eq;
252
if (info->chip_class == GFX9) {
253
/* The bit array is smaller in gfx9_meta_equation than in addrlib. */
254
assert(dout.equation.gfx9.num_bits <= ARRAY_SIZE(eq.u.gfx9.bit));
255
} else {
256
/* gfx9_meta_equation doesn't store the first 4 and the last 8 elements. They must be 0. */
257
for (unsigned i = 0; i < 4; i++)
258
assert(dout.equation.gfx10_bits[i] == 0);
259
260
for (unsigned i = ARRAY_SIZE(eq.u.gfx10_bits) + 4; i < 68; i++)
261
assert(dout.equation.gfx10_bits[i] == 0);
262
}
263
264
for (in.x = start_x; in.x < in.pitch; in.x += dout.compressBlkWidth) {
265
for (in.y = start_y; in.y < in.height; in.y += dout.compressBlkHeight) {
266
for (in.slice = start_z; in.slice < depth; in.slice += dout.compressBlkDepth) {
267
for (in.sample = start_sample; in.sample < samples; in.sample++) {
268
int r = Addr2ComputeDccAddrFromCoord(addrlib, &in, &out);
269
if (r != ADDR_OK) {
270
printf("%s addrlib error: %s\n", name, test);
271
abort();
272
}
273
274
unsigned addr;
275
if (info->chip_class == GFX9) {
276
addr = gfx9_dcc_addr_from_coord(info, &dout, dout.metaBlkWidth, dout.metaBlkHeight,
277
dout.metaBlkDepth, dout.pitch, dout.height,
278
in.x, in.y, in.slice, in.sample, in.pipeXor);
279
if (in.sample == 1) {
280
/* Sample 0 should be one byte before sample 1. The DCC MSAA clear relies on it. */
281
assert(addr - 1 ==
282
gfx9_dcc_addr_from_coord(info, &dout, dout.metaBlkWidth, dout.metaBlkHeight,
283
dout.metaBlkDepth, dout.pitch, dout.height,
284
in.x, in.y, in.slice, 0, in.pipeXor));
285
}
286
} else {
287
addr = gfx10_dcc_addr_from_coord(info, dout.equation.gfx10_bits,
288
in.bpp, dout.metaBlkWidth, dout.metaBlkHeight,
289
dout.pitch, dout.dccRamSliceSize,
290
in.x, in.y, in.slice, in.pipeXor);
291
}
292
293
if (out.addr != addr) {
294
printf("%s fail (%s) at %ux%ux%u@%u: expected = %llu, got = %u\n",
295
name, test, in.x, in.y, in.slice, in.sample, out.addr, addr);
296
return false;
297
}
298
}
299
}
300
}
301
}
302
return true;
303
}
304
305
static void run_dcc_address_test(const char *name, const struct radeon_info *info, bool full)
306
{
307
unsigned total = 0;
308
unsigned fails = 0;
309
unsigned swizzle_mode = info->chip_class == GFX9 ? ADDR_SW_64KB_S_X : ADDR_SW_64KB_R_X;
310
unsigned last_size, max_samples, min_bpp, max_bpp;
311
312
if (full) {
313
last_size = 6*6 - 1;
314
max_samples = 8;
315
min_bpp = 8;
316
max_bpp = 128;
317
} else {
318
/* The test coverage is reduced for Gitlab CI because it timeouts. */
319
last_size = 0;
320
max_samples = 2;
321
min_bpp = 32;
322
max_bpp = 64;
323
}
324
325
#ifdef HAVE_OPENMP
326
#pragma omp parallel for
327
#endif
328
for (unsigned size = 0; size <= last_size; size++) {
329
unsigned width = 8 + 379 * (size % 6);
330
unsigned height = 8 + 379 * ((size / 6) % 6);
331
332
struct ac_addrlib *ac_addrlib = ac_addrlib_create(info, NULL);
333
ADDR_HANDLE addrlib = ac_addrlib_get_handle(ac_addrlib);
334
335
unsigned local_fails = 0;
336
unsigned local_total = 0;
337
338
for (unsigned bpp = min_bpp; bpp <= max_bpp; bpp *= 2) {
339
/* addrlib can do DccAddrFromCoord with MSAA images only on gfx9 */
340
for (unsigned samples = 1; samples <= (info->chip_class == GFX9 ? max_samples : 1); samples *= 2) {
341
for (int rb_aligned = true; rb_aligned >= (samples > 1 ? true : false); rb_aligned--) {
342
for (int pipe_aligned = true; pipe_aligned >= (samples > 1 ? true : false); pipe_aligned--) {
343
for (unsigned mrt_index = 0; mrt_index < 2; mrt_index++) {
344
unsigned depth = 2;
345
char test[256];
346
347
snprintf(test, sizeof(test), "%ux%ux%u %ubpp %u samples rb:%u pipe:%u",
348
width, height, depth, bpp, samples, rb_aligned, pipe_aligned);
349
350
if (one_dcc_address_test(name, test, addrlib, info, width, height, depth, samples,
351
bpp, swizzle_mode, pipe_aligned, rb_aligned, mrt_index,
352
0, 0, 0, 0)) {
353
} else {
354
local_fails++;
355
}
356
local_total++;
357
}
358
}
359
}
360
}
361
}
362
363
ac_addrlib_destroy(ac_addrlib);
364
p_atomic_add(&fails, local_fails);
365
p_atomic_add(&total, local_total);
366
}
367
printf("%16s total: %u, fail: %u\n", name, total, fails);
368
}
369
370
/* HTILE address computation without mipmapping. */
371
static unsigned gfx10_htile_addr_from_coord(const struct radeon_info *info,
372
const uint16_t *equation,
373
unsigned meta_block_width,
374
unsigned meta_block_height,
375
unsigned htile_pitch, unsigned htile_slice_size,
376
unsigned x, unsigned y, unsigned z,
377
unsigned pipe_xor)
378
{
379
unsigned meta_block_width_log2 = util_logbase2(meta_block_width);
380
unsigned meta_block_height_log2 = util_logbase2(meta_block_height);
381
unsigned blkSizeLog2 = meta_block_width_log2 + meta_block_height_log2 - 4;
382
383
return gfx10_meta_addr_from_coord(info, equation,
384
meta_block_width, meta_block_height,
385
blkSizeLog2,
386
htile_pitch, htile_slice_size,
387
x, y, z, pipe_xor);
388
}
389
390
static bool one_htile_address_test(const char *name, const char *test, ADDR_HANDLE addrlib,
391
const struct radeon_info *info,
392
unsigned width, unsigned height, unsigned depth,
393
unsigned bpp, unsigned swizzle_mode,
394
unsigned start_x, unsigned start_y, unsigned start_z)
395
{
396
ADDR2_COMPUTE_PIPEBANKXOR_INPUT xin = {0};
397
ADDR2_COMPUTE_PIPEBANKXOR_OUTPUT xout = {0};
398
ADDR2_COMPUTE_HTILE_INFO_INPUT hin = {0};
399
ADDR2_COMPUTE_HTILE_INFO_OUTPUT hout = {0};
400
ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_INPUT in = {0};
401
ADDR2_COMPUTE_HTILE_ADDRFROMCOORD_OUTPUT out = {0};
402
ADDR2_META_MIP_INFO meta_mip_info[RADEON_SURF_MAX_LEVELS] = {0};
403
404
hout.pMipInfo = meta_mip_info;
405
406
/* Compute HTILE info. */
407
hin.hTileFlags.pipeAligned = 1;
408
hin.hTileFlags.rbAligned = 1;
409
hin.depthFlags.depth = 1;
410
hin.depthFlags.texture = 1;
411
hin.depthFlags.opt4space = 1;
412
hin.swizzleMode = in.swizzleMode = xin.swizzleMode = swizzle_mode;
413
hin.unalignedWidth = in.unalignedWidth = width;
414
hin.unalignedHeight = in.unalignedHeight = height;
415
hin.numSlices = in.numSlices = depth;
416
hin.numMipLevels = in.numMipLevels = 1; /* addrlib can't do HtileAddrFromCoord with mipmapping. */
417
hin.firstMipIdInTail = 1;
418
419
int ret = Addr2ComputeHtileInfo(addrlib, &hin, &hout);
420
assert(ret == ADDR_OK);
421
422
/* Compute xor. */
423
static AddrFormat format[] = {
424
ADDR_FMT_8, /* unused */
425
ADDR_FMT_16,
426
ADDR_FMT_32,
427
};
428
xin.flags = hin.depthFlags;
429
xin.resourceType = ADDR_RSRC_TEX_2D;
430
xin.format = format[util_logbase2(bpp / 8)];
431
xin.numFrags = xin.numSamples = in.numSamples = 1;
432
433
ret = Addr2ComputePipeBankXor(addrlib, &xin, &xout);
434
assert(ret == ADDR_OK);
435
436
in.hTileFlags = hin.hTileFlags;
437
in.depthflags = xin.flags;
438
in.bpp = bpp;
439
in.pipeXor = xout.pipeBankXor;
440
441
for (in.x = start_x; in.x < width; in.x++) {
442
for (in.y = start_y; in.y < height; in.y++) {
443
for (in.slice = start_z; in.slice < depth; in.slice++) {
444
int r = Addr2ComputeHtileAddrFromCoord(addrlib, &in, &out);
445
if (r != ADDR_OK) {
446
printf("%s addrlib error: %s\n", name, test);
447
abort();
448
}
449
450
unsigned addr =
451
gfx10_htile_addr_from_coord(info, hout.equation.gfx10_bits,
452
hout.metaBlkWidth, hout.metaBlkHeight,
453
hout.pitch, hout.sliceSize,
454
in.x, in.y, in.slice, in.pipeXor);
455
if (out.addr != addr) {
456
printf("%s fail (%s) at %ux%ux%u: expected = %llu, got = %u\n",
457
name, test, in.x, in.y, in.slice, out.addr, addr);
458
return false;
459
}
460
}
461
}
462
}
463
464
return true;
465
}
466
467
static void run_htile_address_test(const char *name, const struct radeon_info *info, bool full)
468
{
469
unsigned total = 0;
470
unsigned fails = 0;
471
unsigned first_size = 0, last_size = 6*6 - 1, max_bpp = 32;
472
473
/* The test coverage is reduced for Gitlab CI because it timeouts. */
474
if (!full) {
475
first_size = last_size = 0;
476
}
477
478
#ifdef HAVE_OPENMP
479
#pragma omp parallel for
480
#endif
481
for (unsigned size = first_size; size <= last_size; size++) {
482
unsigned width = 8 + 379 * (size % 6);
483
unsigned height = 8 + 379 * (size / 6);
484
485
struct ac_addrlib *ac_addrlib = ac_addrlib_create(info, NULL);
486
ADDR_HANDLE addrlib = ac_addrlib_get_handle(ac_addrlib);
487
488
for (unsigned depth = 1; depth <= 2; depth *= 2) {
489
for (unsigned bpp = 16; bpp <= max_bpp; bpp *= 2) {
490
if (one_htile_address_test(name, name, addrlib, info, width, height, depth,
491
bpp, ADDR_SW_64KB_Z_X, 0, 0, 0)) {
492
} else {
493
p_atomic_inc(&fails);
494
}
495
p_atomic_inc(&total);
496
}
497
}
498
499
ac_addrlib_destroy(ac_addrlib);
500
}
501
printf("%16s total: %u, fail: %u\n", name, total, fails);
502
}
503
int main(int argc, char **argv)
504
{
505
bool full = false;
506
507
if (argc == 2 && !strcmp(argv[1], "--full"))
508
full = true;
509
else
510
puts("Specify --full to run the full test.");
511
512
puts("DCC:");
513
for (unsigned i = 0; i < ARRAY_SIZE(testcases); ++i) {
514
struct radeon_info info = get_radeon_info(&testcases[i]);
515
516
run_dcc_address_test(testcases[i].name, &info, full);
517
}
518
519
puts("HTILE:");
520
for (unsigned i = 0; i < ARRAY_SIZE(testcases); ++i) {
521
struct radeon_info info = get_radeon_info(&testcases[i]);
522
523
/* Only GFX10+ is currently supported. */
524
if (info.chip_class < GFX10)
525
continue;
526
527
run_htile_address_test(testcases[i].name, &info, full);
528
}
529
530
return 0;
531
}
532
533