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

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

CLRadeonExtender: Asm: Make first argument in CWS ('.cws', 'reqd_work_group_size' ...) as optional.
CLRXDocs: Update syntax for '.cws' and other pseudo-ops with group-size. Fixed formatting.

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