source: CLRX/CLRadeonExtender/trunk/tests/amdasm/DisasmDataTest.cpp @ 2498

Last change on this file since 2498 was 2498, checked in by matszpk, 4 years ago

CLRadeonExtender: Refactor AMDBIN* flags for AmdCL2Binaries module.

File size: 47.8 KB
Line 
1/*
2 *  CLRadeonExtender - Unofficial OpenCL Radeon Extensions Library
3 *  Copyright (C) 2014-2016 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 <sstream>
23#include <string>
24#include <cstring>
25#include <CLRX/amdbin/AmdBinaries.h>
26#include <CLRX/amdbin/AmdCL2Binaries.h>
27#include <CLRX/amdbin/GalliumBinaries.h>
28#include <CLRX/amdasm/Disassembler.h>
29
30using namespace CLRX;
31
32static const cxbyte disasmInput1Global[14] =
33{ 13, 56, 66, 213,
34  55, 93, 123, 85,
35  164, 234, 21, 37,
36  44, 188 };
37
38static const char* disasmInput1Kernel1Metadata =
39";ARGSTART:__OpenCL_DCT_kernel\n"
40";version:3:1:111\n"
41";device:pitcairn\n"
42";uniqueid:1024\n"
43";memory:uavprivate:0\n"
44";memory:hwlocal:0\n"
45";memory:hwregion:0\n"
46";pointer:output:float:1:1:0:uav:12:4:RW:0:0\n"
47";pointer:input:float:1:1:16:uav:13:4:RO:0:0\n"
48";pointer:dct8x8:float:1:1:32:uav:14:4:RO:0:0\n"
49";pointer:inter:float:1:1:48:hl:1:4:RW:0:0\n"
50";value:width:u32:1:1:64\n"
51";value:blockWidth:u32:1:1:80\n"
52";value:inverse:u32:1:1:96\n"
53";function:1:1030\n"
54";uavid:11\n"
55";printfid:9\n"
56";cbid:10\n"
57";privateid:8\n"
58";reflection:0:float*\n"
59";reflection:1:float*\n"
60";reflection:2:float*\n"
61";reflection:3:float*\n"
62";reflection:4:uint\n"
63";reflection:5:uint\n"
64";reflection:6:uint\n"
65";ARGEND:__OpenCL_DCT_kernel\n"
66"dessss9843re88888888888888888uuuuuuuufdd"
67"dessss9843re88888888888888888uuuuuuuufdd"
68"dessss9843re88888888888888888uuuuuuuufdd444444444444444444444444"
69"\r\r\t\t\t\t\txx\f\f\f\3777x833334441\n";
70
71static const cxbyte disasmInput1Kernel1Header[59] =
72{ 1, 2, 0, 0, 0, 44, 0, 0,
73  12, 3, 6, 3, 3, 2, 0, 0,
74  19, 19, 19, 19, 19, 19, 19, 19,
75  19, 19, 19, 19, 19, 19, 19, 19,
76  19, 19, 19, 19, 19, 19, 19, 18,
77  19, 19, 19, 19, 19, 19, 19, 19,
78  19, 19, 19, 19, 19, 19, 19, 19,
79  19, 19, 19
80};
81
82static const cxbyte disasmInput1Kernel1Data[40] =
83{
84    1, 4, 5, 6, 6, 6, 4, 3,
85    3, 5, 65, 13, 5, 5, 11, 57,
86    5, 65, 5, 0, 0, 0, 0, 5,
87    1, 15, 5, 1, 56, 0, 0, 5,
88    5, 65, 5, 0, 0, 78, 255, 5
89};
90
91static uint32_t disasmInput1Kernel1ProgInfo[13] =
92{
93    LEV(0xffcd44dcU), LEV(0x4543U),
94    LEV(0x456U), LEV(0x5663677U),
95    LEV(0x3cd90cU), LEV(0x3958a85U),
96    LEV(0x458c98d9U), LEV(0x344dbd9U),
97    LEV(0xd0d9d9dU), LEV(0x234455U),
98    LEV(0x1U), LEV(0x55U), LEV(0x4565U)
99};
100
101static uint32_t disasmInput1Kernel1Inputs[20] =
102{
103    LEV(1113U), LEV(1113U), LEV(1113U), LEV(1113U),
104    LEV(1113U), LEV(1113U), LEV(1113U), LEV(1113U),
105    LEV(1113U), LEV(1113U), LEV(1113U), LEV(1114U),
106    LEV(1113U), LEV(1113U), LEV(1113U), LEV(1113U),
107    LEV(1113U), LEV(1113U), LEV(1113U), LEV(1113U)
108};
109
110static uint32_t disasmInput1Kernel1Outputs[17] =
111{
112    LEV(5U), LEV(6U), LEV(3U), LEV(13U), LEV(5U), LEV(117U), LEV(12U), LEV(3U),
113    LEV(785U), LEV(46U), LEV(55U), LEV(5U), LEV(2U), LEV(3U), LEV(0U), LEV(0U), LEV(44U)
114};
115
116static uint32_t disasmInput1Kernel1EarlyExit[3] = { LEV(1355U), LEV(44U), LEV(444U) };
117
118static uint32_t disasmInput1Kernel2EarlyExit[3] = { LEV(121U) };
119
120static CALDataSegmentEntry disasmInput1Kernel1Float32Consts[6] =
121{
122    { LEV(0U), LEV(5U) }, { LEV(66U), LEV(57U) }, { LEV(67U), LEV(334U) },
123    { LEV(1U), LEV(6U) }, { LEV(5U), LEV(86U) }, { LEV(2100U), LEV(466U) }
124};
125
126static CALSamplerMapEntry disasmInput1Kernel1InputSamplers[6] =
127{
128    { LEV(0U), LEV(5U) }, { LEV(66U), LEV(57U) }, { LEV(67U), LEV(334U) },
129    { LEV(1U), LEV(6U) }, { LEV(5U), LEV(86U) }, { LEV(2100U), LEV(466U) }
130};
131
132static uint32_t disasmInput1Kernel1UavOpMask[1] = { LEV(4556U) };
133
134static AmdDisasmInput disasmInput1 =
135{
136    GPUDeviceType::SPOOKY,
137    true,
138    "This\nis my\300\x31 stupid\r\"driver", "-O ccc",
139    sizeof(disasmInput1Global), disasmInput1Global,
140    {
141        { "kernelxVCR",
142          ::strlen(disasmInput1Kernel1Metadata),
143          disasmInput1Kernel1Metadata,
144          sizeof(disasmInput1Kernel1Header), disasmInput1Kernel1Header,
145          {
146              { { 8, 52, CALNOTE_ATI_PROGINFO,
147                  { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
148                 reinterpret_cast<cxbyte*>(disasmInput1Kernel1ProgInfo) },
149              { { 8, 79, CALNOTE_ATI_INPUTS,
150                  { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
151                 reinterpret_cast<cxbyte*>(disasmInput1Kernel1Inputs) },
152              { { 8, 67, CALNOTE_ATI_OUTPUTS,
153                  { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
154                 reinterpret_cast<cxbyte*>(disasmInput1Kernel1Outputs) },
155              { { 8, 12, CALNOTE_ATI_EARLYEXIT,
156                  { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
157                 reinterpret_cast<cxbyte*>(disasmInput1Kernel1EarlyExit) },
158              { { 8, 4, CALNOTE_ATI_EARLYEXIT,
159                  { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
160                 reinterpret_cast<cxbyte*>(disasmInput1Kernel2EarlyExit) },
161              { { 8, 48, CALNOTE_ATI_FLOAT32CONSTS,
162                  { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
163                 reinterpret_cast<cxbyte*>(disasmInput1Kernel1Float32Consts) },
164              { { 8, 48, CALNOTE_ATI_INPUT_SAMPLERS,
165                  { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
166                 reinterpret_cast<cxbyte*>(disasmInput1Kernel1InputSamplers) },
167              { { 8, 48, CALNOTE_ATI_CONSTANT_BUFFERS,
168                  { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
169                 reinterpret_cast<cxbyte*>(disasmInput1Kernel1InputSamplers) },
170              { { 8, 48, 0x3d, { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
171                 reinterpret_cast<cxbyte*>(disasmInput1Kernel1InputSamplers) },
172              { { 8, 4, CALNOTE_ATI_UAV_OP_MASK,
173                  { 'A', 'T', 'I', ' ', 'C', 'A', 'L', 0 } },
174                 reinterpret_cast<cxbyte*>(disasmInput1Kernel1UavOpMask) },
175          },
176          sizeof(disasmInput1Kernel1Data), disasmInput1Kernel1Data,
177          0, nullptr
178        }
179    }
180};
181
182static const cxbyte galliumInput1Global[14] =
183{ 1,2,3,4,5,6,7,8,9,10,11,33,44,55 };
184
185static const GalliumDisasmInput galliumDisasmData =
186{
187    GPUDeviceType::PITCAIRN, false,
188    sizeof(galliumInput1Global), galliumInput1Global,
189    {
190        { "kernel1",
191          { { 0xff1123, 0xcda1fa }, { 0x3bf1123, 0xfdca45 }, { 0x2dca6, 0xfbca168 } },
192          0, {
193              { GalliumArgType::SCALAR, false, GalliumArgSemantic::GENERAL, 4, 8, 12 },
194              { GalliumArgType::CONSTANT, false, GalliumArgSemantic::GENERAL, 1, 8, 12 },
195              { GalliumArgType::GLOBAL, false, GalliumArgSemantic::GENERAL, 4, 2, 12 },
196              { GalliumArgType::IMAGE2D_RDONLY, false,
197                  GalliumArgSemantic::GENERAL, 4, 7, 45 },
198              { GalliumArgType::IMAGE2D_WRONLY, false,
199                  GalliumArgSemantic::GENERAL, 4, 8, 45 },
200              { GalliumArgType::IMAGE3D_RDONLY, false,
201                  GalliumArgSemantic::GENERAL, 9, 7, 45 },
202              { GalliumArgType::IMAGE3D_WRONLY, false,
203                  GalliumArgSemantic::GENERAL, 12, 7, 45 },
204              { GalliumArgType::SAMPLER, false, GalliumArgSemantic::GENERAL, 17, 16, 74 },
205              { GalliumArgType::SCALAR, true, GalliumArgSemantic::GENERAL, 4, 8, 12 },
206              { GalliumArgType::SCALAR, false,
207                  GalliumArgSemantic::GRID_DIMENSION, 124, 8, 12 },
208              { GalliumArgType::SCALAR, false,
209                  GalliumArgSemantic::GRID_OFFSET, 4, 0, 32 }
210          } },
211        { "kernel2",
212          { { 0x234423, 0xaaabba }, { 0x3bdd123, 0x132235 }, { 0x11122, 0xf3424dd } },
213          0, {
214              { GalliumArgType::CONSTANT, false, GalliumArgSemantic::GENERAL, 1, 8, 12 },
215              { GalliumArgType::GLOBAL, false, GalliumArgSemantic::GENERAL, 4, 2, 12 },
216              { GalliumArgType::SCALAR, false, GalliumArgSemantic::GENERAL, 4, 8, 12 },
217              { GalliumArgType::IMAGE2D_RDONLY, false,
218                  GalliumArgSemantic::GENERAL, 4, 9, 45 },
219              { GalliumArgType::IMAGE2D_WRONLY, false,
220                  GalliumArgSemantic::GENERAL, 4, 8, 51 },
221              { GalliumArgType::IMAGE3D_RDONLY, false,
222                  GalliumArgSemantic::GENERAL, 9, 7, 45 },
223              { GalliumArgType::IMAGE3D_WRONLY, true,
224                  GalliumArgSemantic::GENERAL, 12, 7, 45 },
225              { GalliumArgType::SAMPLER, false, GalliumArgSemantic::GENERAL, 17, 16, 74 },
226              { GalliumArgType::SCALAR, true, GalliumArgSemantic::GENERAL, 4, 8, 12 },
227              { GalliumArgType::SCALAR, false,
228                  GalliumArgSemantic::GRID_DIMENSION, 124, 8, 12 },
229              { GalliumArgType::SCALAR, false,
230                  GalliumArgSemantic::GRID_OFFSET, 4, 32, 32 }
231          } }
232    },
233    0, nullptr
234};
235
236struct DisasmAmdTestCase
237{
238    const AmdDisasmInput* amdInput;
239    const GalliumDisasmInput* galliumInput;
240    const char* filename;
241    const char* expectedString;
242    bool config;
243};
244
245static const DisasmAmdTestCase disasmDataTestCases[] =
246{
247    { &disasmInput1, nullptr, nullptr,
248        R"xxFxx(.amd
249.gpu Spooky
250.64bit
251.compile_options "-O ccc"
252.driver_info "This\nis my\3001 stupid\r\"driver"
253.globaldata
254    .byte 0x0d, 0x38, 0x42, 0xd5, 0x37, 0x5d, 0x7b, 0x55
255    .byte 0xa4, 0xea, 0x15, 0x25, 0x2c, 0xbc
256.kernel kernelxVCR
257    .header
258        .byte 0x01, 0x02, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x00
259        .byte 0x0c, 0x03, 0x06, 0x03, 0x03, 0x02, 0x00, 0x00
260        .fill 16, 1, 0x13
261        .byte 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x13, 0x12
262        .fill 19, 1, 0x13
263    .metadata
264        .ascii ";ARGSTART:__OpenCL_DCT_kernel\n"
265        .ascii ";version:3:1:111\n"
266        .ascii ";device:pitcairn\n"
267        .ascii ";uniqueid:1024\n"
268        .ascii ";memory:uavprivate:0\n"
269        .ascii ";memory:hwlocal:0\n"
270        .ascii ";memory:hwregion:0\n"
271        .ascii ";pointer:output:float:1:1:0:uav:12:4:RW:0:0\n"
272        .ascii ";pointer:input:float:1:1:16:uav:13:4:RO:0:0\n"
273        .ascii ";pointer:dct8x8:float:1:1:32:uav:14:4:RO:0:0\n"
274        .ascii ";pointer:inter:float:1:1:48:hl:1:4:RW:0:0\n"
275        .ascii ";value:width:u32:1:1:64\n"
276        .ascii ";value:blockWidth:u32:1:1:80\n"
277        .ascii ";value:inverse:u32:1:1:96\n"
278        .ascii ";function:1:1030\n"
279        .ascii ";uavid:11\n"
280        .ascii ";printfid:9\n"
281        .ascii ";cbid:10\n"
282        .ascii ";privateid:8\n"
283        .ascii ";reflection:0:float*\n"
284        .ascii ";reflection:1:float*\n"
285        .ascii ";reflection:2:float*\n"
286        .ascii ";reflection:3:float*\n"
287        .ascii ";reflection:4:uint\n"
288        .ascii ";reflection:5:uint\n"
289        .ascii ";reflection:6:uint\n"
290        .ascii ";ARGEND:__OpenCL_DCT_kernel\n"
291        .ascii "dessss9843re88888888888888888uuuuuuuufdddessss9843re88888888888888888uuu"
292        .ascii "uuuuufdddessss9843re88888888888888888uuuuuuuufdd444444444444444444444444"
293        .ascii "\r\r\t\t\t\t\txx\f\f\f\3777x833334441\n"
294    .data
295        .byte 0x01, 0x04, 0x05, 0x06, 0x06, 0x06, 0x04, 0x03
296        .byte 0x03, 0x05, 0x41, 0x0d, 0x05, 0x05, 0x0b, 0x39
297        .byte 0x05, 0x41, 0x05, 0x00, 0x00, 0x00, 0x00, 0x05
298        .byte 0x01, 0x0f, 0x05, 0x01, 0x38, 0x00, 0x00, 0x05
299        .byte 0x05, 0x41, 0x05, 0x00, 0x00, 0x4e, 0xff, 0x05
300    .proginfo
301        .entry 0xffcd44dc, 0x00004543
302        .entry 0x00000456, 0x05663677
303        .entry 0x003cd90c, 0x03958a85
304        .entry 0x458c98d9, 0x0344dbd9
305        .entry 0x0d0d9d9d, 0x00234455
306        .entry 0x00000001, 0x00000055
307        .byte 0x65, 0x45, 0x00, 0x00
308    .inputs
309        .fill 8, 4, 0x00000459
310        .int 0x00000459, 0x00000459, 0x00000459, 0x0000045a
311        .fill 7, 4, 0x00000459
312        .byte 0x59, 0x04, 0x00
313    .outputs
314        .int 0x00000005, 0x00000006, 0x00000003, 0x0000000d
315        .int 0x00000005, 0x00000075, 0x0000000c, 0x00000003
316        .int 0x00000311, 0x0000002e, 0x00000037, 0x00000005
317        .int 0x00000002, 0x00000003, 0x00000000, 0x00000000
318        .byte 0x2c, 0x00, 0x00
319    .earlyexit
320        .byte 0x4b, 0x05, 0x00, 0x00, 0x2c, 0x00, 0x00, 0x00
321        .byte 0xbc, 0x01, 0x00, 0x00
322    .earlyexit 121
323    .floatconsts
324        .segment 0, 5
325        .segment 66, 57
326        .segment 67, 334
327        .segment 1, 6
328        .segment 5, 86
329        .segment 2100, 466
330    .inputsamplers
331        .sampler 0, 0x5
332        .sampler 66, 0x39
333        .sampler 67, 0x14e
334        .sampler 1, 0x6
335        .sampler 5, 0x56
336        .sampler 2100, 0x1d2
337    .constantbuffers
338        .cbmask 0, 5
339        .cbmask 66, 57
340        .cbmask 67, 334
341        .cbmask 1, 6
342        .cbmask 5, 86
343        .cbmask 2100, 466
344    .calnote 0x3d
345        .byte 0x00, 0x00, 0x00, 0x00, 0x05, 0x00, 0x00, 0x00
346        .byte 0x42, 0x00, 0x00, 0x00, 0x39, 0x00, 0x00, 0x00
347        .byte 0x43, 0x00, 0x00, 0x00, 0x4e, 0x01, 0x00, 0x00
348        .byte 0x01, 0x00, 0x00, 0x00, 0x06, 0x00, 0x00, 0x00
349        .byte 0x05, 0x00, 0x00, 0x00, 0x56, 0x00, 0x00, 0x00
350        .byte 0x34, 0x08, 0x00, 0x00, 0xd2, 0x01, 0x00, 0x00
351    .uavopmask 4556
352)xxFxx", false
353    },
354    { nullptr, nullptr, CLRX_SOURCE_DIR "/tests/amdasm/amdbins/samplekernels.clo",
355        R"xxFxx(.amd
356.gpu Pitcairn
357.32bit
358.compile_options ""
359.driver_info "@(#) OpenCL 1.2 AMD-APP (1702.3).  Driver version: 1702.3 (VM)"
360.kernel add
361    .header
362        .fill 16, 1, 0x00
363        .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
364        .fill 8, 1, 0x00
365    .metadata
366        .ascii ";ARGSTART:__OpenCL_add_kernel\n"
367        .ascii ";version:3:1:111\n"
368        .ascii ";device:pitcairn\n"
369        .ascii ";uniqueid:1024\n"
370        .ascii ";memory:uavprivate:0\n"
371        .ascii ";memory:hwlocal:0\n"
372        .ascii ";memory:hwregion:0\n"
373        .ascii ";value:n:u32:1:1:0\n"
374        .ascii ";pointer:adat:u32:1:1:16:uav:12:4:RO:0:0\n"
375        .ascii ";constarg:1:adat\n"
376        .ascii ";pointer:bdat:u32:1:1:32:uav:13:4:RO:0:0\n"
377        .ascii ";constarg:2:bdat\n"
378        .ascii ";pointer:cdat:u32:1:1:48:uav:14:4:RW:0:0\n"
379        .ascii ";function:1:1028\n"
380        .ascii ";uavid:11\n"
381        .ascii ";printfid:9\n"
382        .ascii ";cbid:10\n"
383        .ascii ";privateid:8\n"
384        .ascii ";reflection:0:uint\n"
385        .ascii ";reflection:1:uint*\n"
386        .ascii ";reflection:2:uint*\n"
387        .ascii ";reflection:3:uint*\n"
388        .ascii ";ARGEND:__OpenCL_add_kernel\n"
389    .data
390        .fill 4736, 1, 0x00
391    .inputs
392    .outputs
393    .uav
394        .entry 12, 4, 0, 5
395        .entry 13, 4, 0, 5
396        .entry 14, 4, 0, 5
397        .entry 11, 4, 0, 5
398    .condout 0
399    .floatconsts
400    .intconsts
401    .boolconsts
402    .earlyexit 0
403    .globalbuffers
404    .constantbuffers
405        .cbmask 0, 0
406        .cbmask 1, 0
407    .inputsamplers
408    .scratchbuffers
409        .int 0x00000000
410    .persistentbuffers
411    .proginfo
412        .entry 0x80001000, 0x00000003
413        .entry 0x80001001, 0x00000017
414        .entry 0x80001002, 0x00000000
415        .entry 0x80001003, 0x00000002
416        .entry 0x80001004, 0x00000002
417        .entry 0x80001005, 0x00000002
418        .entry 0x80001006, 0x00000000
419        .entry 0x80001007, 0x00000004
420        .entry 0x80001008, 0x00000004
421        .entry 0x80001009, 0x00000002
422        .entry 0x8000100a, 0x00000001
423        .entry 0x8000100b, 0x00000008
424        .entry 0x8000100c, 0x00000004
425        .entry 0x80001041, 0x00000003
426        .entry 0x80001042, 0x00000010
427        .entry 0x80001863, 0x00000066
428        .entry 0x80001864, 0x00000100
429        .entry 0x80001043, 0x000000c0
430        .entry 0x80001044, 0x00000000
431        .entry 0x80001045, 0x00000000
432        .entry 0x00002e13, 0x00000098
433        .entry 0x8000001c, 0x00000100
434        .entry 0x8000001d, 0x00000000
435        .entry 0x8000001e, 0x00000000
436        .entry 0x80001841, 0x00000000
437        .entry 0x8000001f, 0x00007000
438        .entry 0x80001843, 0x00007000
439        .entry 0x80001844, 0x00000000
440        .entry 0x80001845, 0x00000000
441        .entry 0x80001846, 0x00000000
442        .entry 0x80001847, 0x00000000
443        .entry 0x80001848, 0x00000000
444        .entry 0x80001849, 0x00000000
445        .entry 0x8000184a, 0x00000000
446        .entry 0x8000184b, 0x00000000
447        .entry 0x8000184c, 0x00000000
448        .entry 0x8000184d, 0x00000000
449        .entry 0x8000184e, 0x00000000
450        .entry 0x8000184f, 0x00000000
451        .entry 0x80001850, 0x00000000
452        .entry 0x80001851, 0x00000000
453        .entry 0x80001852, 0x00000000
454        .entry 0x80001853, 0x00000000
455        .entry 0x80001854, 0x00000000
456        .entry 0x80001855, 0x00000000
457        .entry 0x80001856, 0x00000000
458        .entry 0x80001857, 0x00000000
459        .entry 0x80001858, 0x00000000
460        .entry 0x80001859, 0x00000000
461        .entry 0x8000185a, 0x00000000
462        .entry 0x8000185b, 0x00000000
463        .entry 0x8000185c, 0x00000000
464        .entry 0x8000185d, 0x00000000
465        .entry 0x8000185e, 0x00000000
466        .entry 0x8000185f, 0x00000000
467        .entry 0x80001860, 0x00000000
468        .entry 0x80001861, 0x00000000
469        .entry 0x80001862, 0x00000000
470        .entry 0x8000000a, 0x00000001
471        .entry 0x80000078, 0x00000040
472        .entry 0x80000081, 0x00008000
473        .entry 0x80000082, 0x00000000
474    .subconstantbuffers
475    .uavmailboxsize 0
476    .uavopmask
477        .byte 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
478        .fill 120, 1, 0x00
479    .text
480/*c2000504         */ s_buffer_load_dword s0, s[4:7], 0x4
481/*c2008518         */ s_buffer_load_dword s1, s[4:7], 0x18
482/*c2020900         */ s_buffer_load_dword s4, s[8:11], 0x0
483/*c2028904         */ s_buffer_load_dword s5, s[8:11], 0x4
484/*c2030908         */ s_buffer_load_dword s6, s[8:11], 0x8
485/*c203890c         */ s_buffer_load_dword s7, s[8:11], 0xc
486/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
487/*8380ff00 0000ffff*/ s_min_u32       s0, s0, 0xffff
488/*9300000c         */ s_mul_i32       s0, s12, s0
489/*80000100         */ s_add_u32       s0, s0, s1
490/*4a000000         */ v_add_i32       v0, vcc, s0, v0
491/*7d880004         */ v_cmp_gt_u32    vcc, s4, v0
492/*be80246a         */ s_and_saveexec_b64 s[0:1], vcc
493/*bf880011         */ s_cbranch_execz .L128_0
494/*c0840360         */ s_load_dwordx4  s[8:11], s[2:3], 0x60
495/*c0860368         */ s_load_dwordx4  s[12:15], s[2:3], 0x68
496/*34000082         */ v_lshlrev_b32   v0, 2, v0
497/*4a020005         */ v_add_i32       v1, vcc, s5, v0
498/*4a040006         */ v_add_i32       v2, vcc, s6, v0
499/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
500/*eba01000 80020101*/ tbuffer_load_format_x v1, v1, s[8:11], 0 offen format:[32,float]
501/*eba01000 80030202*/ tbuffer_load_format_x v2, v2, s[12:15], 0 offen format:[32,float]
502/*c0840370         */ s_load_dwordx4  s[8:11], s[2:3], 0x70
503/*bf8c0f70         */ s_waitcnt       vmcnt(0)
504/*4a020501         */ v_add_i32       v1, vcc, v1, v2
505/*4a000007         */ v_add_i32       v0, vcc, s7, v0
506/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
507/*eba41000 80020100*/ tbuffer_store_format_x v1, v0, s[8:11], 0 offen format:[32,float]
508.L128_0:
509/*bf810000         */ s_endpgm
510.kernel multiply
511    .header
512        .fill 16, 1, 0x00
513        .byte 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
514        .fill 8, 1, 0x00
515    .metadata
516        .ascii ";ARGSTART:__OpenCL_multiply_kernel\n"
517        .ascii ";version:3:1:111\n"
518        .ascii ";device:pitcairn\n"
519        .ascii ";uniqueid:1025\n"
520        .ascii ";memory:uavprivate:0\n"
521        .ascii ";memory:hwlocal:0\n"
522        .ascii ";memory:hwregion:0\n"
523        .ascii ";value:n:u32:1:1:0\n"
524        .ascii ";pointer:adat:u32:1:1:16:uav:12:4:RO:0:0\n"
525        .ascii ";constarg:1:adat\n"
526        .ascii ";pointer:bdat:u32:1:1:32:uav:13:4:RO:0:0\n"
527        .ascii ";constarg:2:bdat\n"
528        .ascii ";pointer:cdat:u32:1:1:48:uav:14:4:RW:0:0\n"
529        .ascii ";function:1:1029\n"
530        .ascii ";uavid:11\n"
531        .ascii ";printfid:9\n"
532        .ascii ";cbid:10\n"
533        .ascii ";privateid:8\n"
534        .ascii ";reflection:0:uint\n"
535        .ascii ";reflection:1:uint*\n"
536        .ascii ";reflection:2:uint*\n"
537        .ascii ";reflection:3:uint*\n"
538        .ascii ";ARGEND:__OpenCL_multiply_kernel\n"
539    .data
540        .fill 4736, 1, 0x00
541    .inputs
542    .outputs
543    .uav
544        .entry 12, 4, 0, 5
545        .entry 13, 4, 0, 5
546        .entry 14, 4, 0, 5
547        .entry 11, 4, 0, 5
548    .condout 0
549    .floatconsts
550    .intconsts
551    .boolconsts
552    .earlyexit 0
553    .globalbuffers
554    .constantbuffers
555        .cbmask 0, 0
556        .cbmask 1, 0
557    .inputsamplers
558    .scratchbuffers
559        .int 0x00000000
560    .persistentbuffers
561    .proginfo
562        .entry 0x80001000, 0x00000003
563        .entry 0x80001001, 0x00000017
564        .entry 0x80001002, 0x00000000
565        .entry 0x80001003, 0x00000002
566        .entry 0x80001004, 0x00000002
567        .entry 0x80001005, 0x00000002
568        .entry 0x80001006, 0x00000000
569        .entry 0x80001007, 0x00000004
570        .entry 0x80001008, 0x00000004
571        .entry 0x80001009, 0x00000002
572        .entry 0x8000100a, 0x00000001
573        .entry 0x8000100b, 0x00000008
574        .entry 0x8000100c, 0x00000004
575        .entry 0x80001041, 0x00000003
576        .entry 0x80001042, 0x00000014
577        .entry 0x80001863, 0x00000066
578        .entry 0x80001864, 0x00000100
579        .entry 0x80001043, 0x000000c0
580        .entry 0x80001044, 0x00000000
581        .entry 0x80001045, 0x00000000
582        .entry 0x00002e13, 0x00000098
583        .entry 0x8000001c, 0x00000100
584        .entry 0x8000001d, 0x00000000
585        .entry 0x8000001e, 0x00000000
586        .entry 0x80001841, 0x00000000
587        .entry 0x8000001f, 0x00007000
588        .entry 0x80001843, 0x00007000
589        .entry 0x80001844, 0x00000000
590        .entry 0x80001845, 0x00000000
591        .entry 0x80001846, 0x00000000
592        .entry 0x80001847, 0x00000000
593        .entry 0x80001848, 0x00000000
594        .entry 0x80001849, 0x00000000
595        .entry 0x8000184a, 0x00000000
596        .entry 0x8000184b, 0x00000000
597        .entry 0x8000184c, 0x00000000
598        .entry 0x8000184d, 0x00000000
599        .entry 0x8000184e, 0x00000000
600        .entry 0x8000184f, 0x00000000
601        .entry 0x80001850, 0x00000000
602        .entry 0x80001851, 0x00000000
603        .entry 0x80001852, 0x00000000
604        .entry 0x80001853, 0x00000000
605        .entry 0x80001854, 0x00000000
606        .entry 0x80001855, 0x00000000
607        .entry 0x80001856, 0x00000000
608        .entry 0x80001857, 0x00000000
609        .entry 0x80001858, 0x00000000
610        .entry 0x80001859, 0x00000000
611        .entry 0x8000185a, 0x00000000
612        .entry 0x8000185b, 0x00000000
613        .entry 0x8000185c, 0x00000000
614        .entry 0x8000185d, 0x00000000
615        .entry 0x8000185e, 0x00000000
616        .entry 0x8000185f, 0x00000000
617        .entry 0x80001860, 0x00000000
618        .entry 0x80001861, 0x00000000
619        .entry 0x80001862, 0x00000000
620        .entry 0x8000000a, 0x00000001
621        .entry 0x80000078, 0x00000040
622        .entry 0x80000081, 0x00008000
623        .entry 0x80000082, 0x00000000
624    .subconstantbuffers
625    .uavmailboxsize 0
626    .uavopmask
627        .byte 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
628        .fill 120, 1, 0x00
629    .text
630/*c2000504         */ s_buffer_load_dword s0, s[4:7], 0x4
631/*c2008518         */ s_buffer_load_dword s1, s[4:7], 0x18
632/*c2020900         */ s_buffer_load_dword s4, s[8:11], 0x0
633/*c2028904         */ s_buffer_load_dword s5, s[8:11], 0x4
634/*c2030908         */ s_buffer_load_dword s6, s[8:11], 0x8
635/*c203890c         */ s_buffer_load_dword s7, s[8:11], 0xc
636/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
637/*8380ff00 0000ffff*/ s_min_u32       s0, s0, 0xffff
638/*9300000c         */ s_mul_i32       s0, s12, s0
639/*80000100         */ s_add_u32       s0, s0, s1
640/*4a000000         */ v_add_i32       v0, vcc, s0, v0
641/*7d880004         */ v_cmp_gt_u32    vcc, s4, v0
642/*be80246a         */ s_and_saveexec_b64 s[0:1], vcc
643/*bf880011         */ s_cbranch_execz .L128_1
644/*c0840360         */ s_load_dwordx4  s[8:11], s[2:3], 0x60
645/*c0860368         */ s_load_dwordx4  s[12:15], s[2:3], 0x68
646/*c0880370         */ s_load_dwordx4  s[16:19], s[2:3], 0x70
647/*34000082         */ v_lshlrev_b32   v0, 2, v0
648/*4a020005         */ v_add_i32       v1, vcc, s5, v0
649/*4a040006         */ v_add_i32       v2, vcc, s6, v0
650/*4a000007         */ v_add_i32       v0, vcc, s7, v0
651/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
652/*eba01000 80020101*/ tbuffer_load_format_x v1, v1, s[8:11], 0 offen format:[32,float]
653/*eba01000 80030202*/ tbuffer_load_format_x v2, v2, s[12:15], 0 offen format:[32,float]
654/*bf8c0f70         */ s_waitcnt       vmcnt(0)
655/*d2d60001 00020302*/ v_mul_lo_i32    v1, v2, v1
656/*eba41000 80040100*/ tbuffer_store_format_x v1, v0, s[16:19], 0 offen format:[32,float]
657.L128_1:
658/*bf810000         */ s_endpgm
659)xxFxx", false
660    },
661    { nullptr, nullptr, CLRX_SOURCE_DIR "/tests/amdasm/amdbins/samplekernels_64.clo",
662        R"xxFxx(.amd
663.gpu Pitcairn
664.64bit
665.compile_options ""
666.driver_info "@(#) OpenCL 1.2 AMD-APP (1702.3).  Driver version: 1702.3 (VM)"
667.kernel add
668    .header
669        .fill 16, 1, 0x00
670        .byte 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
671        .fill 8, 1, 0x00
672    .metadata
673        .ascii ";ARGSTART:__OpenCL_add_kernel\n"
674        .ascii ";version:3:1:111\n"
675        .ascii ";device:pitcairn\n"
676        .ascii ";uniqueid:1024\n"
677        .ascii ";memory:uavprivate:0\n"
678        .ascii ";memory:hwlocal:0\n"
679        .ascii ";memory:hwregion:0\n"
680        .ascii ";value:n:u32:1:1:0\n"
681        .ascii ";pointer:adat:u32:1:1:16:uav:12:4:RO:0:0\n"
682        .ascii ";constarg:1:adat\n"
683        .ascii ";pointer:bdat:u32:1:1:32:uav:13:4:RO:0:0\n"
684        .ascii ";constarg:2:bdat\n"
685        .ascii ";pointer:cdat:u32:1:1:48:uav:14:4:RW:0:0\n"
686        .ascii ";function:1:1028\n"
687        .ascii ";memory:64bitABI\n"
688        .ascii ";uavid:11\n"
689        .ascii ";printfid:9\n"
690        .ascii ";cbid:10\n"
691        .ascii ";privateid:8\n"
692        .ascii ";reflection:0:uint\n"
693        .ascii ";reflection:1:uint*\n"
694        .ascii ";reflection:2:uint*\n"
695        .ascii ";reflection:3:uint*\n"
696        .ascii ";ARGEND:__OpenCL_add_kernel\n"
697    .data
698        .fill 4736, 1, 0x00
699    .inputs
700    .outputs
701    .uav
702        .entry 12, 4, 0, 5
703        .entry 13, 4, 0, 5
704        .entry 14, 4, 0, 5
705        .entry 11, 4, 0, 5
706    .condout 0
707    .floatconsts
708    .intconsts
709    .boolconsts
710    .earlyexit 0
711    .globalbuffers
712    .constantbuffers
713        .cbmask 0, 0
714        .cbmask 1, 0
715    .inputsamplers
716    .scratchbuffers
717        .int 0x00000000
718    .persistentbuffers
719    .proginfo
720        .entry 0x80001000, 0x00000003
721        .entry 0x80001001, 0x00000017
722        .entry 0x80001002, 0x00000000
723        .entry 0x80001003, 0x00000002
724        .entry 0x80001004, 0x00000002
725        .entry 0x80001005, 0x00000002
726        .entry 0x80001006, 0x00000000
727        .entry 0x80001007, 0x00000004
728        .entry 0x80001008, 0x00000004
729        .entry 0x80001009, 0x00000002
730        .entry 0x8000100a, 0x00000001
731        .entry 0x8000100b, 0x00000008
732        .entry 0x8000100c, 0x00000004
733        .entry 0x80001041, 0x00000008
734        .entry 0x80001042, 0x00000014
735        .entry 0x80001863, 0x00000066
736        .entry 0x80001864, 0x00000100
737        .entry 0x80001043, 0x000000c0
738        .entry 0x80001044, 0x00000000
739        .entry 0x80001045, 0x00000000
740        .entry 0x00002e13, 0x00000098
741        .entry 0x8000001c, 0x00000100
742        .entry 0x8000001d, 0x00000000
743        .entry 0x8000001e, 0x00000000
744        .entry 0x80001841, 0x00000000
745        .entry 0x8000001f, 0x00007000
746        .entry 0x80001843, 0x00007000
747        .entry 0x80001844, 0x00000000
748        .entry 0x80001845, 0x00000000
749        .entry 0x80001846, 0x00000000
750        .entry 0x80001847, 0x00000000
751        .entry 0x80001848, 0x00000000
752        .entry 0x80001849, 0x00000000
753        .entry 0x8000184a, 0x00000000
754        .entry 0x8000184b, 0x00000000
755        .entry 0x8000184c, 0x00000000
756        .entry 0x8000184d, 0x00000000
757        .entry 0x8000184e, 0x00000000
758        .entry 0x8000184f, 0x00000000
759        .entry 0x80001850, 0x00000000
760        .entry 0x80001851, 0x00000000
761        .entry 0x80001852, 0x00000000
762        .entry 0x80001853, 0x00000000
763        .entry 0x80001854, 0x00000000
764        .entry 0x80001855, 0x00000000
765        .entry 0x80001856, 0x00000000
766        .entry 0x80001857, 0x00000000
767        .entry 0x80001858, 0x00000000
768        .entry 0x80001859, 0x00000000
769        .entry 0x8000185a, 0x00000000
770        .entry 0x8000185b, 0x00000000
771        .entry 0x8000185c, 0x00000000
772        .entry 0x8000185d, 0x00000000
773        .entry 0x8000185e, 0x00000000
774        .entry 0x8000185f, 0x00000000
775        .entry 0x80001860, 0x00000000
776        .entry 0x80001861, 0x00000000
777        .entry 0x80001862, 0x00000000
778        .entry 0x8000000a, 0x00000001
779        .entry 0x80000078, 0x00000040
780        .entry 0x80000081, 0x00008000
781        .entry 0x80000082, 0x00000000
782    .subconstantbuffers
783    .uavmailboxsize 0
784    .uavopmask
785        .byte 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
786        .fill 120, 1, 0x00
787    .text
788/*c2000504         */ s_buffer_load_dword s0, s[4:7], 0x4
789/*c2008518         */ s_buffer_load_dword s1, s[4:7], 0x18
790/*c2420904         */ s_buffer_load_dwordx2 s[4:5], s[8:11], 0x4
791/*c2430908         */ s_buffer_load_dwordx2 s[6:7], s[8:11], 0x8
792/*c247090c         */ s_buffer_load_dwordx2 s[14:15], s[8:11], 0xc
793/*c2040900         */ s_buffer_load_dword s8, s[8:11], 0x0
794/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
795/*8380ff00 0000ffff*/ s_min_u32       s0, s0, 0xffff
796/*9300000c         */ s_mul_i32       s0, s12, s0
797/*80000100         */ s_add_u32       s0, s0, s1
798/*4a000000         */ v_add_i32       v0, vcc, s0, v0
799/*7e020280         */ v_mov_b32       v1, 0
800/*7e040208         */ v_mov_b32       v2, s8
801/*7e060280         */ v_mov_b32       v3, 0
802/*7dc20500         */ v_cmp_lt_u64    vcc, v[0:1], v[2:3]
803/*be80246a         */ s_and_saveexec_b64 s[0:1], vcc
804/*bf880018         */ s_cbranch_execz .L168_0
805/*c0840360         */ s_load_dwordx4  s[8:11], s[2:3], 0x60
806/*c0880368         */ s_load_dwordx4  s[16:19], s[2:3], 0x68
807/*d2c20000 00010500*/ v_lshl_b64      v[0:1], v[0:1], 2
808/*4a040004         */ v_add_i32       v2, vcc, s4, v0
809/*7e060205         */ v_mov_b32       v3, s5
810/*50060303         */ v_addc_u32      v3, vcc, v3, v1, vcc
811/*4a0c0006         */ v_add_i32       v6, vcc, s6, v0
812/*7e0a0207         */ v_mov_b32       v5, s7
813/*500e0305         */ v_addc_u32      v7, vcc, v5, v1, vcc
814/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
815/*eba08000 80020202*/ tbuffer_load_format_x v2, v[2:3], s[8:11], 0 addr64 format:[32,float]
816/*eba08000 80040306*/ tbuffer_load_format_x v3, v[6:7], s[16:19], 0 addr64 format:[32,float]
817/*c0820370         */ s_load_dwordx4  s[4:7], s[2:3], 0x70
818/*bf8c0f70         */ s_waitcnt       vmcnt(0)
819/*4a040702         */ v_add_i32       v2, vcc, v2, v3
820/*4a00000e         */ v_add_i32       v0, vcc, s14, v0
821/*7e06020f         */ v_mov_b32       v3, s15
822/*50020303         */ v_addc_u32      v1, vcc, v3, v1, vcc
823/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
824/*eba48000 80010200*/ tbuffer_store_format_x v2, v[0:1], s[4:7], 0 addr64 format:[32,float]
825.L168_0:
826/*bf810000         */ s_endpgm
827.kernel multiply
828    .header
829        .fill 16, 1, 0x00
830        .byte 0x08, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00
831        .fill 8, 1, 0x00
832    .metadata
833        .ascii ";ARGSTART:__OpenCL_multiply_kernel\n"
834        .ascii ";version:3:1:111\n"
835        .ascii ";device:pitcairn\n"
836        .ascii ";uniqueid:1025\n"
837        .ascii ";memory:uavprivate:0\n"
838        .ascii ";memory:hwlocal:0\n"
839        .ascii ";memory:hwregion:0\n"
840        .ascii ";value:n:u32:1:1:0\n"
841        .ascii ";pointer:adat:u32:1:1:16:uav:12:4:RO:0:0\n"
842        .ascii ";constarg:1:adat\n"
843        .ascii ";pointer:bdat:u32:1:1:32:uav:13:4:RO:0:0\n"
844        .ascii ";constarg:2:bdat\n"
845        .ascii ";pointer:cdat:u32:1:1:48:uav:14:4:RW:0:0\n"
846        .ascii ";function:1:1029\n"
847        .ascii ";memory:64bitABI\n"
848        .ascii ";uavid:11\n"
849        .ascii ";printfid:9\n"
850        .ascii ";cbid:10\n"
851        .ascii ";privateid:8\n"
852        .ascii ";reflection:0:uint\n"
853        .ascii ";reflection:1:uint*\n"
854        .ascii ";reflection:2:uint*\n"
855        .ascii ";reflection:3:uint*\n"
856        .ascii ";ARGEND:__OpenCL_multiply_kernel\n"
857    .data
858        .fill 4736, 1, 0x00
859    .inputs
860    .outputs
861    .uav
862        .entry 12, 4, 0, 5
863        .entry 13, 4, 0, 5
864        .entry 14, 4, 0, 5
865        .entry 11, 4, 0, 5
866    .condout 0
867    .floatconsts
868    .intconsts
869    .boolconsts
870    .earlyexit 0
871    .globalbuffers
872    .constantbuffers
873        .cbmask 0, 0
874        .cbmask 1, 0
875    .inputsamplers
876    .scratchbuffers
877        .int 0x00000000
878    .persistentbuffers
879    .proginfo
880        .entry 0x80001000, 0x00000003
881        .entry 0x80001001, 0x00000017
882        .entry 0x80001002, 0x00000000
883        .entry 0x80001003, 0x00000002
884        .entry 0x80001004, 0x00000002
885        .entry 0x80001005, 0x00000002
886        .entry 0x80001006, 0x00000000
887        .entry 0x80001007, 0x00000004
888        .entry 0x80001008, 0x00000004
889        .entry 0x80001009, 0x00000002
890        .entry 0x8000100a, 0x00000001
891        .entry 0x8000100b, 0x00000008
892        .entry 0x8000100c, 0x00000004
893        .entry 0x80001041, 0x00000008
894        .entry 0x80001042, 0x00000014
895        .entry 0x80001863, 0x00000066
896        .entry 0x80001864, 0x00000100
897        .entry 0x80001043, 0x000000c0
898        .entry 0x80001044, 0x00000000
899        .entry 0x80001045, 0x00000000
900        .entry 0x00002e13, 0x00000098
901        .entry 0x8000001c, 0x00000100
902        .entry 0x8000001d, 0x00000000
903        .entry 0x8000001e, 0x00000000
904        .entry 0x80001841, 0x00000000
905        .entry 0x8000001f, 0x00007000
906        .entry 0x80001843, 0x00007000
907        .entry 0x80001844, 0x00000000
908        .entry 0x80001845, 0x00000000
909        .entry 0x80001846, 0x00000000
910        .entry 0x80001847, 0x00000000
911        .entry 0x80001848, 0x00000000
912        .entry 0x80001849, 0x00000000
913        .entry 0x8000184a, 0x00000000
914        .entry 0x8000184b, 0x00000000
915        .entry 0x8000184c, 0x00000000
916        .entry 0x8000184d, 0x00000000
917        .entry 0x8000184e, 0x00000000
918        .entry 0x8000184f, 0x00000000
919        .entry 0x80001850, 0x00000000
920        .entry 0x80001851, 0x00000000
921        .entry 0x80001852, 0x00000000
922        .entry 0x80001853, 0x00000000
923        .entry 0x80001854, 0x00000000
924        .entry 0x80001855, 0x00000000
925        .entry 0x80001856, 0x00000000
926        .entry 0x80001857, 0x00000000
927        .entry 0x80001858, 0x00000000
928        .entry 0x80001859, 0x00000000
929        .entry 0x8000185a, 0x00000000
930        .entry 0x8000185b, 0x00000000
931        .entry 0x8000185c, 0x00000000
932        .entry 0x8000185d, 0x00000000
933        .entry 0x8000185e, 0x00000000
934        .entry 0x8000185f, 0x00000000
935        .entry 0x80001860, 0x00000000
936        .entry 0x80001861, 0x00000000
937        .entry 0x80001862, 0x00000000
938        .entry 0x8000000a, 0x00000001
939        .entry 0x80000078, 0x00000040
940        .entry 0x80000081, 0x00008000
941        .entry 0x80000082, 0x00000000
942    .subconstantbuffers
943    .uavmailboxsize 0
944    .uavopmask
945        .byte 0x00, 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
946        .fill 120, 1, 0x00
947    .text
948/*c2000504         */ s_buffer_load_dword s0, s[4:7], 0x4
949/*c2008518         */ s_buffer_load_dword s1, s[4:7], 0x18
950/*c2420904         */ s_buffer_load_dwordx2 s[4:5], s[8:11], 0x4
951/*c2430908         */ s_buffer_load_dwordx2 s[6:7], s[8:11], 0x8
952/*c247090c         */ s_buffer_load_dwordx2 s[14:15], s[8:11], 0xc
953/*c2040900         */ s_buffer_load_dword s8, s[8:11], 0x0
954/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
955/*8380ff00 0000ffff*/ s_min_u32       s0, s0, 0xffff
956/*9300000c         */ s_mul_i32       s0, s12, s0
957/*80000100         */ s_add_u32       s0, s0, s1
958/*4a000000         */ v_add_i32       v0, vcc, s0, v0
959/*7e020280         */ v_mov_b32       v1, 0
960/*7e040208         */ v_mov_b32       v2, s8
961/*7e060280         */ v_mov_b32       v3, 0
962/*7dc20500         */ v_cmp_lt_u64    vcc, v[0:1], v[2:3]
963/*be80246a         */ s_and_saveexec_b64 s[0:1], vcc
964/*bf880019         */ s_cbranch_execz .L172_1
965/*c0840360         */ s_load_dwordx4  s[8:11], s[2:3], 0x60
966/*c0880368         */ s_load_dwordx4  s[16:19], s[2:3], 0x68
967/*d2c20000 00010500*/ v_lshl_b64      v[0:1], v[0:1], 2
968/*4a040004         */ v_add_i32       v2, vcc, s4, v0
969/*7e060205         */ v_mov_b32       v3, s5
970/*50060303         */ v_addc_u32      v3, vcc, v3, v1, vcc
971/*4a0c0006         */ v_add_i32       v6, vcc, s6, v0
972/*7e0a0207         */ v_mov_b32       v5, s7
973/*500e0305         */ v_addc_u32      v7, vcc, v5, v1, vcc
974/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
975/*eba08000 80020202*/ tbuffer_load_format_x v2, v[2:3], s[8:11], 0 addr64 format:[32,float]
976/*eba08000 80040306*/ tbuffer_load_format_x v3, v[6:7], s[16:19], 0 addr64 format:[32,float]
977/*c0820370         */ s_load_dwordx4  s[4:7], s[2:3], 0x70
978/*bf8c0f70         */ s_waitcnt       vmcnt(0)
979/*d2d60002 00020503*/ v_mul_lo_i32    v2, v3, v2
980/*4a00000e         */ v_add_i32       v0, vcc, s14, v0
981/*7e06020f         */ v_mov_b32       v3, s15
982/*50020303         */ v_addc_u32      v1, vcc, v3, v1, vcc
983/*bf8c007f         */ s_waitcnt       lgkmcnt(0)
984/*eba48000 80010200*/ tbuffer_store_format_x v2, v[0:1], s[4:7], 0 addr64 format:[32,float]
985.L172_1:
986/*bf810000         */ s_endpgm
987)xxFxx", false
988    },
989    { nullptr, &galliumDisasmData, nullptr,
990        R"fxDfx(.gallium
991.gpu Pitcairn
992.32bit
993.rodata
994    .byte 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08
995    .byte 0x09, 0x0a, 0x0b, 0x21, 0x2c, 0x37
996.kernel kernel1
997    .args
998        .arg scalar, 4, 8, 12, zext, general
999        .arg constant, 1, 8, 12, zext, general
1000        .arg global, 4, 2, 12, zext, general
1001        .arg image2d_rd, 4, 7, 45, zext, general
1002        .arg image2d_wr, 4, 8, 45, zext, general
1003        .arg image3d_rd, 9, 7, 45, zext, general
1004        .arg image3d_wr, 12, 7, 45, zext, general
1005        .arg sampler, 17, 16, 74, zext, general
1006        .arg scalar, 4, 8, 12, sext, general
1007        .arg scalar, 124, 8, 12, zext, griddim
1008        .arg scalar, 4, 0, 32, zext, gridoffset
1009    .proginfo
1010        .entry 0x00ff1123, 0x00cda1fa
1011        .entry 0x03bf1123, 0x00fdca45
1012        .entry 0x0002dca6, 0x0fbca168
1013.kernel kernel2
1014    .args
1015        .arg constant, 1, 8, 12, zext, general
1016        .arg global, 4, 2, 12, zext, general
1017        .arg scalar, 4, 8, 12, zext, general
1018        .arg image2d_rd, 4, 9, 45, zext, general
1019        .arg image2d_wr, 4, 8, 51, zext, general
1020        .arg image3d_rd, 9, 7, 45, zext, general
1021        .arg image3d_wr, 12, 7, 45, sext, general
1022        .arg sampler, 17, 16, 74, zext, general
1023        .arg scalar, 4, 8, 12, sext, general
1024        .arg scalar, 124, 8, 12, zext, griddim
1025        .arg scalar, 4, 32, 32, zext, gridoffset
1026    .proginfo
1027        .entry 0x00234423, 0x00aaabba
1028        .entry 0x03bdd123, 0x00132235
1029        .entry 0x00011122, 0x0f3424dd
1030)fxDfx", false
1031    },
1032    /* configuration dump test cases */
1033    { nullptr, nullptr, CLRX_SOURCE_DIR "/tests/amdasm/amdbins/amd1.clo",
1034        R"ffDXD(.amd
1035.gpu Bonaire
1036.32bit
1037.compile_options "-O"
1038.driver_info "@(#) OpenCL 1.2 AMD-APP (1912.5).  Driver version: 1912.5 (VM)"
1039.kernel xT1
1040    .config
1041        .dims xyz
1042        .cws 2, 7, 1
1043        .sgprsnum 18
1044        .vgprsnum 222
1045        .floatmode 0xc0
1046        .scratchbuffer 108
1047        .uavid 11
1048        .uavprivate 314
1049        .printfid 9
1050        .privateid 8
1051        .cbid 10
1052        .earlyexit 1
1053        .condout 5
1054        .pgmrsrc2 0x7520139d
1055        .useprintf
1056        .exceptions 0x75
1057        .userdata ptr_uav_table, 0, 2, 2
1058        .userdata imm_const_buffer, 0, 4, 4
1059        .userdata imm_const_buffer, 7, 12, 2
1060        .arg x, "float", float
1061        .arg xff, "SP", float
1062        .arg x4, "float4", float
1063        .arg aaa, "SP4", float
1064        .arg vv, "double3", double
1065        .arg vv3, "SP4", double
1066        .arg sampler, "sampler_t", sampler
1067        .arg structor, "TypeX", structure, 24
1068        .arg structor2, "TypeX", structure, 24
1069        .arg img1, "IMG2D", image2d, read_only, 0
1070        .arg img1a, "IMG2DA", image2d_array, read_only, 1
1071        .arg img2, "TDIMG", image3d, write_only, 0
1072        .arg buf1, "uint*", uint*, global, const, 12
1073        .arg buf2, "ColorData", structure*, 52, global, const, 13
1074        .arg const2, "ColorData", structure*, 52, constant, volatile, 0, 14
1075        .arg dblloc, "double*", double*, local,
1076        .arg counterx, "counter32_t", counter32, 0
1077        .arg sampler2, "sampler_t", sampler
1078        .arg countery, "counter32_t", counter32, 1
1079    .text
1080/*bf810000         */ s_endpgm
1081/*4a040501         */ v_add_i32       v2, vcc, v1, v2
1082)ffDXD", true
1083    },
1084    /* amdcl2 config */
1085    { nullptr, nullptr, CLRX_SOURCE_DIR "/tests/amdasm/amdbins/amdcl2.clo",
1086        R"ffDXD(.amdcl2
1087.gpu Bonaire
1088.arch_minor 0
1089.arch_stepping 0
1090.driver_version 191205
1091.compile_options ""
1092.acl_version "AMD-COMP-LIB-v0.8 (0.0.SC_BUILD_NUMBER)"
1093.kernel aaa1
1094    .config
1095        .dims x
1096        .sgprsnum 12
1097        .vgprsnum 1
1098        .localsize 1000
1099        .floatmode 0xda
1100        .pgmrsrc1 0x00ada040
1101        .pgmrsrc2 0x0000008c
1102        .dx10clamp
1103        .ieeemode
1104        .useargs
1105        .priority 0
1106        .arg _.global_offset_0, "size_t", long
1107        .arg _.global_offset_1, "size_t", long
1108        .arg _.global_offset_2, "size_t", long
1109        .arg _.printf_buffer, "size_t", void*, global, , rdonly
1110        .arg _.vqueue_pointer, "size_t", long
1111        .arg _.aqlwrap_pointer, "size_t", long
1112        .arg n, "uint", uint
1113        .arg in, "uint*", uint*, global, const
1114        .arg out, "uint*", uint*, global,
1115    .text
1116/*8709ac05         */ s_and_b32       s9, s5, 44
1117/*870a8505         */ s_and_b32       s10, s5, 5
1118/*870b8505         */ s_and_b32       s11, s5, 5
1119/*bf810000         */ s_endpgm
1120.kernel aaa2
1121    .config
1122        .dims x
1123        .sgprsnum 12
1124        .vgprsnum 1
1125        .localsize 1000
1126        .floatmode 0xda
1127        .scratchbuffer 2342
1128        .pgmrsrc1 0x00fda840
1129        .pgmrsrc2 0x12001095
1130        .privmode
1131        .debugmode
1132        .dx10clamp
1133        .ieeemode
1134        .exceptions 0x12
1135        .useargs
1136        .usesetup
1137        .useenqueue
1138        .priority 2
1139        .arg _.global_offset_0, "size_t", long
1140        .arg _.global_offset_1, "size_t", long
1141        .arg _.global_offset_2, "size_t", long
1142        .arg _.printf_buffer, "size_t", void*, global, , rdonly
1143        .arg _.vqueue_pointer, "size_t", long
1144        .arg _.aqlwrap_pointer, "size_t", long
1145        .arg n, "uint", uint
1146        .arg in, "float*", float*, global, const
1147        .arg out, "float*", float*, global,
1148        .arg q, "queue_t", queue
1149        .arg piper, "pipe", pipe, rdonly
1150        .arg ce, "clk_event_t", clkevent
1151    .text
1152/*8709ac05         */ s_and_b32       s9, s5, 44
1153/*bf810000         */ s_endpgm
1154.kernel gfd12
1155    .config
1156        .dims xyz
1157        .cws 8, 5, 2
1158        .sgprsnum 25
1159        .vgprsnum 78
1160        .localsize 656
1161        .floatmode 0xf4
1162        .pgmrsrc1 0x012f40d3
1163        .pgmrsrc2 0x0fcdf7d8
1164        .dx10clamp
1165        .tgsize
1166        .exceptions 0x0f
1167        .useargs
1168        .usesetup
1169        .usegeneric
1170        .priority 0
1171        .arg _.global_offset_0, "size_t", long
1172        .arg _.global_offset_1, "size_t", long
1173        .arg _.global_offset_2, "size_t", long
1174        .arg _.printf_buffer, "size_t", void*, global, , rdonly
1175        .arg _.vqueue_pointer, "size_t", long
1176        .arg _.aqlwrap_pointer, "size_t", long
1177        .arg n, "uint", uint
1178        .arg in, "double*", double*, global, const
1179        .arg out, "double*", double*, global,
1180        .arg v, "uchar", uchar
1181        .arg v2, "uchar", uchar
1182    .text
1183/*7e020302         */ v_mov_b32       v1, v2
1184/*4a0206b7         */ v_add_i32       v1, vcc, 55, v3
1185/*bf810000         */ s_endpgm
1186)ffDXD", true
1187    },
1188    /* gallium config */
1189    { nullptr, nullptr, CLRX_SOURCE_DIR "/tests/amdasm/amdbins/gallium1.clo",
1190        R"ffDXD(.gallium
1191.gpu CapeVerde
1192.32bit
1193.rodata
1194    .byte 0x01, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00
1195    .byte 0x03, 0x00, 0x00, 0x00, 0x22, 0x00, 0x00, 0x00
1196    .byte 0x2d, 0x00, 0x00, 0x00
1197.kernel one1
1198    .args
1199        .arg scalar, 4, 8, 4, sext, general
1200        .arg scalar, 16, 16, 32, sext, general
1201        .arg scalar, 4, 4, 4, zext, imgformat
1202        .arg global, 8, 8, 8, zext, general
1203        .arg scalar, 4, 4, 4, zext, griddim
1204        .arg scalar, 4, 4, 4, zext, gridoffset
1205    .config
1206        .dims x
1207        .sgprsnum 104
1208        .vgprsnum 12
1209        .privmode
1210        .debugmode
1211        .ieeemode
1212        .tgsize
1213        .floatmode 0xfe
1214        .priority 3
1215        .exceptions 0x7f
1216        .localsize 32768
1217        .userdatanum 16
1218        .scratchbuffer 48
1219        .pgmrsrc1 0xffdfef02
1220        .pgmrsrc2 0x004004a1
1221.kernel secondx
1222    .args
1223    .config
1224        .dims xyz
1225        .sgprsnum 8
1226        .vgprsnum 56
1227        .tgsize
1228        .floatmode 0xd0
1229        .priority 3
1230        .localsize 256
1231        .userdatanum 16
1232        .pgmrsrc1 0x000d0c0d
1233        .pgmrsrc2 0x3d0097a0
1234.text
1235secondx:
1236/*3a040480         */ v_xor_b32       v2, 0, v2
1237/*bf810000         */ s_endpgm
1238.fill 62, 4, 0
1239one1:
1240/*7e000301         */ v_mov_b32       v0, v1
1241/*7e000303         */ v_mov_b32       v0, v3
1242)ffDXD", true
1243    }
1244};
1245
1246static void testDisasmData(cxuint testId, const DisasmAmdTestCase& testCase)
1247{
1248    std::ostringstream disasmOss;
1249    std::string resultStr;
1250    Flags disasmFlags = DISASM_ALL;
1251    if (testCase.config)
1252        disasmFlags |= DISASM_CONFIG;
1253    if (testCase.filename == nullptr)
1254    {
1255        if (testCase.amdInput != nullptr)
1256        {
1257            Disassembler disasm(testCase.amdInput, disasmOss, disasmFlags);
1258            disasm.disassemble();
1259            resultStr = disasmOss.str();
1260        }
1261        else if (testCase.galliumInput != nullptr)
1262        {
1263            Disassembler disasm(testCase.galliumInput, disasmOss, disasmFlags);
1264            disasm.disassemble();
1265            resultStr = disasmOss.str();
1266        }
1267    }
1268    else
1269    {
1270        Array<cxbyte> binaryData = loadDataFromFile(testCase.filename);
1271        if (isAmdBinary(binaryData.size(), binaryData.data()))
1272        {
1273            std::unique_ptr<AmdMainBinaryBase> base(createAmdBinaryFromCode(
1274                    binaryData.size(), binaryData.data(),
1275                    AMDBIN_CREATE_KERNELINFO | AMDBIN_CREATE_KERNELINFOMAP |
1276                    AMDBIN_CREATE_INNERBINMAP | AMDBIN_CREATE_KERNELHEADERS |
1277                    AMDBIN_CREATE_KERNELHEADERMAP | AMDBIN_INNER_CREATE_CALNOTES |
1278                    AMDBIN_CREATE_INFOSTRINGS));
1279            AmdMainGPUBinary32* amdGpuBin = static_cast<AmdMainGPUBinary32*>(base.get());
1280            Disassembler disasm(*amdGpuBin, disasmOss, disasmFlags);
1281            disasm.disassemble();
1282            resultStr = disasmOss.str();
1283        }
1284        else if (isAmdCL2Binary(binaryData.size(), binaryData.data()))
1285        {
1286            AmdCL2MainGPUBinary amdBin(binaryData.size(), binaryData.data(),
1287                AMDBIN_CREATE_KERNELINFO | AMDBIN_CREATE_KERNELINFOMAP |
1288                AMDBIN_CREATE_INNERBINMAP | AMDBIN_CREATE_KERNELHEADERS |
1289                AMDBIN_CREATE_KERNELHEADERMAP | AMDBIN_INNER_CREATE_CALNOTES |
1290                AMDBIN_CREATE_INFOSTRINGS | AMDCL2BIN_INNER_CREATE_KERNELDATA |
1291                AMDCL2BIN_INNER_CREATE_KERNELDATAMAP | AMDCL2BIN_INNER_CREATE_KERNELSTUBS);
1292            Disassembler disasm(amdBin, disasmOss, disasmFlags);
1293            disasm.disassemble();
1294            resultStr = disasmOss.str();
1295        }
1296        else
1297        {   /* gallium */
1298            GalliumBinary galliumBin(binaryData.size(),binaryData.data(), 0);
1299            Disassembler disasm(GPUDeviceType::CAPE_VERDE, galliumBin,
1300                            disasmOss, disasmFlags);
1301            disasm.disassemble();
1302            resultStr = disasmOss.str();
1303        }
1304    }
1305   
1306    if (::strcmp(testCase.expectedString, resultStr.c_str()) != 0)
1307    {   // print error
1308        std::ostringstream oss;
1309        oss << "Failed for #" << testId << std::endl;
1310        oss << resultStr << std::endl;
1311        oss.flush();
1312        throw Exception(oss.str());
1313    }
1314}
1315
1316int main(int argc, const char** argv)
1317{
1318    int retVal = 0;
1319    for (cxuint i = 0; i < sizeof(disasmDataTestCases)/sizeof(DisasmAmdTestCase); i++)
1320        try
1321        { testDisasmData(i, disasmDataTestCases[i]); }
1322        catch(const std::exception& ex)
1323        {
1324            std::cerr << ex.what() << std::endl;
1325            retVal = 1;
1326        }
1327    return retVal;
1328}
Note: See TracBrowser for help on using the repository browser.