gem5  v21.1.0.2
instructions.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2021 Advanced Micro Devices, Inc.
3  * All rights reserved.
4  *
5  * For use for simulation and test purposes only
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions are met:
9  *
10  * 1. Redistributions of source code must retain the above copyright notice,
11  * this list of conditions and the following disclaimer.
12  *
13  * 2. Redistributions in binary form must reproduce the above copyright notice,
14  * this list of conditions and the following disclaimer in the documentation
15  * and/or other materials provided with the distribution.
16  *
17  * 3. Neither the name of the copyright holder nor the names of its
18  * contributors may be used to endorse or promote products derived from this
19  * software without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
22  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
25  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
26  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
27  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
28  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
29  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
30  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
31  * POSSIBILITY OF SUCH DAMAGE.
32  */
33 
35 
36 #include <cmath>
37 
39 #include "debug/VEGA.hh"
40 #include "debug/GPUSync.hh"
41 #include "gpu-compute/shader.hh"
42 
43 namespace gem5
44 {
45 
46 namespace VegaISA
47 {
48  // --- Inst_SOP2__S_ADD_U32 class methods ---
49 
51  : Inst_SOP2(iFmt, "s_add_u32")
52  {
53  setFlag(ALU);
54  } // Inst_SOP2__S_ADD_U32
55 
57  {
58  } // ~Inst_SOP2__S_ADD_U32
59 
60  // --- description from .arch file ---
61  // D.u = S0.u + S1.u;
62  // SCC = (S0.u + S1.u >= 0x800000000ULL ? 1 : 0) is an unsigned
63  // --- overflow/carry-out for S_ADDC_U32.
64  void
66  {
67  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
68  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
69  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
70  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
71 
72  src0.read();
73  src1.read();
74 
75  sdst = src0.rawData() + src1.rawData();
76  scc = ((ScalarRegU64)src0.rawData() + (ScalarRegU64)src1.rawData())
77  >= 0x100000000ULL ? 1 : 0;
78 
79  sdst.write();
80  scc.write();
81  } // execute
82  // --- Inst_SOP2__S_SUB_U32 class methods ---
83 
85  : Inst_SOP2(iFmt, "s_sub_u32")
86  {
87  setFlag(ALU);
88  } // Inst_SOP2__S_SUB_U32
89 
91  {
92  } // ~Inst_SOP2__S_SUB_U32
93 
94  // --- description from .arch file ---
95  // D.u = S0.u - S1.u;
96  // SCC = (S1.u > S0.u ? 1 : 0) is an unsigned overflow or carry-out for
97  // --- S_SUBB_U32.
98  void
100  {
101  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
102  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
103  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
104  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
105 
106  src0.read();
107  src1.read();
108 
109  sdst = src0.rawData() - src1.rawData();
110  scc = (src1.rawData() > src0.rawData()) ? 1 : 0;
111 
112  sdst.write();
113  scc.write();
114  } // execute
115  // --- Inst_SOP2__S_ADD_I32 class methods ---
116 
118  : Inst_SOP2(iFmt, "s_add_i32")
119  {
120  setFlag(ALU);
121  } // Inst_SOP2__S_ADD_I32
122 
124  {
125  } // ~Inst_SOP2__S_ADD_I32
126 
127  // --- description from .arch file ---
128  // D.i = S0.i + S1.i;
129  // SCC = (S0.u[31] == S1.u[31] && S0.u[31] != D.u[31]) is a signed
130  // overflow.
131  // This opcode is not suitable for use with S_ADDC_U32 for implementing
132  // 64-bit operations.
133  void
135  {
136  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
137  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
138  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
139  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
140 
141  src0.read();
142  src1.read();
143 
144  sdst = src0.rawData() + src1.rawData();
145  scc = (bits(src0.rawData(), 31) == bits(src1.rawData(), 31)
146  && bits(src0.rawData(), 31) != bits(sdst.rawData(), 31))
147  ? 1 : 0;
148 
149  sdst.write();
150  scc.write();
151  } // execute
152  // --- Inst_SOP2__S_SUB_I32 class methods ---
153 
155  : Inst_SOP2(iFmt, "s_sub_i32")
156  {
157  setFlag(ALU);
158  } // Inst_SOP2__S_SUB_I32
159 
161  {
162  } // ~Inst_SOP2__S_SUB_I32
163 
164  // --- description from .arch file ---
165  // D.i = S0.i - S1.i;
166  // SCC = (S0.u[31] != S1.u[31] && S0.u[31] != D.u[31]) is a signed
167  // overflow.
168  // CAUTION: The condition code behaviour for this opcode is inconsistent
169  // with V_SUB_I32; see V_SUB_I32 for further details.
170  // This opcode is not suitable for use with S_SUBB_U32 for implementing
171  // 64-bit operations.
172  void
174  {
175  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
176  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
177  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
178  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
179 
180  src0.read();
181  src1.read();
182 
183  sdst = src0.rawData() - src1.rawData();
184  scc = (bits(src0.rawData(), 31) != bits(src1.rawData(), 31)
185  && bits(src0.rawData(), 31) != bits(sdst.rawData(), 31)) ? 1 : 0;
186 
187  sdst.write();
188  scc.write();
189  } // execute
190  // --- Inst_SOP2__S_ADDC_U32 class methods ---
191 
193  : Inst_SOP2(iFmt, "s_addc_u32")
194  {
195  setFlag(ALU);
196  } // Inst_SOP2__S_ADDC_U32
197 
199  {
200  } // ~Inst_SOP2__S_ADDC_U32
201 
202  // --- description from .arch file ---
203  // D.u = S0.u + S1.u + SCC;
204  // SCC = (S0.u + S1.u + SCC >= 0x800000000ULL ? 1 : 0) is an unsigned
205  // overflow.
206  void
208  {
209  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
210  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
211  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
212  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
213 
214  src0.read();
215  src1.read();
216  scc.read();
217 
218  sdst = src0.rawData() + src1.rawData() + scc.rawData();
219  scc = ((ScalarRegU64)src0.rawData() + (ScalarRegU64)src1.rawData()
220  + (ScalarRegU64)scc.rawData()) >= 0x100000000ULL ? 1 : 0;
221 
222  sdst.write();
223  scc.write();
224  } // execute
225  // --- Inst_SOP2__S_SUBB_U32 class methods ---
226 
228  : Inst_SOP2(iFmt, "s_subb_u32")
229  {
230  setFlag(ALU);
231  } // Inst_SOP2__S_SUBB_U32
232 
234  {
235  } // ~Inst_SOP2__S_SUBB_U32
236 
237  // --- description from .arch file ---
238  // D.u = S0.u - S1.u - SCC;
239  // SCC = (S1.u + SCC > S0.u ? 1 : 0) is an unsigned overflow.
240  void
242  {
243  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
244  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
245  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
246  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
247 
248  src0.read();
249  src1.read();
250  scc.read();
251 
252  sdst = src0.rawData() - src1.rawData() - scc.rawData();
253  scc = (src1.rawData() + scc.rawData()) > src0.rawData() ? 1 : 0;
254 
255  sdst.write();
256  scc.write();
257  } // execute
258  // --- Inst_SOP2__S_MIN_I32 class methods ---
259 
261  : Inst_SOP2(iFmt, "s_min_i32")
262  {
263  setFlag(ALU);
264  } // Inst_SOP2__S_MIN_I32
265 
267  {
268  } // ~Inst_SOP2__S_MIN_I32
269 
270  // --- description from .arch file ---
271  // D.i = (S0.i < S1.i) ? S0.i : S1.i;
272  // SCC = 1 if S0 is chosen as the minimum value.
273  void
275  {
276  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
277  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
278  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
279  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
280 
281  src0.read();
282  src1.read();
283 
284  sdst = std::min(src0.rawData(), src1.rawData());
285  scc = (src0.rawData() < src1.rawData()) ? 1 : 0;
286 
287  sdst.write();
288  scc.write();
289  } // execute
290  // --- Inst_SOP2__S_MIN_U32 class methods ---
291 
293  : Inst_SOP2(iFmt, "s_min_u32")
294  {
295  setFlag(ALU);
296  } // Inst_SOP2__S_MIN_U32
297 
299  {
300  } // ~Inst_SOP2__S_MIN_U32
301 
302  // --- description from .arch file ---
303  // D.u = (S0.u < S1.u) ? S0.u : S1.u;
304  // SCC = 1 if S0 is chosen as the minimum value.
305  void
307  {
308  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
309  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
310  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
311  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
312 
313  src0.read();
314  src1.read();
315 
316  sdst = std::min(src0.rawData(), src1.rawData());
317  scc = (src0.rawData() < src1.rawData()) ? 1 : 0;
318 
319  sdst.write();
320  scc.write();
321  } // execute
322  // --- Inst_SOP2__S_MAX_I32 class methods ---
323 
325  : Inst_SOP2(iFmt, "s_max_i32")
326  {
327  setFlag(ALU);
328  } // Inst_SOP2__S_MAX_I32
329 
331  {
332  } // ~Inst_SOP2__S_MAX_I32
333 
334  // --- description from .arch file ---
335  // D.i = (S0.i > S1.i) ? S0.i : S1.i;
336  // SCC = 1 if S0 is chosen as the maximum value.
337  void
339  {
340  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
341  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
342  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
343  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
344 
345  src0.read();
346  src1.read();
347 
348  sdst = std::max(src0.rawData(), src1.rawData());
349  scc = (src0.rawData() > src1.rawData()) ? 1 : 0;
350 
351  sdst.write();
352  scc.write();
353  } // execute
354  // --- Inst_SOP2__S_MAX_U32 class methods ---
355 
357  : Inst_SOP2(iFmt, "s_max_u32")
358  {
359  setFlag(ALU);
360  } // Inst_SOP2__S_MAX_U32
361 
363  {
364  } // ~Inst_SOP2__S_MAX_U32
365 
366  // --- description from .arch file ---
367  // D.u = (S0.u > S1.u) ? S0.u : S1.u;
368  // SCC = 1 if S0 is chosen as the maximum value.
369  void
371  {
372  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
373  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
374  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
375  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
376 
377  src0.read();
378  src1.read();
379 
380  sdst = std::max(src0.rawData(), src1.rawData());
381  scc = (src0.rawData() > src1.rawData()) ? 1 : 0;
382 
383  sdst.write();
384  scc.write();
385  } // execute
386  // --- Inst_SOP2__S_CSELECT_B32 class methods ---
387 
389  : Inst_SOP2(iFmt, "s_cselect_b32")
390  {
391  setFlag(ALU);
392  } // Inst_SOP2__S_CSELECT_B32
393 
395  {
396  } // ~Inst_SOP2__S_CSELECT_B32
397 
398  // --- description from .arch file ---
399  // D.u = SCC ? S0.u : S1.u (conditional select).
400  void
402  {
403  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
404  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
405  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
406  ConstScalarOperandU32 scc(gpuDynInst, REG_SCC);
407 
408  src0.read();
409  src1.read();
410  scc.read();
411 
412  sdst = scc.rawData() ? src0.rawData() : src1.rawData();
413 
414  sdst.write();
415  } // execute
416  // --- Inst_SOP2__S_CSELECT_B64 class methods ---
417 
419  : Inst_SOP2(iFmt, "s_cselect_b64")
420  {
421  setFlag(ALU);
422  } // Inst_SOP2__S_CSELECT_B64
423 
425  {
426  } // ~Inst_SOP2__S_CSELECT_B64
427 
428  // --- description from .arch file ---
429  // D.u64 = SCC ? S0.u64 : S1.u64 (conditional select).
430  void
432  {
433  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
434  ConstScalarOperandU64 src1(gpuDynInst, instData.SSRC1);
435  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
436  ConstScalarOperandU32 scc(gpuDynInst, REG_SCC);
437 
438  src0.read();
439  src1.read();
440  scc.read();
441 
442  sdst = scc.rawData() ? src0.rawData() : src1.rawData();
443 
444  sdst.write();
445  } // execute
446  // --- Inst_SOP2__S_AND_B32 class methods ---
447 
449  : Inst_SOP2(iFmt, "s_and_b32")
450  {
451  setFlag(ALU);
452  } // Inst_SOP2__S_AND_B32
453 
455  {
456  } // ~Inst_SOP2__S_AND_B32
457 
458  // --- description from .arch file ---
459  // D.u = S0.u & S1.u;
460  // SCC = 1 if result is non-zero.
461  void
463  {
464  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
465  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
466  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
467  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
468 
469  src0.read();
470  src1.read();
471 
472  sdst = src0.rawData() & src1.rawData();
473  scc = sdst.rawData() ? 1 : 0;
474 
475  sdst.write();
476  scc.write();
477  } // execute
478  // --- Inst_SOP2__S_AND_B64 class methods ---
479 
481  : Inst_SOP2(iFmt, "s_and_b64")
482  {
483  setFlag(ALU);
484  } // Inst_SOP2__S_AND_B64
485 
487  {
488  } // ~Inst_SOP2__S_AND_B64
489 
490  // --- description from .arch file ---
491  // D.u64 = S0.u64 & S1.u64;
492  // SCC = 1 if result is non-zero.
493  void
495  {
496  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
497  ConstScalarOperandU64 src1(gpuDynInst, instData.SSRC1);
498  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
499  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
500 
501  src0.read();
502  src1.read();
503 
504  sdst = src0.rawData() & src1.rawData();
505  scc = sdst.rawData() ? 1 : 0;
506 
507  sdst.write();
508  scc.write();
509  } // execute
510  // --- Inst_SOP2__S_OR_B32 class methods ---
511 
513  : Inst_SOP2(iFmt, "s_or_b32")
514  {
515  setFlag(ALU);
516  } // Inst_SOP2__S_OR_B32
517 
519  {
520  } // ~Inst_SOP2__S_OR_B32
521 
522  // --- description from .arch file ---
523  // D.u = S0.u | S1.u;
524  // SCC = 1 if result is non-zero.
525  void
527  {
528  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
529  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
530  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
531  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
532 
533  src0.read();
534  src1.read();
535 
536  sdst = src0.rawData() | src1.rawData();
537  scc = sdst.rawData() ? 1 : 0;
538 
539  sdst.write();
540  scc.write();
541  } // execute
542  // --- Inst_SOP2__S_OR_B64 class methods ---
543 
545  : Inst_SOP2(iFmt, "s_or_b64")
546  {
547  setFlag(ALU);
548  } // Inst_SOP2__S_OR_B64
549 
551  {
552  } // ~Inst_SOP2__S_OR_B64
553 
554  // --- description from .arch file ---
555  // D.u64 = S0.u64 | S1.u64;
556  // SCC = 1 if result is non-zero.
557  void
559  {
560  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
561  ConstScalarOperandU64 src1(gpuDynInst, instData.SSRC1);
562  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
563  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
564 
565  src0.read();
566  src1.read();
567 
568  sdst = src0.rawData() | src1.rawData();
569  scc = sdst.rawData() ? 1 : 0;
570 
571  sdst.write();
572  scc.write();
573  } // execute
574  // --- Inst_SOP2__S_XOR_B32 class methods ---
575 
577  : Inst_SOP2(iFmt, "s_xor_b32")
578  {
579  setFlag(ALU);
580  } // Inst_SOP2__S_XOR_B32
581 
583  {
584  } // ~Inst_SOP2__S_XOR_B32
585 
586  // --- description from .arch file ---
587  // D.u = S0.u ^ S1.u;
588  // SCC = 1 if result is non-zero.
589  void
591  {
592  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
593  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
594  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
595  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
596 
597  src0.read();
598  src1.read();
599 
600  sdst = src0.rawData() ^ src1.rawData();
601  scc = sdst.rawData() ? 1 : 0;
602 
603  sdst.write();
604  scc.write();
605  } // execute
606  // --- Inst_SOP2__S_XOR_B64 class methods ---
607 
609  : Inst_SOP2(iFmt, "s_xor_b64")
610  {
611  setFlag(ALU);
612  } // Inst_SOP2__S_XOR_B64
613 
615  {
616  } // ~Inst_SOP2__S_XOR_B64
617 
618  // --- description from .arch file ---
619  // D.u64 = S0.u64 ^ S1.u64;
620  // SCC = 1 if result is non-zero.
621  void
623  {
624  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
625  ConstScalarOperandU64 src1(gpuDynInst, instData.SSRC1);
626  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
627  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
628 
629  src0.read();
630  src1.read();
631 
632  sdst = src0.rawData() ^ src1.rawData();
633  scc = sdst.rawData() ? 1 : 0;
634 
635  sdst.write();
636  scc.write();
637  } // execute
638  // --- Inst_SOP2__S_ANDN2_B32 class methods ---
639 
641  : Inst_SOP2(iFmt, "s_andn2_b32")
642  {
643  setFlag(ALU);
644  } // Inst_SOP2__S_ANDN2_B32
645 
647  {
648  } // ~Inst_SOP2__S_ANDN2_B32
649 
650  // --- description from .arch file ---
651  // D.u = S0.u & ~S1.u;
652  // SCC = 1 if result is non-zero.
653  void
655  {
656  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
657  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
658  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
659  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
660 
661  src0.read();
662  src1.read();
663 
664  sdst = src0.rawData() &~ src1.rawData();
665  scc = sdst.rawData() ? 1 : 0;
666 
667  sdst.write();
668  scc.write();
669  } // execute
670  // --- Inst_SOP2__S_ANDN2_B64 class methods ---
671 
673  : Inst_SOP2(iFmt, "s_andn2_b64")
674  {
675  setFlag(ALU);
676  } // Inst_SOP2__S_ANDN2_B64
677 
679  {
680  } // ~Inst_SOP2__S_ANDN2_B64
681 
682  // --- description from .arch file ---
683  // D.u64 = S0.u64 & ~S1.u64;
684  // SCC = 1 if result is non-zero.
685  void
687  {
688  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
689  ConstScalarOperandU64 src1(gpuDynInst, instData.SSRC1);
690  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
691  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
692 
693  src0.read();
694  src1.read();
695 
696  sdst = src0.rawData() &~ src1.rawData();
697  scc = sdst.rawData() ? 1 : 0;
698 
699  sdst.write();
700  scc.write();
701  } // execute
702  // --- Inst_SOP2__S_ORN2_B32 class methods ---
703 
705  : Inst_SOP2(iFmt, "s_orn2_b32")
706  {
707  setFlag(ALU);
708  } // Inst_SOP2__S_ORN2_B32
709 
711  {
712  } // ~Inst_SOP2__S_ORN2_B32
713 
714  // --- description from .arch file ---
715  // D.u = S0.u | ~S1.u;
716  // SCC = 1 if result is non-zero.
717  void
719  {
720  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
721  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
722  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
723  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
724 
725  src0.read();
726  src1.read();
727 
728  sdst = src0.rawData() |~ src1.rawData();
729  scc = sdst.rawData() ? 1 : 0;
730 
731  sdst.write();
732  scc.write();
733  } // execute
734  // --- Inst_SOP2__S_ORN2_B64 class methods ---
735 
737  : Inst_SOP2(iFmt, "s_orn2_b64")
738  {
739  setFlag(ALU);
740  } // Inst_SOP2__S_ORN2_B64
741 
743  {
744  } // ~Inst_SOP2__S_ORN2_B64
745 
746  // --- description from .arch file ---
747  // D.u64 = S0.u64 | ~S1.u64;
748  // SCC = 1 if result is non-zero.
749  void
751  {
752  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
753  ConstScalarOperandU64 src1(gpuDynInst, instData.SSRC1);
754  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
755  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
756 
757  src0.read();
758  src1.read();
759 
760  sdst = src0.rawData() |~ src1.rawData();
761  scc = sdst.rawData() ? 1 : 0;
762 
763  sdst.write();
764  scc.write();
765  } // execute
766  // --- Inst_SOP2__S_NAND_B32 class methods ---
767 
769  : Inst_SOP2(iFmt, "s_nand_b32")
770  {
771  setFlag(ALU);
772  } // Inst_SOP2__S_NAND_B32
773 
775  {
776  } // ~Inst_SOP2__S_NAND_B32
777 
778  // --- description from .arch file ---
779  // D.u = ~(S0.u & S1.u);
780  // SCC = 1 if result is non-zero.
781  void
783  {
784  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
785  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
786  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
787  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
788 
789  src0.read();
790  src1.read();
791 
792  sdst = ~(src0.rawData() & src1.rawData());
793  scc = sdst.rawData() ? 1 : 0;
794 
795  sdst.write();
796  scc.write();
797  } // execute
798  // --- Inst_SOP2__S_NAND_B64 class methods ---
799 
801  : Inst_SOP2(iFmt, "s_nand_b64")
802  {
803  setFlag(ALU);
804  } // Inst_SOP2__S_NAND_B64
805 
807  {
808  } // ~Inst_SOP2__S_NAND_B64
809 
810  // --- description from .arch file ---
811  // D.u64 = ~(S0.u64 & S1.u64);
812  // SCC = 1 if result is non-zero.
813  void
815  {
816  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
817  ConstScalarOperandU64 src1(gpuDynInst, instData.SSRC1);
818  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
819  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
820 
821  src0.read();
822  src1.read();
823 
824  sdst = ~(src0.rawData() & src1.rawData());
825  scc = sdst.rawData() ? 1 : 0;
826 
827  sdst.write();
828  scc.write();
829  } // execute
830  // --- Inst_SOP2__S_NOR_B32 class methods ---
831 
833  : Inst_SOP2(iFmt, "s_nor_b32")
834  {
835  setFlag(ALU);
836  } // Inst_SOP2__S_NOR_B32
837 
839  {
840  } // ~Inst_SOP2__S_NOR_B32
841 
842  // --- description from .arch file ---
843  // D.u = ~(S0.u | S1.u);
844  // SCC = 1 if result is non-zero.
845  void
847  {
848  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
849  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
850  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
851  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
852 
853  src0.read();
854  src1.read();
855 
856  sdst = ~(src0.rawData() | src1.rawData());
857  scc = sdst.rawData() ? 1 : 0;
858 
859  sdst.write();
860  scc.write();
861  } // execute
862  // --- Inst_SOP2__S_NOR_B64 class methods ---
863 
865  : Inst_SOP2(iFmt, "s_nor_b64")
866  {
867  setFlag(ALU);
868  } // Inst_SOP2__S_NOR_B64
869 
871  {
872  } // ~Inst_SOP2__S_NOR_B64
873 
874  // --- description from .arch file ---
875  // D.u64 = ~(S0.u64 | S1.u64);
876  // SCC = 1 if result is non-zero.
877  void
879  {
880  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
881  ConstScalarOperandU64 src1(gpuDynInst, instData.SSRC1);
882  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
883  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
884 
885  src0.read();
886  src1.read();
887 
888  sdst = ~(src0.rawData() | src1.rawData());
889  scc = sdst.rawData() ? 1 : 0;
890 
891  sdst.write();
892  scc.write();
893  } // execute
894  // --- Inst_SOP2__S_XNOR_B32 class methods ---
895 
897  : Inst_SOP2(iFmt, "s_xnor_b32")
898  {
899  setFlag(ALU);
900  } // Inst_SOP2__S_XNOR_B32
901 
903  {
904  } // ~Inst_SOP2__S_XNOR_B32
905 
906  // --- description from .arch file ---
907  // D.u = ~(S0.u ^ S1.u);
908  // SCC = 1 if result is non-zero.
909  void
911  {
912  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
913  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
914  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
915  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
916 
917  src0.read();
918  src1.read();
919 
920  sdst = ~(src0.rawData() ^ src1.rawData());
921  scc = sdst.rawData() ? 1 : 0;
922 
923  sdst.write();
924  scc.write();
925  } // execute
926  // --- Inst_SOP2__S_XNOR_B64 class methods ---
927 
929  : Inst_SOP2(iFmt, "s_xnor_b64")
930  {
931  setFlag(ALU);
932  } // Inst_SOP2__S_XNOR_B64
933 
935  {
936  } // ~Inst_SOP2__S_XNOR_B64
937 
938  // --- description from .arch file ---
939  // D.u64 = ~(S0.u64 ^ S1.u64);
940  // SCC = 1 if result is non-zero.
941  void
943  {
944  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
945  ConstScalarOperandU64 src1(gpuDynInst, instData.SSRC1);
946  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
947  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
948 
949  src0.read();
950  src1.read();
951 
952  sdst = ~(src0.rawData() ^ src1.rawData());
953  scc = sdst.rawData() ? 1 : 0;
954 
955  sdst.write();
956  scc.write();
957  } // execute
958  // --- Inst_SOP2__S_LSHL_B32 class methods ---
959 
961  : Inst_SOP2(iFmt, "s_lshl_b32")
962  {
963  setFlag(ALU);
964  } // Inst_SOP2__S_LSHL_B32
965 
967  {
968  } // ~Inst_SOP2__S_LSHL_B32
969 
970  // --- description from .arch file ---
971  // D.u = S0.u << S1.u[4:0];
972  // SCC = 1 if result is non-zero.
973  void
975  {
976  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
977  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
978  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
979  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
980 
981  src0.read();
982  src1.read();
983 
984  sdst = (src0.rawData() << bits(src1.rawData(), 4, 0));
985  scc = sdst.rawData() ? 1 : 0;
986 
987  sdst.write();
988  scc.write();
989  } // execute
990  // --- Inst_SOP2__S_LSHL_B64 class methods ---
991 
993  : Inst_SOP2(iFmt, "s_lshl_b64")
994  {
995  setFlag(ALU);
996  } // Inst_SOP2__S_LSHL_B64
997 
999  {
1000  } // ~Inst_SOP2__S_LSHL_B64
1001 
1002  // --- description from .arch file ---
1003  // D.u64 = S0.u64 << S1.u[5:0];
1004  // SCC = 1 if result is non-zero.
1005  void
1007  {
1008  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
1009  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1010  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
1011  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1012 
1013  src0.read();
1014  src1.read();
1015 
1016  sdst = (src0.rawData() << bits(src1.rawData(), 5, 0));
1017  scc = sdst.rawData() ? 1 : 0;
1018 
1019  sdst.write();
1020  scc.write();
1021  } // execute
1022  // --- Inst_SOP2__S_LSHR_B32 class methods ---
1023 
1025  : Inst_SOP2(iFmt, "s_lshr_b32")
1026  {
1027  setFlag(ALU);
1028  } // Inst_SOP2__S_LSHR_B32
1029 
1031  {
1032  } // ~Inst_SOP2__S_LSHR_B32
1033 
1034  // --- description from .arch file ---
1035  // D.u = S0.u >> S1.u[4:0];
1036  // SCC = 1 if result is non-zero.
1037  // The vacated bits are set to zero.
1038  void
1040  {
1041  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
1042  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1043  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
1044  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1045 
1046  src0.read();
1047  src1.read();
1048 
1049  sdst = (src0.rawData() >> bits(src1.rawData(), 4, 0));
1050  scc = sdst.rawData() ? 1 : 0;
1051 
1052  sdst.write();
1053  scc.write();
1054  } // execute
1055  // --- Inst_SOP2__S_LSHR_B64 class methods ---
1056 
1058  : Inst_SOP2(iFmt, "s_lshr_b64")
1059  {
1060  setFlag(ALU);
1061  } // Inst_SOP2__S_LSHR_B64
1062 
1064  {
1065  } // ~Inst_SOP2__S_LSHR_B64
1066 
1067  // --- description from .arch file ---
1068  // D.u64 = S0.u64 >> S1.u[5:0];
1069  // SCC = 1 if result is non-zero.
1070  // The vacated bits are set to zero.
1071  void
1073  {
1074  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
1075  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1076  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
1077  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1078 
1079  src0.read();
1080  src1.read();
1081 
1082  sdst = (src0.rawData() >> bits(src1.rawData(), 5, 0));
1083  scc = sdst.rawData() ? 1 : 0;
1084 
1085  sdst.write();
1086  scc.write();
1087  } // execute
1088  // --- Inst_SOP2__S_ASHR_I32 class methods ---
1089 
1091  : Inst_SOP2(iFmt, "s_ashr_i32")
1092  {
1093  setFlag(ALU);
1094  } // Inst_SOP2__S_ASHR_I32
1095 
1097  {
1098  } // ~Inst_SOP2__S_ASHR_I32
1099 
1100  // --- description from .arch file ---
1101  // D.i = signext(S0.i) >> S1.u[4:0];
1102  // SCC = 1 if result is non-zero.
1103  // The vacated bits are set to the sign bit of the input value.
1104  void
1106  {
1107  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
1108  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1109  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1110  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1111 
1112  src0.read();
1113  src1.read();
1114 
1115  sdst = (src0.rawData() >> bits(src1.rawData(), 4, 0));
1116  scc = sdst.rawData() ? 1 : 0;
1117 
1118  sdst.write();
1119  scc.write();
1120  } // execute
1121  // --- Inst_SOP2__S_ASHR_I64 class methods ---
1122 
1124  : Inst_SOP2(iFmt, "s_ashr_i64")
1125  {
1126  setFlag(ALU);
1127  } // Inst_SOP2__S_ASHR_I64
1128 
1130  {
1131  } // ~Inst_SOP2__S_ASHR_I64
1132 
1133  // --- description from .arch file ---
1134  // D.i64 = signext(S0.i64) >> S1.u[5:0];
1135  // SCC = 1 if result is non-zero.
1136  // The vacated bits are set to the sign bit of the input value.
1137  void
1139  {
1140  ConstScalarOperandI64 src0(gpuDynInst, instData.SSRC0);
1141  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1142  ScalarOperandI64 sdst(gpuDynInst, instData.SDST);
1143  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1144 
1145  src0.read();
1146  src1.read();
1147 
1148  sdst = (src0.rawData() >> bits(src1.rawData(), 5, 0));
1149  scc = sdst.rawData() ? 1 : 0;
1150 
1151  sdst.write();
1152  scc.write();
1153  } // execute
1154  // --- Inst_SOP2__S_BFM_B32 class methods ---
1155 
1157  : Inst_SOP2(iFmt, "s_bfm_b32")
1158  {
1159  setFlag(ALU);
1160  } // Inst_SOP2__S_BFM_B32
1161 
1163  {
1164  } // ~Inst_SOP2__S_BFM_B32
1165 
1166  // --- description from .arch file ---
1167  // D.u = ((1 << S0.u[4:0]) - 1) << S1.u[4:0] (bitfield mask).
1168  void
1170  {
1171  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
1172  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1173  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
1174 
1175  src0.read();
1176  src1.read();
1177 
1178  sdst = ((1 << bits(src0.rawData(), 4, 0)) - 1)
1179  << bits(src1.rawData(), 4, 0);
1180 
1181  sdst.write();
1182  } // execute
1183  // --- Inst_SOP2__S_BFM_B64 class methods ---
1184 
1186  : Inst_SOP2(iFmt, "s_bfm_b64")
1187  {
1188  setFlag(ALU);
1189  } // Inst_SOP2__S_BFM_B64
1190 
1192  {
1193  } // ~Inst_SOP2__S_BFM_B64
1194 
1195  // --- description from .arch file ---
1196  // D.u64 = ((1ULL << S0.u[5:0]) - 1) << S1.u[5:0] (bitfield mask).
1197  void
1199  {
1200  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
1201  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1202  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
1203 
1204  src0.read();
1205  src1.read();
1206 
1207  sdst = ((1ULL << bits(src0.rawData(), 5, 0)) - 1)
1208  << bits(src1.rawData(), 5, 0);
1209 
1210  sdst.write();
1211  } // execute
1212  // --- Inst_SOP2__S_MUL_I32 class methods ---
1213 
1215  : Inst_SOP2(iFmt, "s_mul_i32")
1216  {
1217  setFlag(ALU);
1218  } // Inst_SOP2__S_MUL_I32
1219 
1221  {
1222  } // ~Inst_SOP2__S_MUL_I32
1223 
1224  // --- description from .arch file ---
1225  // D.i = S0.i * S1.i.
1226  void
1228  {
1229  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
1230  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
1231  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1232 
1233  src0.read();
1234  src1.read();
1235 
1236  sdst = src0.rawData() * src1.rawData();
1237 
1238  sdst.write();
1239  } // execute
1240  // --- Inst_SOP2__S_BFE_U32 class methods ---
1241 
1243  : Inst_SOP2(iFmt, "s_bfe_u32")
1244  {
1245  setFlag(ALU);
1246  } // Inst_SOP2__S_BFE_U32
1247 
1249  {
1250  } // ~Inst_SOP2__S_BFE_U32
1251 
1252  // --- description from .arch file ---
1253  // Bit field extract. S0 is Data, S1[4:0] is field offset, S1[22:16] is
1254  // field width.
1255  // D.u = (S0.u>>S1.u[4:0]) & ((1<<S1.u[22:16])-1);
1256  // SCC = 1 if result is non-zero.
1257  void
1259  {
1260  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
1261  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1262  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
1263  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1264 
1265  src0.read();
1266  src1.read();
1267 
1268  sdst = (src0.rawData() >> bits(src1.rawData(), 4, 0))
1269  & ((1 << bits(src1.rawData(), 22, 16)) - 1);
1270  scc = sdst.rawData() ? 1 : 0;
1271 
1272  sdst.write();
1273  scc.write();
1274  } // execute
1275  // --- Inst_SOP2__S_BFE_I32 class methods ---
1276 
1278  : Inst_SOP2(iFmt, "s_bfe_i32")
1279  {
1280  setFlag(ALU);
1281  } // Inst_SOP2__S_BFE_I32
1282 
1284  {
1285  } // ~Inst_SOP2__S_BFE_I32
1286 
1287  // --- description from .arch file ---
1288  // Bit field extract. S0 is Data, S1[4:0] is field offset, S1[22:16] is
1289  // field width.
1290  // D.i = (S0.i>>S1.u[4:0]) & ((1<<S1.u[22:16])-1);
1291  // Sign-extend the result;
1292  // SCC = 1 if result is non-zero.
1293  void
1295  {
1296  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
1297  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1298  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1299  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1300 
1301  src0.read();
1302  src1.read();
1303 
1304  sdst = (src0.rawData() >> bits(src1.rawData(), 4, 0))
1305  & ((1 << bits(src1.rawData(), 22, 16)) - 1);
1306  scc = sdst.rawData() ? 1 : 0;
1307 
1308  sdst.write();
1309  scc.write();
1310  } // execute
1311  // --- Inst_SOP2__S_BFE_U64 class methods ---
1312 
1314  : Inst_SOP2(iFmt, "s_bfe_u64")
1315  {
1316  setFlag(ALU);
1317  } // Inst_SOP2__S_BFE_U64
1318 
1320  {
1321  } // ~Inst_SOP2__S_BFE_U64
1322 
1323  // --- description from .arch file ---
1324  // Bit field extract. S0 is Data, S1[5:0] is field offset, S1[22:16] is
1325  // field width.
1326  // D.u64 = (S0.u64>>S1.u[5:0]) & ((1<<S1.u[22:16])-1);
1327  // SCC = 1 if result is non-zero.
1328  void
1330  {
1331  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
1332  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1333  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
1334  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1335 
1336  src0.read();
1337  src1.read();
1338 
1339  sdst = (src0.rawData() >> bits(src1.rawData(), 5, 0))
1340  & ((1 << bits(src1.rawData(), 22, 16)) - 1);
1341  scc = sdst.rawData() ? 1 : 0;
1342 
1343  sdst.write();
1344  scc.write();
1345  } // execute
1346  // --- Inst_SOP2__S_BFE_I64 class methods ---
1347 
1349  : Inst_SOP2(iFmt, "s_bfe_i64")
1350  {
1351  setFlag(ALU);
1352  } // Inst_SOP2__S_BFE_I64
1353 
1355  {
1356  } // ~Inst_SOP2__S_BFE_I64
1357 
1358  // --- description from .arch file ---
1359  // Bit field extract. S0 is Data, S1[5:0] is field offset, S1[22:16] is
1360  // field width.
1361  // D.i64 = (S0.i64>>S1.u[5:0]) & ((1<<S1.u[22:16])-1);
1362  // Sign-extend result;
1363  // SCC = 1 if result is non-zero.
1364  void
1366  {
1367  ConstScalarOperandI64 src0(gpuDynInst, instData.SSRC0);
1368  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1369  ScalarOperandI64 sdst(gpuDynInst, instData.SDST);
1370  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1371 
1372  src0.read();
1373  src1.read();
1374 
1375  sdst = (src0.rawData() >> bits(src1.rawData(), 5, 0))
1376  & ((1 << bits(src1.rawData(), 22, 16)) - 1);
1377  scc = sdst.rawData() ? 1 : 0;
1378 
1379  sdst.write();
1380  scc.write();
1381  } // execute
1382  // --- Inst_SOP2__S_CBRANCH_G_FORK class methods ---
1383 
1385  : Inst_SOP2(iFmt, "s_cbranch_g_fork")
1386  {
1387  setFlag(CondBranch);
1388  } // Inst_SOP2__S_CBRANCH_G_FORK
1389 
1391  {
1392  } // ~Inst_SOP2__S_CBRANCH_G_FORK
1393 
1394  // --- description from .arch file ---
1395  // mask_pass = S0.u64 & EXEC;
1396  // mask_fail = ~S0.u64 & EXEC;
1397  // if(mask_pass == EXEC)
1398  // PC = S1.u64;
1399  // elsif(mask_fail == EXEC)
1400  // PC += 4;
1401  // elsif(bitcount(mask_fail) < bitcount(mask_pass))
1402  // EXEC = mask_fail;
1403  // SGPR[CSP*4] = { S1.u64, mask_pass };
1404  // CSP++;
1405  // PC += 4;
1406  // else
1407  // EXEC = mask_pass;
1408  // SGPR[CSP*4] = { PC + 4, mask_fail };
1409  // CSP++;
1410  // PC = S1.u64;
1411  // end.
1412  // Conditional branch using branch-stack.
1413  // S0 = compare mask(vcc or any sgpr) and
1414  // S1 = 64-bit byte address of target instruction.
1415  // See also S_CBRANCH_JOIN.
1416  void
1418  {
1420  } // execute
1421  // --- Inst_SOP2__S_ABSDIFF_I32 class methods ---
1422 
1424  : Inst_SOP2(iFmt, "s_absdiff_i32")
1425  {
1426  setFlag(ALU);
1427  } // Inst_SOP2__S_ABSDIFF_I32
1428 
1430  {
1431  } // ~Inst_SOP2__S_ABSDIFF_I32
1432 
1433  // --- description from .arch file ---
1434  // D.i = S0.i - S1.i;
1435  // if(D.i < 0) then D.i = -D.i;
1436  // SCC = 1 if result is non-zero.
1437  // Compute the absolute value of difference between two values.
1438  void
1440  {
1441  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
1442  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
1443  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1444  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1445 
1446  sdst = std::abs(src0.rawData() - src1.rawData());
1447  scc = sdst.rawData() ? 1 : 0;
1448 
1449  sdst.write();
1450  scc.write();
1451  } // execute
1452  // --- Inst_SOP2__S_RFE_RESTORE_B64 class methods ---
1453 
1455  InFmt_SOP2 *iFmt)
1456  : Inst_SOP2(iFmt, "s_rfe_restore_b64")
1457  {
1458  } // Inst_SOP2__S_RFE_RESTORE_B64
1459 
1461  {
1462  } // ~Inst_SOP2__S_RFE_RESTORE_B64
1463 
1464  // --- description from .arch file ---
1465  // PRIV = 0;
1466  // PC = S0.u64;
1467  // INST_ATC = S1.u32[0].
1468  // Return from exception handler and continue, possibly changing the
1469  // --- instruction ATC mode.
1470  // This instruction may only be used within a trap handler.
1471  // Use this instruction when the main program may be in a different memory
1472  // --- space than the trap handler.
1473  void
1475  {
1477  } // execute
1478  // --- Inst_SOPK__S_MOVK_I32 class methods ---
1479 
1481  : Inst_SOPK(iFmt, "s_movk_i32")
1482  {
1483  setFlag(ALU);
1484  } // Inst_SOPK__S_MOVK_I32
1485 
1487  {
1488  } // ~Inst_SOPK__S_MOVK_I32
1489 
1490  // --- description from .arch file ---
1491  // D.i = signext(SIMM16) (sign extension).
1492  void
1494  {
1496  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1497 
1498  sdst = simm16;
1499 
1500  sdst.write();
1501  } // execute
1502  // --- Inst_SOPK__S_CMOVK_I32 class methods ---
1503 
1505  : Inst_SOPK(iFmt, "s_cmovk_i32")
1506  {
1507  setFlag(ALU);
1508  } // Inst_SOPK__S_CMOVK_I32
1509 
1511  {
1512  } // ~Inst_SOPK__S_CMOVK_I32
1513 
1514  // --- description from .arch file ---
1515  // if(SCC) then D.i = signext(SIMM16);
1516  // else NOP.
1517  // Conditional move with sign extension.
1518  void
1520  {
1522  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1523  ConstScalarOperandU32 scc(gpuDynInst, REG_SCC);
1524 
1525  scc.read();
1526 
1527  if (scc.rawData()) {
1528  sdst = simm16;
1529  sdst.write();
1530  }
1531  } // execute
1532  // --- Inst_SOPK__S_CMPK_EQ_I32 class methods ---
1533 
1535  : Inst_SOPK(iFmt, "s_cmpk_eq_i32")
1536  {
1537  setFlag(ALU);
1538  } // Inst_SOPK__S_CMPK_EQ_I32
1539 
1541  {
1542  } // ~Inst_SOPK__S_CMPK_EQ_I32
1543 
1544  // --- description from .arch file ---
1545  // SCC = (S0.i == signext(SIMM16)).
1546  void
1548  {
1550  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1551  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1552 
1553  src.read();
1554 
1555  scc = (src.rawData() == simm16) ? 1 : 0;
1556 
1557  scc.write();
1558  } // execute
1559  // --- Inst_SOPK__S_CMPK_LG_I32 class methods ---
1560 
1562  : Inst_SOPK(iFmt, "s_cmpk_lg_i32")
1563  {
1564  setFlag(ALU);
1565  } // Inst_SOPK__S_CMPK_LG_I32
1566 
1568  {
1569  } // ~Inst_SOPK__S_CMPK_LG_I32
1570 
1571  // --- description from .arch file ---
1572  // SCC = (S0.i != signext(SIMM16)).
1573  void
1575  {
1577  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1578  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1579 
1580  src.read();
1581 
1582  scc = (src.rawData() != simm16) ? 1 : 0;
1583 
1584  scc.write();
1585  } // execute
1586  // --- Inst_SOPK__S_CMPK_GT_I32 class methods ---
1587 
1589  : Inst_SOPK(iFmt, "s_cmpk_gt_i32")
1590  {
1591  setFlag(ALU);
1592  } // Inst_SOPK__S_CMPK_GT_I32
1593 
1595  {
1596  } // ~Inst_SOPK__S_CMPK_GT_I32
1597 
1598  // --- description from .arch file ---
1599  // SCC = (S0.i > signext(SIMM16)).
1600  void
1602  {
1604  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1605  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1606 
1607  src.read();
1608 
1609  scc = (src.rawData() > simm16) ? 1 : 0;
1610 
1611  scc.write();
1612  } // execute
1613  // --- Inst_SOPK__S_CMPK_GE_I32 class methods ---
1614 
1616  : Inst_SOPK(iFmt, "s_cmpk_ge_i32")
1617  {
1618  setFlag(ALU);
1619  } // Inst_SOPK__S_CMPK_GE_I32
1620 
1622  {
1623  } // ~Inst_SOPK__S_CMPK_GE_I32
1624 
1625  // --- description from .arch file ---
1626  // SCC = (S0.i >= signext(SIMM16)).
1627  void
1629  {
1631  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1632  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1633 
1634  src.read();
1635 
1636  scc = (src.rawData() >= simm16) ? 1 : 0;
1637 
1638  scc.write();
1639  } // execute
1640  // --- Inst_SOPK__S_CMPK_LT_I32 class methods ---
1641 
1643  : Inst_SOPK(iFmt, "s_cmpk_lt_i32")
1644  {
1645  setFlag(ALU);
1646  } // Inst_SOPK__S_CMPK_LT_I32
1647 
1649  {
1650  } // ~Inst_SOPK__S_CMPK_LT_I32
1651 
1652  // --- description from .arch file ---
1653  // SCC = (S0.i < signext(SIMM16)).
1654  void
1656  {
1658  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1659  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1660 
1661  src.read();
1662 
1663  scc = (src.rawData() < simm16) ? 1 : 0;
1664 
1665  scc.write();
1666  } // execute
1667  // --- Inst_SOPK__S_CMPK_LE_I32 class methods ---
1668 
1670  : Inst_SOPK(iFmt, "s_cmpk_le_i32")
1671  {
1672  setFlag(ALU);
1673  } // Inst_SOPK__S_CMPK_LE_I32
1674 
1676  {
1677  } // ~Inst_SOPK__S_CMPK_LE_I32
1678 
1679  // --- description from .arch file ---
1680  // SCC = (S0.i <= signext(SIMM16)).
1681  void
1683  {
1685  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1686  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1687 
1688  src.read();
1689 
1690  scc = (src.rawData() <= simm16) ? 1 : 0;
1691 
1692  scc.write();
1693  } // execute
1694  // --- Inst_SOPK__S_CMPK_EQ_U32 class methods ---
1695 
1697  : Inst_SOPK(iFmt, "s_cmpk_eq_u32")
1698  {
1699  setFlag(ALU);
1700  } // Inst_SOPK__S_CMPK_EQ_U32
1701 
1703  {
1704  } // ~Inst_SOPK__S_CMPK_EQ_U32
1705 
1706  // --- description from .arch file ---
1707  // SCC = (S0.u == SIMM16).
1708  void
1710  {
1712  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1713  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1714 
1715  src.read();
1716 
1717  scc = (src.rawData() == simm16) ? 1 : 0;
1718 
1719  scc.write();
1720  } // execute
1721  // --- Inst_SOPK__S_CMPK_LG_U32 class methods ---
1722 
1724  : Inst_SOPK(iFmt, "s_cmpk_lg_u32")
1725  {
1726  setFlag(ALU);
1727  } // Inst_SOPK__S_CMPK_LG_U32
1728 
1730  {
1731  } // ~Inst_SOPK__S_CMPK_LG_U32
1732 
1733  // --- description from .arch file ---
1734  // SCC = (S0.u != SIMM16).
1735  void
1737  {
1739  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1740  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1741 
1742  src.read();
1743 
1744  scc = (src.rawData() != simm16) ? 1 : 0;
1745 
1746  scc.write();
1747  } // execute
1748  // --- Inst_SOPK__S_CMPK_GT_U32 class methods ---
1749 
1751  : Inst_SOPK(iFmt, "s_cmpk_gt_u32")
1752  {
1753  setFlag(ALU);
1754  } // Inst_SOPK__S_CMPK_GT_U32
1755 
1757  {
1758  } // ~Inst_SOPK__S_CMPK_GT_U32
1759 
1760  // --- description from .arch file ---
1761  // SCC = (S0.u > SIMM16).
1762  void
1764  {
1766  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1767  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1768 
1769  src.read();
1770 
1771  scc = (src.rawData() > simm16) ? 1 : 0;
1772 
1773  scc.write();
1774  } // execute
1775  // --- Inst_SOPK__S_CMPK_GE_U32 class methods ---
1776 
1778  : Inst_SOPK(iFmt, "s_cmpk_ge_u32")
1779  {
1780  setFlag(ALU);
1781  } // Inst_SOPK__S_CMPK_GE_U32
1782 
1784  {
1785  } // ~Inst_SOPK__S_CMPK_GE_U32
1786 
1787  // --- description from .arch file ---
1788  // SCC = (S0.u >= SIMM16).
1789  void
1791  {
1793  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1794  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1795 
1796  src.read();
1797 
1798  scc = (src.rawData() >= simm16) ? 1 : 0;
1799 
1800  scc.write();
1801  } // execute
1802  // --- Inst_SOPK__S_CMPK_LT_U32 class methods ---
1803 
1805  : Inst_SOPK(iFmt, "s_cmpk_lt_u32")
1806  {
1807  setFlag(ALU);
1808  } // Inst_SOPK__S_CMPK_LT_U32
1809 
1811  {
1812  } // ~Inst_SOPK__S_CMPK_LT_U32
1813 
1814  // --- description from .arch file ---
1815  // SCC = (S0.u < SIMM16).
1816  void
1818  {
1820  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1821  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1822 
1823  src.read();
1824 
1825  scc = (src.rawData() < simm16) ? 1 : 0;
1826 
1827  scc.write();
1828  } // execute
1829  // --- Inst_SOPK__S_CMPK_LE_U32 class methods ---
1830 
1832  : Inst_SOPK(iFmt, "s_cmpk_le_u32")
1833  {
1834  setFlag(ALU);
1835  } // Inst_SOPK__S_CMPK_LE_U32
1836 
1838  {
1839  } // ~Inst_SOPK__S_CMPK_LE_U32
1840 
1841  // --- description from .arch file ---
1842  // SCC = (S0.u <= SIMM16).
1843  void
1845  {
1847  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1848  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1849 
1850  src.read();
1851 
1852  scc = (src.rawData() <= simm16) ? 1 : 0;
1853 
1854  scc.write();
1855  } // execute
1856  // --- Inst_SOPK__S_ADDK_I32 class methods ---
1857 
1859  : Inst_SOPK(iFmt, "s_addk_i32")
1860  {
1861  setFlag(ALU);
1862  } // Inst_SOPK__S_ADDK_I32
1863 
1865  {
1866  } // ~Inst_SOPK__S_ADDK_I32
1867 
1868  // --- description from .arch file ---
1869  // D.i = D.i + signext(SIMM16);
1870  // SCC = overflow.
1871  void
1873  {
1874  ScalarRegI16 simm16 = instData.SIMM16;
1875  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1876  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1877  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1878 
1879  src.read();
1880 
1881  sdst = src.rawData() + (ScalarRegI32)simm16;
1882  scc = (bits(src.rawData(), 31) == bits(simm16, 15)
1883  && bits(src.rawData(), 31) != bits(sdst.rawData(), 31)) ? 1 : 0;
1884 
1885  sdst.write();
1886  scc.write();
1887  } // execute
1888  // --- Inst_SOPK__S_MULK_I32 class methods ---
1889 
1891  : Inst_SOPK(iFmt, "s_mulk_i32")
1892  {
1893  setFlag(ALU);
1894  } // Inst_SOPK__S_MULK_I32
1895 
1897  {
1898  } // ~Inst_SOPK__S_MULK_I32
1899 
1900  // --- description from .arch file ---
1901  // D.i = D.i * signext(SIMM16).
1902  void
1904  {
1905  ScalarRegI16 simm16 = instData.SIMM16;
1906  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1907 
1908  sdst.read();
1909 
1910  sdst = sdst.rawData() * (ScalarRegI32)simm16;
1911 
1912  sdst.write();
1913  } // execute
1914  // --- Inst_SOPK__S_CBRANCH_I_FORK class methods ---
1915 
1917  : Inst_SOPK(iFmt, "s_cbranch_i_fork")
1918  {
1919  setFlag(CondBranch);
1920  } // Inst_SOPK__S_CBRANCH_I_FORK
1921 
1923  {
1924  } // ~Inst_SOPK__S_CBRANCH_I_FORK
1925 
1926  // --- description from .arch file ---
1927  // mask_pass = S0.u64 & EXEC;
1928  // mask_fail = ~S0.u64 & EXEC;
1929  // target_addr = PC + signext(SIMM16 * 4) + 4;
1930  // if(mask_pass == EXEC)
1931  // PC = target_addr;
1932  // elsif(mask_fail == EXEC)
1933  // PC += 4;
1934  // elsif(bitcount(mask_fail) < bitcount(mask_pass))
1935  // EXEC = mask_fail;
1936  // SGPR[CSP*4] = { target_addr, mask_pass };
1937  // CSP++;
1938  // PC += 4;
1939  // else
1940  // EXEC = mask_pass;
1941  // SGPR[CSP*4] = { PC + 4, mask_fail };
1942  // CSP++;
1943  // PC = target_addr;
1944  // end.
1945  // Conditional branch using branch-stack.
1946  // S0 = compare mask(vcc or any sgpr), and
1947  // SIMM16 = signed DWORD branch offset relative to next instruction.
1948  // See also S_CBRANCH_JOIN.
1949  void
1951  {
1953  } // execute
1954  // --- Inst_SOPK__S_GETREG_B32 class methods ---
1955 
1957  : Inst_SOPK(iFmt, "s_getreg_b32")
1958  {
1959  } // Inst_SOPK__S_GETREG_B32
1960 
1962  {
1963  } // ~Inst_SOPK__S_GETREG_B32
1964 
1965  // --- description from .arch file ---
1966  // D.u = hardware-reg. Read some or all of a hardware register into the
1967  // LSBs of D.
1968  // SIMM16 = {size[4:0], offset[4:0], hwRegId[5:0]}; offset is 0..31, size
1969  // is 1..32.
1970  void
1972  {
1974  } // execute
1975  // --- Inst_SOPK__S_SETREG_B32 class methods ---
1976 
1978  : Inst_SOPK(iFmt, "s_setreg_b32")
1979  {
1980  setFlag(ALU);
1981  } // Inst_SOPK__S_SETREG_B32
1982 
1984  {
1985  } // ~Inst_SOPK__S_SETREG_B32
1986 
1987  // --- description from .arch file ---
1988  // hardware-reg = S0.u. Write some or all of the LSBs of D into a hardware
1989  // register.
1990  // SIMM16 = {size[4:0], offset[4:0], hwRegId[5:0]}; offset is 0..31, size
1991  // is 1..32.
1992  void
1994  {
1995  ScalarRegI16 simm16 = instData.SIMM16;
1996  ScalarRegU32 hwregId = simm16 & 0x3f;
1997  ScalarRegU32 offset = (simm16 >> 6) & 31;
1998  ScalarRegU32 size = ((simm16 >> 11) & 31) + 1;
1999 
2000  ScalarOperandU32 hwreg(gpuDynInst, hwregId);
2001  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2002  hwreg.read();
2003  sdst.read();
2004 
2005  // Store value from SDST to part of the hardware register.
2006  ScalarRegU32 mask = (((1U << size) - 1U) << offset);
2007  hwreg = ((hwreg.rawData() & ~mask)
2008  | ((sdst.rawData() << offset) & mask));
2009  hwreg.write();
2010 
2011  // set MODE register to control the behavior of single precision
2012  // floating-point numbers: denormal mode or round mode
2013  if (hwregId==1 && size==2
2014  && (offset==4 || offset==0)) {
2015  warn_once("Be cautious that s_setreg_b32 has no real effect "
2016  "on FP modes: %s\n", gpuDynInst->disassemble());
2017  return;
2018  }
2019 
2020  // panic if not changing MODE of floating-point numbers
2022  } // execute
2023  // --- Inst_SOPK__S_SETREG_IMM32_B32 class methods ---
2024 
2026  InFmt_SOPK *iFmt)
2027  : Inst_SOPK(iFmt, "s_setreg_imm32_b32")
2028  {
2029  setFlag(ALU);
2030  } // Inst_SOPK__S_SETREG_IMM32_B32
2031 
2033  {
2034  } // ~Inst_SOPK__S_SETREG_IMM32_B32
2035 
2036  // --- description from .arch file ---
2037  // Write some or all of the LSBs of IMM32 into a hardware register; this
2038  // --- instruction requires a 32-bit literal constant.
2039  // SIMM16 = {size[4:0], offset[4:0], hwRegId[5:0]}; offset is 0..31, size
2040  // is 1..32.
2041  void
2043  {
2044  ScalarRegI16 simm16 = instData.SIMM16;
2045  ScalarRegU32 hwregId = simm16 & 0x3f;
2046  ScalarRegU32 offset = (simm16 >> 6) & 31;
2047  ScalarRegU32 size = ((simm16 >> 11) & 31) + 1;
2048 
2049  ScalarOperandU32 hwreg(gpuDynInst, hwregId);
2050  ScalarRegI32 simm32 = extData.imm_u32;
2051  hwreg.read();
2052 
2053  // Store value from SIMM32 to part of the hardware register.
2054  ScalarRegU32 mask = (((1U << size) - 1U) << offset);
2055  hwreg = ((hwreg.rawData() & ~mask)
2056  | ((simm32 << offset) & mask));
2057  hwreg.write();
2058 
2059  // set MODE register to control the behavior of single precision
2060  // floating-point numbers: denormal mode or round mode
2061  if (hwregId==1 && size==2
2062  && (offset==4 || offset==0)) {
2063  warn_once("Be cautious that s_setreg_imm32_b32 has no real effect "
2064  "on FP modes: %s\n", gpuDynInst->disassemble());
2065  return;
2066  }
2067 
2068  // panic if not changing modes of single-precision FPs
2070  } // execute
2071  // --- Inst_SOP1__S_MOV_B32 class methods ---
2072 
2074  : Inst_SOP1(iFmt, "s_mov_b32")
2075  {
2076  setFlag(ALU);
2077  } // Inst_SOP1__S_MOV_B32
2078 
2080  {
2081  } // ~Inst_SOP1__S_MOV_B32
2082 
2083  // --- description from .arch file ---
2084  // D.u = S0.u.
2085  void
2087  {
2088  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2089  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2090 
2091  src.read();
2092 
2093  sdst = src.rawData();
2094 
2095  sdst.write();
2096  } // execute
2097  // --- Inst_SOP1__S_MOV_B64 class methods ---
2098 
2100  : Inst_SOP1(iFmt, "s_mov_b64")
2101  {
2102  setFlag(ALU);
2103  } // Inst_SOP1__S_MOV_B64
2104 
2106  {
2107  } // ~Inst_SOP1__S_MOV_B64
2108 
2109  // --- description from .arch file ---
2110  // D.u64 = S0.u64.
2111  void
2113  {
2114  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2115  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2116 
2117  src.read();
2118 
2119  sdst = src.rawData();
2120 
2121  sdst.write();
2122  } // execute
2123  // --- Inst_SOP1__S_CMOV_B32 class methods ---
2124 
2126  : Inst_SOP1(iFmt, "s_cmov_b32")
2127  {
2128  setFlag(ALU);
2129  } // Inst_SOP1__S_CMOV_B32
2130 
2132  {
2133  } // ~Inst_SOP1__S_CMOV_B32
2134 
2135  // --- description from .arch file ---
2136  // (SCC) then D.u = S0.u;
2137  // else NOP.
2138  // Conditional move.
2139  void
2141  {
2142  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2143  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2144  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2145 
2146  src.read();
2147  scc.read();
2148 
2149  if (scc.rawData()) {
2150  sdst = src.rawData();
2151  sdst.write();
2152  }
2153  } // execute
2154  // --- Inst_SOP1__S_CMOV_B64 class methods ---
2155 
2157  : Inst_SOP1(iFmt, "s_cmov_b64")
2158  {
2159  setFlag(ALU);
2160  } // Inst_SOP1__S_CMOV_B64
2161 
2163  {
2164  } // ~Inst_SOP1__S_CMOV_B64
2165 
2166  // --- description from .arch file ---
2167  // if(SCC) then D.u64 = S0.u64;
2168  // else NOP.
2169  // Conditional move.
2170  void
2172  {
2173  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2174  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2175  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2176 
2177  src.read();
2178  scc.read();
2179 
2180  if (scc.rawData()) {
2181  sdst = src.rawData();
2182  sdst.write();
2183  }
2184  } // execute
2185  // --- Inst_SOP1__S_NOT_B32 class methods ---
2186 
2188  : Inst_SOP1(iFmt, "s_not_b32")
2189  {
2190  setFlag(ALU);
2191  } // Inst_SOP1__S_NOT_B32
2192 
2194  {
2195  } // ~Inst_SOP1__S_NOT_B32
2196 
2197  // --- description from .arch file ---
2198  // D.u = ~S0.u;
2199  // SCC = 1 if result is non-zero.
2200  // Bitwise negation.
2201  void
2203  {
2204  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2205  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2206  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2207 
2208  src.read();
2209 
2210  sdst = ~src.rawData();
2211 
2212  scc = sdst.rawData() ? 1 : 0;
2213 
2214  sdst.write();
2215  scc.write();
2216  } // execute
2217  // --- Inst_SOP1__S_NOT_B64 class methods ---
2218 
2220  : Inst_SOP1(iFmt, "s_not_b64")
2221  {
2222  setFlag(ALU);
2223  } // Inst_SOP1__S_NOT_B64
2224 
2226  {
2227  } // ~Inst_SOP1__S_NOT_B64
2228 
2229  // --- description from .arch file ---
2230  // D.u64 = ~S0.u64;
2231  // SCC = 1 if result is non-zero.
2232  // Bitwise negation.
2233  void
2235  {
2236  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2237  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2238  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2239 
2240  src.read();
2241 
2242  sdst = ~src.rawData();
2243  scc = sdst.rawData() ? 1 : 0;
2244 
2245  sdst.write();
2246  scc.write();
2247  } // execute
2248  // --- Inst_SOP1__S_WQM_B32 class methods ---
2249 
2251  : Inst_SOP1(iFmt, "s_wqm_b32")
2252  {
2253  setFlag(ALU);
2254  } // Inst_SOP1__S_WQM_B32
2255 
2257  {
2258  } // ~Inst_SOP1__S_WQM_B32
2259 
2260  // --- description from .arch file ---
2261  // D[i] = (S0[(i & ~3):(i | 3)] != 0);
2262  // Computes whole quad mode for an active/valid mask.
2263  // SCC = 1 if result is non-zero.
2264  void
2266  {
2267  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2268  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2269  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2270 
2271  src.read();
2272 
2273  sdst = wholeQuadMode(src.rawData());
2274  scc = sdst.rawData() ? 1 : 0;
2275 
2276  sdst.write();
2277  scc.write();
2278  } // execute
2279  // --- Inst_SOP1__S_WQM_B64 class methods ---
2280 
2282  : Inst_SOP1(iFmt, "s_wqm_b64")
2283  {
2284  setFlag(ALU);
2285  } // Inst_SOP1__S_WQM_B64
2286 
2288  {
2289  } // ~Inst_SOP1__S_WQM_B64
2290 
2291  // --- description from .arch file ---
2292  // D[i] = (S0[(i & ~3):(i | 3)] != 0);
2293  // Computes whole quad mode for an active/valid mask.
2294  // SCC = 1 if result is non-zero.
2295  void
2297  {
2298  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2299  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2300  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2301 
2302  src.read();
2303 
2304  sdst = wholeQuadMode(src.rawData());
2305  scc = sdst.rawData() ? 1 : 0;
2306 
2307  sdst.write();
2308  scc.write();
2309  } // execute
2310  // --- Inst_SOP1__S_BREV_B32 class methods ---
2311 
2313  : Inst_SOP1(iFmt, "s_brev_b32")
2314  {
2315  setFlag(ALU);
2316  } // Inst_SOP1__S_BREV_B32
2317 
2319  {
2320  } // ~Inst_SOP1__S_BREV_B32
2321 
2322  // --- description from .arch file ---
2323  // D.u[31:0] = S0.u[0:31] (reverse bits).
2324  void
2326  {
2327  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2328  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2329 
2330  src.read();
2331 
2332  sdst = reverseBits(src.rawData());
2333 
2334  sdst.write();
2335  } // execute
2336  // --- Inst_SOP1__S_BREV_B64 class methods ---
2337 
2339  : Inst_SOP1(iFmt, "s_brev_b64")
2340  {
2341  setFlag(ALU);
2342  } // Inst_SOP1__S_BREV_B64
2343 
2345  {
2346  } // ~Inst_SOP1__S_BREV_B64
2347 
2348  // --- description from .arch file ---
2349  // D.u64[63:0] = S0.u64[0:63] (reverse bits).
2350  void
2352  {
2353  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2354  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2355 
2356  src.read();
2357 
2358  sdst = reverseBits(src.rawData());
2359 
2360  sdst.write();
2361  } // execute
2362  // --- Inst_SOP1__S_BCNT0_I32_B32 class methods ---
2363 
2365  : Inst_SOP1(iFmt, "s_bcnt0_i32_b32")
2366  {
2367  setFlag(ALU);
2368  } // Inst_SOP1__S_BCNT0_I32_B32
2369 
2371  {
2372  } // ~Inst_SOP1__S_BCNT0_I32_B32
2373 
2374  // --- description from .arch file ---
2375  // D.i = CountZeroBits(S0.u);
2376  // SCC = 1 if result is non-zero.
2377  void
2379  {
2380  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2381  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2382  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2383 
2384  src.read();
2385 
2386  sdst = countZeroBits(src.rawData());
2387  scc = sdst.rawData() ? 1 : 0;
2388 
2389  sdst.write();
2390  scc.write();
2391  } // execute
2392  // --- Inst_SOP1__S_BCNT0_I32_B64 class methods ---
2393 
2395  : Inst_SOP1(iFmt, "s_bcnt0_i32_b64")
2396  {
2397  setFlag(ALU);
2398  } // Inst_SOP1__S_BCNT0_I32_B64
2399 
2401  {
2402  } // ~Inst_SOP1__S_BCNT0_I32_B64
2403 
2404  // --- description from .arch file ---
2405  // D.i = CountZeroBits(S0.u64);
2406  // SCC = 1 if result is non-zero.
2407  void
2409  {
2410  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2411  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2412  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2413 
2414  src.read();
2415 
2416  sdst = countZeroBits(src.rawData());
2417  scc = sdst.rawData() ? 1 : 0;
2418 
2419  sdst.write();
2420  scc.write();
2421  } // execute
2422  // --- Inst_SOP1__S_BCNT1_I32_B32 class methods ---
2423 
2425  : Inst_SOP1(iFmt, "s_bcnt1_i32_b32")
2426  {
2427  setFlag(ALU);
2428  } // Inst_SOP1__S_BCNT1_I32_B32
2429 
2431  {
2432  } // ~Inst_SOP1__S_BCNT1_I32_B32
2433 
2434  // --- description from .arch file ---
2435  // D.i = CountOneBits(S0.u);
2436  // SCC = 1 if result is non-zero.
2437  void
2439  {
2440  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2441  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2442  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2443 
2444  src.read();
2445 
2446  sdst = popCount(src.rawData());
2447  scc = sdst.rawData() ? 1 : 0;
2448 
2449  sdst.write();
2450  scc.write();
2451  } // execute
2452  // --- Inst_SOP1__S_BCNT1_I32_B64 class methods ---
2453 
2455  : Inst_SOP1(iFmt, "s_bcnt1_i32_b64")
2456  {
2457  setFlag(ALU);
2458  } // Inst_SOP1__S_BCNT1_I32_B64
2459 
2461  {
2462  } // ~Inst_SOP1__S_BCNT1_I32_B64
2463 
2464  // --- description from .arch file ---
2465  // D.i = CountOneBits(S0.u64);
2466  // SCC = 1 if result is non-zero.
2467  void
2469  {
2470  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2471  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2472  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2473 
2474  src.read();
2475 
2476  sdst = popCount(src.rawData());
2477  scc = sdst.rawData() ? 1 : 0;
2478 
2479  sdst.write();
2480  scc.write();
2481  } // execute
2482  // --- Inst_SOP1__S_FF0_I32_B32 class methods ---
2483 
2485  : Inst_SOP1(iFmt, "s_ff0_i32_b32")
2486  {
2487  setFlag(ALU);
2488  } // Inst_SOP1__S_FF0_I32_B32
2489 
2491  {
2492  } // ~Inst_SOP1__S_FF0_I32_B32
2493 
2494  // --- description from .arch file ---
2495  // D.i = FindFirstZero(S0.u);
2496  // If no zeros are found, return -1.
2497  // Returns the bit position of the first zero from the LSB.
2498  void
2500  {
2501  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2502  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2503 
2504  src.read();
2505 
2506  sdst = findFirstZero(src.rawData());
2507 
2508  sdst.write();
2509  } // execute
2510  // --- Inst_SOP1__S_FF0_I32_B64 class methods ---
2511 
2513  : Inst_SOP1(iFmt, "s_ff0_i32_b64")
2514  {
2515  setFlag(ALU);
2516  } // Inst_SOP1__S_FF0_I32_B64
2517 
2519  {
2520  } // ~Inst_SOP1__S_FF0_I32_B64
2521 
2522  // --- description from .arch file ---
2523  // D.i = FindFirstZero(S0.u64);
2524  // If no zeros are found, return -1.
2525  // Returns the bit position of the first zero from the LSB.
2526  void
2528  {
2529  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2530  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2531 
2532  src.read();
2533 
2534  sdst = findFirstZero(src.rawData());
2535 
2536  sdst.write();
2537  } // execute
2538  // --- Inst_SOP1__S_FF1_I32_B32 class methods ---
2539 
2541  : Inst_SOP1(iFmt, "s_ff1_i32_b32")
2542  {
2543  setFlag(ALU);
2544  } // Inst_SOP1__S_FF1_I32_B32
2545 
2547  {
2548  } // ~Inst_SOP1__S_FF1_I32_B32
2549 
2550  // --- description from .arch file ---
2551  // D.i = FindFirstOne(S0.u);
2552  // If no ones are found, return -1.
2553  // Returns the bit position of the first one from the LSB.
2554  void
2556  {
2557  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2558  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2559 
2560  src.read();
2561 
2562  sdst = findFirstOne(src.rawData());
2563 
2564  sdst.write();
2565  } // execute
2566  // --- Inst_SOP1__S_FF1_I32_B64 class methods ---
2567 
2569  : Inst_SOP1(iFmt, "s_ff1_i32_b64")
2570  {
2571  setFlag(ALU);
2572  } // Inst_SOP1__S_FF1_I32_B64
2573 
2575  {
2576  } // ~Inst_SOP1__S_FF1_I32_B64
2577 
2578  // --- description from .arch file ---
2579  // D.i = FindFirstOne(S0.u64);
2580  // If no ones are found, return -1.
2581  // Returns the bit position of the first one from the LSB.
2582  void
2584  {
2585  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2586  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2587 
2588  src.read();
2589 
2590  sdst = findFirstOne(src.rawData());
2591 
2592  sdst.write();
2593  } // execute
2594  // --- Inst_SOP1__S_FLBIT_I32_B32 class methods ---
2595 
2597  : Inst_SOP1(iFmt, "s_flbit_i32_b32")
2598  {
2599  setFlag(ALU);
2600  } // Inst_SOP1__S_FLBIT_I32_B32
2601 
2603  {
2604  } // ~Inst_SOP1__S_FLBIT_I32_B32
2605 
2606  // --- description from .arch file ---
2607  // D.i = FindFirstOne(S0.u);
2608  // If no ones are found, return -1.
2609  // Counts how many zeros before the first one starting from the MSB.
2610  void
2612  {
2613  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2614  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2615 
2616  src.read();
2617 
2618  sdst = countZeroBitsMsb(src.rawData());
2619 
2620  sdst.write();
2621  } // execute
2622  // --- Inst_SOP1__S_FLBIT_I32_B64 class methods ---
2623 
2625  : Inst_SOP1(iFmt, "s_flbit_i32_b64")
2626  {
2627  setFlag(ALU);
2628  } // Inst_SOP1__S_FLBIT_I32_B64
2629 
2631  {
2632  } // ~Inst_SOP1__S_FLBIT_I32_B64
2633 
2634  // --- description from .arch file ---
2635  // D.i = FindFirstOne(S0.u64);
2636  // If no ones are found, return -1.
2637  // Counts how many zeros before the first one starting from the MSB.
2638  void
2640  {
2641  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2642  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2643 
2644  src.read();
2645 
2646  sdst = countZeroBitsMsb(src.rawData());
2647 
2648  sdst.write();
2649  } // execute
2650  // --- Inst_SOP1__S_FLBIT_I32 class methods ---
2651 
2653  : Inst_SOP1(iFmt, "s_flbit_i32")
2654  {
2655  setFlag(ALU);
2656  } // Inst_SOP1__S_FLBIT_I32
2657 
2659  {
2660  } // ~Inst_SOP1__S_FLBIT_I32
2661 
2662  // --- description from .arch file ---
2663  // D.i = FirstOppositeSignBit(S0.i);
2664  // If S0.i == 0 or S0.i == -1 (all bits are the same), return -1.
2665  // Counts how many bits in a row (from MSB to LSB) are the same as the
2666  // sign bit.
2667  void
2669  {
2670  ConstScalarOperandI32 src(gpuDynInst, instData.SSRC0);
2671  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2672 
2673  src.read();
2674 
2675  sdst = firstOppositeSignBit(src.rawData());
2676 
2677  sdst.write();
2678  } // execute
2679  // --- Inst_SOP1__S_FLBIT_I32_I64 class methods ---
2680 
2682  : Inst_SOP1(iFmt, "s_flbit_i32_i64")
2683  {
2684  setFlag(ALU);
2685  } // Inst_SOP1__S_FLBIT_I32_I64
2686 
2688  {
2689  } // ~Inst_SOP1__S_FLBIT_I32_I64
2690 
2691  // --- description from .arch file ---
2692  // D.i = FirstOppositeSignBit(S0.i64);
2693  // If S0.i == 0 or S0.i == -1 (all bits are the same), return -1.
2694  // Counts how many bits in a row (from MSB to LSB) are the same as the
2695  // sign bit.
2696  void
2698  {
2699  ConstScalarOperandI64 src(gpuDynInst, instData.SSRC0);
2700  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2701 
2702  src.read();
2703 
2704  sdst = firstOppositeSignBit(src.rawData());
2705 
2706  sdst.write();
2707  } // execute
2708  // --- Inst_SOP1__S_SEXT_I32_I8 class methods ---
2709 
2711  : Inst_SOP1(iFmt, "s_sext_i32_i8")
2712  {
2713  setFlag(ALU);
2714  } // Inst_SOP1__S_SEXT_I32_I8
2715 
2717  {
2718  } // ~Inst_SOP1__S_SEXT_I32_I8
2719 
2720  // --- description from .arch file ---
2721  // D.i = signext(S0.i[7:0]) (sign extension).
2722  void
2724  {
2725  ConstScalarOperandI32 src(gpuDynInst, instData.SSRC0);
2726  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2727 
2728  src.read();
2729 
2730  sdst = sext<std::numeric_limits<ScalarRegI8>::digits>(
2731  bits(src.rawData(), 7, 0));
2732 
2733  sdst.write();
2734  } // execute
2735  // --- Inst_SOP1__S_SEXT_I32_I16 class methods ---
2736 
2738  : Inst_SOP1(iFmt, "s_sext_i32_i16")
2739  {
2740  setFlag(ALU);
2741  } // Inst_SOP1__S_SEXT_I32_I16
2742 
2744  {
2745  } // ~Inst_SOP1__S_SEXT_I32_I16
2746 
2747  // --- description from .arch file ---
2748  // D.i = signext(S0.i[15:0]) (sign extension).
2749  void
2751  {
2752  ConstScalarOperandI32 src(gpuDynInst, instData.SSRC0);
2753  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2754 
2755  src.read();
2756 
2757  sdst = sext<std::numeric_limits<ScalarRegI16>::digits>(
2758  bits(src.rawData(), 15, 0));
2759 
2760  sdst.write();
2761  } // execute
2762  // --- Inst_SOP1__S_BITSET0_B32 class methods ---
2763 
2765  : Inst_SOP1(iFmt, "s_bitset0_b32")
2766  {
2767  setFlag(ALU);
2768  } // Inst_SOP1__S_BITSET0_B32
2769 
2771  {
2772  } // ~Inst_SOP1__S_BITSET0_B32
2773 
2774  // --- description from .arch file ---
2775  // D.u[S0.u[4:0]] = 0.
2776  void
2778  {
2779  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2780  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2781 
2782  src.read();
2783 
2784  sdst.setBit(bits(src.rawData(), 4, 0), 0);
2785 
2786  sdst.write();
2787  } // execute
2788  // --- Inst_SOP1__S_BITSET0_B64 class methods ---
2789 
2791  : Inst_SOP1(iFmt, "s_bitset0_b64")
2792  {
2793  setFlag(ALU);
2794  } // Inst_SOP1__S_BITSET0_B64
2795 
2797  {
2798  } // ~Inst_SOP1__S_BITSET0_B64
2799 
2800  // --- description from .arch file ---
2801  // D.u64[S0.u[5:0]] = 0.
2802  void
2804  {
2805  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2806  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2807 
2808  src.read();
2809 
2810  sdst.setBit(bits(src.rawData(), 5, 0), 0);
2811 
2812  sdst.write();
2813  } // execute
2814  // --- Inst_SOP1__S_BITSET1_B32 class methods ---
2815 
2817  : Inst_SOP1(iFmt, "s_bitset1_b32")
2818  {
2819  setFlag(ALU);
2820  } // Inst_SOP1__S_BITSET1_B32
2821 
2823  {
2824  } // ~Inst_SOP1__S_BITSET1_B32
2825 
2826  // --- description from .arch file ---
2827  // D.u[S0.u[4:0]] = 1.
2828  void
2830  {
2831  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2832  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2833 
2834  src.read();
2835 
2836  sdst.setBit(bits(src.rawData(), 4, 0), 1);
2837 
2838  sdst.write();
2839  } // execute
2840  // --- Inst_SOP1__S_BITSET1_B64 class methods ---
2841 
2843  : Inst_SOP1(iFmt, "s_bitset1_b64")
2844  {
2845  setFlag(ALU);
2846  } // Inst_SOP1__S_BITSET1_B64
2847 
2849  {
2850  } // ~Inst_SOP1__S_BITSET1_B64
2851 
2852  // --- description from .arch file ---
2853  // D.u64[S0.u[5:0]] = 1.
2854  void
2856  {
2857  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2858  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2859 
2860  src.read();
2861 
2862  sdst.setBit(bits(src.rawData(), 5, 0), 1);
2863 
2864  sdst.write();
2865  } // execute
2866  // --- Inst_SOP1__S_GETPC_B64 class methods ---
2867 
2869  : Inst_SOP1(iFmt, "s_getpc_b64")
2870  {
2871  setFlag(ALU);
2872  } // Inst_SOP1__S_GETPC_B64
2873 
2875  {
2876  } // ~Inst_SOP1__S_GETPC_B64
2877 
2878  // --- description from .arch file ---
2879  // D.u64 = PC + 4.
2880  // Destination receives the byte address of the next instruction.
2881  void
2883  {
2884  Addr pc = gpuDynInst->pc();
2885  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2886 
2887  sdst = pc + 4;
2888 
2889  sdst.write();
2890  } // execute
2891  // --- Inst_SOP1__S_SETPC_B64 class methods ---
2892 
2894  : Inst_SOP1(iFmt, "s_setpc_b64")
2895  {
2896  setFlag(ALU);
2897  } // Inst_SOP1__S_SETPC_B64
2898 
2900  {
2901  } // ~Inst_SOP1__S_SETPC_B64
2902 
2903  // --- description from .arch file ---
2904  // PC = S0.u64.
2905  // S0.u64 is a byte address of the instruction to jump to.
2906  void
2908  {
2909  Wavefront *wf = gpuDynInst->wavefront();
2910  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2911 
2912  src.read();
2913 
2914  wf->pc(src.rawData());
2915  } // execute
2916  // --- Inst_SOP1__S_SWAPPC_B64 class methods ---
2917 
2919  : Inst_SOP1(iFmt, "s_swappc_b64")
2920  {
2921  setFlag(ALU);
2922  } // Inst_SOP1__S_SWAPPC_B64
2923 
2925  {
2926  } // ~Inst_SOP1__S_SWAPPC_B64
2927 
2928  // --- description from .arch file ---
2929  // D.u64 = PC + 4; PC = S0.u64.
2930  // S0.u64 is a byte address of the instruction to jump to.
2931  void
2933  {
2934  Wavefront *wf = gpuDynInst->wavefront();
2935  Addr pc = gpuDynInst->pc();
2936  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2937  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2938 
2939  src.read();
2940 
2941  sdst = pc + 4;
2942 
2943  wf->pc(src.rawData());
2944  sdst.write();
2945  } // execute
2946  // --- Inst_SOP1__S_RFE_B64 class methods ---
2947 
2949  : Inst_SOP1(iFmt, "s_rfe_b64")
2950  {
2951  } // Inst_SOP1__S_RFE_B64
2952 
2954  {
2955  } // ~Inst_SOP1__S_RFE_B64
2956 
2957  // --- description from .arch file ---
2958  // PRIV = 0;
2959  // PC = S0.u64.
2960  // Return from exception handler and continue.
2961  // This instruction may only be used within a trap handler.
2962  void
2964  {
2966  } // execute
2967  // --- Inst_SOP1__S_AND_SAVEEXEC_B64 class methods ---
2968 
2970  InFmt_SOP1 *iFmt)
2971  : Inst_SOP1(iFmt, "s_and_saveexec_b64")
2972  {
2973  setFlag(ALU);
2974  setFlag(ReadsExec);
2975  setFlag(WritesExec);
2976  } // Inst_SOP1__S_AND_SAVEEXEC_B64
2977 
2979  {
2980  } // ~Inst_SOP1__S_AND_SAVEEXEC_B64
2981 
2982  // --- description from .arch file ---
2983  // D.u64 = EXEC;
2984  // EXEC = S0.u64 & EXEC;
2985  // SCC = 1 if the new value of EXEC is non-zero.
2986  void
2988  {
2989  Wavefront *wf = gpuDynInst->wavefront();
2990  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2991  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2992  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2993 
2994  src.read();
2995 
2996  sdst = wf->execMask().to_ullong();
2997  wf->execMask() = src.rawData() & wf->execMask().to_ullong();
2998  scc = wf->execMask().any() ? 1 : 0;
2999 
3000  sdst.write();
3001  scc.write();
3002  } // execute
3003  // --- Inst_SOP1__S_OR_SAVEEXEC_B64 class methods ---
3004 
3006  InFmt_SOP1 *iFmt)
3007  : Inst_SOP1(iFmt, "s_or_saveexec_b64")
3008  {
3009  setFlag(ALU);
3010  setFlag(ReadsExec);
3011  setFlag(WritesExec);
3012  } // Inst_SOP1__S_OR_SAVEEXEC_B64
3013 
3015  {
3016  } // ~Inst_SOP1__S_OR_SAVEEXEC_B64
3017 
3018  // --- description from .arch file ---
3019  // D.u64 = EXEC;
3020  // EXEC = S0.u64 | EXEC;
3021  // SCC = 1 if the new value of EXEC is non-zero.
3022  void
3024  {
3025  Wavefront *wf = gpuDynInst->wavefront();
3026  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3027  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3028  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3029 
3030  src.read();
3031 
3032  sdst = wf->execMask().to_ullong();
3033  wf->execMask() = src.rawData() | wf->execMask().to_ullong();
3034  scc = wf->execMask().any() ? 1 : 0;
3035 
3036  sdst.write();
3037  scc.write();
3038  } // execute
3039  // --- Inst_SOP1__S_XOR_SAVEEXEC_B64 class methods ---
3040 
3042  InFmt_SOP1 *iFmt)
3043  : Inst_SOP1(iFmt, "s_xor_saveexec_b64")
3044  {
3045  setFlag(ALU);
3046  setFlag(ReadsExec);
3047  setFlag(WritesExec);
3048  } // Inst_SOP1__S_XOR_SAVEEXEC_B64
3049 
3051  {
3052  } // ~Inst_SOP1__S_XOR_SAVEEXEC_B64
3053 
3054  // --- description from .arch file ---
3055  // D.u64 = EXEC;
3056  // EXEC = S0.u64 ^ EXEC;
3057  // SCC = 1 if the new value of EXEC is non-zero.
3058  void
3060  {
3061  Wavefront *wf = gpuDynInst->wavefront();
3062  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3063  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3064  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3065 
3066  src.read();
3067 
3068  sdst = wf->execMask().to_ullong();
3069  wf->execMask() = src.rawData() ^ wf->execMask().to_ullong();
3070  scc = wf->execMask().any() ? 1 : 0;
3071 
3072  sdst.write();
3073  scc.write();
3074  } // execute
3075  // --- Inst_SOP1__S_ANDN2_SAVEEXEC_B64 class methods ---
3076 
3078  InFmt_SOP1 *iFmt)
3079  : Inst_SOP1(iFmt, "s_andn2_saveexec_b64")
3080  {
3081  setFlag(ALU);
3082  setFlag(ReadsExec);
3083  setFlag(WritesExec);
3084  } // Inst_SOP1__S_ANDN2_SAVEEXEC_B64
3085 
3087  {
3088  } // ~Inst_SOP1__S_ANDN2_SAVEEXEC_B64
3089 
3090  // --- description from .arch file ---
3091  // D.u64 = EXEC;
3092  // EXEC = S0.u64 & ~EXEC;
3093  // SCC = 1 if the new value of EXEC is non-zero.
3094  void
3096  {
3097  Wavefront *wf = gpuDynInst->wavefront();
3098  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3099  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3100  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3101 
3102  src.read();
3103 
3104  sdst = wf->execMask().to_ullong();
3105  wf->execMask() = src.rawData() &~ wf->execMask().to_ullong();
3106  scc = wf->execMask().any() ? 1 : 0;
3107 
3108  sdst.write();
3109  scc.write();
3110  } // execute
3111  // --- Inst_SOP1__S_ORN2_SAVEEXEC_B64 class methods ---
3112 
3114  InFmt_SOP1 *iFmt)
3115  : Inst_SOP1(iFmt, "s_orn2_saveexec_b64")
3116  {
3117  setFlag(ALU);
3118  setFlag(ReadsExec);
3119  setFlag(WritesExec);
3120  } // Inst_SOP1__S_ORN2_SAVEEXEC_B64
3121 
3123  {
3124  } // ~Inst_SOP1__S_ORN2_SAVEEXEC_B64
3125 
3126  // --- description from .arch file ---
3127  // D.u64 = EXEC;
3128  // EXEC = S0.u64 | ~EXEC;
3129  // SCC = 1 if the new value of EXEC is non-zero.
3130  void
3132  {
3133  Wavefront *wf = gpuDynInst->wavefront();
3134  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3135  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3136  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3137 
3138  src.read();
3139 
3140  sdst = wf->execMask().to_ullong();
3141  wf->execMask() = src.rawData() |~ wf->execMask().to_ullong();
3142  scc = wf->execMask().any() ? 1 : 0;
3143 
3144  sdst.write();
3145  scc.write();
3146  } // execute
3147  // --- Inst_SOP1__S_NAND_SAVEEXEC_B64 class methods ---
3148 
3150  InFmt_SOP1 *iFmt)
3151  : Inst_SOP1(iFmt, "s_nand_saveexec_b64")
3152  {
3153  setFlag(ALU);
3154  setFlag(ReadsExec);
3155  setFlag(WritesExec);
3156  } // Inst_SOP1__S_NAND_SAVEEXEC_B64
3157 
3159  {
3160  } // ~Inst_SOP1__S_NAND_SAVEEXEC_B64
3161 
3162  // --- description from .arch file ---
3163  // D.u64 = EXEC;
3164  // EXEC = ~(S0.u64 & EXEC);
3165  // SCC = 1 if the new value of EXEC is non-zero.
3166  void
3168  {
3169  Wavefront *wf = gpuDynInst->wavefront();
3170  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3171  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3172  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3173 
3174  src.read();
3175 
3176  sdst = wf->execMask().to_ullong();
3177  wf->execMask() = ~(src.rawData() & wf->execMask().to_ullong());
3178  scc = wf->execMask().any() ? 1 : 0;
3179 
3180  sdst.write();
3181  scc.write();
3182  } // execute
3183  // --- Inst_SOP1__S_NOR_SAVEEXEC_B64 class methods ---
3184 
3186  InFmt_SOP1 *iFmt)
3187  : Inst_SOP1(iFmt, "s_nor_saveexec_b64")
3188  {
3189  setFlag(ALU);
3190  setFlag(ReadsExec);
3191  setFlag(WritesExec);
3192  } // Inst_SOP1__S_NOR_SAVEEXEC_B64
3193 
3195  {
3196  } // ~Inst_SOP1__S_NOR_SAVEEXEC_B64
3197 
3198  // --- description from .arch file ---
3199  // D.u64 = EXEC;
3200  // EXEC = ~(S0.u64 | EXEC);
3201  // SCC = 1 if the new value of EXEC is non-zero.
3202  void
3204  {
3205  Wavefront *wf = gpuDynInst->wavefront();
3206  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3207  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3208  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3209 
3210  src.read();
3211 
3212  sdst = wf->execMask().to_ullong();
3213  wf->execMask() = ~(src.rawData() | wf->execMask().to_ullong());
3214  scc = wf->execMask().any() ? 1 : 0;
3215 
3216  sdst.write();
3217  scc.write();
3218  } // execute
3219  // --- Inst_SOP1__S_XNOR_SAVEEXEC_B64 class methods ---
3220 
3222  InFmt_SOP1 *iFmt)
3223  : Inst_SOP1(iFmt, "s_xnor_saveexec_b64")
3224  {
3225  setFlag(ALU);
3226  setFlag(ReadsExec);
3227  setFlag(WritesExec);
3228  } // Inst_SOP1__S_XNOR_SAVEEXEC_B64
3229 
3231  {
3232  } // ~Inst_SOP1__S_XNOR_SAVEEXEC_B64
3233 
3234  // --- description from .arch file ---
3235  // D.u64 = EXEC;
3236  // EXEC = ~(S0.u64 ^ EXEC);
3237  // SCC = 1 if the new value of EXEC is non-zero.
3238  void
3240  {
3241  Wavefront *wf = gpuDynInst->wavefront();
3242  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3243  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3244  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3245 
3246  src.read();
3247 
3248  sdst = wf->execMask().to_ullong();
3249  wf->execMask() = ~(src.rawData() ^ wf->execMask().to_ullong());
3250  scc = wf->execMask().any() ? 1 : 0;
3251 
3252  sdst.write();
3253  scc.write();
3254  } // execute
3255  // --- Inst_SOP1__S_QUADMASK_B32 class methods ---
3256 
3258  : Inst_SOP1(iFmt, "s_quadmask_b32")
3259  {
3260  setFlag(ALU);
3261  } // Inst_SOP1__S_QUADMASK_B32
3262 
3264  {
3265  } // ~Inst_SOP1__S_QUADMASK_B32
3266 
3267  // --- description from .arch file ---
3268  // D.u = QuadMask(S0.u):
3269  // D[0] = OR(S0[3:0]), D[1] = OR(S0[7:4]) ... D[31:8] = 0;
3270  // SCC = 1 if result is non-zero.
3271  void
3273  {
3274  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
3275  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
3276  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3277 
3278  src.read();
3279 
3280  sdst = quadMask(src.rawData());
3281  scc = sdst.rawData() ? 1 : 0;
3282 
3283  sdst.write();
3284  scc.write();
3285  } // execute
3286  // --- Inst_SOP1__S_QUADMASK_B64 class methods ---
3287 
3289  : Inst_SOP1(iFmt, "s_quadmask_b64")
3290  {
3291  setFlag(ALU);
3292  } // Inst_SOP1__S_QUADMASK_B64
3293 
3295  {
3296  } // ~Inst_SOP1__S_QUADMASK_B64
3297 
3298  // --- description from .arch file ---
3299  // D.u64 = QuadMask(S0.u64):
3300  // D[0] = OR(S0[3:0]), D[1] = OR(S0[7:4]) ... D[63:16] = 0;
3301  // SCC = 1 if result is non-zero.
3302  void
3304  {
3305  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3306  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3307  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3308 
3309  src.read();
3310 
3311  sdst = quadMask(src.rawData());
3312  scc = sdst.rawData() ? 1 : 0;
3313 
3314  sdst.write();
3315  scc.write();
3316  } // execute
3317  // --- Inst_SOP1__S_MOVRELS_B32 class methods ---
3318 
3320  : Inst_SOP1(iFmt, "s_movrels_b32")
3321  {
3322  setFlag(ALU);
3323  } // Inst_SOP1__S_MOVRELS_B32
3324 
3326  {
3327  } // ~Inst_SOP1__S_MOVRELS_B32
3328 
3329  // --- description from .arch file ---
3330  // D.u = SGPR[S0.u + M0.u].u (move from relative source).
3331  void
3333  {
3334  ConstScalarOperandU32 m0(gpuDynInst, REG_M0);
3335  m0.read();
3336  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0 + m0.rawData());
3337  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
3338 
3339  src.read();
3340 
3341  sdst = src.rawData();
3342 
3343  sdst.write();
3344  } // execute
3345  // --- Inst_SOP1__S_MOVRELS_B64 class methods ---
3346 
3348  : Inst_SOP1(iFmt, "s_movrels_b64")
3349  {
3350  setFlag(ALU);
3351  } // Inst_SOP1__S_MOVRELS_B64
3352 
3354  {
3355  } // ~Inst_SOP1__S_MOVRELS_B64
3356 
3357  // --- description from .arch file ---
3358  // D.u64 = SGPR[S0.u + M0.u].u64 (move from relative source).
3359  // The index in M0.u must be even for this operation.
3360  void
3362  {
3363  ConstScalarOperandU32 m0(gpuDynInst, REG_M0);
3364  m0.read();
3365  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0 + m0.rawData());
3366  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3367 
3368  src.read();
3369 
3370  sdst = src.rawData();
3371 
3372  sdst.write();
3373  } // execute
3374  // --- Inst_SOP1__S_MOVRELD_B32 class methods ---
3375 
3377  : Inst_SOP1(iFmt, "s_movreld_b32")
3378  {
3379  setFlag(ALU);
3380  } // Inst_SOP1__S_MOVRELD_B32
3381 
3383  {
3384  } // ~Inst_SOP1__S_MOVRELD_B32
3385 
3386  // --- description from .arch file ---
3387  // SGPR[D.u + M0.u].u = S0.u (move to relative destination).
3388  void
3390  {
3391  ConstScalarOperandU32 m0(gpuDynInst, REG_M0);
3392  m0.read();
3393  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
3394  ScalarOperandU32 sdst(gpuDynInst, instData.SDST + m0.rawData());
3395 
3396  src.read();
3397 
3398  sdst = src.rawData();
3399 
3400  sdst.write();
3401  } // execute
3402  // --- Inst_SOP1__S_MOVRELD_B64 class methods ---
3403 
3405  : Inst_SOP1(iFmt, "s_movreld_b64")
3406  {
3407  setFlag(ALU);
3408  } // Inst_SOP1__S_MOVRELD_B64
3409 
3411  {
3412  } // ~Inst_SOP1__S_MOVRELD_B64
3413 
3414  // --- description from .arch file ---
3415  // SGPR[D.u + M0.u].u64 = S0.u64 (move to relative destination).
3416  // The index in M0.u must be even for this operation.
3417  void
3419  {
3420  ConstScalarOperandU32 m0(gpuDynInst, REG_M0);
3421  m0.read();
3422  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3423  ScalarOperandU64 sdst(gpuDynInst, instData.SDST + m0.rawData());
3424 
3425  src.read();
3426 
3427  sdst = src.rawData();
3428 
3429  sdst.write();
3430  } // execute
3431  // --- Inst_SOP1__S_CBRANCH_JOIN class methods ---
3432 
3434  : Inst_SOP1(iFmt, "s_cbranch_join")
3435  {
3436  setFlag(CondBranch);
3437  setFlag(WritesExec);
3438  } // Inst_SOP1__S_CBRANCH_JOIN
3439 
3441  {
3442  } // ~Inst_SOP1__S_CBRANCH_JOIN
3443 
3444  // --- description from .arch file ---
3445  // saved_csp = S0.u;
3446  // if(CSP == saved_csp) then
3447  // PC += 4; // Second time to JOIN: continue with program.
3448  // else
3449  // CSP -= 1; // First time to JOIN; jump to other FORK path.
3450  // {PC, EXEC} = SGPR[CSP * 4]; // Read 128 bits from 4 consecutive
3451  // SGPRs.
3452  // end
3453  // Conditional branch join point (end of conditional branch block). S0 is
3454  // saved CSP value.
3455  // See S_CBRANCH_G_FORK and S_CBRANCH_I_FORK for related instructions.
3456  void
3458  {
3460  } // execute
3461  // --- Inst_SOP1__S_ABS_I32 class methods ---
3462 
3464  : Inst_SOP1(iFmt, "s_abs_i32")
3465  {
3466  setFlag(ALU);
3467  } // Inst_SOP1__S_ABS_I32
3468 
3470  {
3471  } // ~Inst_SOP1__S_ABS_I32
3472 
3473  // --- description from .arch file ---
3474  // if(S.i < 0) then D.i = -S.i;
3475  // else D.i = S.i;
3476  // SCC = 1 if result is non-zero.
3477  // Integer absolute value.
3478  void
3480  {
3481  ConstScalarOperandI32 src(gpuDynInst, instData.SSRC0);
3482  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
3483  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3484 
3485  src.read();
3486 
3487  sdst = std::abs(src.rawData());
3488 
3489  scc = sdst.rawData() ? 1 : 0;
3490 
3491  sdst.write();
3492  scc.write();
3493  } // execute
3494  // --- Inst_SOP1__S_MOV_FED_B32 class methods ---
3495 
3497  : Inst_SOP1(iFmt, "s_mov_fed_b32")
3498  {
3499  setFlag(ALU);
3500  } // Inst_SOP1__S_MOV_FED_B32
3501 
3503  {
3504  } // ~Inst_SOP1__S_MOV_FED_B32
3505 
3506  // --- description from .arch file ---
3507  // D.u = S0.u. Introduce an EDC double-detect error on write to the
3508  // destination SGPR.
3509  void
3511  {
3513  } // execute
3514  // --- Inst_SOP1__S_SET_GPR_IDX_IDX class methods ---
3515 
3517  InFmt_SOP1 *iFmt)
3518  : Inst_SOP1(iFmt, "s_set_gpr_idx_idx")
3519  {
3520  } // Inst_SOP1__S_SET_GPR_IDX_IDX
3521 
3523  {
3524  } // ~Inst_SOP1__S_SET_GPR_IDX_IDX
3525 
3526  // --- description from .arch file ---
3527  // M0[7:0] = S0.u[7:0].
3528  // Modify the index used in vector GPR indexing.
3529  void
3531  {
3533  } // execute
3534  // --- Inst_SOPC__S_CMP_EQ_I32 class methods ---
3535 
3537  : Inst_SOPC(iFmt, "s_cmp_eq_i32")
3538  {
3539  setFlag(ALU);
3540  } // Inst_SOPC__S_CMP_EQ_I32
3541 
3543  {
3544  } // ~Inst_SOPC__S_CMP_EQ_I32
3545 
3546  // --- description from .arch file ---
3547  // SCC = (S0.i == S1.i).
3548  void
3550  {
3551  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3552  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3553  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3554 
3555  src0.read();
3556  src1.read();
3557 
3558  scc = (src0.rawData() == src1.rawData()) ? 1 : 0;
3559 
3560  scc.write();
3561  } // execute
3562  // --- Inst_SOPC__S_CMP_LG_I32 class methods ---
3563 
3565  : Inst_SOPC(iFmt, "s_cmp_lg_i32")
3566  {
3567  setFlag(ALU);
3568  } // Inst_SOPC__S_CMP_LG_I32
3569 
3571  {
3572  } // ~Inst_SOPC__S_CMP_LG_I32
3573 
3574  // --- description from .arch file ---
3575  // SCC = (S0.i != S1.i).
3576  void
3578  {
3579  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3580  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3581  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3582 
3583  src0.read();
3584  src1.read();
3585 
3586  scc = (src0.rawData() != src1.rawData()) ? 1 : 0;
3587 
3588  scc.write();
3589  } // execute
3590  // --- Inst_SOPC__S_CMP_GT_I32 class methods ---
3591 
3593  : Inst_SOPC(iFmt, "s_cmp_gt_i32")
3594  {
3595  setFlag(ALU);
3596  } // Inst_SOPC__S_CMP_GT_I32
3597 
3599  {
3600  } // ~Inst_SOPC__S_CMP_GT_I32
3601 
3602  // --- description from .arch file ---
3603  // SCC = (S0.i > S1.i).
3604  void
3606  {
3607  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3608  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3609  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3610 
3611  src0.read();
3612  src1.read();
3613 
3614  scc = (src0.rawData() > src1.rawData()) ? 1 : 0;
3615 
3616  scc.write();
3617  } // execute
3618  // --- Inst_SOPC__S_CMP_GE_I32 class methods ---
3619 
3621  : Inst_SOPC(iFmt, "s_cmp_ge_i32")
3622  {
3623  setFlag(ALU);
3624  } // Inst_SOPC__S_CMP_GE_I32
3625 
3627  {
3628  } // ~Inst_SOPC__S_CMP_GE_I32
3629 
3630  // --- description from .arch file ---
3631  // SCC = (S0.i >= S1.i).
3632  void
3634  {
3635  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3636  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3637  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3638 
3639  src0.read();
3640  src1.read();
3641 
3642  scc = (src0.rawData() >= src1.rawData()) ? 1 : 0;
3643 
3644  scc.write();
3645  } // execute
3646  // --- Inst_SOPC__S_CMP_LT_I32 class methods ---
3647 
3649  : Inst_SOPC(iFmt, "s_cmp_lt_i32")
3650  {
3651  setFlag(ALU);
3652  } // Inst_SOPC__S_CMP_LT_I32
3653 
3655  {
3656  } // ~Inst_SOPC__S_CMP_LT_I32
3657 
3658  // --- description from .arch file ---
3659  // SCC = (S0.i < S1.i).
3660  void
3662  {
3663  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3664  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3665  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3666 
3667  src0.read();
3668  src1.read();
3669 
3670  scc = (src0.rawData() < src1.rawData()) ? 1 : 0;
3671 
3672  scc.write();
3673  } // execute
3674  // --- Inst_SOPC__S_CMP_LE_I32 class methods ---
3675 
3677  : Inst_SOPC(iFmt, "s_cmp_le_i32")
3678  {
3679  setFlag(ALU);
3680  } // Inst_SOPC__S_CMP_LE_I32
3681 
3683  {
3684  } // ~Inst_SOPC__S_CMP_LE_I32
3685 
3686  // --- description from .arch file ---
3687  // SCC = (S0.i <= S1.i).
3688  void
3690  {
3691  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3692  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3693  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3694 
3695  src0.read();
3696  src1.read();
3697 
3698  scc = (src0.rawData() <= src1.rawData()) ? 1 : 0;
3699 
3700  scc.write();
3701  } // execute
3702  // --- Inst_SOPC__S_CMP_EQ_U32 class methods ---
3703 
3705  : Inst_SOPC(iFmt, "s_cmp_eq_u32")
3706  {
3707  setFlag(ALU);
3708  } // Inst_SOPC__S_CMP_EQ_U32
3709 
3711  {
3712  } // ~Inst_SOPC__S_CMP_EQ_U32
3713 
3714  // --- description from .arch file ---
3715  // SCC = (S0.u == S1.u).
3716  void
3718  {
3719  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3720  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3721  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3722 
3723  src0.read();
3724  src1.read();
3725 
3726  scc = (src0.rawData() == src1.rawData()) ? 1 : 0;
3727 
3728  scc.write();
3729  } // execute
3730  // --- Inst_SOPC__S_CMP_LG_U32 class methods ---
3731 
3733  : Inst_SOPC(iFmt, "s_cmp_lg_u32")
3734  {
3735  setFlag(ALU);
3736  } // Inst_SOPC__S_CMP_LG_U32
3737 
3739  {
3740  } // ~Inst_SOPC__S_CMP_LG_U32
3741 
3742  // --- description from .arch file ---
3743  // SCC = (S0.u != S1.u).
3744  void
3746  {
3747  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3748  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3749  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3750 
3751  src0.read();
3752  src1.read();
3753 
3754  scc = (src0.rawData() != src1.rawData()) ? 1 : 0;
3755 
3756  scc.write();
3757  } // execute
3758  // --- Inst_SOPC__S_CMP_GT_U32 class methods ---
3759 
3761  : Inst_SOPC(iFmt, "s_cmp_gt_u32")
3762  {
3763  setFlag(ALU);
3764  } // Inst_SOPC__S_CMP_GT_U32
3765 
3767  {
3768  } // ~Inst_SOPC__S_CMP_GT_U32
3769 
3770  // --- description from .arch file ---
3771  // SCC = (S0.u > S1.u).
3772  void
3774  {
3775  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3776  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3777  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3778 
3779  src0.read();
3780  src1.read();
3781 
3782  scc = (src0.rawData() > src1.rawData()) ? 1 : 0;
3783 
3784  scc.write();
3785  } // execute
3786  // --- Inst_SOPC__S_CMP_GE_U32 class methods ---
3787 
3789  : Inst_SOPC(iFmt, "s_cmp_ge_u32")
3790  {
3791  setFlag(ALU);
3792  } // Inst_SOPC__S_CMP_GE_U32
3793 
3795  {
3796  } // ~Inst_SOPC__S_CMP_GE_U32
3797 
3798  // --- description from .arch file ---
3799  // SCC = (S0.u >= S1.u).
3800  void
3802  {
3803  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3804  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3805  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3806 
3807  src0.read();
3808  src1.read();
3809 
3810  scc = (src0.rawData() >= src1.rawData()) ? 1 : 0;
3811 
3812  scc.write();
3813  } // execute
3814  // --- Inst_SOPC__S_CMP_LT_U32 class methods ---
3815 
3817  : Inst_SOPC(iFmt, "s_cmp_lt_u32")
3818  {
3819  setFlag(ALU);
3820  } // Inst_SOPC__S_CMP_LT_U32
3821 
3823  {
3824  } // ~Inst_SOPC__S_CMP_LT_U32
3825 
3826  // --- description from .arch file ---
3827  // SCC = (S0.u < S1.u).
3828  void
3830  {
3831  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3832  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3833  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3834 
3835  src0.read();
3836  src1.read();
3837 
3838  scc = (src0.rawData() < src1.rawData()) ? 1 : 0;
3839 
3840  scc.write();
3841  } // execute
3842  // --- Inst_SOPC__S_CMP_LE_U32 class methods ---
3843 
3845  : Inst_SOPC(iFmt, "s_cmp_le_u32")
3846  {
3847  setFlag(ALU);
3848  } // Inst_SOPC__S_CMP_LE_U32
3849 
3851  {
3852  } // ~Inst_SOPC__S_CMP_LE_U32
3853 
3854  // --- description from .arch file ---
3855  // SCC = (S0.u <= S1.u).
3856  void
3858  {
3859  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3860  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3861  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3862 
3863  src0.read();
3864  src1.read();
3865 
3866  scc = (src0.rawData() <= src1.rawData()) ? 1 : 0;
3867 
3868  scc.write();
3869  } // execute
3870  // --- Inst_SOPC__S_BITCMP0_B32 class methods ---
3871 
3873  : Inst_SOPC(iFmt, "s_bitcmp0_b32")
3874  {
3875  setFlag(ALU);
3876  } // Inst_SOPC__S_BITCMP0_B32
3877 
3879  {
3880  } // ~Inst_SOPC__S_BITCMP0_B32
3881 
3882  // --- description from .arch file ---
3883  // SCC = (S0.u[S1.u[4:0]] == 0).
3884  void
3886  {
3887  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3888  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3889  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3890 
3891  src0.read();
3892  src1.read();
3893 
3894  scc = !bits(src0.rawData(), bits(src1.rawData(), 4, 0)) ? 1 : 0;
3895 
3896  scc.write();
3897  } // execute
3898  // --- Inst_SOPC__S_BITCMP1_B32 class methods ---
3899 
3901  : Inst_SOPC(iFmt, "s_bitcmp1_b32")
3902  {
3903  setFlag(ALU);
3904  } // Inst_SOPC__S_BITCMP1_B32
3905 
3907  {
3908  } // ~Inst_SOPC__S_BITCMP1_B32
3909 
3910  // --- description from .arch file ---
3911  // SCC = (S0.u[S1.u[4:0]] == 1).
3912  void
3914  {
3915  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3916  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3917  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3918 
3919  src0.read();
3920  src1.read();
3921 
3922  scc = bits(src0.rawData(), bits(src1.rawData(), 4, 0)) ? 1 : 0;
3923 
3924  scc.write();
3925  } // execute
3926  // --- Inst_SOPC__S_BITCMP0_B64 class methods ---
3927 
3929  : Inst_SOPC(iFmt, "s_bitcmp0_b64")
3930  {
3931  setFlag(ALU);
3932  } // Inst_SOPC__S_BITCMP0_B64
3933 
3935  {
3936  } // ~Inst_SOPC__S_BITCMP0_B64
3937 
3938  // --- description from .arch file ---
3939  // SCC = (S0.u64[S1.u[5:0]] == 0).
3940  void
3942  {
3943  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
3944  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3945  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3946 
3947  src0.read();
3948  src1.read();
3949 
3950  scc = !bits(src0.rawData(), bits(src1.rawData(), 5, 0)) ? 1 : 0;
3951 
3952  scc.write();
3953  } // execute
3954  // --- Inst_SOPC__S_BITCMP1_B64 class methods ---
3955 
3957  : Inst_SOPC(iFmt, "s_bitcmp1_b64")
3958  {
3959  setFlag(ALU);
3960  } // Inst_SOPC__S_BITCMP1_B64
3961 
3963  {
3964  } // ~Inst_SOPC__S_BITCMP1_B64
3965 
3966  // --- description from .arch file ---
3967  // SCC = (S0.u64[S1.u[5:0]] == 1).
3968  void
3970  {
3971  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
3972  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3973  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3974 
3975  src0.read();
3976  src1.read();
3977 
3978  scc = bits(src0.rawData(), bits(src1.rawData(), 5, 0)) ? 1 : 0;
3979 
3980  scc.write();
3981  } // execute
3982  // --- Inst_SOPC__S_SETVSKIP class methods ---
3983 
3985  : Inst_SOPC(iFmt, "s_setvskip")
3986  {
3987  } // Inst_SOPC__S_SETVSKIP
3988 
3990  {
3991  } // ~Inst_SOPC__S_SETVSKIP
3992 
3993  // --- description from .arch file ---
3994  // VSKIP = S0.u[S1.u[4:0]].
3995  // Enables and disables VSKIP mode.
3996  // When VSKIP is enabled, no VOP*/M*BUF/MIMG/DS/FLAT/EXP instuctions are
3997  // issued.
3998  // If any vector operations are outstanding, S_WAITCNT must be issued
3999  // before executing.
4000  // This instruction requires one waitstate after executing (e.g. S_NOP 0).
4001  // Example:
4002  // s_waitcnt 0
4003  // s_setvskip 1, 0 // Enable vskip mode.
4004  // s_nop 1
4005  void
4007  {
4009  } // execute
4010  // --- Inst_SOPC__S_SET_GPR_IDX_ON class methods ---
4011 
4013  : Inst_SOPC(iFmt, "s_set_gpr_idx_on")
4014  {
4015  } // Inst_SOPC__S_SET_GPR_IDX_ON
4016 
4018  {
4019  } // ~Inst_SOPC__S_SET_GPR_IDX_ON
4020 
4021  // --- description from .arch file ---
4022  // MODE.gpr_idx_en = 1;
4023  // M0[7:0] = S0.u[7:0];
4024  // M0[15:12] = SIMM4 (direct contents of S1 field);
4025  // // Remaining bits of M0 are unmodified.
4026  // Enable GPR indexing mode. Vector operations after this will perform
4027  // relative GPR addressing based on the contents of M0. The structure
4028  // SQ_M0_GPR_IDX_WORD may be used to decode M0.
4029  // The raw contents of the S1 field are read and used to set the enable
4030  // bits. S1[0] = VSRC0_REL, S1[1] = VSRC1_REL, S1[2] = VSRC2_REL and
4031  // S1[3] = VDST_REL.
4032  void
4034  {
4036  } // execute
4037  // --- Inst_SOPC__S_CMP_EQ_U64 class methods ---
4038 
4040  : Inst_SOPC(iFmt, "s_cmp_eq_u64")
4041  {
4042  setFlag(ALU);
4043  } // Inst_SOPC__S_CMP_EQ_U64
4044 
4046  {
4047  } // ~Inst_SOPC__S_CMP_EQ_U64
4048 
4049  // --- description from .arch file ---
4050  // SCC = (S0.i64 == S1.i64).
4051  void
4053  {
4054  ConstScalarOperandI64 src0(gpuDynInst, instData.SSRC0);
4055  ConstScalarOperandI64 src1(gpuDynInst, instData.SSRC1);
4056  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
4057 
4058  src0.read();
4059  src1.read();
4060 
4061  scc = (src0.rawData() == src1.rawData()) ? 1 : 0;
4062 
4063  scc.write();
4064  } // execute
4065  // --- Inst_SOPC__S_CMP_LG_U64 class methods ---
4066 
4068  : Inst_SOPC(iFmt, "s_cmp_lg_u64")
4069  {
4070  setFlag(ALU);
4071  } // Inst_SOPC__S_CMP_LG_U64
4072 
4074  {
4075  } // ~Inst_SOPC__S_CMP_LG_U64
4076 
4077  // --- description from .arch file ---
4078  // SCC = (S0.i64 != S1.i64).
4079  void
4081  {
4082  ConstScalarOperandI64 src0(gpuDynInst, instData.SSRC0);
4083  ConstScalarOperandI64 src1(gpuDynInst, instData.SSRC1);
4084  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
4085 
4086  src0.read();
4087  src1.read();
4088 
4089  scc = (src0.rawData() != src1.rawData()) ? 1 : 0;
4090 
4091  scc.write();
4092  } // execute
4093  // --- Inst_SOPP__S_NOP class methods ---
4094 
4096  : Inst_SOPP(iFmt, "s_nop")
4097  {
4098  setFlag(Nop);
4099  setFlag(Internal);
4100  } // Inst_SOPP__S_NOP
4101 
4103  {
4104  } // ~Inst_SOPP__S_NOP
4105 
4106  // --- description from .arch file ---
4107  // Do nothing. Repeat NOP 1..8 times based on SIMM16[2:0] -- 0 = 1 time,
4108  // 7 = 8 times.
4109  // This instruction may be used to introduce wait states to resolve
4110  // hazards; see the shader programming guide for details. Compare with
4111  // S_SLEEP.
4112  void
4114  {
4115  } // execute
4116  // --- Inst_SOPP__S_ENDPGM class methods ---
4117 
4119  : Inst_SOPP(iFmt, "s_endpgm")
4120  {
4121  setFlag(EndOfKernel);
4122  } // Inst_SOPP__S_ENDPGM
4123 
4125  {
4126  } // ~Inst_SOPP__S_ENDPGM
4127 
4128  // --- description from .arch file ---
4129  // End of program; terminate wavefront.
4130  // The hardware implicitly executes S_WAITCNT 0 before executing this
4131  // --- instruction.
4132  // See S_ENDPGM_SAVED for the context-switch version of this instruction.
4133  void
4135  {
4136  Wavefront *wf = gpuDynInst->wavefront();
4137  ComputeUnit *cu = gpuDynInst->computeUnit();
4138 
4139  // delete extra instructions fetched for completed work-items
4140  wf->instructionBuffer.erase(wf->instructionBuffer.begin() + 1,
4141  wf->instructionBuffer.end());
4142 
4143  if (wf->pendingFetch) {
4144  wf->dropFetch = true;
4145  }
4146 
4148  .flushBuf(wf->wfSlotId);
4150 
4151  int refCount = wf->computeUnit->getLds()
4152  .decreaseRefCounter(wf->dispatchId, wf->wgId);
4153 
4159  int bar_id = WFBarrier::InvalidID;
4160  if (wf->hasBarrier()) {
4161  assert(wf->getStatus() != Wavefront::S_BARRIER);
4162  bar_id = wf->barrierId();
4163  assert(bar_id != WFBarrier::InvalidID);
4164  wf->releaseBarrier();
4165  cu->decMaxBarrierCnt(bar_id);
4166  DPRINTF(GPUSync, "CU[%d] WF[%d][%d] Wave[%d] - Exiting the "
4167  "program and decrementing max barrier count for "
4168  "barrier Id%d. New max count: %d.\n", cu->cu_id,
4169  wf->simdId, wf->wfSlotId, wf->wfDynId, bar_id,
4170  cu->maxBarrierCnt(bar_id));
4171  }
4172 
4173  DPRINTF(GPUExec, "CU%d: decrease ref ctr WG[%d] to [%d]\n",
4174  wf->computeUnit->cu_id, wf->wgId, refCount);
4175 
4177  wf->computeUnit->completedWfs++;
4178  wf->computeUnit->activeWaves--;
4179 
4180  panic_if(wf->computeUnit->activeWaves < 0, "CU[%d] Active waves less "
4181  "than zero\n", wf->computeUnit->cu_id);
4182 
4183  DPRINTF(GPUExec, "Doing return for CU%d: WF[%d][%d][%d]\n",
4184  wf->computeUnit->cu_id, wf->simdId, wf->wfSlotId, wf->wfDynId);
4185 
4186  for (int i = 0; i < wf->vecReads.size(); i++) {
4187  if (wf->rawDist.find(i) != wf->rawDist.end()) {
4188  wf->readsPerWrite.sample(wf->vecReads.at(i));
4189  }
4190  }
4191  wf->vecReads.clear();
4192  wf->rawDist.clear();
4193  wf->lastInstExec = 0;
4194 
4195  if (!refCount) {
4202  if (bar_id != WFBarrier::InvalidID) {
4203  DPRINTF(GPUSync, "CU[%d] WF[%d][%d] Wave[%d] - All waves are "
4204  "now complete. Releasing barrier Id%d.\n", cu->cu_id,
4205  wf->simdId, wf->wfSlotId, wf->wfDynId,
4206  wf->barrierId());
4207  cu->releaseBarrier(bar_id);
4208  }
4209 
4218  //check whether the workgroup is indicating the kernel end, i.e.,
4219  //the last workgroup in the kernel
4220  bool kernelEnd =
4222 
4223  bool relNeeded =
4225 
4226  //if it is not a kernel end, then retire the workgroup directly
4227  if (!kernelEnd || !relNeeded) {
4230  wf->computeUnit->completedWGs++;
4231 
4232  return;
4233  }
4234 
4242  setFlag(MemSync);
4243  setFlag(GlobalSegment);
4244  // Notify Memory System of Kernel Completion
4245  // Kernel End = isKernel + isMemSync
4247  gpuDynInst->simdId = wf->simdId;
4248  gpuDynInst->wfSlotId = wf->wfSlotId;
4249  gpuDynInst->wfDynId = wf->wfDynId;
4250 
4251  DPRINTF(GPUExec, "inject global memory fence for CU%d: "
4252  "WF[%d][%d][%d]\n", wf->computeUnit->cu_id,
4253  wf->simdId, wf->wfSlotId, wf->wfDynId);
4254 
4255  // call shader to prepare the flush operations
4256  wf->computeUnit->shader->prepareFlush(gpuDynInst);
4257 
4258  wf->computeUnit->completedWGs++;
4259  } else {
4261  }
4262  } // execute
4263 
4264  // --- Inst_SOPP__S_BRANCH class methods ---
4265 
4267  : Inst_SOPP(iFmt, "s_branch")
4268  {
4269  setFlag(Branch);
4270  } // Inst_SOPP__S_BRANCH
4271 
4273  {
4274  } // ~Inst_SOPP__S_BRANCH
4275 
4276  // --- description from .arch file ---
4277  // PC = PC + signext(SIMM16 * 4) + 4 (short jump).
4278  // For a long jump, use S_SETPC.
4279  void
4281  {
4282  Wavefront *wf = gpuDynInst->wavefront();
4283  Addr pc = gpuDynInst->pc();
4284  ScalarRegI16 simm16 = instData.SIMM16;
4285 
4286  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4287 
4288  wf->pc(pc);
4289  } // execute
4290  // --- Inst_SOPP__S_WAKEUP class methods ---
4291 
4293  : Inst_SOPP(iFmt, "s_wakeup")
4294  {
4295  } // Inst_SOPP__S_WAKEUP
4296 
4298  {
4299  } // ~Inst_SOPP__S_WAKEUP
4300 
4301  // --- description from .arch file ---
4302  // Allow a wave to 'ping' all the other waves in its threadgroup to force
4303  // them to wake up immediately from an S_SLEEP instruction. The ping is
4304  // ignored if the waves are not sleeping.
4305  // This allows for more efficient polling on a memory location. The waves
4306  // which are polling can sit in a long S_SLEEP between memory reads, but
4307  // the wave which writes the value can tell them all to wake up early now
4308  // that the data is available. This is useful for fBarrier implementations
4309  // (speedup).
4310  // This method is also safe from races because if any wave misses the ping,
4311  // everything still works fine (whoever missed it just completes their
4312  // normal S_SLEEP).
4313  void
4315  {
4317  } // execute
4318  // --- Inst_SOPP__S_CBRANCH_SCC0 class methods ---
4319 
4321  : Inst_SOPP(iFmt, "s_cbranch_scc0")
4322  {
4323  setFlag(CondBranch);
4324  } // Inst_SOPP__S_CBRANCH_SCC0
4325 
4327  {
4328  } // ~Inst_SOPP__S_CBRANCH_SCC0
4329 
4330  // --- description from .arch file ---
4331  // if(SCC == 0) then PC = PC + signext(SIMM16 * 4) + 4;
4332  // else NOP.
4333  void
4335  {
4336  Wavefront *wf = gpuDynInst->wavefront();
4337  Addr pc = gpuDynInst->pc();
4338  ScalarRegI16 simm16 = instData.SIMM16;
4339  ConstScalarOperandU32 scc(gpuDynInst, REG_SCC);
4340 
4341  scc.read();
4342 
4343  if (!scc.rawData()) {
4344  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4345  }
4346 
4347  wf->pc(pc);
4348  } // execute
4349  // --- Inst_SOPP__S_CBRANCH_SCC1 class methods ---
4350 
4352  : Inst_SOPP(iFmt, "s_cbranch_scc1")
4353  {
4354  setFlag(CondBranch);
4355  } // Inst_SOPP__S_CBRANCH_SCC1
4356 
4358  {
4359  } // ~Inst_SOPP__S_CBRANCH_SCC1
4360 
4361  // --- description from .arch file ---
4362  // if(SCC == 1) then PC = PC + signext(SIMM16 * 4) + 4;
4363  // else NOP.
4364  void
4366  {
4367  Wavefront *wf = gpuDynInst->wavefront();
4368  Addr pc = gpuDynInst->pc();
4369  ScalarRegI16 simm16 = instData.SIMM16;
4370  ConstScalarOperandU32 scc(gpuDynInst, REG_SCC);
4371 
4372  scc.read();
4373 
4374  if (scc.rawData()) {
4375  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4376  }
4377 
4378  wf->pc(pc);
4379  } // execute
4380  // --- Inst_SOPP__S_CBRANCH_VCCZ class methods ---
4381 
4383  : Inst_SOPP(iFmt, "s_cbranch_vccz")
4384  {
4385  setFlag(CondBranch);
4386  setFlag(ReadsVCC);
4387  } // Inst_SOPP__S_CBRANCH_VCCZ
4388 
4390  {
4391  } // ~Inst_SOPP__S_CBRANCH_VCCZ
4392 
4393  // --- description from .arch file ---
4394  // if(VCC == 0) then PC = PC + signext(SIMM16 * 4) + 4;
4395  // else NOP.
4396  void
4398  {
4399  Wavefront *wf = gpuDynInst->wavefront();
4400  ConstScalarOperandU64 vcc(gpuDynInst, REG_VCC_LO);
4401  Addr pc = gpuDynInst->pc();
4402  ScalarRegI16 simm16 = instData.SIMM16;
4403 
4404  vcc.read();
4405 
4406  if (!vcc.rawData()) {
4407  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4408  }
4409 
4410  wf->pc(pc);
4411  } // execute
4412  // --- Inst_SOPP__S_CBRANCH_VCCNZ class methods ---
4413 
4415  : Inst_SOPP(iFmt, "s_cbranch_vccnz")
4416  {
4417  setFlag(CondBranch);
4418  setFlag(ReadsVCC);
4419  } // Inst_SOPP__S_CBRANCH_VCCNZ
4420 
4422  {
4423  } // ~Inst_SOPP__S_CBRANCH_VCCNZ
4424 
4425  // --- description from .arch file ---
4426  // if(VCC != 0) then PC = PC + signext(SIMM16 * 4) + 4;
4427  // else NOP.
4428  void
4430  {
4431  Wavefront *wf = gpuDynInst->wavefront();
4432  ConstScalarOperandU64 vcc(gpuDynInst, REG_VCC_LO);
4433 
4434  vcc.read();
4435 
4436  if (vcc.rawData()) {
4437  Addr pc = gpuDynInst->pc();
4438  ScalarRegI16 simm16 = instData.SIMM16;
4439  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4440  wf->pc(pc);
4441  }
4442  } // execute
4443  // --- Inst_SOPP__S_CBRANCH_EXECZ class methods ---
4444 
4446  : Inst_SOPP(iFmt, "s_cbranch_execz")
4447  {
4448  setFlag(CondBranch);
4449  setFlag(ReadsExec);
4450  } // Inst_SOPP__S_CBRANCH_EXECZ
4451 
4453  {
4454  } // ~Inst_SOPP__S_CBRANCH_EXECZ
4455 
4456  // --- description from .arch file ---
4457  // if(EXEC == 0) then PC = PC + signext(SIMM16 * 4) + 4;
4458  // else NOP.
4459  void
4461  {
4462  Wavefront *wf = gpuDynInst->wavefront();
4463 
4464  if (wf->execMask().none()) {
4465  Addr pc = gpuDynInst->pc();
4466  ScalarRegI16 simm16 = instData.SIMM16;
4467  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4468  wf->pc(pc);
4469  }
4470  } // execute
4471  // --- Inst_SOPP__S_CBRANCH_EXECNZ class methods ---
4472 
4474  : Inst_SOPP(iFmt, "s_cbranch_execnz")
4475  {
4476  setFlag(CondBranch);
4477  setFlag(ReadsExec);
4478  } // Inst_SOPP__S_CBRANCH_EXECNZ
4479 
4481  {
4482  } // ~Inst_SOPP__S_CBRANCH_EXECNZ
4483 
4484  // --- description from .arch file ---
4485  // if(EXEC != 0) then PC = PC + signext(SIMM16 * 4) + 4;
4486  // else NOP.
4487  void
4489  {
4490  Wavefront *wf = gpuDynInst->wavefront();
4491 
4492  if (wf->execMask().any()) {
4493  Addr pc = gpuDynInst->pc();
4494  ScalarRegI16 simm16 = instData.SIMM16;
4495  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4496  wf->pc(pc);
4497  }
4498  } // execute
4499  // --- Inst_SOPP__S_BARRIER class methods ---
4500 
4502  : Inst_SOPP(iFmt, "s_barrier")
4503  {
4504  setFlag(Barrier);
4505  } // Inst_SOPP__S_BARRIER
4506 
4508  {
4509  } // ~Inst_SOPP__S_BARRIER
4510 
4511  // --- description from .arch file ---
4512  // Synchronize waves within a threadgroup.
4513  // If not all waves of the threadgroup have been created yet, waits for
4514  // entire group before proceeding.
4515  // If some waves in the threadgroup have already terminated, this waits on
4516  // only the surviving waves.
4517  // Barriers are legal inside trap handlers.
4518  void
4520  {
4521  Wavefront *wf = gpuDynInst->wavefront();
4522  ComputeUnit *cu = gpuDynInst->computeUnit();
4523 
4524  if (wf->hasBarrier()) {
4525  int bar_id = wf->barrierId();
4526  assert(wf->getStatus() == Wavefront::S_BARRIER);
4527  cu->incNumAtBarrier(bar_id);
4528  DPRINTF(GPUSync, "CU[%d] WF[%d][%d] Wave[%d] - Stalling at "
4529  "barrier Id%d. %d waves now at barrier, %d waves "
4530  "remain.\n", cu->cu_id, wf->simdId, wf->wfSlotId,
4531  wf->wfDynId, bar_id, cu->numAtBarrier(bar_id),
4532  cu->numYetToReachBarrier(bar_id));
4533  }
4534  } // execute
4535  // --- Inst_SOPP__S_SETKILL class methods ---
4536 
4538  : Inst_SOPP(iFmt, "s_setkill")
4539  {
4540  } // Inst_SOPP__S_SETKILL
4541 
4543  {
4544  } // ~Inst_SOPP__S_SETKILL
4545 
4546  // --- description from .arch file ---
4547  // set KILL bit to value of SIMM16[0].
4548  // Used primarily for debugging kill wave host command behavior.
4549  void
4551  {
4553  } // execute
4554  // --- Inst_SOPP__S_WAITCNT class methods ---
4555 
4557  : Inst_SOPP(iFmt, "s_waitcnt")
4558  {
4559  setFlag(Waitcnt);
4560  setFlag(Internal);
4561  } // Inst_SOPP__S_WAITCNT
4562 
4564  {
4565  } // ~Inst_SOPP__S_WAITCNT
4566 
4567  // --- description from .arch file ---
4568  // Wait for the counts of outstanding lds, vector-memory and
4569  // --- export/vmem-write-data to be at or below the specified levels.
4570  // SIMM16[3:0] = vmcount (vector memory operations),
4571  // SIMM16[6:4] = export/mem-write-data count,
4572  // SIMM16[12:8] = LGKM_cnt (scalar-mem/GDS/LDS count).
4573  void
4575  {
4576  ScalarRegI32 vm_cnt = 0;
4577  ScalarRegI32 exp_cnt = 0;
4578  ScalarRegI32 lgkm_cnt = 0;
4579  vm_cnt = bits<ScalarRegI16>(instData.SIMM16, 3, 0);
4580  exp_cnt = bits<ScalarRegI16>(instData.SIMM16, 6, 4);
4581  lgkm_cnt = bits<ScalarRegI16>(instData.SIMM16, 12, 8);
4582  gpuDynInst->wavefront()->setStatus(Wavefront::S_WAITCNT);
4583  gpuDynInst->wavefront()->setWaitCnts(vm_cnt, exp_cnt, lgkm_cnt);
4584  } // execute
4585  // --- Inst_SOPP__S_SETHALT class methods ---
4586 
4588  : Inst_SOPP(iFmt, "s_sethalt")
4589  {
4590  } // Inst_SOPP__S_SETHALT
4591 
4593  {
4594  } // ~Inst_SOPP__S_SETHALT
4595 
4596  // --- description from .arch file ---
4597  // Set HALT bit to value of SIMM16[0]; 1 = halt, 0 = resume.
4598  // The halt flag is ignored while PRIV == 1 (inside trap handlers) but the
4599  // shader will halt immediately after the handler returns if HALT is still
4600  // set at that time.
4601  void
4603  {
4605  } // execute
4606  // --- Inst_SOPP__S_SLEEP class methods ---
4607 
4609  : Inst_SOPP(iFmt, "s_sleep")
4610  {
4611  } // Inst_SOPP__S_SLEEP
4612 
4614  {
4615  } // ~Inst_SOPP__S_SLEEP
4616 
4617  // --- description from .arch file ---
4618  // Cause a wave to sleep for (64 * SIMM16[2:0] + 1..64) clocks.
4619  // The exact amount of delay is approximate. Compare with S_NOP.
4620  void
4622  {
4624  } // execute
4625  // --- Inst_SOPP__S_SETPRIO class methods ---
4626 
4628  : Inst_SOPP(iFmt, "s_setprio")
4629  {
4630  } // Inst_SOPP__S_SETPRIO
4631 
4633  {
4634  } // ~Inst_SOPP__S_SETPRIO
4635 
4636  // --- description from .arch file ---
4637  // User settable wave priority is set to SIMM16[1:0]. 0 = lowest,
4638  // 3 = highest.
4639  // The overall wave priority is {SPIPrio[1:0] + UserPrio[1:0],
4640  // WaveAge[3:0]}.
4641  void
4643  {
4645  } // execute
4646  // --- Inst_SOPP__S_SENDMSG class methods ---
4647 
4649  : Inst_SOPP(iFmt, "s_sendmsg")
4650  {
4651  } // Inst_SOPP__S_SENDMSG
4652 
4654  {
4655  } // ~Inst_SOPP__S_SENDMSG
4656 
4657  // --- description from .arch file ---
4658  // Send a message upstream to VGT or the interrupt handler.
4659  // SIMM16[9:0] contains the message type and is documented in the shader
4660  // --- programming guide.
4661  void
4663  {
4665  } // execute
4666  // --- Inst_SOPP__S_SENDMSGHALT class methods ---
4667 
4669  : Inst_SOPP(iFmt, "s_sendmsghalt")
4670  {
4671  } // Inst_SOPP__S_SENDMSGHALT
4672 
4674  {
4675  } // ~Inst_SOPP__S_SENDMSGHALT
4676 
4677  // --- description from .arch file ---
4678  // Send a message and then HALT the wavefront; see S_SENDMSG for details.
4679  void
4681  {
4683  } // execute
4684  // --- Inst_SOPP__S_TRAP class methods ---
4685 
4687  : Inst_SOPP(iFmt, "s_trap")
4688  {
4689  } // Inst_SOPP__S_TRAP
4690 
4692  {
4693  } // ~Inst_SOPP__S_TRAP
4694 
4695  // --- description from .arch file ---
4696  // TrapID = SIMM16[7:0];
4697  // Wait for all instructions to complete;
4698  // set {TTMP1, TTMP0} = {3'h0, PCRewind[3:0], HT[0], TrapID[7:0],
4699  // PC[47:0]};
4700  // PC = TBA (trap base address);
4701  // PRIV = 1.
4702  // Enter the trap handler. This instruction may be generated internally as
4703  // well in response to a host trap (HT = 1) or an exception.
4704  // TrapID 0 is reserved for hardware use and should not be used in a
4705  // shader-generated trap.
4706  void
4708  {
4710  } // execute
4711  // --- Inst_SOPP__S_ICACHE_INV class methods ---
4712 
4714  : Inst_SOPP(iFmt, "s_icache_inv")
4715  {
4716  } // Inst_SOPP__S_ICACHE_INV
4717 
4719  {
4720  } // ~Inst_SOPP__S_ICACHE_INV
4721 
4722  // --- description from .arch file ---
4723  // Invalidate entire L1 instruction cache.
4724  // You must have 12 separate S_NOP instructions or a jump/branch
4725  // instruction after this instruction
4726  // to ensure the SQ instruction buffer is purged.
4727  void
4729  {
4731  } // execute
4732  // --- Inst_SOPP__S_INCPERFLEVEL class methods ---
4733 
4735  : Inst_SOPP(iFmt, "s_incperflevel")
4736  {
4737  } // Inst_SOPP__S_INCPERFLEVEL
4738 
4740  {
4741  } // ~Inst_SOPP__S_INCPERFLEVEL
4742 
4743  // --- description from .arch file ---
4744  // Increment performance counter specified in SIMM16[3:0] by 1.
4745  void
4747  {
4749  } // execute
4750  // --- Inst_SOPP__S_DECPERFLEVEL class methods ---
4751 
4753  : Inst_SOPP(iFmt, "s_decperflevel")
4754  {
4755  } // Inst_SOPP__S_DECPERFLEVEL
4756 
4758  {
4759  } // ~Inst_SOPP__S_DECPERFLEVEL
4760 
4761  // --- description from .arch file ---
4762  // Decrement performance counter specified in SIMM16[3:0] by 1.
4763  void
4765  {
4767  } // execute
4768  // --- Inst_SOPP__S_TTRACEDATA class methods ---
4769 
4771  : Inst_SOPP(iFmt, "s_ttracedata")
4772  {
4773  } // Inst_SOPP__S_TTRACEDATA
4774 
4776  {
4777  } // ~Inst_SOPP__S_TTRACEDATA
4778 
4779  // --- description from .arch file ---
4780  // Send M0 as user data to the thread trace stream.
4781  void
4783  {
4785  } // execute
4786  // --- Inst_SOPP__S_CBRANCH_CDBGSYS class methods ---
4787 
4789  InFmt_SOPP *iFmt)
4790  : Inst_SOPP(iFmt, "s_cbranch_cdbgsys")
4791  {
4792  setFlag(CondBranch);
4793  } // Inst_SOPP__S_CBRANCH_CDBGSYS
4794 
4796  {
4797  } // ~Inst_SOPP__S_CBRANCH_CDBGSYS
4798 
4799  // --- description from .arch file ---
4800  // if(conditional_debug_system != 0) then PC = PC + signext(SIMM16 * 4)
4801  // + 4;
4802  // else NOP.
4803  void
4805  {
4807  } // execute
4808  // --- Inst_SOPP__S_CBRANCH_CDBGUSER class methods ---
4809 
4811  InFmt_SOPP *iFmt)
4812  : Inst_SOPP(iFmt, "s_cbranch_cdbguser")
4813  {
4814  setFlag(CondBranch);
4815  } // Inst_SOPP__S_CBRANCH_CDBGUSER
4816 
4818  {
4819  } // ~Inst_SOPP__S_CBRANCH_CDBGUSER
4820 
4821  // --- description from .arch file ---
4822  // if(conditional_debug_user != 0) then PC = PC + signext(SIMM16 * 4) + 4;
4823  // else NOP.
4824  void
4826  {
4828  } // execute
4829  // --- Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER class methods ---
4830 
4832  InFmt_SOPP *iFmt)
4833  : Inst_SOPP(iFmt, "s_cbranch_cdbgsys_or_user")
4834  {
4835  setFlag(CondBranch);
4836  } // Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER
4837 
4840  {
4841  } // ~Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER
4842 
4843  // --- description from .arch file ---
4844  // if(conditional_debug_system || conditional_debug_user) then PC = PC +
4845  // --- signext(SIMM16 * 4) + 4;
4846  // else NOP.
4847  void
4849  {
4851  } // execute
4852  // --- Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER class methods ---
4853 
4856  : Inst_SOPP(iFmt, "s_cbranch_cdbgsys_and_user")
4857  {
4858  setFlag(CondBranch);
4859  } // Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER
4860 
4863  {
4864  } // ~Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER
4865 
4866  // --- description from .arch file ---
4867  // if(conditional_debug_system && conditional_debug_user) then PC = PC +
4868  // --- signext(SIMM16 * 4) + 4;
4869  // else NOP.
4870  void
4872  {
4874  } // execute
4875  // --- Inst_SOPP__S_ENDPGM_SAVED class methods ---
4876 
4878  : Inst_SOPP(iFmt, "s_endpgm_saved")
4879  {
4880  } // Inst_SOPP__S_ENDPGM_SAVED
4881 
4883  {
4884  } // ~Inst_SOPP__S_ENDPGM_SAVED
4885 
4886  // --- description from .arch file ---
4887  // End of program; signal that a wave has been saved by the context-switch
4888  // trap handler and terminate wavefront.
4889  // The hardware implicitly executes S_WAITCNT 0 before executing this
4890  // instruction.
4891  // Use S_ENDPGM in all cases unless you are executing the context-switch
4892  // save handler.
4893  void
4895  {
4897  } // execute
4898  // --- Inst_SOPP__S_SET_GPR_IDX_OFF class methods ---
4899 
4901  InFmt_SOPP *iFmt)
4902  : Inst_SOPP(iFmt, "s_set_gpr_idx_off")
4903  {
4904  } // Inst_SOPP__S_SET_GPR_IDX_OFF
4905 
4907  {
4908  } // ~Inst_SOPP__S_SET_GPR_IDX_OFF
4909 
4910  // --- description from .arch file ---
4911  // MODE.gpr_idx_en = 0.
4912  // Clear GPR indexing mode. Vector operations after this will not perform
4913  // --- relative GPR addressing regardless of the contents of M0. This
4914  // --- instruction does not modify M0.
4915  void
4917  {
4919  } // execute
4920  // --- Inst_SOPP__S_SET_GPR_IDX_MODE class methods ---
4921 
4923  InFmt_SOPP *iFmt)
4924  : Inst_SOPP(iFmt, "s_set_gpr_idx_mode")
4925  {
4926  } // Inst_SOPP__S_SET_GPR_IDX_MODE
4927 
4929  {
4930  } // ~Inst_SOPP__S_SET_GPR_IDX_MODE
4931 
4932  // --- description from .arch file ---
4933  // M0[15:12] = SIMM4.
4934  // Modify the mode used for vector GPR indexing.
4935  // The raw contents of the source field are read and used to set the enable
4936  // bits. SIMM4[0] = VSRC0_REL, SIMM4[1] = VSRC1_REL, SIMM4[2] = VSRC2_REL
4937  // and SIMM4[3] = VDST_REL.
4938  void
4940  {
4942  } // execute
4943  // --- Inst_SMEM__S_LOAD_DWORD class methods ---
4944 
4946  : Inst_SMEM(iFmt, "s_load_dword")
4947  {
4948  setFlag(Load);
4949  } // Inst_SMEM__S_LOAD_DWORD
4950 
4952  {
4953  } // ~Inst_SMEM__S_LOAD_DWORD
4954 
4961  void
4963  {
4964  Wavefront *wf = gpuDynInst->wavefront();
4965  gpuDynInst->execUnitId = wf->execUnitId;
4966  gpuDynInst->latency.init(gpuDynInst->computeUnit());
4967  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
4968  ScalarRegU32 offset(0);
4969  ConstScalarOperandU64 addr(gpuDynInst, instData.SBASE << 1);
4970 
4971  addr.read();
4972 
4973  if (instData.IMM) {
4974  offset = extData.OFFSET;
4975  } else {
4976  ConstScalarOperandU32 off_sgpr(gpuDynInst, extData.OFFSET);
4977  off_sgpr.read();
4978  offset = off_sgpr.rawData();
4979  }
4980 
4981  calcAddr(gpuDynInst, addr, offset);
4982 
4983  gpuDynInst->computeUnit()->scalarMemoryPipe
4984  .issueRequest(gpuDynInst);
4985  } // execute
4986 
4987  void
4989  {
4990  initMemRead<1>(gpuDynInst);
4991  } // initiateAcc
4992 
4993  void
4995  {
4996  ScalarOperandU32 sdst(gpuDynInst, instData.SDATA);
4997  sdst.write();
4998  } // completeAcc
4999  // --- Inst_SMEM__S_LOAD_DWORDX2 class methods ---
5000 
5002  : Inst_SMEM(iFmt, "s_load_dwordx2")
5003  {
5004  setFlag(Load);
5005  } // Inst_SMEM__S_LOAD_DWORDX2
5006 
5008  {
5009  } // ~Inst_SMEM__S_LOAD_DWORDX2
5010 
5015  void
5017  {
5018  Wavefront *wf = gpuDynInst->wavefront();
5019  gpuDynInst->execUnitId = wf->execUnitId;
5020  gpuDynInst->latency.init(gpuDynInst->computeUnit());
5021  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
5022  ScalarRegU32 offset(0);
5023  ConstScalarOperandU64 addr(gpuDynInst, instData.SBASE << 1);
5024 
5025  addr.read();
5026 
5027  if (instData.IMM) {
5028  offset = extData.OFFSET;
5029  } else {
5030  ConstScalarOperandU32 off_sgpr(gpuDynInst, extData.OFFSET);
5031  off_sgpr.read();
5032  offset = off_sgpr.rawData();
5033  }
5034 
5035  calcAddr(gpuDynInst, addr, offset);
5036 
5037  gpuDynInst->computeUnit()->scalarMemoryPipe.
5038  issueRequest(gpuDynInst);
5039  } // execute
5040 
5041  void
5043  {
5044  initMemRead<2>(gpuDynInst);
5045  } // initiateAcc
5046 
5047  void
5049  {
5050  ScalarOperandU64 sdst(gpuDynInst, instData.SDATA);
5051  sdst.write();
5052  } // completeAcc
5053  // --- Inst_SMEM__S_LOAD_DWORDX4 class methods ---
5054 
5056  : Inst_SMEM(iFmt, "s_load_dwordx4")
5057  {
5058  setFlag(Load);
5059  } // Inst_SMEM__S_LOAD_DWORDX4
5060 
5062  {
5063  } // ~Inst_SMEM__S_LOAD_DWORDX4
5064 
5065  // --- description from .arch file ---
5066  // Read 4 dwords from scalar data cache. See S_LOAD_DWORD for details on
5067  // the offset input.
5068  void
5070  {
5071  Wavefront *wf = gpuDynInst->wavefront();
5072  gpuDynInst->execUnitId = wf->execUnitId;
5073  gpuDynInst->latency.init(gpuDynInst->computeUnit());
5074  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
5075  ScalarRegU32 offset(0);
5076  ConstScalarOperandU64 addr(gpuDynInst, instData.SBASE << 1);
5077 
5078  addr.read();
5079 
5080  if (instData.IMM) {
5081  offset = extData.OFFSET;
5082  } else {
5083  ConstScalarOperandU32 off_sgpr(gpuDynInst, extData.OFFSET);
5084  off_sgpr.read();
5085  offset = off_sgpr.rawData();
5086  }
5087 
5088  calcAddr(gpuDynInst, addr, offset);
5089 
5090  gpuDynInst->computeUnit()->scalarMemoryPipe.
5091  issueRequest(gpuDynInst);
5092  } // execute
5093 
5094  void
5096  {
5097  initMemRead<4>(gpuDynInst);
5098  } // initiateAcc
5099 
5100  void
5102  {
5103  ScalarOperandU128 sdst(gpuDynInst, instData.SDATA);
5104  sdst.write();
5105  } // completeAcc
5106  // --- Inst_SMEM__S_LOAD_DWORDX8 class methods ---
5107 
5109  : Inst_SMEM(iFmt, "s_load_dwordx8")
5110  {
5111  setFlag(Load);
5112  } // Inst_SMEM__S_LOAD_DWORDX8
5113 
5115  {
5116  } // ~Inst_SMEM__S_LOAD_DWORDX8
5117 
5118  // --- description from .arch file ---
5119  // Read 8 dwords from scalar data cache. See S_LOAD_DWORD for details on
5120  // the offset input.
5121  void
5123  {
5124  Wavefront *wf = gpuDynInst->wavefront();
5125  gpuDynInst->execUnitId = wf->execUnitId;
5126  gpuDynInst->latency.init(gpuDynInst->computeUnit());
5127  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
5128  ScalarRegU32 offset(0);
5129  ConstScalarOperandU64 addr(gpuDynInst, instData.SBASE << 1);
5130 
5131  addr.read();
5132 
5133  if (instData.IMM) {
5134  offset = extData.OFFSET;
5135  } else {
5136  ConstScalarOperandU32 off_sgpr(gpuDynInst, extData.OFFSET);
5137  off_sgpr.read();
5138  offset = off_sgpr.rawData();
5139  }
5140 
5141  calcAddr(gpuDynInst, addr, offset);
5142 
5143  gpuDynInst->computeUnit()->scalarMemoryPipe.
5144  issueRequest(gpuDynInst);
5145  } // execute
5146 
5147  void
5149  {
5150  initMemRead<8>(gpuDynInst);
5151  } // initiateAcc
5152 
5153  void
5155  {
5156  ScalarOperandU256 sdst(gpuDynInst, instData.SDATA);
5157  sdst.write();
5158  } // completeAcc
5159  // --- Inst_SMEM__S_LOAD_DWORDX16 class methods ---
5160 
5162  : Inst_SMEM(iFmt, "s_load_dwordx16")
5163  {
5164  setFlag(Load);
5165  } // Inst_SMEM__S_LOAD_DWORDX16
5166 
5168  {
5169  } // ~Inst_SMEM__S_LOAD_DWORDX16
5170 
5171  // --- description from .arch file ---
5172  // Read 16 dwords from scalar data cache. See S_LOAD_DWORD for details on
5173  // the offset input.
5174  void
5176  {
5177  Wavefront *wf = gpuDynInst->wavefront();
5178  gpuDynInst->execUnitId = wf->execUnitId;
5179  gpuDynInst->latency.init(gpuDynInst->computeUnit());
5180  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
5181  ScalarRegU32 offset(0);
5182  ConstScalarOperandU64 addr(gpuDynInst, instData.SBASE << 1);
5183 
5184  addr.read();
5185 
5186  if (instData.IMM) {
5187  offset = extData.OFFSET;
5188  } else {
5189  ConstScalarOperandU32 off_sgpr(gpuDynInst, extData.OFFSET);
5190  off_sgpr.read();
5191  offset = off_sgpr.rawData();
5192  }
5193 
5194  calcAddr(gpuDynInst, addr, offset);
5195 
5196  gpuDynInst->computeUnit()->scalarMemoryPipe.
5197  issueRequest(gpuDynInst);
5198  } // execute
5199 
5200  void
5202  {
5203  initMemRead<16>(gpuDynInst);
5204  } // initiateAcc
5205 
5206  void
5208  {
5209  ScalarOperandU512 sdst(gpuDynInst, instData.SDATA);
5210  sdst.write();
5211  } // completeAcc
5212  // --- Inst_SMEM__S_BUFFER_LOAD_DWORD class methods ---
5213 
5215  InFmt_SMEM *iFmt)
5216  : Inst_SMEM(iFmt, "s_buffer_load_dword")
5217  {
5218  setFlag(Load);
5219  } // Inst_SMEM__S_BUFFER_LOAD_DWORD
5220 
5222  {
5223  } // ~Inst_SMEM__S_BUFFER_LOAD_DWORD
5224 
5225  // --- description from .arch file ---
5226  // Read 1 dword from scalar data cache. See S_LOAD_DWORD for details on the
5227  // --- offset input.
5228  void
5230  {
5231  Wavefront *wf = gpuDynInst->wavefront();
5232  gpuDynInst->execUnitId = wf->execUnitId;
5233  gpuDynInst->latency.init(gpuDynInst->computeUnit());
5234  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
5235  ScalarRegU32 offset(0);
<