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