Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/gallium/drivers/r300/compiler/radeon_opcodes.c
4574 views
1
/*
2
* Copyright (C) 2009 Nicolai Haehnle.
3
*
4
* All Rights Reserved.
5
*
6
* Permission is hereby granted, free of charge, to any person obtaining
7
* a copy of this software and associated documentation files (the
8
* "Software"), to deal in the Software without restriction, including
9
* without limitation the rights to use, copy, modify, merge, publish,
10
* distribute, sublicense, and/or sell copies of the Software, and to
11
* permit persons to whom the Software is furnished to do so, subject to
12
* the following conditions:
13
*
14
* The above copyright notice and this permission notice (including the
15
* next paragraph) shall be included in all copies or substantial
16
* portions of the Software.
17
*
18
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
19
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
21
* IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE
22
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
23
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
24
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25
*
26
*/
27
28
#include "radeon_opcodes.h"
29
#include "radeon_program.h"
30
31
#include "radeon_program_constants.h"
32
33
#include "util/compiler.h"
34
35
struct rc_opcode_info rc_opcodes[MAX_RC_OPCODE] = {
36
{
37
.Opcode = RC_OPCODE_NOP,
38
.Name = "NOP"
39
},
40
{
41
.Opcode = RC_OPCODE_ILLEGAL_OPCODE,
42
.Name = "ILLEGAL OPCODE"
43
},
44
{
45
.Opcode = RC_OPCODE_ABS,
46
.Name = "ABS",
47
.NumSrcRegs = 1,
48
.HasDstReg = 1,
49
.IsComponentwise = 1
50
},
51
{
52
.Opcode = RC_OPCODE_ADD,
53
.Name = "ADD",
54
.NumSrcRegs = 2,
55
.HasDstReg = 1,
56
.IsComponentwise = 1
57
},
58
{
59
.Opcode = RC_OPCODE_ARL,
60
.Name = "ARL",
61
.NumSrcRegs = 1,
62
.HasDstReg = 1
63
},
64
{
65
.Opcode = RC_OPCODE_ARR,
66
.Name = "ARR",
67
.NumSrcRegs = 1,
68
.HasDstReg = 1
69
},
70
{
71
.Opcode = RC_OPCODE_CEIL,
72
.Name = "CEIL",
73
.NumSrcRegs = 1,
74
.HasDstReg = 1,
75
.IsComponentwise = 1
76
},
77
{
78
.Opcode = RC_OPCODE_CLAMP,
79
.Name = "CLAMP",
80
.NumSrcRegs = 3,
81
.HasDstReg = 1,
82
.IsComponentwise = 1
83
},
84
{
85
.Opcode = RC_OPCODE_CMP,
86
.Name = "CMP",
87
.NumSrcRegs = 3,
88
.HasDstReg = 1,
89
.IsComponentwise = 1
90
},
91
{
92
.Opcode = RC_OPCODE_CND,
93
.Name = "CND",
94
.NumSrcRegs = 3,
95
.HasDstReg = 1,
96
.IsComponentwise = 1
97
},
98
{
99
.Opcode = RC_OPCODE_COS,
100
.Name = "COS",
101
.NumSrcRegs = 1,
102
.HasDstReg = 1,
103
.IsStandardScalar = 1
104
},
105
{
106
.Opcode = RC_OPCODE_DDX,
107
.Name = "DDX",
108
.NumSrcRegs = 2,
109
.HasDstReg = 1,
110
.IsComponentwise = 1
111
},
112
{
113
.Opcode = RC_OPCODE_DDY,
114
.Name = "DDY",
115
.NumSrcRegs = 2,
116
.HasDstReg = 1,
117
.IsComponentwise = 1
118
},
119
{
120
.Opcode = RC_OPCODE_DP2,
121
.Name = "DP2",
122
.NumSrcRegs = 2,
123
.HasDstReg = 1
124
},
125
{
126
.Opcode = RC_OPCODE_DP3,
127
.Name = "DP3",
128
.NumSrcRegs = 2,
129
.HasDstReg = 1
130
},
131
{
132
.Opcode = RC_OPCODE_DP4,
133
.Name = "DP4",
134
.NumSrcRegs = 2,
135
.HasDstReg = 1
136
},
137
{
138
.Opcode = RC_OPCODE_DPH,
139
.Name = "DPH",
140
.NumSrcRegs = 2,
141
.HasDstReg = 1
142
},
143
{
144
.Opcode = RC_OPCODE_DST,
145
.Name = "DST",
146
.NumSrcRegs = 2,
147
.HasDstReg = 1
148
},
149
{
150
.Opcode = RC_OPCODE_EX2,
151
.Name = "EX2",
152
.NumSrcRegs = 1,
153
.HasDstReg = 1,
154
.IsStandardScalar = 1
155
},
156
{
157
.Opcode = RC_OPCODE_EXP,
158
.Name = "EXP",
159
.NumSrcRegs = 1,
160
.HasDstReg = 1
161
},
162
{
163
.Opcode = RC_OPCODE_FLR,
164
.Name = "FLR",
165
.NumSrcRegs = 1,
166
.HasDstReg = 1,
167
.IsComponentwise = 1
168
},
169
{
170
.Opcode = RC_OPCODE_FRC,
171
.Name = "FRC",
172
.NumSrcRegs = 1,
173
.HasDstReg = 1,
174
.IsComponentwise = 1
175
},
176
{
177
.Opcode = RC_OPCODE_KIL,
178
.Name = "KIL",
179
.NumSrcRegs = 1
180
},
181
{
182
.Opcode = RC_OPCODE_LG2,
183
.Name = "LG2",
184
.NumSrcRegs = 1,
185
.HasDstReg = 1,
186
.IsStandardScalar = 1
187
},
188
{
189
.Opcode = RC_OPCODE_LIT,
190
.Name = "LIT",
191
.NumSrcRegs = 1,
192
.HasDstReg = 1
193
},
194
{
195
.Opcode = RC_OPCODE_LOG,
196
.Name = "LOG",
197
.NumSrcRegs = 1,
198
.HasDstReg = 1
199
},
200
{
201
.Opcode = RC_OPCODE_LRP,
202
.Name = "LRP",
203
.NumSrcRegs = 3,
204
.HasDstReg = 1,
205
.IsComponentwise = 1
206
},
207
{
208
.Opcode = RC_OPCODE_MAD,
209
.Name = "MAD",
210
.NumSrcRegs = 3,
211
.HasDstReg = 1,
212
.IsComponentwise = 1
213
},
214
{
215
.Opcode = RC_OPCODE_MAX,
216
.Name = "MAX",
217
.NumSrcRegs = 2,
218
.HasDstReg = 1,
219
.IsComponentwise = 1
220
},
221
{
222
.Opcode = RC_OPCODE_MIN,
223
.Name = "MIN",
224
.NumSrcRegs = 2,
225
.HasDstReg = 1,
226
.IsComponentwise = 1
227
},
228
{
229
.Opcode = RC_OPCODE_MOV,
230
.Name = "MOV",
231
.NumSrcRegs = 1,
232
.HasDstReg = 1,
233
.IsComponentwise = 1
234
},
235
{
236
.Opcode = RC_OPCODE_MUL,
237
.Name = "MUL",
238
.NumSrcRegs = 2,
239
.HasDstReg = 1,
240
.IsComponentwise = 1
241
},
242
{
243
.Opcode = RC_OPCODE_POW,
244
.Name = "POW",
245
.NumSrcRegs = 2,
246
.HasDstReg = 1,
247
.IsStandardScalar = 1
248
},
249
{
250
.Opcode = RC_OPCODE_RCP,
251
.Name = "RCP",
252
.NumSrcRegs = 1,
253
.HasDstReg = 1,
254
.IsStandardScalar = 1
255
},
256
{
257
.Opcode = RC_OPCODE_ROUND,
258
.Name = "ROUND",
259
.NumSrcRegs = 1,
260
.HasDstReg = 1,
261
.IsComponentwise = 1
262
},
263
{
264
.Opcode = RC_OPCODE_RSQ,
265
.Name = "RSQ",
266
.NumSrcRegs = 1,
267
.HasDstReg = 1,
268
.IsStandardScalar = 1
269
},
270
{
271
.Opcode = RC_OPCODE_SCS,
272
.Name = "SCS",
273
.NumSrcRegs = 1,
274
.HasDstReg = 1
275
},
276
{
277
.Opcode = RC_OPCODE_SEQ,
278
.Name = "SEQ",
279
.NumSrcRegs = 2,
280
.HasDstReg = 1,
281
.IsComponentwise = 1
282
},
283
{
284
.Opcode = RC_OPCODE_SFL,
285
.Name = "SFL",
286
.NumSrcRegs = 0,
287
.HasDstReg = 1,
288
.IsComponentwise = 1
289
},
290
{
291
.Opcode = RC_OPCODE_SGE,
292
.Name = "SGE",
293
.NumSrcRegs = 2,
294
.HasDstReg = 1,
295
.IsComponentwise = 1
296
},
297
{
298
.Opcode = RC_OPCODE_SGT,
299
.Name = "SGT",
300
.NumSrcRegs = 2,
301
.HasDstReg = 1,
302
.IsComponentwise = 1
303
},
304
{
305
.Opcode = RC_OPCODE_SIN,
306
.Name = "SIN",
307
.NumSrcRegs = 1,
308
.HasDstReg = 1,
309
.IsStandardScalar = 1
310
},
311
{
312
.Opcode = RC_OPCODE_SLE,
313
.Name = "SLE",
314
.NumSrcRegs = 2,
315
.HasDstReg = 1,
316
.IsComponentwise = 1
317
},
318
{
319
.Opcode = RC_OPCODE_SLT,
320
.Name = "SLT",
321
.NumSrcRegs = 2,
322
.HasDstReg = 1,
323
.IsComponentwise = 1
324
},
325
{
326
.Opcode = RC_OPCODE_SNE,
327
.Name = "SNE",
328
.NumSrcRegs = 2,
329
.HasDstReg = 1,
330
.IsComponentwise = 1
331
},
332
{
333
.Opcode = RC_OPCODE_SSG,
334
.Name = "SSG",
335
.NumSrcRegs = 1,
336
.HasDstReg = 1,
337
.IsComponentwise = 1
338
},
339
{
340
.Opcode = RC_OPCODE_SUB,
341
.Name = "SUB",
342
.NumSrcRegs = 2,
343
.HasDstReg = 1,
344
.IsComponentwise = 1
345
},
346
{
347
.Opcode = RC_OPCODE_SWZ,
348
.Name = "SWZ",
349
.NumSrcRegs = 1,
350
.HasDstReg = 1,
351
.IsComponentwise = 1
352
},
353
{
354
.Opcode = RC_OPCODE_TRUNC,
355
.Name = "TRUNC",
356
.NumSrcRegs = 1,
357
.HasDstReg = 1,
358
.IsComponentwise = 1
359
},
360
{
361
.Opcode = RC_OPCODE_XPD,
362
.Name = "XPD",
363
.NumSrcRegs = 2,
364
.HasDstReg = 1
365
},
366
{
367
.Opcode = RC_OPCODE_TEX,
368
.Name = "TEX",
369
.HasTexture = 1,
370
.NumSrcRegs = 1,
371
.HasDstReg = 1
372
},
373
{
374
.Opcode = RC_OPCODE_TXB,
375
.Name = "TXB",
376
.HasTexture = 1,
377
.NumSrcRegs = 1,
378
.HasDstReg = 1
379
},
380
{
381
.Opcode = RC_OPCODE_TXD,
382
.Name = "TXD",
383
.HasTexture = 1,
384
.NumSrcRegs = 3,
385
.HasDstReg = 1
386
},
387
{
388
.Opcode = RC_OPCODE_TXL,
389
.Name = "TXL",
390
.HasTexture = 1,
391
.NumSrcRegs = 1,
392
.HasDstReg = 1
393
},
394
{
395
.Opcode = RC_OPCODE_TXP,
396
.Name = "TXP",
397
.HasTexture = 1,
398
.NumSrcRegs = 1,
399
.HasDstReg = 1
400
},
401
{
402
.Opcode = RC_OPCODE_IF,
403
.Name = "IF",
404
.IsFlowControl = 1,
405
.NumSrcRegs = 1
406
},
407
{
408
.Opcode = RC_OPCODE_ELSE,
409
.Name = "ELSE",
410
.IsFlowControl = 1,
411
.NumSrcRegs = 0
412
},
413
{
414
.Opcode = RC_OPCODE_ENDIF,
415
.Name = "ENDIF",
416
.IsFlowControl = 1,
417
.NumSrcRegs = 0
418
},
419
{
420
.Opcode = RC_OPCODE_BGNLOOP,
421
.Name = "BGNLOOP",
422
.IsFlowControl = 1,
423
.NumSrcRegs = 0
424
},
425
{
426
.Opcode = RC_OPCODE_BRK,
427
.Name = "BRK",
428
.IsFlowControl = 1,
429
.NumSrcRegs = 0
430
},
431
{
432
.Opcode = RC_OPCODE_ENDLOOP,
433
.Name = "ENDLOOP",
434
.IsFlowControl = 1,
435
.NumSrcRegs = 0,
436
},
437
{
438
.Opcode = RC_OPCODE_CONT,
439
.Name = "CONT",
440
.IsFlowControl = 1,
441
.NumSrcRegs = 0
442
},
443
{
444
.Opcode = RC_OPCODE_REPL_ALPHA,
445
.Name = "REPL_ALPHA",
446
.HasDstReg = 1
447
},
448
{
449
.Opcode = RC_OPCODE_BEGIN_TEX,
450
.Name = "BEGIN_TEX"
451
},
452
{
453
.Opcode = RC_OPCODE_KILP,
454
.Name = "KILP",
455
},
456
{
457
.Opcode = RC_ME_PRED_SEQ,
458
.Name = "ME_PRED_SEQ",
459
.NumSrcRegs = 1,
460
.HasDstReg = 1
461
},
462
{
463
.Opcode = RC_ME_PRED_SGT,
464
.Name = "ME_PRED_SGT",
465
.NumSrcRegs = 1,
466
.HasDstReg = 1
467
},
468
{
469
.Opcode = RC_ME_PRED_SGE,
470
.Name = "ME_PRED_SGE",
471
.NumSrcRegs = 1,
472
.HasDstReg = 1
473
},
474
{
475
.Opcode = RC_ME_PRED_SNEQ,
476
.Name = "ME_PRED_SNEQ",
477
.NumSrcRegs = 1,
478
.HasDstReg = 1
479
},
480
{
481
.Opcode = RC_ME_PRED_SET_CLR,
482
.Name = "ME_PRED_SET_CLEAR",
483
.NumSrcRegs = 1,
484
.HasDstReg = 1
485
},
486
{
487
.Opcode = RC_ME_PRED_SET_INV,
488
.Name = "ME_PRED_SET_INV",
489
.NumSrcRegs = 1,
490
.HasDstReg = 1
491
},
492
{
493
.Opcode = RC_ME_PRED_SET_POP,
494
.Name = "ME_PRED_SET_POP",
495
.NumSrcRegs = 1,
496
.HasDstReg = 1
497
},
498
{
499
.Opcode = RC_ME_PRED_SET_RESTORE,
500
.Name = "ME_PRED_SET_RESTORE",
501
.NumSrcRegs = 1,
502
.HasDstReg = 1
503
},
504
{
505
.Opcode = RC_VE_PRED_SEQ_PUSH,
506
.Name = "VE_PRED_SEQ_PUSH",
507
.NumSrcRegs = 2,
508
.HasDstReg = 1
509
},
510
{
511
.Opcode = RC_VE_PRED_SGT_PUSH,
512
.Name = "VE_PRED_SGT_PUSH",
513
.NumSrcRegs = 2,
514
.HasDstReg = 1
515
},
516
{
517
.Opcode = RC_VE_PRED_SGE_PUSH,
518
.Name = "VE_PRED_SGE_PUSH",
519
.NumSrcRegs = 2,
520
.HasDstReg = 1
521
},
522
{
523
.Opcode = RC_VE_PRED_SNEQ_PUSH,
524
.Name = "VE_PRED_SNEQ_PUSH",
525
.NumSrcRegs = 2,
526
.HasDstReg = 1
527
}
528
};
529
530
void rc_compute_sources_for_writemask(
531
const struct rc_instruction *inst,
532
unsigned int writemask,
533
unsigned int *srcmasks)
534
{
535
const struct rc_opcode_info * opcode = rc_get_opcode_info(inst->U.I.Opcode);
536
srcmasks[0] = 0;
537
srcmasks[1] = 0;
538
srcmasks[2] = 0;
539
540
if (opcode->Opcode == RC_OPCODE_KIL)
541
srcmasks[0] |= RC_MASK_XYZW;
542
else if (opcode->Opcode == RC_OPCODE_IF)
543
srcmasks[0] |= RC_MASK_X;
544
545
if (!writemask)
546
return;
547
548
if (opcode->IsComponentwise) {
549
for(unsigned int src = 0; src < opcode->NumSrcRegs; ++src)
550
srcmasks[src] |= writemask;
551
} else if (opcode->IsStandardScalar) {
552
for(unsigned int src = 0; src < opcode->NumSrcRegs; ++src)
553
srcmasks[src] |= writemask;
554
} else {
555
switch(opcode->Opcode) {
556
case RC_OPCODE_ARL:
557
case RC_OPCODE_ARR:
558
srcmasks[0] |= RC_MASK_X;
559
break;
560
case RC_OPCODE_DP2:
561
srcmasks[0] |= RC_MASK_XY;
562
srcmasks[1] |= RC_MASK_XY;
563
break;
564
case RC_OPCODE_DP3:
565
case RC_OPCODE_XPD:
566
srcmasks[0] |= RC_MASK_XYZ;
567
srcmasks[1] |= RC_MASK_XYZ;
568
break;
569
case RC_OPCODE_DP4:
570
srcmasks[0] |= RC_MASK_XYZW;
571
srcmasks[1] |= RC_MASK_XYZW;
572
break;
573
case RC_OPCODE_DPH:
574
srcmasks[0] |= RC_MASK_XYZ;
575
srcmasks[1] |= RC_MASK_XYZW;
576
break;
577
case RC_OPCODE_TXB:
578
case RC_OPCODE_TXP:
579
case RC_OPCODE_TXL:
580
srcmasks[0] |= RC_MASK_W;
581
FALLTHROUGH;
582
case RC_OPCODE_TEX:
583
switch (inst->U.I.TexSrcTarget) {
584
case RC_TEXTURE_1D:
585
srcmasks[0] |= RC_MASK_X;
586
break;
587
case RC_TEXTURE_2D:
588
case RC_TEXTURE_RECT:
589
case RC_TEXTURE_1D_ARRAY:
590
srcmasks[0] |= RC_MASK_XY;
591
break;
592
case RC_TEXTURE_3D:
593
case RC_TEXTURE_CUBE:
594
case RC_TEXTURE_2D_ARRAY:
595
srcmasks[0] |= RC_MASK_XYZ;
596
break;
597
}
598
break;
599
case RC_OPCODE_TXD:
600
switch (inst->U.I.TexSrcTarget) {
601
case RC_TEXTURE_1D_ARRAY:
602
srcmasks[0] |= RC_MASK_Y;
603
FALLTHROUGH;
604
case RC_TEXTURE_1D:
605
srcmasks[0] |= RC_MASK_X;
606
srcmasks[1] |= RC_MASK_X;
607
srcmasks[2] |= RC_MASK_X;
608
break;
609
case RC_TEXTURE_2D_ARRAY:
610
srcmasks[0] |= RC_MASK_Z;
611
FALLTHROUGH;
612
case RC_TEXTURE_2D:
613
case RC_TEXTURE_RECT:
614
srcmasks[0] |= RC_MASK_XY;
615
srcmasks[1] |= RC_MASK_XY;
616
srcmasks[2] |= RC_MASK_XY;
617
break;
618
case RC_TEXTURE_3D:
619
case RC_TEXTURE_CUBE:
620
srcmasks[0] |= RC_MASK_XYZ;
621
srcmasks[1] |= RC_MASK_XYZ;
622
srcmasks[2] |= RC_MASK_XYZ;
623
break;
624
}
625
break;
626
case RC_OPCODE_DST:
627
srcmasks[0] |= RC_MASK_Y | RC_MASK_Z;
628
srcmasks[1] |= RC_MASK_Y | RC_MASK_W;
629
break;
630
case RC_OPCODE_EXP:
631
case RC_OPCODE_LOG:
632
srcmasks[0] |= RC_MASK_XY;
633
break;
634
case RC_OPCODE_LIT:
635
srcmasks[0] |= RC_MASK_X | RC_MASK_Y | RC_MASK_W;
636
break;
637
default:
638
break;
639
}
640
}
641
}
642
643