source: CLRX/CLRadeonExtender/trunk/tests/amdasm/AsmAmdFormat.cpp @ 3743

Last change on this file since 3743 was 3743, checked in by matszpk, 3 years ago

CLRadeonExtender: Amd & AmdCL2: Add testcases with default CWS sizes.

File size: 32.5 KB
Line 
1/*
2 *  CLRadeonExtender - Unofficial OpenCL Radeon Extensions Library
3 *  Copyright (C) 2014-2018 Mateusz Szpakowski
4 *
5 *  This library is free software; you can redistribute it and/or
6 *  modify it under the terms of the GNU Lesser General Public
7 *  License as published by the Free Software Foundation; either
8 *  version 2.1 of the License, or (at your option) any later version.
9 *
10 *  This library is distributed in the hope that it will be useful,
11 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
13 *  Lesser General Public License for more details.
14 *
15 *  You should have received a copy of the GNU Lesser General Public
16 *  License along with this library; if not, write to the Free Software
17 *  Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
18 */
19
20#include <CLRX/Config.h>
21#include <iostream>
22#include <cstdio>
23#include <sstream>
24#include <algorithm>
25#include <memory>
26#include <CLRX/amdasm/Assembler.h>
27#include "../TestUtils.h"
28
29using namespace CLRX;
30
31static const char* argTypeNameTbl[] =
32{
33    "void", "uchar", "char", "ushort", "short", "uint", "int",
34    "ulong", "long", "float", "double", "pointer",
35    "image", "image1d", "image1d_array", "image1d_buffer",
36    "image2d", "image2d_array", "image3d",
37    "uchar2", "uchar3", "uchar4", "uchar8", "uchar16",
38    "char2", "char3", "char4", "char8", "char16",
39    "ushort2", "ushort3", "ushort4", "ushort8", "ushort16",
40    "short2", "short3", "short4", "short8", "short16",
41    "uint2", "uint3", "uint4", "uint8", "uint16",
42    "int2", "int3", "int4", "int8", "int16",
43    "ulong2", "ulong3", "ulong4", "ulong8", "ulong16",
44    "long2", "long3", "long4", "long8", "long16",
45    "float2", "float3", "float4", "float8", "float16",
46    "double2", "double3", "double4", "double8", "double16",
47    "sampler", "structure", "counter32", "counter64",
48    "pipe", "cmdqueue", "clkevent"
49};
50
51static const char* ptrSpaceNameTbl[] =
52{ "none", "local", "constant", "global" };
53
54static const char* calNoteNamesTbl[] =
55{
56    "none", "proginfo", "inputs", "outputs", "condout", "float32consts", "int32consts",
57    "bool32consts", "earlyexit", "globalbuffers", "constantbuffers", "inputsamplers",
58    "persistentbuffers", "scratchbuffers", "subconstantbuffers", "uavmailboxsize",
59    "uav", "uavopmask"
60};
61
62// print hex data or nullptr
63static void printHexData(std::ostream& os, cxuint indentLevel, size_t size,
64             const cxbyte* data)
65{
66    if (data==nullptr)
67    {
68        for (cxuint j = 0; j < indentLevel; j++)
69            os << "  ";
70        os << "nullptr\n";
71        return;
72    }
73    for (size_t i = 0; i < size; i++)
74    {
75        if ((i&31)==0)
76            for (cxuint j = 0; j < indentLevel; j++)
77                os << "  ";
78        char buf[10];
79        snprintf(buf, 10, "%02x", cxuint(data[i]));
80        os << buf;
81        if ((i&31)==31 || i+1 == size)
82            os << '\n';
83    }
84}
85
86// helper for printing value from kernel config (print default and notsupplied)
87static std::string confValueToString(uint32_t val)
88{
89    if (val == BINGEN_DEFAULT)
90        return "default";
91    if (val == BINGEN_NOTSUPPLIED)
92        return "notsup";
93    std::ostringstream oss;
94    oss << val;
95    return oss.str();
96}
97
98// print dump of AMD Catalyst output to stream for comparing with testcase
99static void printAmdOutput(std::ostream& os, const AmdInput* output)
100{
101    os << "AmdBinDump:" << std::endl;
102    os << "  Bitness=" << ((output->is64Bit) ? "64-bit" : "32-bit") << ", "
103            "devType=" << getGPUDeviceTypeName(output->deviceType) << ", "
104            "drvVersion=" << output->driverVersion << ", "
105            "drvInfo=\"" << output->driverInfo << "\", "
106            "compileOptions=\"" << output->compileOptions << "\"\n";
107   
108    for (const AmdKernelInput& kernel: output->kernels)
109    {
110        // print kernel data and code
111        os << "  Kernel: " << kernel.kernelName << "\n";
112        os << "    Data:\n";
113        printHexData(os, 2, kernel.dataSize, kernel.data);
114        os << "    Code:\n";
115        printHexData(os, 2, kernel.codeSize, kernel.code);
116        if (!kernel.useConfig)
117        {
118            // print header, metadata
119            os << "    Header:\n";
120            printHexData(os, 2, kernel.headerSize, kernel.header);
121            os << "    Metadata:\n";
122            printHexData(os, 2, kernel.metadataSize, (const cxbyte*)kernel.metadata);
123            // CALNotes
124            if (!kernel.calNotes.empty())
125            {
126                for(const CALNoteInput calNote: kernel.calNotes)
127                {
128                    os << "    CALNote: type=";
129                    if (calNote.header.type<=CALNOTE_ATI_MAXTYPE)
130                        os << calNoteNamesTbl[calNote.header.type];
131                    else // unknown
132                        os << calNote.header.type;
133                    os << ", nameSize=" << calNote.header.nameSize << "\n";
134                    printHexData(os, 2, calNote.header.descSize, calNote.data);
135                }
136            }
137        }
138        else
139        {
140            // when config
141            const AmdKernelConfig& config = kernel.config;
142            os << "    Config:\n";
143            for (AmdKernelArgInput arg: config.args)
144                os << "      Arg: \"" << arg.argName << "\", \"" <<
145                        arg.typeName << "\", " <<
146                        argTypeNameTbl[cxuint(arg.argType)] << ", " <<
147                        argTypeNameTbl[cxuint(arg.pointerType)] << ", " <<
148                        ptrSpaceNameTbl[cxuint(arg.ptrSpace)] << ", " <<
149                        cxuint(arg.ptrAccess) << ", " << arg.structSize << ", " <<
150                        arg.constSpaceSize << ", " << confValueToString(arg.resId) << ", " <<
151                        (arg.used ? "true":"false")<< "\n";
152           
153            if (!config.samplers.empty())
154            {
155                os << "      Sampler:";
156                for (cxuint sampler: config.samplers)
157                    os << " " << sampler;
158                os << '\n';
159            }
160            os << "      dims=" << confValueToString(config.dimMask) << ", "
161                    "cws=" << config.reqdWorkGroupSize[0] << " " <<
162                    config.reqdWorkGroupSize[1] << " " << config.reqdWorkGroupSize[2] << ", "
163                    "SGPRS=" << confValueToString(config.usedSGPRsNum) << ", "
164                    "VGPRS=" << confValueToString(config.usedVGPRsNum) << ", "
165                    "pgmRSRC2=" << std::hex << "0x" << config.pgmRSRC2 << ", "
166                    "ieeeMode=0x" << config.ieeeMode << "\n      "
167                    "floatMode=0x" << config.floatMode<< std::dec << ", "
168                    "hwLocalSize=" << config.hwLocalSize << ", "
169                    "hwRegion=" << confValueToString(config.hwRegion) << ", "
170                    "scratchBuffer=" << config.scratchBufferSize << "\n      "
171                    "uavPrivate=" << confValueToString(config.uavPrivate) << ", "
172                    "uavId=" << confValueToString(config.uavId) << ", "
173                    "constBufferId=" << confValueToString(config.constBufferId) << ", "
174                    "printfId=" << confValueToString(config.printfId) << "\n      "
175                    "privateId=" << confValueToString(config.privateId) << ", "
176                    "earlyExit=" << config.earlyExit << ","
177                    "condOut=" << config.condOut << ", " <<
178                    (config.usePrintf?"usePrintf ":"") <<
179                    (config.useConstantData?"useConstantData ":"") << "\n";
180             for (cxuint u = 0; u < config.userDatas.size(); u++)
181                 os << "      UserData: " << config.userDatas[u].dataClass << ", " <<
182                        config.userDatas[u].apiSlot << ", " <<
183                        config.userDatas[u].regStart << ", " <<
184                        config.userDatas[u].regSize << "\n";
185        }
186        // print extra sections in inner binaries
187        for (BinSection section: kernel.extraSections)
188        {
189            os << "    Section " << section.name << ", type=" << section.type <<
190                        ", flags=" << section.flags << ":\n";
191            printHexData(os, 2, section.size, section.data);
192        }
193        // print extra symbols in inner binaries
194        for (BinSymbol symbol: kernel.extraSymbols)
195                os << "    Symbol: name=" << symbol.name << ", value=" << symbol.value <<
196                ", size=" << symbol.size << ", section=" << symbol.sectionId << "\n";
197        os.flush();
198    }
199    os << "  GlobalData:\n";
200    printHexData(os,  1, output->globalDataSize, output->globalData);
201    // print extra sections in main binaries
202    for (BinSection section: output->extraSections)
203    {
204        os << "  Section " << section.name << ", type=" << section.type <<
205                        ", flags=" << section.flags << ":\n";
206        printHexData(os, 1, section.size, section.data);
207    }
208    // print extra symbols in main binaries
209    for (BinSymbol symbol: output->extraSymbols)
210        os << "  Symbol: name=" << symbol.name << ", value=" << symbol.value <<
211                ", size=" << symbol.size << ", section=" << symbol.sectionId << "\n";
212    os.flush();
213}
214
215struct AsmTestCase
216{
217    const char* input;
218    const char* dump;
219    const char* errors;
220    bool good;
221};
222
223static const AsmTestCase asmTestCases1Tbl[] =
224{
225    {
226        R"ffDXD(            .amd
227           
228            .kernel non_config
229            .header
230            .byte 0,2,3,4,5,65,6,6,8
231            .metadata
232            .ascii "alamakota. this is only test"
233            .data
234            .byte 77,55,33
235            .text
236            .int 0x12334dcd,0x23349aac,0x348d8189
237            .boolconsts
238            .segment 31,42
239            .proginfo
240            .entry 123,544
241            .entry 112,1
242            .entry 1,21
243            .intconsts
244            .segment 2334,6553
245            .segment 66544,112
246            .earlyexit 23
247            .boolconsts
248            .segment 12,344
249            .segment 15,112
250            .outputs
251            .short 0xfda,0x223d
252            .inputs
253            .short 0xfdb,0x223e
254            .scratchbuffers
255            .short 55,77
256            .persistentbuffers
257            .short 155,177
258            .globalbuffers
259            .short 5,6,7,168,88
260            .condout 664
261            .byte 122
262            .inputsamplers
263            .sampler 0,1
264            .sampler 5,7
265            .sampler 77, 5
266            .floatconsts
267            .segment 71,77
268            .segment 11,0
269            .constantbuffers
270            .cbid 0xfeda,0xdb44
271            .calnote 24
272            .hword 4321,64321
273            .calnote 112
274            .hword 999,888
275            .subconstantbuffers
276            .byte 11,10,9,8,7
277            .uavmailboxsize 145
278            .uavopmask 344
279            .uav
280            .entry 11,20,23,21
281            .entry 15,25,27,29
282            .calnote 0
283            .byte 55,66,77
284           
285            .rodata
286            .ascii "this is rodata"
287            .section .ubu
288            .ascii "this is ubu"
289           
290            .kernel defconfigured
291            .ascii "this is code"
292            .config
293           
294            .kernel configured
295            .ascii "this is code2"
296            .config
297            .dims zx
298            .cws 554,44,11
299            .sampler 55,44,332,121
300            .sgprsnum 24
301            .vgprsnum 47
302            .pgmrsrc2 0xaabbccdd
303            .ieeemode
304            .floatmode 0xe0
305            .hwlocal 0x33
306            .hwregion 394
307            .scratchbuffer 9
308            .printfid 10
309            .privateid 8
310            .cbid 11
311            .uavid 12
312            .uavprivate 8
313            .earlyexit 1
314            .condout 2
315            .userdata imm_kernel_arg,0,0,4
316            .userdata ptr_indirect_uav,0,4,1
317            .userdata ptr_indirect_uav,0,5,1
318            .userdata imm_sampler,0,6,2
319            .arg v0,double
320            .arg v1,"double_t",double
321            .arg v2,double2
322            .arg v3,double3
323            .arg v4,double4
324            .arg v5,double8
325            .arg v6,double16
326            .arg v7,"float_t",float
327            .arg v8,float2
328            .arg v9,float3
329            .arg v10,float4
330            .arg v11,float8
331            .arg v12,float16
332            .arg v13,float16,unused
333            .arg v14,short8
334            .arg v15,uint4
335            .arg v16,long3
336            .arg v17,sampler
337            .arg v18,structure,24
338            .arg v19,structure,44,unused
339            .arg v20,counter32,3
340            .arg v21,counter32,3,unused
341            .arg v22,image
342            .arg v23,image2d
343            .arg v24,image3d
344            .arg v25,image2d_array
345            .arg v26,image1d_buffer
346            .arg v27,image1d_array
347            .arg v28,image1d
348            .arg v29,image2d,write_only
349            .arg v30,image2d,,5
350            .arg v31,image2d,,5,unused
351            .arg v32,image2d,,,unused
352            .arg v33,"myimage",image3d
353            .arg v34,void*,global
354            .arg v35,void*,global,const
355            .arg v36,void*,local
356            .arg v37,void*,constant
357            .arg v38,uchar8*,global
358            .arg v39,double3*,global
359            .arg v40,long4*,global
360            .arg v41,ulong16  *,global
361            .arg v42,ulong16  *,global, restrict
362            .arg v43,ulong16  *,global, restrict volatile
363            .arg v44,ulong16  *,global, restrict restrict volatile const
364            .arg v45,ulong16  *,global,
365            .arg v46,structure*,0,global,
366            .arg v47,structure*,14,global,const
367            .arg v48,structure*,14,global,const, 17
368            .arg v49,ulong16  *,global,,18
369            .arg v50,structure*,14,global,const, 17, unused
370            .arg v51,float*,global,,,unused
371            .arg v52,float*,local,restrict,unused
372            .arg v53,float*,local,restrict
373            .arg v54,float*,constant,,40
374            .arg v55,float*,constant,,40,20
375            .arg v56,float*,constant,,40,20,unused
376            .arg v57,structure*,82,global,,,unused
377            .arg v58,structure*,78,local,restrict,unused
378            .arg v59,structure*,110,local,restrict
379            .arg v60,structure*,17,constant,,40
380            .arg v61,structure*,19,constant,,40,20
381            .arg v62,structure*,22,constant,,40,20,unused
382            .section .notknown
383            .ascii "notknownsection"
384            .section .notknown2, "wa", @note
385            .main
386            .section .sometest
387            .ascii "UUaa"
388            .section .flagged, "xw", @nobits)ffDXD",
389        /* dump */
390        R"ffDXD(AmdBinDump:
391  Bitness=32-bit, devType=CapeVerde, drvVersion=0, drvInfo="", compileOptions=""
392  Kernel: non_config
393    Data:
394    4d3721
395    Code:
396    cd4d3312ac9a342389818d34
397    Header:
398    000203040541060608
399    Metadata:
400    616c616d616b6f74612e2074686973206973206f6e6c792074657374
401    CALNote: type=bool32consts, nameSize=8
402    1f0000002a000000
403    CALNote: type=proginfo, nameSize=8
404    7b0000002002000070000000010000000100000015000000
405    CALNote: type=int32consts, nameSize=8
406    1e09000099190000f003010070000000
407    CALNote: type=earlyexit, nameSize=8
408    17000000
409    CALNote: type=bool32consts, nameSize=8
410    0c000000580100000f00000070000000
411    CALNote: type=outputs, nameSize=8
412    da0f3d22
413    CALNote: type=inputs, nameSize=8
414    db0f3e22
415    CALNote: type=scratchbuffers, nameSize=8
416    37004d00
417    CALNote: type=persistentbuffers, nameSize=8
418    9b00b100
419    CALNote: type=globalbuffers, nameSize=8
420    050006000700a8005800
421    CALNote: type=condout, nameSize=8
422    980200007a
423    CALNote: type=inputsamplers, nameSize=8
424    000000000100000005000000070000004d00000005000000
425    CALNote: type=float32consts, nameSize=8
426    470000004d0000000b00000000000000
427    CALNote: type=constantbuffers, nameSize=8
428    dafe000044db0000
429    CALNote: type=24, nameSize=8
430    e11041fb
431    CALNote: type=112, nameSize=8
432    e7037803
433    CALNote: type=subconstantbuffers, nameSize=8
434    0b0a090807
435    CALNote: type=uavmailboxsize, nameSize=8
436    91000000
437    CALNote: type=uavopmask, nameSize=8
438    58010000
439    CALNote: type=uav, nameSize=8
440    0b0000001400000017000000150000000f000000190000001b0000001d000000
441    CALNote: type=none, nameSize=8
442    37424d
443    Section .rodata, type=1, flags=0:
444    7468697320697320726f64617461
445    Section .ubu, type=1, flags=0:
446    7468697320697320756275
447  Kernel: defconfigured
448    Data:
449    nullptr
450    Code:
451    7468697320697320636f6465
452    Config:
453      dims=default, cws=0 0 0, SGPRS=0, VGPRS=0, pgmRSRC2=0x0, ieeeMode=0x0
454      floatMode=0xc0, hwLocalSize=0, hwRegion=default, scratchBuffer=0
455      uavPrivate=default, uavId=default, constBufferId=default, printfId=default
456      privateId=default, earlyExit=0,condOut=0,
457  Kernel: configured
458    Data:
459    nullptr
460    Code:
461    7468697320697320636f646532
462    Config:
463      Arg: "v0", "double", double, void, none, 0, 0, 0, default, true
464      Arg: "v1", "double_t", double, void, none, 0, 0, 0, default, true
465      Arg: "v2", "double2", double2, void, none, 0, 0, 0, default, true
466      Arg: "v3", "double3", double3, void, none, 0, 0, 0, default, true
467      Arg: "v4", "double4", double4, void, none, 0, 0, 0, default, true
468      Arg: "v5", "double8", double8, void, none, 0, 0, 0, default, true
469      Arg: "v6", "double16", double16, void, none, 0, 0, 0, default, true
470      Arg: "v7", "float_t", float, void, none, 0, 0, 0, default, true
471      Arg: "v8", "float2", float2, void, none, 0, 0, 0, default, true
472      Arg: "v9", "float3", float3, void, none, 0, 0, 0, default, true
473      Arg: "v10", "float4", float4, void, none, 0, 0, 0, default, true
474      Arg: "v11", "float8", float8, void, none, 0, 0, 0, default, true
475      Arg: "v12", "float16", float16, void, none, 0, 0, 0, default, true
476      Arg: "v13", "float16", float16, void, none, 0, 0, 0, default, false
477      Arg: "v14", "short8", short8, void, none, 0, 0, 0, default, true
478      Arg: "v15", "uint4", uint4, void, none, 0, 0, 0, default, true
479      Arg: "v16", "long3", long3, void, none, 0, 0, 0, default, true
480      Arg: "v17", "sampler_t", sampler, void, none, 0, 0, 0, default, true
481      Arg: "v18", "structure", structure, void, none, 0, 24, 0, default, true
482      Arg: "v19", "structure", structure, void, none, 0, 44, 0, default, false
483      Arg: "v20", "counter32_t", counter32, void, none, 0, 0, 0, 3, true
484      Arg: "v21", "counter32_t", counter32, void, none, 0, 0, 0, 3, false
485      Arg: "v22", "image2d_t", image, void, global, 1, 0, 0, default, true
486      Arg: "v23", "image2d_t", image2d, void, global, 1, 0, 0, default, true
487      Arg: "v24", "image3d_t", image3d, void, global, 1, 0, 0, default, true
488      Arg: "v25", "image2d_array_t", image2d_array, void, global, 1, 0, 0, default, true
489      Arg: "v26", "image1d_buffer_t", image1d_buffer, void, global, 1, 0, 0, default, true
490      Arg: "v27", "image1d_array_t", image1d_array, void, global, 1, 0, 0, default, true
491      Arg: "v28", "image1d_t", image1d, void, global, 1, 0, 0, default, true
492      Arg: "v29", "image2d_t", image2d, void, global, 2, 0, 0, default, true
493      Arg: "v30", "image2d_t", image2d, void, global, 1, 0, 0, 5, true
494      Arg: "v31", "image2d_t", image2d, void, global, 1, 0, 0, 5, false
495      Arg: "v32", "image2d_t", image2d, void, global, 1, 0, 0, default, false
496      Arg: "v33", "myimage", image3d, void, global, 1, 0, 0, default, true
497      Arg: "v34", "void*", pointer, void, global, 0, 0, 0, default, true
498      Arg: "v35", "void*", pointer, void, global, 4, 0, 0, default, true
499      Arg: "v36", "void*", pointer, void, local, 0, 0, 0, default, true
500      Arg: "v37", "void*", pointer, void, constant, 0, 0, 0, default, true
501      Arg: "v38", "uchar8*", pointer, uchar8, global, 0, 0, 0, default, true
502      Arg: "v39", "double3*", pointer, double3, global, 0, 0, 0, default, true
503      Arg: "v40", "long4*", pointer, long4, global, 0, 0, 0, default, true
504      Arg: "v41", "ulong16*", pointer, ulong16, global, 0, 0, 0, default, true
505      Arg: "v42", "ulong16*", pointer, ulong16, global, 8, 0, 0, default, true
506      Arg: "v43", "ulong16*", pointer, ulong16, global, 24, 0, 0, default, true
507      Arg: "v44", "ulong16*", pointer, ulong16, global, 28, 0, 0, default, true
508      Arg: "v45", "ulong16*", pointer, ulong16, global, 0, 0, 0, default, true
509      Arg: "v46", "structure*", pointer, structure, global, 0, 0, 0, default, true
510      Arg: "v47", "structure*", pointer, structure, global, 4, 14, 0, default, true
511      Arg: "v48", "structure*", pointer, structure, global, 4, 14, 0, 17, true
512      Arg: "v49", "ulong16*", pointer, ulong16, global, 0, 0, 0, 18, true
513      Arg: "v50", "structure*", pointer, structure, global, 4, 14, 0, 17, false
514      Arg: "v51", "float*", pointer, float, global, 0, 0, 0, default, false
515      Arg: "v52", "float*", pointer, float, local, 8, 0, 0, default, false
516      Arg: "v53", "float*", pointer, float, local, 8, 0, 0, default, true
517      Arg: "v54", "float*", pointer, float, constant, 0, 0, 40, default, true
518      Arg: "v55", "float*", pointer, float, constant, 0, 0, 40, 20, true
519      Arg: "v56", "float*", pointer, float, constant, 0, 0, 40, 20, false
520      Arg: "v57", "structure*", pointer, structure, global, 0, 82, 0, default, false
521      Arg: "v58", "structure*", pointer, structure, local, 8, 78, 0, default, false
522      Arg: "v59", "structure*", pointer, structure, local, 8, 110, 0, default, true
523      Arg: "v60", "structure*", pointer, structure, constant, 0, 17, 40, default, true
524      Arg: "v61", "structure*", pointer, structure, constant, 0, 19, 40, 20, true
525      Arg: "v62", "structure*", pointer, structure, constant, 0, 22, 40, 20, false
526      Sampler: 55 44 332 121
527      dims=5, cws=554 44 11, SGPRS=24, VGPRS=47, pgmRSRC2=0xaabbccdd, ieeeMode=0x1
528      floatMode=0xe0, hwLocalSize=51, hwRegion=394, scratchBuffer=9
529      uavPrivate=8, uavId=12, constBufferId=11, printfId=10
530      privateId=8, earlyExit=1,condOut=2,
531      UserData: 15, 0, 0, 4
532      UserData: 28, 0, 4, 1
533      UserData: 28, 0, 5, 1
534      UserData: 1, 0, 6, 2
535    Section .notknown, type=1, flags=0:
536    6e6f746b6e6f776e73656374696f6e
537    Section .notknown2, type=7, flags=3:
538  GlobalData:
539  nullptr
540  Section .sometest, type=1, flags=0:
541  55556161
542  Section .flagged, type=8, flags=5:
543)ffDXD", "", true
544    },
545    /* 3 - amd format - errors */
546    {
547        R"ffDXD(            .amd
548           
549            .kernel non_config
550            .header
551            .byte 0,2,3,4,5,65,6,6,8
552           
553            .config
554           
555            .boolconsts 4
556            .intconsts 55
557            .floatconsts 51
558            .earlyexit
559            .segment 3,4
560            .cbid 4,32
561            .entry 4,2
562            .sampler 21,1
563            .cbmask 431,33
564           
565            .calnote
566            .inputsamplers
567            .sampler 3,
568            .sampler ,4
569            .sampler ,
570            .sampler 45
571            .uav
572            .entry 1,2,3
573            .entry 1,2,3,
574            .entry 1,2,
575            .entry 1,2
576            .entry 1,
577            .entry 1
578            .entry
579            .calnote 45,5
580           
581            .sgprsnum 2
582           
583            .kernel configuredKernel
584            .config
585            .metadata
586            .header
587            .proginfo
588            .calnote 34
589            .sgprsnum -4
590            .sgprsnum 103
591            .vgprsnum -4
592            .vgprsnum 102
593            .vgprsnum 257
594            .vgprsnum 256
595            .uavid 1024
596            .cbid 1024
597            .printfid 1024
598            .privateid 1024
599            .uavprivate 333
600            .hwlocal 120303
601            .hwlocal
602            .sgprsnum
603            .vgprsnum
604            .earlyexit
605            .condout
606            .printfid
607            .uavid
608            .cbid
609            .privateid
610            .dims xUz
611            .cws
612            .cws 1
613            .cws 1,
614            .cws 1,2
615            .cws 1,2,
616           
617            .userdata 0,0,2,112
618            .userdata imm_sampler,0,14,2
619            .userdata imm_sampler,0,14,3
620            .userdata imm_sampler,0,16,1
621            .userdata imm_sampler
622            .userdata imm_sampler,0
623            .userdata imm_sampler,0,1
624            .userdata imm_sampler,0,3,
625           
626            .arg
627            .arg v0, "test1", t
628            .arg v0, ucharx
629            .arg v0, uchar*, glocal
630            .arg v0, uchar*,, restrict
631            .arg v0, uchar*,global, ::
632            .arg v0, uchar*,global,,XXX
633            .arg v0, uchar*,global,,5,unx
634            .arg v0, structure
635            .arg v0, structure,
636            .arg v0, image, const
637            .arg v0, image, local
638            .arg v0, counter32, 111
639            .arg v0, uchar*,global,,,
640            .arg vx, int
641            .arg vx, uint
642            .arg v0, structure*,global
643            .arg v0, structure*,global,const
644            .arg v0, ulong*, global,,1024
645            .arg v0, image2d,read_only,128
646            .arg v0, image2d,write_only,8
647            .arg v0, short*, constant,,,160
648            .arg v0, short*, local,,,,
649            .arg v0, short*, local, const,4
650            .arg v0, sampler*, global
651            .arg v0, image3d*, global
652            .arg v0, sampler*, global
653            .arg v0, counter32*, global
654            .arg v52,float*,local,rexstrict,unused
655            .text
656            .sgprsnum 103)ffDXD",
657        "",
658        /* errors */
659        R"ffDXD(test.s:7:13: Error: Config can't be defined if metadata,header and/or CALnotes section exists
660test.s:9:25: Error: Garbages at end of line
661test.s:10:24: Error: Garbages at end of line
662test.s:11:26: Error: Garbages at end of line
663test.s:13:13: Error: Illegal place of segment
664test.s:14:13: Error: Illegal place of cbid
665test.s:15:13: Error: Illegal place of entry
666test.s:16:13: Error: Illegal place of sampler
667test.s:17:13: Error: Illegal place of cbmask
668test.s:19:22: Error: Expected expression
669test.s:21:24: Error: Expected expression
670test.s:22:22: Error: Expected expression
671test.s:23:22: Error: Expected expression
672test.s:23:23: Error: Expected expression
673test.s:24:24: Error: Expected ',' before argument
674test.s:26:25: Error: Expected ',' before argument
675test.s:27:26: Error: Expected expression
676test.s:28:24: Error: Expected expression
677test.s:28:24: Error: Expected ',' before argument
678test.s:29:23: Error: Expected ',' before argument
679test.s:30:22: Error: Expected expression
680test.s:30:22: Error: Expected ',' before argument
681test.s:31:21: Error: Expected ',' before argument
682test.s:32:19: Error: Expected expression
683test.s:32:19: Error: Expected ',' before argument
684test.s:33:24: Error: Garbages at end of line
685test.s:35:13: Error: Illegal place of configuration pseudo-op
686test.s:39:13: Error: Metadata can't be defined if configuration was defined
687test.s:40:13: Error: Header can't be defined if configuration was defined
688test.s:41:13: Error: CALNote can't be defined if configuration was defined
689test.s:42:13: Error: CALNote can't be defined if configuration was defined
690test.s:43:23: Error: Used SGPRs number out of range (0-102)
691test.s:44:23: Error: Used SGPRs number out of range (0-102)
692test.s:45:23: Error: Used VGPRs number out of range (0-256)
693test.s:47:23: Error: Used VGPRs number out of range (0-256)
694test.s:49:20: Error: UAVId out of range (0-1023)
695test.s:50:19: Error: ConstBufferId out of range (0-1023)
696test.s:51:23: Error: PrintfId out of range (0-1023)
697test.s:52:24: Error: PrivateId out of range (0-1023)
698test.s:54:22: Error: HWLocalSize out of range (0-32768)
699test.s:55:21: Error: Expected expression
700test.s:56:22: Error: Expected expression
701test.s:57:22: Error: Expected expression
702test.s:58:23: Error: Expected expression
703test.s:59:21: Error: Expected expression
704test.s:64:19: Error: Unknown dimension type
705test.s:65:17: Error: Expected expression
706test.s:71:23: Error: Some garbages at Data Class place
707test.s:71:27: Error: RegStart+RegSize out of range (0-16)
708test.s:73:37: Error: RegStart+RegSize out of range (0-16)
709test.s:74:37: Error: RegStart out of range (0-15)
710test.s:74:37: Error: RegStart+RegSize out of range (0-16)
711test.s:75:34: Error: Expected ',' before argument
712test.s:76:36: Error: Expected ',' before argument
713test.s:77:38: Error: Expected ',' before argument
714test.s:78:39: Error: Expected expression
715test.s:80:18: Error: Expected argument name
716test.s:80:18: Error: Expected ',' before argument
717test.s:81:31: Error: Unknown argument type
718test.s:82:22: Error: Unknown argument type
719test.s:83:30: Error: Unknown pointer space
720test.s:84:29: Error: Some garbages at pointer space place
721test.s:85:37: Error: Some garbages at access qualifier place
722test.s:86:37: Error: Expression have unresolved symbol 'XXX'
723test.s:87:39: Error: This is not 'unused' specifier
724test.s:88:31: Error: Expected ',' before argument
725test.s:89:32: Error: Expected expression
726test.s:90:29: Error: Unknown access qualifier
727test.s:91:29: Error: Unknown access qualifier
728test.s:92:33: Error: Resource Id out of range (0-7)
729test.s:93:38: Error: Expected unused specifier
730test.s:93:38: Error: This is not 'unused' specifier
731test.s:95:18: Error: Kernel argument 'vx' is already defined
732test.s:96:33: Error: Expression have unresolved symbol 'global'
733test.s:96:39: Error: Expected ',' before argument
734test.s:97:33: Error: Expression have unresolved symbol 'global'
735test.s:97:40: Error: Unknown pointer space
736test.s:98:38: Error: UAVId out of range (0-1023)
737test.s:99:40: Error: Resource Id out of range (0-127)
738test.s:100:41: Error: Resource Id out of range (0-7)
739test.s:101:41: Error: UAVId out of range (0-159)
740test.s:102:37: Error: Some garbages at unused specifier place
741test.s:102:37: Error: This is not 'unused' specifier
742test.s:103:43: Error: Some garbages at unused specifier place
743test.s:103:43: Error: This is not 'unused' specifier
744test.s:104:22: Error: Illegal pointer type
745test.s:105:22: Error: Illegal pointer type
746test.s:106:22: Error: Illegal pointer type
747test.s:107:22: Error: Illegal pointer type
748test.s:108:35: Error: Unknown access qualifier
749test.s:110:13: Error: Illegal place of configuration pseudo-op
750)ffDXD", false
751    },
752    {   // cws default
753        R"ffDXD(            .amd
754    .kernel configKernel
755        .config
756            .uavid 11
757            .arg x  ,  float 
758            .arg xff ,  "SP" ,  float 
759            .cws 41,6
760        .text
761            s_endpgm
762    .kernel configKernel2
763        .config
764            .uavid 13
765            .arg x  ,  float 
766            .arg xff ,  "SP" ,  float 
767            .cws 42
768        .text
769            s_endpgm
770)ffDXD",
771        R"ffDXD(AmdBinDump:
772  Bitness=32-bit, devType=CapeVerde, drvVersion=0, drvInfo="", compileOptions=""
773  Kernel: configKernel
774    Data:
775    nullptr
776    Code:
777    000081bf
778    Config:
779      Arg: "x", "float", float, void, none, 0, 0, 0, default, true
780      Arg: "xff", "SP", float, void, none, 0, 0, 0, default, true
781      dims=default, cws=41 6 1, SGPRS=0, VGPRS=0, pgmRSRC2=0x0, ieeeMode=0x0
782      floatMode=0xc0, hwLocalSize=0, hwRegion=default, scratchBuffer=0
783      uavPrivate=default, uavId=11, constBufferId=default, printfId=default
784      privateId=default, earlyExit=0,condOut=0,
785  Kernel: configKernel2
786    Data:
787    nullptr
788    Code:
789    000081bf
790    Config:
791      Arg: "x", "float", float, void, none, 0, 0, 0, default, true
792      Arg: "xff", "SP", float, void, none, 0, 0, 0, default, true
793      dims=default, cws=42 1 1, SGPRS=0, VGPRS=0, pgmRSRC2=0x0, ieeeMode=0x0
794      floatMode=0xc0, hwLocalSize=0, hwRegion=default, scratchBuffer=0
795      uavPrivate=default, uavId=13, constBufferId=default, printfId=default
796      privateId=default, earlyExit=0,condOut=0,
797  GlobalData:
798  nullptr
799)ffDXD",
800        "", true
801    }
802};
803
804static void testAssembler(cxuint testId, const AsmTestCase& testCase)
805{
806    std::istringstream input(testCase.input);
807    std::ostringstream errorStream;
808    std::ostringstream printStream;
809   
810    // create assembler with testcase's input and with ASM_TESTRUN flag
811    Assembler assembler("test.s", input, (ASM_ALL|ASM_TESTRUN)&~ASM_ALTMACRO,
812            BinaryFormat::AMD, GPUDeviceType::CAPE_VERDE, errorStream, printStream);
813    bool good = assembler.assemble();
814   
815    std::ostringstream dumpOss;
816    if (good && assembler.getFormatHandler()!=nullptr)
817        // get format handler and their output
818        if (assembler.getBinaryFormat() == BinaryFormat::AMD)
819            printAmdOutput(dumpOss, static_cast<const AsmAmdHandler*>(
820                        assembler.getFormatHandler())->getOutput());
821    /* compare result dump with expected dump */
822    char testName[30];
823    snprintf(testName, 30, "Test #%u", testId);
824   
825    assertValue(testName, "good", int(testCase.good), int(good));
826    assertString(testName, "dump", testCase.dump, dumpOss.str());
827    assertString(testName, "errorMessages", testCase.errors, errorStream.str());
828}
829
830int main(int argc, const char** argv)
831{
832    int retVal = 0;
833    for (size_t i = 0; i < sizeof(asmTestCases1Tbl)/sizeof(AsmTestCase); i++)
834        try
835        { testAssembler(i, asmTestCases1Tbl[i]); }
836        catch(const std::exception& ex)
837        {
838            std::cerr << ex.what() << std::endl;
839            retVal = 1;
840        }
841    return retVal;
842}
Note: See TracBrowser for help on using the repository browser.