gem5  v22.0.0.2
instructions.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2015-2021 Advanced Micro Devices, Inc.
3  * All rights reserved.
4  *
5  * 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_SOP2__S_MUL_HI_U32 class methods ---
1477 
1479  : Inst_SOP2(iFmt, "s_mul_hi_u32")
1480  {
1481  setFlag(ALU);
1482  } // Inst_SOP2__S_MUL_HI_U32
1483 
1485  {
1486  } // ~Inst_SOP2__S_MUL_HI_U32
1487 
1488  // --- description from .arch file ---
1489  // D.u = (S0.u * S1.u) >> 32;
1490  void
1492  {
1493  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
1494  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
1495  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
1496 
1497  src0.read();
1498  src1.read();
1499 
1500  VecElemU64 tmp_dst =
1501  ((VecElemU64)src0.rawData() * (VecElemU64)src1.rawData());
1502  sdst = (tmp_dst >> 32);
1503 
1504  sdst.write();
1505  } // execute
1506  // --- Inst_SOP2__S_MUL_HI_I32 class methods ---
1507 
1509  : Inst_SOP2(iFmt, "s_mul_hi_i32")
1510  {
1511  setFlag(ALU);
1512  } // Inst_SOP2__S_MUL_HI_I32
1513 
1515  {
1516  } // ~Inst_SOP2__S_MUL_HI_I32
1517 
1518  // --- description from .arch file ---
1519  // D.u = (S0.u * S1.u) >> 32;
1520  void
1522  {
1523  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
1524  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
1525  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1526 
1527  src0.read();
1528  src1.read();
1529 
1530  VecElemI64 tmp_src0 =
1531  sext<std::numeric_limits<VecElemI64>::digits>(src0.rawData());
1532  VecElemI64 tmp_src1 =
1533  sext<std::numeric_limits<VecElemI64>::digits>(src1.rawData());
1534  sdst = (VecElemI32)((tmp_src0 * tmp_src1) >> 32);
1535 
1536  sdst.write();
1537  } // execute
1538  // --- Inst_SOPK__S_MOVK_I32 class methods ---
1539 
1541  : Inst_SOPK(iFmt, "s_movk_i32")
1542  {
1543  setFlag(ALU);
1544  } // Inst_SOPK__S_MOVK_I32
1545 
1547  {
1548  } // ~Inst_SOPK__S_MOVK_I32
1549 
1550  // --- description from .arch file ---
1551  // D.i = signext(SIMM16) (sign extension).
1552  void
1554  {
1556  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1557 
1558  sdst = simm16;
1559 
1560  sdst.write();
1561  } // execute
1562  // --- Inst_SOPK__S_CMOVK_I32 class methods ---
1563 
1565  : Inst_SOPK(iFmt, "s_cmovk_i32")
1566  {
1567  setFlag(ALU);
1568  } // Inst_SOPK__S_CMOVK_I32
1569 
1571  {
1572  } // ~Inst_SOPK__S_CMOVK_I32
1573 
1574  // --- description from .arch file ---
1575  // if(SCC) then D.i = signext(SIMM16);
1576  // else NOP.
1577  // Conditional move with sign extension.
1578  void
1580  {
1582  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1583  ConstScalarOperandU32 scc(gpuDynInst, REG_SCC);
1584 
1585  scc.read();
1586 
1587  if (scc.rawData()) {
1588  sdst = simm16;
1589  sdst.write();
1590  }
1591  } // execute
1592  // --- Inst_SOPK__S_CMPK_EQ_I32 class methods ---
1593 
1595  : Inst_SOPK(iFmt, "s_cmpk_eq_i32")
1596  {
1597  setFlag(ALU);
1598  } // Inst_SOPK__S_CMPK_EQ_I32
1599 
1601  {
1602  } // ~Inst_SOPK__S_CMPK_EQ_I32
1603 
1604  // --- description from .arch file ---
1605  // SCC = (S0.i == signext(SIMM16)).
1606  void
1608  {
1610  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1611  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1612 
1613  src.read();
1614 
1615  scc = (src.rawData() == simm16) ? 1 : 0;
1616 
1617  scc.write();
1618  } // execute
1619  // --- Inst_SOPK__S_CMPK_LG_I32 class methods ---
1620 
1622  : Inst_SOPK(iFmt, "s_cmpk_lg_i32")
1623  {
1624  setFlag(ALU);
1625  } // Inst_SOPK__S_CMPK_LG_I32
1626 
1628  {
1629  } // ~Inst_SOPK__S_CMPK_LG_I32
1630 
1631  // --- description from .arch file ---
1632  // SCC = (S0.i != signext(SIMM16)).
1633  void
1635  {
1637  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1638  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1639 
1640  src.read();
1641 
1642  scc = (src.rawData() != simm16) ? 1 : 0;
1643 
1644  scc.write();
1645  } // execute
1646  // --- Inst_SOPK__S_CMPK_GT_I32 class methods ---
1647 
1649  : Inst_SOPK(iFmt, "s_cmpk_gt_i32")
1650  {
1651  setFlag(ALU);
1652  } // Inst_SOPK__S_CMPK_GT_I32
1653 
1655  {
1656  } // ~Inst_SOPK__S_CMPK_GT_I32
1657 
1658  // --- description from .arch file ---
1659  // SCC = (S0.i > signext(SIMM16)).
1660  void
1662  {
1664  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1665  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1666 
1667  src.read();
1668 
1669  scc = (src.rawData() > simm16) ? 1 : 0;
1670 
1671  scc.write();
1672  } // execute
1673  // --- Inst_SOPK__S_CMPK_GE_I32 class methods ---
1674 
1676  : Inst_SOPK(iFmt, "s_cmpk_ge_i32")
1677  {
1678  setFlag(ALU);
1679  } // Inst_SOPK__S_CMPK_GE_I32
1680 
1682  {
1683  } // ~Inst_SOPK__S_CMPK_GE_I32
1684 
1685  // --- description from .arch file ---
1686  // SCC = (S0.i >= signext(SIMM16)).
1687  void
1689  {
1691  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1692  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1693 
1694  src.read();
1695 
1696  scc = (src.rawData() >= simm16) ? 1 : 0;
1697 
1698  scc.write();
1699  } // execute
1700  // --- Inst_SOPK__S_CMPK_LT_I32 class methods ---
1701 
1703  : Inst_SOPK(iFmt, "s_cmpk_lt_i32")
1704  {
1705  setFlag(ALU);
1706  } // Inst_SOPK__S_CMPK_LT_I32
1707 
1709  {
1710  } // ~Inst_SOPK__S_CMPK_LT_I32
1711 
1712  // --- description from .arch file ---
1713  // SCC = (S0.i < signext(SIMM16)).
1714  void
1716  {
1718  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1719  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1720 
1721  src.read();
1722 
1723  scc = (src.rawData() < simm16) ? 1 : 0;
1724 
1725  scc.write();
1726  } // execute
1727  // --- Inst_SOPK__S_CMPK_LE_I32 class methods ---
1728 
1730  : Inst_SOPK(iFmt, "s_cmpk_le_i32")
1731  {
1732  setFlag(ALU);
1733  } // Inst_SOPK__S_CMPK_LE_I32
1734 
1736  {
1737  } // ~Inst_SOPK__S_CMPK_LE_I32
1738 
1739  // --- description from .arch file ---
1740  // SCC = (S0.i <= signext(SIMM16)).
1741  void
1743  {
1745  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1746  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1747 
1748  src.read();
1749 
1750  scc = (src.rawData() <= simm16) ? 1 : 0;
1751 
1752  scc.write();
1753  } // execute
1754  // --- Inst_SOPK__S_CMPK_EQ_U32 class methods ---
1755 
1757  : Inst_SOPK(iFmt, "s_cmpk_eq_u32")
1758  {
1759  setFlag(ALU);
1760  } // Inst_SOPK__S_CMPK_EQ_U32
1761 
1763  {
1764  } // ~Inst_SOPK__S_CMPK_EQ_U32
1765 
1766  // --- description from .arch file ---
1767  // SCC = (S0.u == SIMM16).
1768  void
1770  {
1772  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1773  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1774 
1775  src.read();
1776 
1777  scc = (src.rawData() == simm16) ? 1 : 0;
1778 
1779  scc.write();
1780  } // execute
1781  // --- Inst_SOPK__S_CMPK_LG_U32 class methods ---
1782 
1784  : Inst_SOPK(iFmt, "s_cmpk_lg_u32")
1785  {
1786  setFlag(ALU);
1787  } // Inst_SOPK__S_CMPK_LG_U32
1788 
1790  {
1791  } // ~Inst_SOPK__S_CMPK_LG_U32
1792 
1793  // --- description from .arch file ---
1794  // SCC = (S0.u != SIMM16).
1795  void
1797  {
1799  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1800  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1801 
1802  src.read();
1803 
1804  scc = (src.rawData() != simm16) ? 1 : 0;
1805 
1806  scc.write();
1807  } // execute
1808  // --- Inst_SOPK__S_CMPK_GT_U32 class methods ---
1809 
1811  : Inst_SOPK(iFmt, "s_cmpk_gt_u32")
1812  {
1813  setFlag(ALU);
1814  } // Inst_SOPK__S_CMPK_GT_U32
1815 
1817  {
1818  } // ~Inst_SOPK__S_CMPK_GT_U32
1819 
1820  // --- description from .arch file ---
1821  // SCC = (S0.u > SIMM16).
1822  void
1824  {
1826  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1827  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1828 
1829  src.read();
1830 
1831  scc = (src.rawData() > simm16) ? 1 : 0;
1832 
1833  scc.write();
1834  } // execute
1835  // --- Inst_SOPK__S_CMPK_GE_U32 class methods ---
1836 
1838  : Inst_SOPK(iFmt, "s_cmpk_ge_u32")
1839  {
1840  setFlag(ALU);
1841  } // Inst_SOPK__S_CMPK_GE_U32
1842 
1844  {
1845  } // ~Inst_SOPK__S_CMPK_GE_U32
1846 
1847  // --- description from .arch file ---
1848  // SCC = (S0.u >= SIMM16).
1849  void
1851  {
1853  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1854  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1855 
1856  src.read();
1857 
1858  scc = (src.rawData() >= simm16) ? 1 : 0;
1859 
1860  scc.write();
1861  } // execute
1862  // --- Inst_SOPK__S_CMPK_LT_U32 class methods ---
1863 
1865  : Inst_SOPK(iFmt, "s_cmpk_lt_u32")
1866  {
1867  setFlag(ALU);
1868  } // Inst_SOPK__S_CMPK_LT_U32
1869 
1871  {
1872  } // ~Inst_SOPK__S_CMPK_LT_U32
1873 
1874  // --- description from .arch file ---
1875  // SCC = (S0.u < SIMM16).
1876  void
1878  {
1880  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1881  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1882 
1883  src.read();
1884 
1885  scc = (src.rawData() < simm16) ? 1 : 0;
1886 
1887  scc.write();
1888  } // execute
1889  // --- Inst_SOPK__S_CMPK_LE_U32 class methods ---
1890 
1892  : Inst_SOPK(iFmt, "s_cmpk_le_u32")
1893  {
1894  setFlag(ALU);
1895  } // Inst_SOPK__S_CMPK_LE_U32
1896 
1898  {
1899  } // ~Inst_SOPK__S_CMPK_LE_U32
1900 
1901  // --- description from .arch file ---
1902  // SCC = (S0.u <= SIMM16).
1903  void
1905  {
1907  ConstScalarOperandU32 src(gpuDynInst, instData.SDST);
1908  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1909 
1910  src.read();
1911 
1912  scc = (src.rawData() <= simm16) ? 1 : 0;
1913 
1914  scc.write();
1915  } // execute
1916  // --- Inst_SOPK__S_ADDK_I32 class methods ---
1917 
1919  : Inst_SOPK(iFmt, "s_addk_i32")
1920  {
1921  setFlag(ALU);
1922  } // Inst_SOPK__S_ADDK_I32
1923 
1925  {
1926  } // ~Inst_SOPK__S_ADDK_I32
1927 
1928  // --- description from .arch file ---
1929  // D.i = D.i + signext(SIMM16);
1930  // SCC = overflow.
1931  void
1933  {
1934  ScalarRegI16 simm16 = instData.SIMM16;
1935  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1936  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1937  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
1938 
1939  src.read();
1940 
1941  sdst = src.rawData() + (ScalarRegI32)simm16;
1942  scc = (bits(src.rawData(), 31) == bits(simm16, 15)
1943  && bits(src.rawData(), 31) != bits(sdst.rawData(), 31)) ? 1 : 0;
1944 
1945  sdst.write();
1946  scc.write();
1947  } // execute
1948  // --- Inst_SOPK__S_MULK_I32 class methods ---
1949 
1951  : Inst_SOPK(iFmt, "s_mulk_i32")
1952  {
1953  setFlag(ALU);
1954  } // Inst_SOPK__S_MULK_I32
1955 
1957  {
1958  } // ~Inst_SOPK__S_MULK_I32
1959 
1960  // --- description from .arch file ---
1961  // D.i = D.i * signext(SIMM16).
1962  void
1964  {
1965  ScalarRegI16 simm16 = instData.SIMM16;
1966  ConstScalarOperandI32 src(gpuDynInst, instData.SDST);
1967  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
1968 
1969  src.read();
1970 
1971  sdst = src.rawData() * (ScalarRegI32)simm16;
1972 
1973  sdst.write();
1974  } // execute
1975  // --- Inst_SOPK__S_CBRANCH_I_FORK class methods ---
1976 
1978  : Inst_SOPK(iFmt, "s_cbranch_i_fork")
1979  {
1980  setFlag(Branch);
1981  } // Inst_SOPK__S_CBRANCH_I_FORK
1982 
1984  {
1985  } // ~Inst_SOPK__S_CBRANCH_I_FORK
1986 
1987  // --- description from .arch file ---
1988  // mask_pass = S0.u64 & EXEC;
1989  // mask_fail = ~S0.u64 & EXEC;
1990  // target_addr = PC + signext(SIMM16 * 4) + 4;
1991  // if(mask_pass == EXEC)
1992  // PC = target_addr;
1993  // elsif(mask_fail == EXEC)
1994  // PC += 4;
1995  // elsif(bitcount(mask_fail) < bitcount(mask_pass))
1996  // EXEC = mask_fail;
1997  // SGPR[CSP*4] = { target_addr, mask_pass };
1998  // CSP++;
1999  // PC += 4;
2000  // else
2001  // EXEC = mask_pass;
2002  // SGPR[CSP*4] = { PC + 4, mask_fail };
2003  // CSP++;
2004  // PC = target_addr;
2005  // end.
2006  // Conditional branch using branch-stack.
2007  // S0 = compare mask(vcc or any sgpr), and
2008  // SIMM16 = signed DWORD branch offset relative to next instruction.
2009  // See also S_CBRANCH_JOIN.
2010  void
2012  {
2014  } // execute
2015  // --- Inst_SOPK__S_GETREG_B32 class methods ---
2016 
2018  : Inst_SOPK(iFmt, "s_getreg_b32")
2019  {
2020  } // Inst_SOPK__S_GETREG_B32
2021 
2023  {
2024  } // ~Inst_SOPK__S_GETREG_B32
2025 
2026  // --- description from .arch file ---
2027  // D.u = hardware-reg. Read some or all of a hardware register into the
2028  // LSBs of D.
2029  // SIMM16 = {size[4:0], offset[4:0], hwRegId[5:0]}; offset is 0..31, size
2030  // is 1..32.
2031  void
2033  {
2035  } // execute
2036  // --- Inst_SOPK__S_SETREG_B32 class methods ---
2037 
2039  : Inst_SOPK(iFmt, "s_setreg_b32")
2040  {
2041  setFlag(ALU);
2042  } // Inst_SOPK__S_SETREG_B32
2043 
2045  {
2046  } // ~Inst_SOPK__S_SETREG_B32
2047 
2048  // --- description from .arch file ---
2049  // hardware-reg = S0.u. Write some or all of the LSBs of D into a hardware
2050  // register.
2051  // SIMM16 = {size[4:0], offset[4:0], hwRegId[5:0]}; offset is 0..31, size
2052  // is 1..32.
2053  void
2055  {
2056  ScalarRegI16 simm16 = instData.SIMM16;
2057  ScalarRegU32 hwregId = simm16 & 0x3f;
2058  ScalarRegU32 offset = (simm16 >> 6) & 31;
2059  ScalarRegU32 size = ((simm16 >> 11) & 31) + 1;
2060 
2061  ScalarOperandU32 hwreg(gpuDynInst, hwregId);
2062  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2063  hwreg.read();
2064  sdst.read();
2065 
2066  // Store value from SDST to part of the hardware register.
2067  ScalarRegU32 mask = (((1U << size) - 1U) << offset);
2068  hwreg = ((hwreg.rawData() & ~mask)
2069  | ((sdst.rawData() << offset) & mask));
2070  hwreg.write();
2071 
2072  // set MODE register to control the behavior of single precision
2073  // floating-point numbers: denormal mode or round mode
2074  if (hwregId==1 && size==2
2075  && (offset==4 || offset==0)) {
2076  warn_once("Be cautious that s_setreg_b32 has no real effect "
2077  "on FP modes: %s\n", gpuDynInst->disassemble());
2078  return;
2079  }
2080 
2081  // panic if not changing MODE of floating-point numbers
2083  } // execute
2084  // --- Inst_SOPK__S_SETREG_IMM32_B32 class methods ---
2085 
2087  InFmt_SOPK *iFmt)
2088  : Inst_SOPK(iFmt, "s_setreg_imm32_b32")
2089  {
2090  setFlag(ALU);
2091  } // Inst_SOPK__S_SETREG_IMM32_B32
2092 
2094  {
2095  } // ~Inst_SOPK__S_SETREG_IMM32_B32
2096 
2097  // --- description from .arch file ---
2098  // Write some or all of the LSBs of IMM32 into a hardware register; this
2099  // --- instruction requires a 32-bit literal constant.
2100  // SIMM16 = {size[4:0], offset[4:0], hwRegId[5:0]}; offset is 0..31, size
2101  // is 1..32.
2102  void
2104  {
2105  ScalarRegI16 simm16 = instData.SIMM16;
2106  ScalarRegU32 hwregId = simm16 & 0x3f;
2107  ScalarRegU32 offset = (simm16 >> 6) & 31;
2108  ScalarRegU32 size = ((simm16 >> 11) & 31) + 1;
2109 
2110  ScalarOperandU32 hwreg(gpuDynInst, hwregId);
2111  ScalarRegI32 simm32 = extData.imm_u32;
2112  hwreg.read();
2113 
2114  // Store value from SIMM32 to part of the hardware register.
2115  ScalarRegU32 mask = (((1U << size) - 1U) << offset);
2116  hwreg = ((hwreg.rawData() & ~mask)
2117  | ((simm32 << offset) & mask));
2118  hwreg.write();
2119 
2120  // set MODE register to control the behavior of single precision
2121  // floating-point numbers: denormal mode or round mode
2122  if (hwregId==1 && size==2
2123  && (offset==4 || offset==0)) {
2124  warn_once("Be cautious that s_setreg_imm32_b32 has no real effect "
2125  "on FP modes: %s\n", gpuDynInst->disassemble());
2126  return;
2127  }
2128 
2129  // panic if not changing modes of single-precision FPs
2131  } // execute
2132  // --- Inst_SOP1__S_MOV_B32 class methods ---
2133 
2135  : Inst_SOP1(iFmt, "s_mov_b32")
2136  {
2137  setFlag(ALU);
2138  } // Inst_SOP1__S_MOV_B32
2139 
2141  {
2142  } // ~Inst_SOP1__S_MOV_B32
2143 
2144  // --- description from .arch file ---
2145  // D.u = S0.u.
2146  void
2148  {
2149  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2150  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2151 
2152  src.read();
2153 
2154  sdst = src.rawData();
2155 
2156  sdst.write();
2157  } // execute
2158  // --- Inst_SOP1__S_MOV_B64 class methods ---
2159 
2161  : Inst_SOP1(iFmt, "s_mov_b64")
2162  {
2163  setFlag(ALU);
2164  } // Inst_SOP1__S_MOV_B64
2165 
2167  {
2168  } // ~Inst_SOP1__S_MOV_B64
2169 
2170  // --- description from .arch file ---
2171  // D.u64 = S0.u64.
2172  void
2174  {
2175  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2176  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2177 
2178  src.read();
2179 
2180  sdst = src.rawData();
2181 
2182  sdst.write();
2183  } // execute
2184  // --- Inst_SOP1__S_CMOV_B32 class methods ---
2185 
2187  : Inst_SOP1(iFmt, "s_cmov_b32")
2188  {
2189  setFlag(ALU);
2190  } // Inst_SOP1__S_CMOV_B32
2191 
2193  {
2194  } // ~Inst_SOP1__S_CMOV_B32
2195 
2196  // --- description from .arch file ---
2197  // (SCC) then D.u = S0.u;
2198  // else NOP.
2199  // Conditional move.
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  scc.read();
2209 
2210  if (scc.rawData()) {
2211  sdst = src.rawData();
2212  sdst.write();
2213  }
2214  } // execute
2215  // --- Inst_SOP1__S_CMOV_B64 class methods ---
2216 
2218  : Inst_SOP1(iFmt, "s_cmov_b64")
2219  {
2220  setFlag(ALU);
2221  } // Inst_SOP1__S_CMOV_B64
2222 
2224  {
2225  } // ~Inst_SOP1__S_CMOV_B64
2226 
2227  // --- description from .arch file ---
2228  // if(SCC) then D.u64 = S0.u64;
2229  // else NOP.
2230  // Conditional move.
2231  void
2233  {
2234  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2235  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2236  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2237 
2238  src.read();
2239  scc.read();
2240 
2241  if (scc.rawData()) {
2242  sdst = src.rawData();
2243  sdst.write();
2244  }
2245  } // execute
2246  // --- Inst_SOP1__S_NOT_B32 class methods ---
2247 
2249  : Inst_SOP1(iFmt, "s_not_b32")
2250  {
2251  setFlag(ALU);
2252  } // Inst_SOP1__S_NOT_B32
2253 
2255  {
2256  } // ~Inst_SOP1__S_NOT_B32
2257 
2258  // --- description from .arch file ---
2259  // D.u = ~S0.u;
2260  // SCC = 1 if result is non-zero.
2261  // Bitwise negation.
2262  void
2264  {
2265  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2266  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2267  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2268 
2269  src.read();
2270 
2271  sdst = ~src.rawData();
2272 
2273  scc = sdst.rawData() ? 1 : 0;
2274 
2275  sdst.write();
2276  scc.write();
2277  } // execute
2278  // --- Inst_SOP1__S_NOT_B64 class methods ---
2279 
2281  : Inst_SOP1(iFmt, "s_not_b64")
2282  {
2283  setFlag(ALU);
2284  } // Inst_SOP1__S_NOT_B64
2285 
2287  {
2288  } // ~Inst_SOP1__S_NOT_B64
2289 
2290  // --- description from .arch file ---
2291  // D.u64 = ~S0.u64;
2292  // SCC = 1 if result is non-zero.
2293  // Bitwise negation.
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 = ~src.rawData();
2304  scc = sdst.rawData() ? 1 : 0;
2305 
2306  sdst.write();
2307  scc.write();
2308  } // execute
2309  // --- Inst_SOP1__S_WQM_B32 class methods ---
2310 
2312  : Inst_SOP1(iFmt, "s_wqm_b32")
2313  {
2314  setFlag(ALU);
2315  } // Inst_SOP1__S_WQM_B32
2316 
2318  {
2319  } // ~Inst_SOP1__S_WQM_B32
2320 
2321  // --- description from .arch file ---
2322  // D[i] = (S0[(i & ~3):(i | 3)] != 0);
2323  // Computes whole quad mode for an active/valid mask.
2324  // SCC = 1 if result is non-zero.
2325  void
2327  {
2328  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2329  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2330  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2331 
2332  src.read();
2333 
2334  sdst = wholeQuadMode(src.rawData());
2335  scc = sdst.rawData() ? 1 : 0;
2336 
2337  sdst.write();
2338  scc.write();
2339  } // execute
2340  // --- Inst_SOP1__S_WQM_B64 class methods ---
2341 
2343  : Inst_SOP1(iFmt, "s_wqm_b64")
2344  {
2345  setFlag(ALU);
2346  } // Inst_SOP1__S_WQM_B64
2347 
2349  {
2350  } // ~Inst_SOP1__S_WQM_B64
2351 
2352  // --- description from .arch file ---
2353  // D[i] = (S0[(i & ~3):(i | 3)] != 0);
2354  // Computes whole quad mode for an active/valid mask.
2355  // SCC = 1 if result is non-zero.
2356  void
2358  {
2359  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2360  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2361  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2362 
2363  src.read();
2364 
2365  sdst = wholeQuadMode(src.rawData());
2366  scc = sdst.rawData() ? 1 : 0;
2367 
2368  sdst.write();
2369  scc.write();
2370  } // execute
2371  // --- Inst_SOP1__S_BREV_B32 class methods ---
2372 
2374  : Inst_SOP1(iFmt, "s_brev_b32")
2375  {
2376  setFlag(ALU);
2377  } // Inst_SOP1__S_BREV_B32
2378 
2380  {
2381  } // ~Inst_SOP1__S_BREV_B32
2382 
2383  // --- description from .arch file ---
2384  // D.u[31:0] = S0.u[0:31] (reverse bits).
2385  void
2387  {
2388  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2389  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2390 
2391  src.read();
2392 
2393  sdst = reverseBits(src.rawData());
2394 
2395  sdst.write();
2396  } // execute
2397  // --- Inst_SOP1__S_BREV_B64 class methods ---
2398 
2400  : Inst_SOP1(iFmt, "s_brev_b64")
2401  {
2402  setFlag(ALU);
2403  } // Inst_SOP1__S_BREV_B64
2404 
2406  {
2407  } // ~Inst_SOP1__S_BREV_B64
2408 
2409  // --- description from .arch file ---
2410  // D.u64[63:0] = S0.u64[0:63] (reverse bits).
2411  void
2413  {
2414  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2415  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2416 
2417  src.read();
2418 
2419  sdst = reverseBits(src.rawData());
2420 
2421  sdst.write();
2422  } // execute
2423  // --- Inst_SOP1__S_BCNT0_I32_B32 class methods ---
2424 
2426  : Inst_SOP1(iFmt, "s_bcnt0_i32_b32")
2427  {
2428  setFlag(ALU);
2429  } // Inst_SOP1__S_BCNT0_I32_B32
2430 
2432  {
2433  } // ~Inst_SOP1__S_BCNT0_I32_B32
2434 
2435  // --- description from .arch file ---
2436  // D.i = CountZeroBits(S0.u);
2437  // SCC = 1 if result is non-zero.
2438  void
2440  {
2441  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2442  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2443  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2444 
2445  src.read();
2446 
2447  sdst = countZeroBits(src.rawData());
2448  scc = sdst.rawData() ? 1 : 0;
2449 
2450  sdst.write();
2451  scc.write();
2452  } // execute
2453  // --- Inst_SOP1__S_BCNT0_I32_B64 class methods ---
2454 
2456  : Inst_SOP1(iFmt, "s_bcnt0_i32_b64")
2457  {
2458  setFlag(ALU);
2459  } // Inst_SOP1__S_BCNT0_I32_B64
2460 
2462  {
2463  } // ~Inst_SOP1__S_BCNT0_I32_B64
2464 
2465  // --- description from .arch file ---
2466  // D.i = CountZeroBits(S0.u64);
2467  // SCC = 1 if result is non-zero.
2468  void
2470  {
2471  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2472  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2473  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2474 
2475  src.read();
2476 
2477  sdst = countZeroBits(src.rawData());
2478  scc = sdst.rawData() ? 1 : 0;
2479 
2480  sdst.write();
2481  scc.write();
2482  } // execute
2483  // --- Inst_SOP1__S_BCNT1_I32_B32 class methods ---
2484 
2486  : Inst_SOP1(iFmt, "s_bcnt1_i32_b32")
2487  {
2488  setFlag(ALU);
2489  } // Inst_SOP1__S_BCNT1_I32_B32
2490 
2492  {
2493  } // ~Inst_SOP1__S_BCNT1_I32_B32
2494 
2495  // --- description from .arch file ---
2496  // D.i = CountOneBits(S0.u);
2497  // SCC = 1 if result is non-zero.
2498  void
2500  {
2501  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2502  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2503  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2504 
2505  src.read();
2506 
2507  sdst = popCount(src.rawData());
2508  scc = sdst.rawData() ? 1 : 0;
2509 
2510  sdst.write();
2511  scc.write();
2512  } // execute
2513  // --- Inst_SOP1__S_BCNT1_I32_B64 class methods ---
2514 
2516  : Inst_SOP1(iFmt, "s_bcnt1_i32_b64")
2517  {
2518  setFlag(ALU);
2519  } // Inst_SOP1__S_BCNT1_I32_B64
2520 
2522  {
2523  } // ~Inst_SOP1__S_BCNT1_I32_B64
2524 
2525  // --- description from .arch file ---
2526  // D.i = CountOneBits(S0.u64);
2527  // SCC = 1 if result is non-zero.
2528  void
2530  {
2531  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2532  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2533  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
2534 
2535  src.read();
2536 
2537  sdst = popCount(src.rawData());
2538  scc = sdst.rawData() ? 1 : 0;
2539 
2540  sdst.write();
2541  scc.write();
2542  } // execute
2543  // --- Inst_SOP1__S_FF0_I32_B32 class methods ---
2544 
2546  : Inst_SOP1(iFmt, "s_ff0_i32_b32")
2547  {
2548  setFlag(ALU);
2549  } // Inst_SOP1__S_FF0_I32_B32
2550 
2552  {
2553  } // ~Inst_SOP1__S_FF0_I32_B32
2554 
2555  // --- description from .arch file ---
2556  // D.i = FindFirstZero(S0.u);
2557  // If no zeros are found, return -1.
2558  // Returns the bit position of the first zero from the LSB.
2559  void
2561  {
2562  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2563  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2564 
2565  src.read();
2566 
2567  sdst = findFirstZero(src.rawData());
2568 
2569  sdst.write();
2570  } // execute
2571  // --- Inst_SOP1__S_FF0_I32_B64 class methods ---
2572 
2574  : Inst_SOP1(iFmt, "s_ff0_i32_b64")
2575  {
2576  setFlag(ALU);
2577  } // Inst_SOP1__S_FF0_I32_B64
2578 
2580  {
2581  } // ~Inst_SOP1__S_FF0_I32_B64
2582 
2583  // --- description from .arch file ---
2584  // D.i = FindFirstZero(S0.u64);
2585  // If no zeros are found, return -1.
2586  // Returns the bit position of the first zero from the LSB.
2587  void
2589  {
2590  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2591  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2592 
2593  src.read();
2594 
2595  sdst = findFirstZero(src.rawData());
2596 
2597  sdst.write();
2598  } // execute
2599  // --- Inst_SOP1__S_FF1_I32_B32 class methods ---
2600 
2602  : Inst_SOP1(iFmt, "s_ff1_i32_b32")
2603  {
2604  setFlag(ALU);
2605  } // Inst_SOP1__S_FF1_I32_B32
2606 
2608  {
2609  } // ~Inst_SOP1__S_FF1_I32_B32
2610 
2611  // --- description from .arch file ---
2612  // D.i = FindFirstOne(S0.u);
2613  // If no ones are found, return -1.
2614  // Returns the bit position of the first one from the LSB.
2615  void
2617  {
2618  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2619  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2620 
2621  src.read();
2622 
2623  sdst = findFirstOne(src.rawData());
2624 
2625  sdst.write();
2626  } // execute
2627  // --- Inst_SOP1__S_FF1_I32_B64 class methods ---
2628 
2630  : Inst_SOP1(iFmt, "s_ff1_i32_b64")
2631  {
2632  setFlag(ALU);
2633  } // Inst_SOP1__S_FF1_I32_B64
2634 
2636  {
2637  } // ~Inst_SOP1__S_FF1_I32_B64
2638 
2639  // --- description from .arch file ---
2640  // D.i = FindFirstOne(S0.u64);
2641  // If no ones are found, return -1.
2642  // Returns the bit position of the first one from the LSB.
2643  void
2645  {
2646  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2647  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2648 
2649  src.read();
2650 
2651  sdst = findFirstOne(src.rawData());
2652 
2653  sdst.write();
2654  } // execute
2655  // --- Inst_SOP1__S_FLBIT_I32_B32 class methods ---
2656 
2658  : Inst_SOP1(iFmt, "s_flbit_i32_b32")
2659  {
2660  setFlag(ALU);
2661  } // Inst_SOP1__S_FLBIT_I32_B32
2662 
2664  {
2665  } // ~Inst_SOP1__S_FLBIT_I32_B32
2666 
2667  // --- description from .arch file ---
2668  // D.i = FindFirstOne(S0.u);
2669  // If no ones are found, return -1.
2670  // Counts how many zeros before the first one starting from the MSB.
2671  void
2673  {
2674  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2675  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2676 
2677  src.read();
2678 
2679  sdst = countZeroBitsMsb(src.rawData());
2680 
2681  sdst.write();
2682  } // execute
2683  // --- Inst_SOP1__S_FLBIT_I32_B64 class methods ---
2684 
2686  : Inst_SOP1(iFmt, "s_flbit_i32_b64")
2687  {
2688  setFlag(ALU);
2689  } // Inst_SOP1__S_FLBIT_I32_B64
2690 
2692  {
2693  } // ~Inst_SOP1__S_FLBIT_I32_B64
2694 
2695  // --- description from .arch file ---
2696  // D.i = FindFirstOne(S0.u64);
2697  // If no ones are found, return -1.
2698  // Counts how many zeros before the first one starting from the MSB.
2699  void
2701  {
2702  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2703  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2704 
2705  src.read();
2706 
2707  sdst = countZeroBitsMsb(src.rawData());
2708 
2709  sdst.write();
2710  } // execute
2711  // --- Inst_SOP1__S_FLBIT_I32 class methods ---
2712 
2714  : Inst_SOP1(iFmt, "s_flbit_i32")
2715  {
2716  setFlag(ALU);
2717  } // Inst_SOP1__S_FLBIT_I32
2718 
2720  {
2721  } // ~Inst_SOP1__S_FLBIT_I32
2722 
2723  // --- description from .arch file ---
2724  // D.i = FirstOppositeSignBit(S0.i);
2725  // If S0.i == 0 or S0.i == -1 (all bits are the same), return -1.
2726  // Counts how many bits in a row (from MSB to LSB) are the same as the
2727  // sign bit.
2728  void
2730  {
2731  ConstScalarOperandI32 src(gpuDynInst, instData.SSRC0);
2732  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2733 
2734  src.read();
2735 
2736  sdst = firstOppositeSignBit(src.rawData());
2737 
2738  sdst.write();
2739  } // execute
2740  // --- Inst_SOP1__S_FLBIT_I32_I64 class methods ---
2741 
2743  : Inst_SOP1(iFmt, "s_flbit_i32_i64")
2744  {
2745  setFlag(ALU);
2746  } // Inst_SOP1__S_FLBIT_I32_I64
2747 
2749  {
2750  } // ~Inst_SOP1__S_FLBIT_I32_I64
2751 
2752  // --- description from .arch file ---
2753  // D.i = FirstOppositeSignBit(S0.i64);
2754  // If S0.i == 0 or S0.i == -1 (all bits are the same), return -1.
2755  // Counts how many bits in a row (from MSB to LSB) are the same as the
2756  // sign bit.
2757  void
2759  {
2760  ConstScalarOperandI64 src(gpuDynInst, instData.SSRC0);
2761  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2762 
2763  src.read();
2764 
2765  sdst = firstOppositeSignBit(src.rawData());
2766 
2767  sdst.write();
2768  } // execute
2769  // --- Inst_SOP1__S_SEXT_I32_I8 class methods ---
2770 
2772  : Inst_SOP1(iFmt, "s_sext_i32_i8")
2773  {
2774  setFlag(ALU);
2775  } // Inst_SOP1__S_SEXT_I32_I8
2776 
2778  {
2779  } // ~Inst_SOP1__S_SEXT_I32_I8
2780 
2781  // --- description from .arch file ---
2782  // D.i = signext(S0.i[7:0]) (sign extension).
2783  void
2785  {
2786  ConstScalarOperandI32 src(gpuDynInst, instData.SSRC0);
2787  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2788 
2789  src.read();
2790 
2791  sdst = sext<std::numeric_limits<ScalarRegI8>::digits>(
2792  bits(src.rawData(), 7, 0));
2793 
2794  sdst.write();
2795  } // execute
2796  // --- Inst_SOP1__S_SEXT_I32_I16 class methods ---
2797 
2799  : Inst_SOP1(iFmt, "s_sext_i32_i16")
2800  {
2801  setFlag(ALU);
2802  } // Inst_SOP1__S_SEXT_I32_I16
2803 
2805  {
2806  } // ~Inst_SOP1__S_SEXT_I32_I16
2807 
2808  // --- description from .arch file ---
2809  // D.i = signext(S0.i[15:0]) (sign extension).
2810  void
2812  {
2813  ConstScalarOperandI32 src(gpuDynInst, instData.SSRC0);
2814  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
2815 
2816  src.read();
2817 
2818  sdst = sext<std::numeric_limits<ScalarRegI16>::digits>(
2819  bits(src.rawData(), 15, 0));
2820 
2821  sdst.write();
2822  } // execute
2823  // --- Inst_SOP1__S_BITSET0_B32 class methods ---
2824 
2826  : Inst_SOP1(iFmt, "s_bitset0_b32")
2827  {
2828  setFlag(ALU);
2829  } // Inst_SOP1__S_BITSET0_B32
2830 
2832  {
2833  } // ~Inst_SOP1__S_BITSET0_B32
2834 
2835  // --- description from .arch file ---
2836  // D.u[S0.u[4:0]] = 0.
2837  void
2839  {
2840  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2841  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2842 
2843  src.read();
2844 
2845  sdst.setBit(bits(src.rawData(), 4, 0), 0);
2846 
2847  sdst.write();
2848  } // execute
2849  // --- Inst_SOP1__S_BITSET0_B64 class methods ---
2850 
2852  : Inst_SOP1(iFmt, "s_bitset0_b64")
2853  {
2854  setFlag(ALU);
2855  } // Inst_SOP1__S_BITSET0_B64
2856 
2858  {
2859  } // ~Inst_SOP1__S_BITSET0_B64
2860 
2861  // --- description from .arch file ---
2862  // D.u64[S0.u[5:0]] = 0.
2863  void
2865  {
2866  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2867  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2868 
2869  src.read();
2870 
2871  sdst.setBit(bits(src.rawData(), 5, 0), 0);
2872 
2873  sdst.write();
2874  } // execute
2875  // --- Inst_SOP1__S_BITSET1_B32 class methods ---
2876 
2878  : Inst_SOP1(iFmt, "s_bitset1_b32")
2879  {
2880  setFlag(ALU);
2881  } // Inst_SOP1__S_BITSET1_B32
2882 
2884  {
2885  } // ~Inst_SOP1__S_BITSET1_B32
2886 
2887  // --- description from .arch file ---
2888  // D.u[S0.u[4:0]] = 1.
2889  void
2891  {
2892  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2893  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
2894 
2895  src.read();
2896 
2897  sdst.setBit(bits(src.rawData(), 4, 0), 1);
2898 
2899  sdst.write();
2900  } // execute
2901  // --- Inst_SOP1__S_BITSET1_B64 class methods ---
2902 
2904  : Inst_SOP1(iFmt, "s_bitset1_b64")
2905  {
2906  setFlag(ALU);
2907  } // Inst_SOP1__S_BITSET1_B64
2908 
2910  {
2911  } // ~Inst_SOP1__S_BITSET1_B64
2912 
2913  // --- description from .arch file ---
2914  // D.u64[S0.u[5:0]] = 1.
2915  void
2917  {
2918  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
2919  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2920 
2921  src.read();
2922 
2923  sdst.setBit(bits(src.rawData(), 5, 0), 1);
2924 
2925  sdst.write();
2926  } // execute
2927  // --- Inst_SOP1__S_GETPC_B64 class methods ---
2928 
2930  : Inst_SOP1(iFmt, "s_getpc_b64")
2931  {
2932  setFlag(ALU);
2933  } // Inst_SOP1__S_GETPC_B64
2934 
2936  {
2937  } // ~Inst_SOP1__S_GETPC_B64
2938 
2939  // --- description from .arch file ---
2940  // D.u64 = PC + 4.
2941  // Destination receives the byte address of the next instruction.
2942  void
2944  {
2945  Addr pc = gpuDynInst->pc();
2946  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2947 
2948  sdst = pc + 4;
2949 
2950  sdst.write();
2951  } // execute
2952  // --- Inst_SOP1__S_SETPC_B64 class methods ---
2953 
2955  : Inst_SOP1(iFmt, "s_setpc_b64")
2956  {
2957  setFlag(ALU);
2958  } // Inst_SOP1__S_SETPC_B64
2959 
2961  {
2962  } // ~Inst_SOP1__S_SETPC_B64
2963 
2964  // --- description from .arch file ---
2965  // PC = S0.u64.
2966  // S0.u64 is a byte address of the instruction to jump to.
2967  void
2969  {
2970  Wavefront *wf = gpuDynInst->wavefront();
2971  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2972 
2973  src.read();
2974 
2975  wf->pc(src.rawData());
2976  } // execute
2977  // --- Inst_SOP1__S_SWAPPC_B64 class methods ---
2978 
2980  : Inst_SOP1(iFmt, "s_swappc_b64")
2981  {
2982  setFlag(ALU);
2983  } // Inst_SOP1__S_SWAPPC_B64
2984 
2986  {
2987  } // ~Inst_SOP1__S_SWAPPC_B64
2988 
2989  // --- description from .arch file ---
2990  // D.u64 = PC + 4; PC = S0.u64.
2991  // S0.u64 is a byte address of the instruction to jump to.
2992  void
2994  {
2995  Wavefront *wf = gpuDynInst->wavefront();
2996  Addr pc = gpuDynInst->pc();
2997  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
2998  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
2999 
3000  src.read();
3001 
3002  sdst = pc + 4;
3003 
3004  wf->pc(src.rawData());
3005  sdst.write();
3006  } // execute
3007  // --- Inst_SOP1__S_RFE_B64 class methods ---
3008 
3010  : Inst_SOP1(iFmt, "s_rfe_b64")
3011  {
3012  } // Inst_SOP1__S_RFE_B64
3013 
3015  {
3016  } // ~Inst_SOP1__S_RFE_B64
3017 
3018  // --- description from .arch file ---
3019  // PRIV = 0;
3020  // PC = S0.u64.
3021  // Return from exception handler and continue.
3022  // This instruction may only be used within a trap handler.
3023  void
3025  {
3027  } // execute
3028  // --- Inst_SOP1__S_AND_SAVEEXEC_B64 class methods ---
3029 
3031  InFmt_SOP1 *iFmt)
3032  : Inst_SOP1(iFmt, "s_and_saveexec_b64")
3033  {
3034  setFlag(ALU);
3035  setFlag(ReadsEXEC);
3036  setFlag(WritesEXEC);
3037  } // Inst_SOP1__S_AND_SAVEEXEC_B64
3038 
3040  {
3041  } // ~Inst_SOP1__S_AND_SAVEEXEC_B64
3042 
3043  // --- description from .arch file ---
3044  // D.u64 = EXEC;
3045  // EXEC = S0.u64 & EXEC;
3046  // SCC = 1 if the new value of EXEC is non-zero.
3047  void
3049  {
3050  Wavefront *wf = gpuDynInst->wavefront();
3051  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3052  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3053  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3054 
3055  src.read();
3056 
3057  sdst = wf->execMask().to_ullong();
3058  wf->execMask() = src.rawData() & wf->execMask().to_ullong();
3059  scc = wf->execMask().any() ? 1 : 0;
3060 
3061  sdst.write();
3062  scc.write();
3063  } // execute
3064  // --- Inst_SOP1__S_OR_SAVEEXEC_B64 class methods ---
3065 
3067  InFmt_SOP1 *iFmt)
3068  : Inst_SOP1(iFmt, "s_or_saveexec_b64")
3069  {
3070  setFlag(ALU);
3071  setFlag(ReadsEXEC);
3072  setFlag(WritesEXEC);
3073  } // Inst_SOP1__S_OR_SAVEEXEC_B64
3074 
3076  {
3077  } // ~Inst_SOP1__S_OR_SAVEEXEC_B64
3078 
3079  // --- description from .arch file ---
3080  // D.u64 = EXEC;
3081  // EXEC = S0.u64 | EXEC;
3082  // SCC = 1 if the new value of EXEC is non-zero.
3083  void
3085  {
3086  Wavefront *wf = gpuDynInst->wavefront();
3087  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3088  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3089  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3090 
3091  src.read();
3092 
3093  sdst = wf->execMask().to_ullong();
3094  wf->execMask() = src.rawData() | wf->execMask().to_ullong();
3095  scc = wf->execMask().any() ? 1 : 0;
3096 
3097  sdst.write();
3098  scc.write();
3099  } // execute
3100  // --- Inst_SOP1__S_XOR_SAVEEXEC_B64 class methods ---
3101 
3103  InFmt_SOP1 *iFmt)
3104  : Inst_SOP1(iFmt, "s_xor_saveexec_b64")
3105  {
3106  setFlag(ALU);
3107  setFlag(ReadsEXEC);
3108  setFlag(WritesEXEC);
3109  } // Inst_SOP1__S_XOR_SAVEEXEC_B64
3110 
3112  {
3113  } // ~Inst_SOP1__S_XOR_SAVEEXEC_B64
3114 
3115  // --- description from .arch file ---
3116  // D.u64 = EXEC;
3117  // EXEC = S0.u64 ^ EXEC;
3118  // SCC = 1 if the new value of EXEC is non-zero.
3119  void
3121  {
3122  Wavefront *wf = gpuDynInst->wavefront();
3123  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3124  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3125  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3126 
3127  src.read();
3128 
3129  sdst = wf->execMask().to_ullong();
3130  wf->execMask() = src.rawData() ^ wf->execMask().to_ullong();
3131  scc = wf->execMask().any() ? 1 : 0;
3132 
3133  sdst.write();
3134  scc.write();
3135  } // execute
3136  // --- Inst_SOP1__S_ANDN2_SAVEEXEC_B64 class methods ---
3137 
3139  InFmt_SOP1 *iFmt)
3140  : Inst_SOP1(iFmt, "s_andn2_saveexec_b64")
3141  {
3142  setFlag(ALU);
3143  setFlag(ReadsEXEC);
3144  setFlag(WritesEXEC);
3145  } // Inst_SOP1__S_ANDN2_SAVEEXEC_B64
3146 
3148  {
3149  } // ~Inst_SOP1__S_ANDN2_SAVEEXEC_B64
3150 
3151  // --- description from .arch file ---
3152  // D.u64 = EXEC;
3153  // EXEC = S0.u64 & ~EXEC;
3154  // SCC = 1 if the new value of EXEC is non-zero.
3155  void
3157  {
3158  Wavefront *wf = gpuDynInst->wavefront();
3159  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3160  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3161  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3162 
3163  src.read();
3164 
3165  sdst = wf->execMask().to_ullong();
3166  wf->execMask() = src.rawData() &~ wf->execMask().to_ullong();
3167  scc = wf->execMask().any() ? 1 : 0;
3168 
3169  sdst.write();
3170  scc.write();
3171  } // execute
3172  // --- Inst_SOP1__S_ORN2_SAVEEXEC_B64 class methods ---
3173 
3175  InFmt_SOP1 *iFmt)
3176  : Inst_SOP1(iFmt, "s_orn2_saveexec_b64")
3177  {
3178  setFlag(ALU);
3179  setFlag(ReadsEXEC);
3180  setFlag(WritesEXEC);
3181  } // Inst_SOP1__S_ORN2_SAVEEXEC_B64
3182 
3184  {
3185  } // ~Inst_SOP1__S_ORN2_SAVEEXEC_B64
3186 
3187  // --- description from .arch file ---
3188  // D.u64 = EXEC;
3189  // EXEC = S0.u64 | ~EXEC;
3190  // SCC = 1 if the new value of EXEC is non-zero.
3191  void
3193  {
3194  Wavefront *wf = gpuDynInst->wavefront();
3195  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3196  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3197  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3198 
3199  src.read();
3200 
3201  sdst = wf->execMask().to_ullong();
3202  wf->execMask() = src.rawData() |~ wf->execMask().to_ullong();
3203  scc = wf->execMask().any() ? 1 : 0;
3204 
3205  sdst.write();
3206  scc.write();
3207  } // execute
3208  // --- Inst_SOP1__S_NAND_SAVEEXEC_B64 class methods ---
3209 
3211  InFmt_SOP1 *iFmt)
3212  : Inst_SOP1(iFmt, "s_nand_saveexec_b64")
3213  {
3214  setFlag(ALU);
3215  setFlag(ReadsEXEC);
3216  setFlag(WritesEXEC);
3217  } // Inst_SOP1__S_NAND_SAVEEXEC_B64
3218 
3220  {
3221  } // ~Inst_SOP1__S_NAND_SAVEEXEC_B64
3222 
3223  // --- description from .arch file ---
3224  // D.u64 = EXEC;
3225  // EXEC = ~(S0.u64 & EXEC);
3226  // SCC = 1 if the new value of EXEC is non-zero.
3227  void
3229  {
3230  Wavefront *wf = gpuDynInst->wavefront();
3231  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3232  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3233  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3234 
3235  src.read();
3236 
3237  sdst = wf->execMask().to_ullong();
3238  wf->execMask() = ~(src.rawData() & wf->execMask().to_ullong());
3239  scc = wf->execMask().any() ? 1 : 0;
3240 
3241  sdst.write();
3242  scc.write();
3243  } // execute
3244  // --- Inst_SOP1__S_NOR_SAVEEXEC_B64 class methods ---
3245 
3247  InFmt_SOP1 *iFmt)
3248  : Inst_SOP1(iFmt, "s_nor_saveexec_b64")
3249  {
3250  setFlag(ALU);
3251  setFlag(ReadsEXEC);
3252  setFlag(WritesEXEC);
3253  } // Inst_SOP1__S_NOR_SAVEEXEC_B64
3254 
3256  {
3257  } // ~Inst_SOP1__S_NOR_SAVEEXEC_B64
3258 
3259  // --- description from .arch file ---
3260  // D.u64 = EXEC;
3261  // EXEC = ~(S0.u64 | EXEC);
3262  // SCC = 1 if the new value of EXEC is non-zero.
3263  void
3265  {
3266  Wavefront *wf = gpuDynInst->wavefront();
3267  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3268  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3269  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3270 
3271  src.read();
3272 
3273  sdst = wf->execMask().to_ullong();
3274  wf->execMask() = ~(src.rawData() | wf->execMask().to_ullong());
3275  scc = wf->execMask().any() ? 1 : 0;
3276 
3277  sdst.write();
3278  scc.write();
3279  } // execute
3280  // --- Inst_SOP1__S_XNOR_SAVEEXEC_B64 class methods ---
3281 
3283  InFmt_SOP1 *iFmt)
3284  : Inst_SOP1(iFmt, "s_xnor_saveexec_b64")
3285  {
3286  setFlag(ALU);
3287  setFlag(ReadsEXEC);
3288  setFlag(WritesEXEC);
3289  } // Inst_SOP1__S_XNOR_SAVEEXEC_B64
3290 
3292  {
3293  } // ~Inst_SOP1__S_XNOR_SAVEEXEC_B64
3294 
3295  // --- description from .arch file ---
3296  // D.u64 = EXEC;
3297  // EXEC = ~(S0.u64 ^ EXEC);
3298  // SCC = 1 if the new value of EXEC is non-zero.
3299  void
3301  {
3302  Wavefront *wf = gpuDynInst->wavefront();
3303  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3304  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3305  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3306 
3307  src.read();
3308 
3309  sdst = wf->execMask().to_ullong();
3310  wf->execMask() = ~(src.rawData() ^ wf->execMask().to_ullong());
3311  scc = wf->execMask().any() ? 1 : 0;
3312 
3313  sdst.write();
3314  scc.write();
3315  } // execute
3316  // --- Inst_SOP1__S_QUADMASK_B32 class methods ---
3317 
3319  : Inst_SOP1(iFmt, "s_quadmask_b32")
3320  {
3321  setFlag(ALU);
3322  } // Inst_SOP1__S_QUADMASK_B32
3323 
3325  {
3326  } // ~Inst_SOP1__S_QUADMASK_B32
3327 
3328  // --- description from .arch file ---
3329  // D.u = QuadMask(S0.u):
3330  // D[0] = OR(S0[3:0]), D[1] = OR(S0[7:4]) ... D[31:8] = 0;
3331  // SCC = 1 if result is non-zero.
3332  void
3334  {
3335  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
3336  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
3337  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3338 
3339  src.read();
3340 
3341  sdst = quadMask(src.rawData());
3342  scc = sdst.rawData() ? 1 : 0;
3343 
3344  sdst.write();
3345  scc.write();
3346  } // execute
3347  // --- Inst_SOP1__S_QUADMASK_B64 class methods ---
3348 
3350  : Inst_SOP1(iFmt, "s_quadmask_b64")
3351  {
3352  setFlag(ALU);
3353  } // Inst_SOP1__S_QUADMASK_B64
3354 
3356  {
3357  } // ~Inst_SOP1__S_QUADMASK_B64
3358 
3359  // --- description from .arch file ---
3360  // D.u64 = QuadMask(S0.u64):
3361  // D[0] = OR(S0[3:0]), D[1] = OR(S0[7:4]) ... D[63:16] = 0;
3362  // SCC = 1 if result is non-zero.
3363  void
3365  {
3366  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3367  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3368  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3369 
3370  src.read();
3371 
3372  sdst = quadMask(src.rawData());
3373  scc = sdst.rawData() ? 1 : 0;
3374 
3375  sdst.write();
3376  scc.write();
3377  } // execute
3378  // --- Inst_SOP1__S_MOVRELS_B32 class methods ---
3379 
3381  : Inst_SOP1(iFmt, "s_movrels_b32")
3382  {
3383  setFlag(ALU);
3384  } // Inst_SOP1__S_MOVRELS_B32
3385 
3387  {
3388  } // ~Inst_SOP1__S_MOVRELS_B32
3389 
3390  // --- description from .arch file ---
3391  // D.u = SGPR[S0.u + M0.u].u (move from relative source).
3392  void
3394  {
3395  ConstScalarOperandU32 m0(gpuDynInst, REG_M0);
3396  m0.read();
3397  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0 + m0.rawData());
3398  ScalarOperandU32 sdst(gpuDynInst, instData.SDST);
3399 
3400  src.read();
3401 
3402  sdst = src.rawData();
3403 
3404  sdst.write();
3405  } // execute
3406  // --- Inst_SOP1__S_MOVRELS_B64 class methods ---
3407 
3409  : Inst_SOP1(iFmt, "s_movrels_b64")
3410  {
3411  setFlag(ALU);
3412  } // Inst_SOP1__S_MOVRELS_B64
3413 
3415  {
3416  } // ~Inst_SOP1__S_MOVRELS_B64
3417 
3418  // --- description from .arch file ---
3419  // D.u64 = SGPR[S0.u + M0.u].u64 (move from relative source).
3420  // The index in M0.u must be even for this operation.
3421  void
3423  {
3424  ConstScalarOperandU32 m0(gpuDynInst, REG_M0);
3425  m0.read();
3426  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0 + m0.rawData());
3427  ScalarOperandU64 sdst(gpuDynInst, instData.SDST);
3428 
3429  src.read();
3430 
3431  sdst = src.rawData();
3432 
3433  sdst.write();
3434  } // execute
3435  // --- Inst_SOP1__S_MOVRELD_B32 class methods ---
3436 
3438  : Inst_SOP1(iFmt, "s_movreld_b32")
3439  {
3440  setFlag(ALU);
3441  } // Inst_SOP1__S_MOVRELD_B32
3442 
3444  {
3445  } // ~Inst_SOP1__S_MOVRELD_B32
3446 
3447  // --- description from .arch file ---
3448  // SGPR[D.u + M0.u].u = S0.u (move to relative destination).
3449  void
3451  {
3452  ConstScalarOperandU32 m0(gpuDynInst, REG_M0);
3453  m0.read();
3454  ConstScalarOperandU32 src(gpuDynInst, instData.SSRC0);
3455  ScalarOperandU32 sdst(gpuDynInst, instData.SDST + m0.rawData());
3456 
3457  src.read();
3458 
3459  sdst = src.rawData();
3460 
3461  sdst.write();
3462  } // execute
3463  // --- Inst_SOP1__S_MOVRELD_B64 class methods ---
3464 
3466  : Inst_SOP1(iFmt, "s_movreld_b64")
3467  {
3468  setFlag(ALU);
3469  } // Inst_SOP1__S_MOVRELD_B64
3470 
3472  {
3473  } // ~Inst_SOP1__S_MOVRELD_B64
3474 
3475  // --- description from .arch file ---
3476  // SGPR[D.u + M0.u].u64 = S0.u64 (move to relative destination).
3477  // The index in M0.u must be even for this operation.
3478  void
3480  {
3481  ConstScalarOperandU32 m0(gpuDynInst, REG_M0);
3482  m0.read();
3483  ConstScalarOperandU64 src(gpuDynInst, instData.SSRC0);
3484  ScalarOperandU64 sdst(gpuDynInst, instData.SDST + m0.rawData());
3485 
3486  src.read();
3487 
3488  sdst = src.rawData();
3489 
3490  sdst.write();
3491  } // execute
3492  // --- Inst_SOP1__S_CBRANCH_JOIN class methods ---
3493 
3495  : Inst_SOP1(iFmt, "s_cbranch_join")
3496  {
3497  setFlag(Branch);
3498  setFlag(WritesEXEC);
3499  } // Inst_SOP1__S_CBRANCH_JOIN
3500 
3502  {
3503  } // ~Inst_SOP1__S_CBRANCH_JOIN
3504 
3505  // --- description from .arch file ---
3506  // saved_csp = S0.u;
3507  // if(CSP == saved_csp) then
3508  // PC += 4; // Second time to JOIN: continue with program.
3509  // else
3510  // CSP -= 1; // First time to JOIN; jump to other FORK path.
3511  // {PC, EXEC} = SGPR[CSP * 4]; // Read 128 bits from 4 consecutive
3512  // SGPRs.
3513  // end
3514  // Conditional branch join point (end of conditional branch block). S0 is
3515  // saved CSP value.
3516  // See S_CBRANCH_G_FORK and S_CBRANCH_I_FORK for related instructions.
3517  void
3519  {
3521  } // execute
3522  // --- Inst_SOP1__S_ABS_I32 class methods ---
3523 
3525  : Inst_SOP1(iFmt, "s_abs_i32")
3526  {
3527  setFlag(ALU);
3528  } // Inst_SOP1__S_ABS_I32
3529 
3531  {
3532  } // ~Inst_SOP1__S_ABS_I32
3533 
3534  // --- description from .arch file ---
3535  // if(S.i < 0) then D.i = -S.i;
3536  // else D.i = S.i;
3537  // SCC = 1 if result is non-zero.
3538  // Integer absolute value.
3539  void
3541  {
3542  ConstScalarOperandI32 src(gpuDynInst, instData.SSRC0);
3543  ScalarOperandI32 sdst(gpuDynInst, instData.SDST);
3544  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3545 
3546  src.read();
3547 
3548  sdst = std::abs(src.rawData());
3549 
3550  scc = sdst.rawData() ? 1 : 0;
3551 
3552  sdst.write();
3553  scc.write();
3554  } // execute
3555  // --- Inst_SOP1__S_MOV_FED_B32 class methods ---
3556 
3558  : Inst_SOP1(iFmt, "s_mov_fed_b32")
3559  {
3560  setFlag(ALU);
3561  } // Inst_SOP1__S_MOV_FED_B32
3562 
3564  {
3565  } // ~Inst_SOP1__S_MOV_FED_B32
3566 
3567  // --- description from .arch file ---
3568  // D.u = S0.u. Introduce an EDC double-detect error on write to the
3569  // destination SGPR.
3570  void
3572  {
3574  } // execute
3575  // --- Inst_SOP1__S_SET_GPR_IDX_IDX class methods ---
3576 
3578  InFmt_SOP1 *iFmt)
3579  : Inst_SOP1(iFmt, "s_set_gpr_idx_idx")
3580  {
3581  } // Inst_SOP1__S_SET_GPR_IDX_IDX
3582 
3584  {
3585  } // ~Inst_SOP1__S_SET_GPR_IDX_IDX
3586 
3587  // --- description from .arch file ---
3588  // M0[7:0] = S0.u[7:0].
3589  // Modify the index used in vector GPR indexing.
3590  void
3592  {
3594  } // execute
3595  // --- Inst_SOPC__S_CMP_EQ_I32 class methods ---
3596 
3598  : Inst_SOPC(iFmt, "s_cmp_eq_i32")
3599  {
3600  setFlag(ALU);
3601  } // Inst_SOPC__S_CMP_EQ_I32
3602 
3604  {
3605  } // ~Inst_SOPC__S_CMP_EQ_I32
3606 
3607  // --- description from .arch file ---
3608  // SCC = (S0.i == S1.i).
3609  void
3611  {
3612  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3613  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3614  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3615 
3616  src0.read();
3617  src1.read();
3618 
3619  scc = (src0.rawData() == src1.rawData()) ? 1 : 0;
3620 
3621  scc.write();
3622  } // execute
3623  // --- Inst_SOPC__S_CMP_LG_I32 class methods ---
3624 
3626  : Inst_SOPC(iFmt, "s_cmp_lg_i32")
3627  {
3628  setFlag(ALU);
3629  } // Inst_SOPC__S_CMP_LG_I32
3630 
3632  {
3633  } // ~Inst_SOPC__S_CMP_LG_I32
3634 
3635  // --- description from .arch file ---
3636  // SCC = (S0.i != S1.i).
3637  void
3639  {
3640  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3641  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3642  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3643 
3644  src0.read();
3645  src1.read();
3646 
3647  scc = (src0.rawData() != src1.rawData()) ? 1 : 0;
3648 
3649  scc.write();
3650  } // execute
3651  // --- Inst_SOPC__S_CMP_GT_I32 class methods ---
3652 
3654  : Inst_SOPC(iFmt, "s_cmp_gt_i32")
3655  {
3656  setFlag(ALU);
3657  } // Inst_SOPC__S_CMP_GT_I32
3658 
3660  {
3661  } // ~Inst_SOPC__S_CMP_GT_I32
3662 
3663  // --- description from .arch file ---
3664  // SCC = (S0.i > S1.i).
3665  void
3667  {
3668  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3669  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3670  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3671 
3672  src0.read();
3673  src1.read();
3674 
3675  scc = (src0.rawData() > src1.rawData()) ? 1 : 0;
3676 
3677  scc.write();
3678  } // execute
3679  // --- Inst_SOPC__S_CMP_GE_I32 class methods ---
3680 
3682  : Inst_SOPC(iFmt, "s_cmp_ge_i32")
3683  {
3684  setFlag(ALU);
3685  } // Inst_SOPC__S_CMP_GE_I32
3686 
3688  {
3689  } // ~Inst_SOPC__S_CMP_GE_I32
3690 
3691  // --- description from .arch file ---
3692  // SCC = (S0.i >= S1.i).
3693  void
3695  {
3696  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3697  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3698  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3699 
3700  src0.read();
3701  src1.read();
3702 
3703  scc = (src0.rawData() >= src1.rawData()) ? 1 : 0;
3704 
3705  scc.write();
3706  } // execute
3707  // --- Inst_SOPC__S_CMP_LT_I32 class methods ---
3708 
3710  : Inst_SOPC(iFmt, "s_cmp_lt_i32")
3711  {
3712  setFlag(ALU);
3713  } // Inst_SOPC__S_CMP_LT_I32
3714 
3716  {
3717  } // ~Inst_SOPC__S_CMP_LT_I32
3718 
3719  // --- description from .arch file ---
3720  // SCC = (S0.i < S1.i).
3721  void
3723  {
3724  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3725  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3726  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3727 
3728  src0.read();
3729  src1.read();
3730 
3731  scc = (src0.rawData() < src1.rawData()) ? 1 : 0;
3732 
3733  scc.write();
3734  } // execute
3735  // --- Inst_SOPC__S_CMP_LE_I32 class methods ---
3736 
3738  : Inst_SOPC(iFmt, "s_cmp_le_i32")
3739  {
3740  setFlag(ALU);
3741  } // Inst_SOPC__S_CMP_LE_I32
3742 
3744  {
3745  } // ~Inst_SOPC__S_CMP_LE_I32
3746 
3747  // --- description from .arch file ---
3748  // SCC = (S0.i <= S1.i).
3749  void
3751  {
3752  ConstScalarOperandI32 src0(gpuDynInst, instData.SSRC0);
3753  ConstScalarOperandI32 src1(gpuDynInst, instData.SSRC1);
3754  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3755 
3756  src0.read();
3757  src1.read();
3758 
3759  scc = (src0.rawData() <= src1.rawData()) ? 1 : 0;
3760 
3761  scc.write();
3762  } // execute
3763  // --- Inst_SOPC__S_CMP_EQ_U32 class methods ---
3764 
3766  : Inst_SOPC(iFmt, "s_cmp_eq_u32")
3767  {
3768  setFlag(ALU);
3769  } // Inst_SOPC__S_CMP_EQ_U32
3770 
3772  {
3773  } // ~Inst_SOPC__S_CMP_EQ_U32
3774 
3775  // --- description from .arch file ---
3776  // SCC = (S0.u == S1.u).
3777  void
3779  {
3780  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3781  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3782  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3783 
3784  src0.read();
3785  src1.read();
3786 
3787  scc = (src0.rawData() == src1.rawData()) ? 1 : 0;
3788 
3789  scc.write();
3790  } // execute
3791  // --- Inst_SOPC__S_CMP_LG_U32 class methods ---
3792 
3794  : Inst_SOPC(iFmt, "s_cmp_lg_u32")
3795  {
3796  setFlag(ALU);
3797  } // Inst_SOPC__S_CMP_LG_U32
3798 
3800  {
3801  } // ~Inst_SOPC__S_CMP_LG_U32
3802 
3803  // --- description from .arch file ---
3804  // SCC = (S0.u != S1.u).
3805  void
3807  {
3808  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3809  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3810  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3811 
3812  src0.read();
3813  src1.read();
3814 
3815  scc = (src0.rawData() != src1.rawData()) ? 1 : 0;
3816 
3817  scc.write();
3818  } // execute
3819  // --- Inst_SOPC__S_CMP_GT_U32 class methods ---
3820 
3822  : Inst_SOPC(iFmt, "s_cmp_gt_u32")
3823  {
3824  setFlag(ALU);
3825  } // Inst_SOPC__S_CMP_GT_U32
3826 
3828  {
3829  } // ~Inst_SOPC__S_CMP_GT_U32
3830 
3831  // --- description from .arch file ---
3832  // SCC = (S0.u > S1.u).
3833  void
3835  {
3836  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3837  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3838  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3839 
3840  src0.read();
3841  src1.read();
3842 
3843  scc = (src0.rawData() > src1.rawData()) ? 1 : 0;
3844 
3845  scc.write();
3846  } // execute
3847  // --- Inst_SOPC__S_CMP_GE_U32 class methods ---
3848 
3850  : Inst_SOPC(iFmt, "s_cmp_ge_u32")
3851  {
3852  setFlag(ALU);
3853  } // Inst_SOPC__S_CMP_GE_U32
3854 
3856  {
3857  } // ~Inst_SOPC__S_CMP_GE_U32
3858 
3859  // --- description from .arch file ---
3860  // SCC = (S0.u >= S1.u).
3861  void
3863  {
3864  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3865  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3866  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3867 
3868  src0.read();
3869  src1.read();
3870 
3871  scc = (src0.rawData() >= src1.rawData()) ? 1 : 0;
3872 
3873  scc.write();
3874  } // execute
3875  // --- Inst_SOPC__S_CMP_LT_U32 class methods ---
3876 
3878  : Inst_SOPC(iFmt, "s_cmp_lt_u32")
3879  {
3880  setFlag(ALU);
3881  } // Inst_SOPC__S_CMP_LT_U32
3882 
3884  {
3885  } // ~Inst_SOPC__S_CMP_LT_U32
3886 
3887  // --- description from .arch file ---
3888  // SCC = (S0.u < S1.u).
3889  void
3891  {
3892  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3893  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3894  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3895 
3896  src0.read();
3897  src1.read();
3898 
3899  scc = (src0.rawData() < src1.rawData()) ? 1 : 0;
3900 
3901  scc.write();
3902  } // execute
3903  // --- Inst_SOPC__S_CMP_LE_U32 class methods ---
3904 
3906  : Inst_SOPC(iFmt, "s_cmp_le_u32")
3907  {
3908  setFlag(ALU);
3909  } // Inst_SOPC__S_CMP_LE_U32
3910 
3912  {
3913  } // ~Inst_SOPC__S_CMP_LE_U32
3914 
3915  // --- description from .arch file ---
3916  // SCC = (S0.u <= S1.u).
3917  void
3919  {
3920  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3921  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3922  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3923 
3924  src0.read();
3925  src1.read();
3926 
3927  scc = (src0.rawData() <= src1.rawData()) ? 1 : 0;
3928 
3929  scc.write();
3930  } // execute
3931  // --- Inst_SOPC__S_BITCMP0_B32 class methods ---
3932 
3934  : Inst_SOPC(iFmt, "s_bitcmp0_b32")
3935  {
3936  setFlag(ALU);
3937  } // Inst_SOPC__S_BITCMP0_B32
3938 
3940  {
3941  } // ~Inst_SOPC__S_BITCMP0_B32
3942 
3943  // --- description from .arch file ---
3944  // SCC = (S0.u[S1.u[4:0]] == 0).
3945  void
3947  {
3948  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3949  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3950  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3951 
3952  src0.read();
3953  src1.read();
3954 
3955  scc = !bits(src0.rawData(), bits(src1.rawData(), 4, 0)) ? 1 : 0;
3956 
3957  scc.write();
3958  } // execute
3959  // --- Inst_SOPC__S_BITCMP1_B32 class methods ---
3960 
3962  : Inst_SOPC(iFmt, "s_bitcmp1_b32")
3963  {
3964  setFlag(ALU);
3965  } // Inst_SOPC__S_BITCMP1_B32
3966 
3968  {
3969  } // ~Inst_SOPC__S_BITCMP1_B32
3970 
3971  // --- description from .arch file ---
3972  // SCC = (S0.u[S1.u[4:0]] == 1).
3973  void
3975  {
3976  ConstScalarOperandU32 src0(gpuDynInst, instData.SSRC0);
3977  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
3978  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
3979 
3980  src0.read();
3981  src1.read();
3982 
3983  scc = bits(src0.rawData(), bits(src1.rawData(), 4, 0)) ? 1 : 0;
3984 
3985  scc.write();
3986  } // execute
3987  // --- Inst_SOPC__S_BITCMP0_B64 class methods ---
3988 
3990  : Inst_SOPC(iFmt, "s_bitcmp0_b64")
3991  {
3992  setFlag(ALU);
3993  } // Inst_SOPC__S_BITCMP0_B64
3994 
3996  {
3997  } // ~Inst_SOPC__S_BITCMP0_B64
3998 
3999  // --- description from .arch file ---
4000  // SCC = (S0.u64[S1.u[5:0]] == 0).
4001  void
4003  {
4004  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
4005  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
4006  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
4007 
4008  src0.read();
4009  src1.read();
4010 
4011  scc = !bits(src0.rawData(), bits(src1.rawData(), 5, 0)) ? 1 : 0;
4012 
4013  scc.write();
4014  } // execute
4015  // --- Inst_SOPC__S_BITCMP1_B64 class methods ---
4016 
4018  : Inst_SOPC(iFmt, "s_bitcmp1_b64")
4019  {
4020  setFlag(ALU);
4021  } // Inst_SOPC__S_BITCMP1_B64
4022 
4024  {
4025  } // ~Inst_SOPC__S_BITCMP1_B64
4026 
4027  // --- description from .arch file ---
4028  // SCC = (S0.u64[S1.u[5:0]] == 1).
4029  void
4031  {
4032  ConstScalarOperandU64 src0(gpuDynInst, instData.SSRC0);
4033  ConstScalarOperandU32 src1(gpuDynInst, instData.SSRC1);
4034  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
4035 
4036  src0.read();
4037  src1.read();
4038 
4039  scc = bits(src0.rawData(), bits(src1.rawData(), 5, 0)) ? 1 : 0;
4040 
4041  scc.write();
4042  } // execute
4043  // --- Inst_SOPC__S_SETVSKIP class methods ---
4044 
4046  : Inst_SOPC(iFmt, "s_setvskip")
4047  {
4048  } // Inst_SOPC__S_SETVSKIP
4049 
4051  {
4052  } // ~Inst_SOPC__S_SETVSKIP
4053 
4054  // --- description from .arch file ---
4055  // VSKIP = S0.u[S1.u[4:0]].
4056  // Enables and disables VSKIP mode.
4057  // When VSKIP is enabled, no VOP*/M*BUF/MIMG/DS/FLAT/EXP instuctions are
4058  // issued.
4059  // If any vector operations are outstanding, S_WAITCNT must be issued
4060  // before executing.
4061  // This instruction requires one waitstate after executing (e.g. S_NOP 0).
4062  // Example:
4063  // s_waitcnt 0
4064  // s_setvskip 1, 0 // Enable vskip mode.
4065  // s_nop 1
4066  void
4068  {
4070  } // execute
4071  // --- Inst_SOPC__S_SET_GPR_IDX_ON class methods ---
4072 
4074  : Inst_SOPC(iFmt, "s_set_gpr_idx_on")
4075  {
4076  } // Inst_SOPC__S_SET_GPR_IDX_ON
4077 
4079  {
4080  } // ~Inst_SOPC__S_SET_GPR_IDX_ON
4081 
4082  // --- description from .arch file ---
4083  // MODE.gpr_idx_en = 1;
4084  // M0[7:0] = S0.u[7:0];
4085  // M0[15:12] = SIMM4 (direct contents of S1 field);
4086  // // Remaining bits of M0 are unmodified.
4087  // Enable GPR indexing mode. Vector operations after this will perform
4088  // relative GPR addressing based on the contents of M0. The structure
4089  // SQ_M0_GPR_IDX_WORD may be used to decode M0.
4090  // The raw contents of the S1 field are read and used to set the enable
4091  // bits. S1[0] = VSRC0_REL, S1[1] = VSRC1_REL, S1[2] = VSRC2_REL and
4092  // S1[3] = VDST_REL.
4093  void
4095  {
4097  } // execute
4098  // --- Inst_SOPC__S_CMP_EQ_U64 class methods ---
4099 
4101  : Inst_SOPC(iFmt, "s_cmp_eq_u64")
4102  {
4103  setFlag(ALU);
4104  } // Inst_SOPC__S_CMP_EQ_U64
4105 
4107  {
4108  } // ~Inst_SOPC__S_CMP_EQ_U64
4109 
4110  // --- description from .arch file ---
4111  // SCC = (S0.i64 == S1.i64).
4112  void
4114  {
4115  ConstScalarOperandI64 src0(gpuDynInst, instData.SSRC0);
4116  ConstScalarOperandI64 src1(gpuDynInst, instData.SSRC1);
4117  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
4118 
4119  src0.read();
4120  src1.read();
4121 
4122  scc = (src0.rawData() == src1.rawData()) ? 1 : 0;
4123 
4124  scc.write();
4125  } // execute
4126  // --- Inst_SOPC__S_CMP_LG_U64 class methods ---
4127 
4129  : Inst_SOPC(iFmt, "s_cmp_lg_u64")
4130  {
4131  setFlag(ALU);
4132  } // Inst_SOPC__S_CMP_LG_U64
4133 
4135  {
4136  } // ~Inst_SOPC__S_CMP_LG_U64
4137 
4138  // --- description from .arch file ---
4139  // SCC = (S0.i64 != S1.i64).
4140  void
4142  {
4143  ConstScalarOperandI64 src0(gpuDynInst, instData.SSRC0);
4144  ConstScalarOperandI64 src1(gpuDynInst, instData.SSRC1);
4145  ScalarOperandU32 scc(gpuDynInst, REG_SCC);
4146 
4147  src0.read();
4148  src1.read();
4149 
4150  scc = (src0.rawData() != src1.rawData()) ? 1 : 0;
4151 
4152  scc.write();
4153  } // execute
4154  // --- Inst_SOPP__S_NOP class methods ---
4155 
4157  : Inst_SOPP(iFmt, "s_nop")
4158  {
4159  setFlag(Nop);
4160  } // Inst_SOPP__S_NOP
4161 
4163  {
4164  } // ~Inst_SOPP__S_NOP
4165 
4166  // --- description from .arch file ---
4167  // Do nothing. Repeat NOP 1..8 times based on SIMM16[2:0] -- 0 = 1 time,
4168  // 7 = 8 times.
4169  // This instruction may be used to introduce wait states to resolve
4170  // hazards; see the shader programming guide for details. Compare with
4171  // S_SLEEP.
4172  void
4174  {
4175  } // execute
4176  // --- Inst_SOPP__S_ENDPGM class methods ---
4177 
4179  : Inst_SOPP(iFmt, "s_endpgm")
4180  {
4181  setFlag(EndOfKernel);
4182  } // Inst_SOPP__S_ENDPGM
4183 
4185  {
4186  } // ~Inst_SOPP__S_ENDPGM
4187 
4188  // --- description from .arch file ---
4189  // End of program; terminate wavefront.
4190  // The hardware implicitly executes S_WAITCNT 0 before executing this
4191  // --- instruction.
4192  // See S_ENDPGM_SAVED for the context-switch version of this instruction.
4193  void
4195  {
4196  Wavefront *wf = gpuDynInst->wavefront();
4197  ComputeUnit *cu = gpuDynInst->computeUnit();
4198 
4199  // delete extra instructions fetched for completed work-items
4200  wf->instructionBuffer.erase(wf->instructionBuffer.begin() + 1,
4201  wf->instructionBuffer.end());
4202 
4203  if (wf->pendingFetch) {
4204  wf->dropFetch = true;
4205  }
4206 
4208  .flushBuf(wf->wfSlotId);
4210 
4211  int refCount = wf->computeUnit->getLds()
4212  .decreaseRefCounter(wf->dispatchId, wf->wgId);
4213 
4219  int bar_id = WFBarrier::InvalidID;
4220  if (wf->hasBarrier()) {
4221  assert(wf->getStatus() != Wavefront::S_BARRIER);
4222  bar_id = wf->barrierId();
4223  assert(bar_id != WFBarrier::InvalidID);
4224  wf->releaseBarrier();
4225  cu->decMaxBarrierCnt(bar_id);
4226  DPRINTF(GPUSync, "CU[%d] WF[%d][%d] Wave[%d] - Exiting the "
4227  "program and decrementing max barrier count for "
4228  "barrier Id%d. New max count: %d.\n", cu->cu_id,
4229  wf->simdId, wf->wfSlotId, wf->wfDynId, bar_id,
4230  cu->maxBarrierCnt(bar_id));
4231  }
4232 
4233  DPRINTF(GPUExec, "CU%d: decrease ref ctr WG[%d] to [%d]\n",
4234  wf->computeUnit->cu_id, wf->wgId, refCount);
4235 
4238  wf->computeUnit->activeWaves--;
4239 
4240  panic_if(wf->computeUnit->activeWaves < 0, "CU[%d] Active waves less "
4241  "than zero\n", wf->computeUnit->cu_id);
4242 
4243  DPRINTF(GPUExec, "Doing return for CU%d: WF[%d][%d][%d]\n",
4244  wf->computeUnit->cu_id, wf->simdId, wf->wfSlotId, wf->wfDynId);
4245 
4246  for (int i = 0; i < wf->vecReads.size(); i++) {
4247  if (wf->rawDist.find(i) != wf->rawDist.end()) {
4248  wf->stats.readsPerWrite.sample(wf->vecReads.at(i));
4249  }
4250  }
4251  wf->vecReads.clear();
4252  wf->rawDist.clear();
4253  wf->lastInstExec = 0;
4254 
4255  if (!refCount) {
4262  if (bar_id != WFBarrier::InvalidID) {
4263  DPRINTF(GPUSync, "CU[%d] WF[%d][%d] Wave[%d] - All waves are "
4264  "now complete. Releasing barrier Id%d.\n", cu->cu_id,
4265  wf->simdId, wf->wfSlotId, wf->wfDynId,
4266  wf->barrierId());
4267  cu->releaseBarrier(bar_id);
4268  }
4269 
4278  //check whether the workgroup is indicating the kernel end, i.e.,
4279  //the last workgroup in the kernel
4280  bool kernelEnd =
4282 
4283  bool relNeeded =
4285 
4286  //if it is not a kernel end, then retire the workgroup directly
4287  if (!kernelEnd || !relNeeded) {
4291 
4292  return;
4293  }
4294 
4302  setFlag(MemSync);
4303  setFlag(GlobalSegment);
4304  // Notify Memory System of Kernel Completion
4305  // Kernel End = isKernel + isMemSync
4307  gpuDynInst->simdId = wf->simdId;
4308  gpuDynInst->wfSlotId = wf->wfSlotId;
4309  gpuDynInst->wfDynId = wf->wfDynId;
4310 
4311  DPRINTF(GPUExec, "inject global memory fence for CU%d: "
4312  "WF[%d][%d][%d]\n", wf->computeUnit->cu_id,
4313  wf->simdId, wf->wfSlotId, wf->wfDynId);
4314 
4315  // call shader to prepare the flush operations
4316  wf->computeUnit->shader->prepareFlush(gpuDynInst);
4317 
4319  } else {
4321  }
4322  } // execute
4323 
4324  // --- Inst_SOPP__S_BRANCH class methods ---
4325 
4327  : Inst_SOPP(iFmt, "s_branch")
4328  {
4329  setFlag(Branch);
4330  } // Inst_SOPP__S_BRANCH
4331 
4333  {
4334  } // ~Inst_SOPP__S_BRANCH
4335 
4336  // --- description from .arch file ---
4337  // PC = PC + signext(SIMM16 * 4) + 4 (short jump).
4338  // For a long jump, use S_SETPC.
4339  void
4341  {
4342  Wavefront *wf = gpuDynInst->wavefront();
4343  Addr pc = gpuDynInst->pc();
4344  ScalarRegI16 simm16 = instData.SIMM16;
4345 
4346  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4347 
4348  wf->pc(pc);
4349  } // execute
4350  // --- Inst_SOPP__S_WAKEUP class methods ---
4351 
4353  : Inst_SOPP(iFmt, "s_wakeup")
4354  {
4355  } // Inst_SOPP__S_WAKEUP
4356 
4358  {
4359  } // ~Inst_SOPP__S_WAKEUP
4360 
4361  // --- description from .arch file ---
4362  // Allow a wave to 'ping' all the other waves in its threadgroup to force
4363  // them to wake up immediately from an S_SLEEP instruction. The ping is
4364  // ignored if the waves are not sleeping.
4365  // This allows for more efficient polling on a memory location. The waves
4366  // which are polling can sit in a long S_SLEEP between memory reads, but
4367  // the wave which writes the value can tell them all to wake up early now
4368  // that the data is available. This is useful for fBarrier implementations
4369  // (speedup).
4370  // This method is also safe from races because if any wave misses the ping,
4371  // everything still works fine (whoever missed it just completes their
4372  // normal S_SLEEP).
4373  void
4375  {
4377  } // execute
4378  // --- Inst_SOPP__S_CBRANCH_SCC0 class methods ---
4379 
4381  : Inst_SOPP(iFmt, "s_cbranch_scc0")
4382  {
4383  setFlag(Branch);
4384  } // Inst_SOPP__S_CBRANCH_SCC0
4385 
4387  {
4388  } // ~Inst_SOPP__S_CBRANCH_SCC0
4389 
4390  // --- description from .arch file ---
4391  // if(SCC == 0) then PC = PC + signext(SIMM16 * 4) + 4;
4392  // else NOP.
4393  void
4395  {
4396  Wavefront *wf = gpuDynInst->wavefront();
4397  Addr pc = gpuDynInst->pc();
4398  ScalarRegI16 simm16 = instData.SIMM16;
4399  ConstScalarOperandU32 scc(gpuDynInst, REG_SCC);
4400 
4401  scc.read();
4402 
4403  if (!scc.rawData()) {
4404  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4405  }
4406 
4407  wf->pc(pc);
4408  } // execute
4409  // --- Inst_SOPP__S_CBRANCH_SCC1 class methods ---
4410 
4412  : Inst_SOPP(iFmt, "s_cbranch_scc1")
4413  {
4414  setFlag(Branch);
4415  } // Inst_SOPP__S_CBRANCH_SCC1
4416 
4418  {
4419  } // ~Inst_SOPP__S_CBRANCH_SCC1
4420 
4421  // --- description from .arch file ---
4422  // if(SCC == 1) then PC = PC + signext(SIMM16 * 4) + 4;
4423  // else NOP.
4424  void
4426  {
4427  Wavefront *wf = gpuDynInst->wavefront();
4428  Addr pc = gpuDynInst->pc();
4429  ScalarRegI16 simm16 = instData.SIMM16;
4430  ConstScalarOperandU32 scc(gpuDynInst, REG_SCC);
4431 
4432  scc.read();
4433 
4434  if (scc.rawData()) {
4435  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4436  }
4437 
4438  wf->pc(pc);
4439  } // execute
4440  // --- Inst_SOPP__S_CBRANCH_VCCZ class methods ---
4441 
4443  : Inst_SOPP(iFmt, "s_cbranch_vccz")
4444  {
4445  setFlag(Branch);
4446  setFlag(ReadsVCC);
4447  } // Inst_SOPP__S_CBRANCH_VCCZ
4448 
4450  {
4451  } // ~Inst_SOPP__S_CBRANCH_VCCZ
4452 
4453  // --- description from .arch file ---
4454  // if(VCC == 0) then PC = PC + signext(SIMM16 * 4) + 4;
4455  // else NOP.
4456  void
4458  {
4459  Wavefront *wf = gpuDynInst->wavefront();
4460  ConstScalarOperandU64 vcc(gpuDynInst, REG_VCC_LO);
4461  Addr pc = gpuDynInst->pc();
4462  ScalarRegI16 simm16 = instData.SIMM16;
4463 
4464  vcc.read();
4465 
4466  if (!vcc.rawData()) {
4467  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4468  }
4469 
4470  wf->pc(pc);
4471  } // execute
4472  // --- Inst_SOPP__S_CBRANCH_VCCNZ class methods ---
4473 
4475  : Inst_SOPP(iFmt, "s_cbranch_vccnz")
4476  {
4477  setFlag(Branch);
4478  setFlag(ReadsVCC);
4479  } // Inst_SOPP__S_CBRANCH_VCCNZ
4480 
4482  {
4483  } // ~Inst_SOPP__S_CBRANCH_VCCNZ
4484 
4485  // --- description from .arch file ---
4486  // if(VCC != 0) then PC = PC + signext(SIMM16 * 4) + 4;
4487  // else NOP.
4488  void
4490  {
4491  Wavefront *wf = gpuDynInst->wavefront();
4492  ConstScalarOperandU64 vcc(gpuDynInst, REG_VCC_LO);
4493 
4494  vcc.read();
4495 
4496  if (vcc.rawData()) {
4497  Addr pc = gpuDynInst->pc();
4498  ScalarRegI16 simm16 = instData.SIMM16;
4499  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4500  wf->pc(pc);
4501  }
4502  } // execute
4503  // --- Inst_SOPP__S_CBRANCH_EXECZ class methods ---
4504 
4506  : Inst_SOPP(iFmt, "s_cbranch_execz")
4507  {
4508  setFlag(Branch);
4509  setFlag(ReadsEXEC);
4510  } // Inst_SOPP__S_CBRANCH_EXECZ
4511 
4513  {
4514  } // ~Inst_SOPP__S_CBRANCH_EXECZ
4515 
4516  // --- description from .arch file ---
4517  // if(EXEC == 0) then PC = PC + signext(SIMM16 * 4) + 4;
4518  // else NOP.
4519  void
4521  {
4522  Wavefront *wf = gpuDynInst->wavefront();
4523 
4524  if (wf->execMask().none()) {
4525  Addr pc = gpuDynInst->pc();
4526  ScalarRegI16 simm16 = instData.SIMM16;
4527  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4528  wf->pc(pc);
4529  }
4530  } // execute
4531  // --- Inst_SOPP__S_CBRANCH_EXECNZ class methods ---
4532 
4534  : Inst_SOPP(iFmt, "s_cbranch_execnz")
4535  {
4536  setFlag(Branch);
4537  setFlag(ReadsEXEC);
4538  } // Inst_SOPP__S_CBRANCH_EXECNZ
4539 
4541  {
4542  } // ~Inst_SOPP__S_CBRANCH_EXECNZ
4543 
4544  // --- description from .arch file ---
4545  // if(EXEC != 0) then PC = PC + signext(SIMM16 * 4) + 4;
4546  // else NOP.
4547  void
4549  {
4550  Wavefront *wf = gpuDynInst->wavefront();
4551 
4552  if (wf->execMask().any()) {
4553  Addr pc = gpuDynInst->pc();
4554  ScalarRegI16 simm16 = instData.SIMM16;
4555  pc = pc + ((ScalarRegI64)simm16 * 4LL) + 4LL;
4556  wf->pc(pc);
4557  }
4558  } // execute
4559  // --- Inst_SOPP__S_BARRIER class methods ---
4560 
4562  : Inst_SOPP(iFmt, "s_barrier")
4563  {
4564  setFlag(MemBarrier);
4565  } // Inst_SOPP__S_BARRIER
4566 
4568  {
4569  } // ~Inst_SOPP__S_BARRIER
4570 
4571  // --- description from .arch file ---
4572  // Synchronize waves within a threadgroup.
4573  // If not all waves of the threadgroup have been created yet, waits for
4574  // entire group before proceeding.
4575  // If some waves in the threadgroup have already terminated, this waits on
4576  // only the surviving waves.
4577  // Barriers are legal inside trap handlers.
4578  void
4580  {
4581  Wavefront *wf = gpuDynInst->wavefront();
4582  ComputeUnit *cu = gpuDynInst->computeUnit();
4583 
4584  if (wf->hasBarrier()) {
4585  int bar_id = wf->barrierId();
4586  assert(wf->getStatus() == Wavefront::S_BARRIER);
4587  cu->incNumAtBarrier(bar_id);
4588  DPRINTF(GPUSync, "CU[%d] WF[%d][%d] Wave[%d] - Stalling at "
4589  "barrier Id%d. %d waves now at barrier, %d waves "
4590  "remain.\n", cu->cu_id, wf->simdId, wf->wfSlotId,
4591  wf->wfDynId, bar_id, cu->numAtBarrier(bar_id),
4592  cu->numYetToReachBarrier(bar_id));
4593  }
4594  } // execute
4595  // --- Inst_SOPP__S_SETKILL class methods ---
4596 
4598  : Inst_SOPP(iFmt, "s_setkill")
4599  {
4600  } // Inst_SOPP__S_SETKILL
4601 
4603  {
4604  } // ~Inst_SOPP__S_SETKILL
4605 
4606  // --- description from .arch file ---
4607  // set KILL bit to value of SIMM16[0].
4608  // Used primarily for debugging kill wave host command behavior.
4609  void
4611  {
4613  } // execute
4614  // --- Inst_SOPP__S_WAITCNT class methods ---
4615 
4617  : Inst_SOPP(iFmt, "s_waitcnt")
4618  {
4619  setFlag(ALU);
4620  setFlag(Waitcnt);
4621  } // Inst_SOPP__S_WAITCNT
4622 
4624  {
4625  } // ~Inst_SOPP__S_WAITCNT
4626 
4627  // --- description from .arch file ---
4628  // Wait for the counts of outstanding lds, vector-memory and
4629  // --- export/vmem-write-data to be at or below the specified levels.
4630  // SIMM16[3:0] = vmcount (vector memory operations),
4631  // SIMM16[6:4] = export/mem-write-data count,
4632  // SIMM16[12:8] = LGKM_cnt (scalar-mem/GDS/LDS count).
4633  void
4635  {
4636  ScalarRegI32 vm_cnt = 0;
4637  ScalarRegI32 exp_cnt = 0;
4638  ScalarRegI32 lgkm_cnt = 0;
4639  vm_cnt = bits<ScalarRegI16>(instData.SIMM16, 3, 0);
4640  exp_cnt = bits<ScalarRegI16>(instData.SIMM16, 6, 4);
4641  lgkm_cnt = bits<ScalarRegI16>(instData.SIMM16, 12, 8);
4642  gpuDynInst->wavefront()->setStatus(Wavefront::S_WAITCNT);
4643  gpuDynInst->wavefront()->setWaitCnts(vm_cnt, exp_cnt, lgkm_cnt);
4644  } // execute
4645  // --- Inst_SOPP__S_SETHALT class methods ---
4646 
4648  : Inst_SOPP(iFmt, "s_sethalt")
4649  {
4650  } // Inst_SOPP__S_SETHALT
4651 
4653  {
4654  } // ~Inst_SOPP__S_SETHALT
4655 
4656  // --- description from .arch file ---
4657  // Set HALT bit to value of SIMM16[0]; 1 = halt, 0 = resume.
4658  // The halt flag is ignored while PRIV == 1 (inside trap handlers) but the
4659  // shader will halt immediately after the handler returns if HALT is still
4660  // set at that time.
4661  void
4663  {
4665  } // execute
4666  // --- Inst_SOPP__S_SLEEP class methods ---
4667 
4669  : Inst_SOPP(iFmt, "s_sleep")
4670  {
4671  setFlag(ALU);
4672  setFlag(Sleep);
4673  } // Inst_SOPP__S_SLEEP
4674 
4676  {
4677  } // ~Inst_SOPP__S_SLEEP
4678 
4679  // --- description from .arch file ---
4680  // Cause a wave to sleep for (64 * SIMM16[2:0] + 1..64) clocks.
4681  // The exact amount of delay is approximate. Compare with S_NOP.
4682  void
4684  {
4686  gpuDynInst->wavefront()->setStatus(Wavefront::S_STALLED_SLEEP);
4687  // sleep duration is specified in multiples of 64 cycles
4688  gpuDynInst->wavefront()->setSleepTime(64 * simm16);
4689  } // execute
4690  // --- Inst_SOPP__S_SETPRIO class methods ---
4691 
4693  : Inst_SOPP(iFmt, "s_setprio")
4694  {
4695  } // Inst_SOPP__S_SETPRIO
4696 
4698  {
4699  } // ~Inst_SOPP__S_SETPRIO
4700 
4701  // --- description from .arch file ---
4702  // User settable wave priority is set to SIMM16[1:0]. 0 = lowest,
4703  // 3 = highest.
4704  // The overall wave priority is {SPIPrio[1:0] + UserPrio[1:0],
4705  // WaveAge[3:0]}.
4706  void
4708  {
4710  } // execute
4711  // --- Inst_SOPP__S_SENDMSG class methods ---
4712 
4714  : Inst_SOPP(iFmt, "s_sendmsg")
4715  {
4716  } // Inst_SOPP__S_SENDMSG
4717 
4719  {
4720  } // ~Inst_SOPP__S_SENDMSG
4721 
4722  // --- description from .arch file ---
4723  // Send a message upstream to VGT or the interrupt handler.
4724  // SIMM16[9:0] contains the message type and is documented in the shader
4725  // --- programming guide.
4726  void
4728  {
4730  } // execute
4731  // --- Inst_SOPP__S_SENDMSGHALT class methods ---
4732 
4734  : Inst_SOPP(iFmt, "s_sendmsghalt")
4735  {
4736  } // Inst_SOPP__S_SENDMSGHALT
4737 
4739  {
4740  } // ~Inst_SOPP__S_SENDMSGHALT
4741 
4742  // --- description from .arch file ---
4743  // Send a message and then HALT the wavefront; see S_SENDMSG for details.
4744  void
4746  {
4748  } // execute
4749  // --- Inst_SOPP__S_TRAP class methods ---
4750 
4752  : Inst_SOPP(iFmt, "s_trap")
4753  {
4754  } // Inst_SOPP__S_TRAP
4755 
4757  {
4758  } // ~Inst_SOPP__S_TRAP
4759 
4760  // --- description from .arch file ---
4761  // TrapID = SIMM16[7:0];
4762  // Wait for all instructions to complete;
4763  // set {TTMP1, TTMP0} = {3'h0, PCRewind[3:0], HT[0], TrapID[7:0],
4764  // PC[47:0]};
4765  // PC = TBA (trap base address);
4766  // PRIV = 1.
4767  // Enter the trap handler. This instruction may be generated internally as
4768  // well in response to a host trap (HT = 1) or an exception.
4769  // TrapID 0 is reserved for hardware use and should not be used in a
4770  // shader-generated trap.
4771  void
4773  {
4775  } // execute
4776  // --- Inst_SOPP__S_ICACHE_INV class methods ---
4777 
4779  : Inst_SOPP(iFmt, "s_icache_inv")
4780  {
4781  } // Inst_SOPP__S_ICACHE_INV
4782 
4784  {
4785  } // ~Inst_SOPP__S_ICACHE_INV
4786 
4787  // --- description from .arch file ---
4788  // Invalidate entire L1 instruction cache.
4789  // You must have 12 separate S_NOP instructions or a jump/branch
4790  // instruction after this instruction
4791  // to ensure the SQ instruction buffer is purged.
4792  void
4794  {
4796  } // execute
4797  // --- Inst_SOPP__S_INCPERFLEVEL class methods ---
4798 
4800  : Inst_SOPP(iFmt, "s_incperflevel")
4801  {
4802  } // Inst_SOPP__S_INCPERFLEVEL
4803 
4805  {
4806  } // ~Inst_SOPP__S_INCPERFLEVEL
4807 
4808  // --- description from .arch file ---
4809  // Increment performance counter specified in SIMM16[3:0] by 1.
4810  void
4812  {
4814  } // execute
4815  // --- Inst_SOPP__S_DECPERFLEVEL class methods ---
4816 
4818  : Inst_SOPP(iFmt, "s_decperflevel")
4819  {
4820  } // Inst_SOPP__S_DECPERFLEVEL
4821 
4823  {
4824  } // ~Inst_SOPP__S_DECPERFLEVEL
4825 
4826  // --- description from .arch file ---
4827  // Decrement performance counter specified in SIMM16[3:0] by 1.
4828  void
4830  {
4832  } // execute
4833  // --- Inst_SOPP__S_TTRACEDATA class methods ---
4834 
4836  : Inst_SOPP(iFmt, "s_ttracedata")
4837  {
4838  } // Inst_SOPP__S_TTRACEDATA
4839 
4841  {
4842  } // ~Inst_SOPP__S_TTRACEDATA
4843 
4844  // --- description from .arch file ---
4845  // Send M0 as user data to the thread trace stream.
4846  void
4848  {
4850  } // execute
4851  // --- Inst_SOPP__S_CBRANCH_CDBGSYS class methods ---
4852 
4854  InFmt_SOPP *iFmt)
4855  : Inst_SOPP(iFmt, "s_cbranch_cdbgsys")
4856  {
4857  setFlag(Branch);
4858  } // Inst_SOPP__S_CBRANCH_CDBGSYS
4859 
4861  {
4862  } // ~Inst_SOPP__S_CBRANCH_CDBGSYS
4863 
4864  // --- description from .arch file ---
4865  // if(conditional_debug_system != 0) then PC = PC + signext(SIMM16 * 4)
4866  // + 4;
4867  // else NOP.
4868  void
4870  {
4872  } // execute
4873  // --- Inst_SOPP__S_CBRANCH_CDBGUSER class methods ---
4874 
4876  InFmt_SOPP *iFmt)
4877  : Inst_SOPP(iFmt, "s_cbranch_cdbguser")
4878  {
4879  setFlag(Branch);
4880  } // Inst_SOPP__S_CBRANCH_CDBGUSER
4881 
4883  {
4884  } // ~Inst_SOPP__S_CBRANCH_CDBGUSER
4885 
4886  // --- description from .arch file ---
4887  // if(conditional_debug_user != 0) then PC = PC + signext(SIMM16 * 4) + 4;
4888  // else NOP.
4889  void
4891  {
4893  } // execute
4894  // --- Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER class methods ---
4895 
4897  InFmt_SOPP *iFmt)
4898  : Inst_SOPP(iFmt, "s_cbranch_cdbgsys_or_user")
4899  {
4900  setFlag(Branch);
4901  } // Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER
4902 
4905  {
4906  } // ~Inst_SOPP__S_CBRANCH_CDBGSYS_OR_USER
4907 
4908  // --- description from .arch file ---
4909  // if(conditional_debug_system || conditional_debug_user) then PC = PC +
4910  // --- signext(SIMM16 * 4) + 4;
4911  // else NOP.
4912  void
4914  {
4916  } // execute
4917  // --- Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER class methods ---
4918 
4921  : Inst_SOPP(iFmt, "s_cbranch_cdbgsys_and_user")
4922  {
4923  setFlag(Branch);
4924  } // Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER
4925 
4928  {
4929  } // ~Inst_SOPP__S_CBRANCH_CDBGSYS_AND_USER
4930 
4931  // --- description from .arch file ---
4932  // if(conditional_debug_system && conditional_debug_user) then PC = PC +
4933  // --- signext(SIMM16 * 4) + 4;
4934  // else NOP.
4935  void
4937  {
4939  } // execute
4940  // --- Inst_SOPP__S_ENDPGM_SAVED class methods ---
4941 
4943  : Inst_SOPP(iFmt, "s_endpgm_saved")
4944  {
4945  } // Inst_SOPP__S_ENDPGM_SAVED
4946 
4948  {
4949  } // ~Inst_SOPP__S_ENDPGM_SAVED
4950 
4951  // --- description from .arch file ---
4952  // End of program; signal that a wave has been saved by the context-switch
4953  // trap handler and terminate wavefront.
4954  // The hardware implicitly executes S_WAITCNT 0 before executing this
4955  // instruction.
4956  // Use S_ENDPGM in all cases unless you are executing the context-switch
4957  // save handler.
4958  void
4960  {
4962  } // execute
4963  // --- Inst_SOPP__S_SET_GPR_IDX_OFF class methods ---
4964 
4966  InFmt_SOPP *iFmt)
4967  : Inst_SOPP(iFmt, "s_set_gpr_idx_off")
4968  {
4969  } // Inst_SOPP__S_SET_GPR_IDX_OFF
4970 
4972  {
4973  } // ~Inst_SOPP__S_SET_GPR_IDX_OFF
4974 
4975  // --- description from .arch file ---
4976  // MODE.gpr_idx_en = 0.
4977  // Clear GPR indexing mode. Vector operations after this will not perform
4978  // --- relative GPR addressing regardless of the contents of M0. This
4979  // --- instruction does not modify M0.
4980  void
4982  {
4984  } // execute
4985  // --- Inst_SOPP__S_SET_GPR_IDX_MODE class methods ---
4986 
4988  InFmt_SOPP *iFmt)
4989  : Inst_SOPP(iFmt, "s_set_gpr_idx_mode")
4990  {
4991  } // Inst_SOPP__S_SET_GPR_IDX_MODE
4992 
4994  {
4995  } // ~Inst_SOPP__S_SET_GPR_IDX_MODE
4996 
4997  // --- description from .arch file ---
4998  // M0[15:12] = SIMM4.
4999  // Modify the mode used for vector GPR indexing.
5000  // The raw contents of the source field are read and used to set the enable
5001  // bits. SIMM4[0] = VSRC0_REL, SIMM4[1] = VSRC1_REL, SIMM4[2] = VSRC2_REL
5002  // and SIMM4[3] = VDST_REL.
5003  void
5005  {
5007  } // execute
5008  // --- Inst_SMEM__S_LOAD_DWORD class methods ---
5009 
5011  : Inst_SMEM(iFmt, "s_load_dword")
5012  {
5013  setFlag(MemoryRef);
5014  setFlag(Load);
5015  } // Inst_SMEM__S_LOAD_DWORD
5016 
5018  {
5019  } // ~Inst_SMEM__S_LOAD_DWORD
5020 
5027  void
5029  {
5030  Wavefront *wf = gpuDynInst->wavefront();
5031  gpuDynInst->execUnitId = wf->execUnitId;
5032  gpuDynInst->latency.init(gpuDynInst->computeUnit());
5033  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
5034  ScalarRegU32 offset(0);
5035  ConstScalarOperandU64 addr(gpuDynInst, instData.SBASE << 1);
5036 
5037  addr.read();
5038 
5039  if (instData.IMM) {
5040  offset = extData.OFFSET;
5041  } else {
5042  ConstScalarOperandU32 off_sgpr(gpuDynInst, extData.OFFSET);
5043  off_sgpr.read();
5044  offset = off_sgpr.rawData();
5045  }
5046 
5047  calcAddr(gpuDynInst, addr, offset);
5048 
5049  gpuDynInst->computeUnit()->scalarMemoryPipe
5050  .issueRequest(gpuDynInst);
5051  } // execute
5052 
5053  void
5055  {
5056  initMemRead<1>(gpuDynInst);
5057  } // initiateAcc
5058 
5059  void
5061  {
5062  ScalarOperandU32 sdst(gpuDynInst, instData.SDATA);
5063  sdst.write();
5064  } // completeAcc
5065  // --- Inst_SMEM__S_LOAD_DWORDX2 class methods ---
5066 
5068  : Inst_SMEM(iFmt, "s_load_dwordx2")
5069  {
5070  setFlag(MemoryRef);
5071  setFlag(Load);
5072  } // Inst_SMEM__S_LOAD_DWORDX2
5073 
5075  {
5076  } // ~Inst_SMEM__S_LOAD_DWORDX2
5077 
5082  void
5084  {
5085  Wavefront *wf = gpuDynInst->wavefront();
5086  gpuDynInst->execUnitId = wf->execUnitId;
5087  gpuDynInst->latency.init(gpuDynInst->computeUnit());
5088  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
5089  ScalarRegU32 offset(0);
5090  ConstScalarOperandU64 addr(gpuDynInst, instData.SBASE << 1);
5091 
5092  addr.read();
5093 
5094  if (instData.IMM) {
5095  offset = extData.OFFSET;
5096  } else {
5097  ConstScalarOperandU32 off_sgpr(gpuDynInst, extData.OFFSET);
5098  off_sgpr.read();
5099  offset = off_sgpr.rawData();
5100  }
5101 
5102  calcAddr(gpuDynInst, addr, offset);
5103 
5104  gpuDynInst->computeUnit()->scalarMemoryPipe.
5105  issueRequest(gpuDynInst);
5106  } // execute
5107 
5108  void
5110  {
5111  initMemRead<2>(gpuDynInst);
5112  } // initiateAcc
5113 
5114  void
5116  {
5117  ScalarOperandU64 sdst(gpuDynInst, instData.SDATA);
5118  sdst.write();
5119  } // completeAcc
5120  // --- Inst_SMEM__S_LOAD_DWORDX4 class methods ---
5121 
5123  : Inst_SMEM(iFmt, "s_load_dwordx4")
5124  {
5125  setFlag(MemoryRef);
5126  setFlag(Load);
5127  } // Inst_SMEM__S_LOAD_DWORDX4
5128 
5130  {
5131  } // ~Inst_SMEM__S_LOAD_DWORDX4
5132 
5133  // --- description from .arch file ---
5134  // Read 4 dwords from scalar data cache. See S_LOAD_DWORD for details on
5135  // the offset input.
5136  void
5138  {
5139  Wavefront *wf = gpuDynInst->wavefront();
5140  gpuDynInst->execUnitId = wf->execUnitId;
5141  gpuDynInst->latency.init(gpuDynInst->computeUnit());
5142  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
5143  ScalarRegU32 offset(0);
5144  ConstScalarOperandU64 addr(gpuDynInst, instData.SBASE << 1);
5145 
5146  addr.read();
5147 
5148  if (instData.IMM) {
5149  offset = extData.OFFSET;
5150  } else {
5151  ConstScalarOperandU32 off_sgpr(gpuDynInst, extData.OFFSET);
5152  off_sgpr.read();
5153  offset = off_sgpr.rawData();
5154  }
5155 
5156  calcAddr(gpuDynInst, addr, offset);
5157 
5158  gpuDynInst->computeUnit()->scalarMemoryPipe.
5159  issueRequest(gpuDynInst);
5160  } // execute
5161 
5162  void
5164  {
5165  initMemRead<4>(gpuDynInst);
5166  } // initiateAcc
5167 
5168  void
5170  {
5171  ScalarOperandU128 sdst(gpuDynInst, instData.SDATA);
5172  sdst.write();
5173  } // completeAcc
5174  // --- Inst_SMEM__S_LOAD_DWORDX8 class methods ---
5175 
5177  : Inst_SMEM(iFmt, "s_load_dwordx8")
5178  {
5179  setFlag(MemoryRef);
5180  setFlag(Load);
5181  } // Inst_SMEM__S_LOAD_DWORDX8
5182 
5184  {
5185  } // ~Inst_SMEM__S_LOAD_DWORDX8
5186 
5187  // --- description from .arch file ---
5188  // Read 8 dwords from scalar data cache. See S_LOAD_DWORD for details on
5189  // the offset input.
5190  void
5192  {
5193  Wavefront *wf = gpuDynInst->wavefront();
5194  gpuDynInst->execUnitId = wf->execUnitId;
5195  gpuDynInst->latency.init(gpuDynInst->computeUnit());
5196  gpuDynInst->latency.set(gpuDynInst->computeUnit()->clockPeriod());
5197  ScalarRegU32 offset(0);
5198  ConstScalarOperandU64 addr(gpuDynInst, instData.SBASE << 1);
5199 
5200  addr.read();
5201 
5202  if (instData.IMM) {
5203  offset = extData.OFFSET;
5204  } else {
5205  ConstScalarOperandU32 off_sgpr(gpuDynInst, extData.OFFSET);
5206  off_sgpr.read();
5207  offset = off_sgpr.rawData();
5208  }
5209 
5210  calcAddr(gpuDynInst, addr, offset);
5211 
5212  gpuDynInst->computeUnit()->scalarMemoryPipe.
5213  issueRequest(gpuDynInst);
5214  } // execute
5215 
5216  void
5218  {
5219  initMemRead<8>(gpuDynInst);
5220  } // initiateAcc
5221 
5222  void