11# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6
22# RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1250 -run-pass=amdgpu-lower-vgpr-encoding -o - %s | FileCheck %s
3+ # RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1250 -start-before=amdgpu-lower-vgpr-encoding -o - %s | FileCheck --check-prefix=ASM %s
34
45---
56# Case 1a: Size < 12 (size=4), imm32[12:19]=0
89# vgpr256/257 (both MSB=1): S_SET_VGPR_MSB mode = (1 << 0) | (1 << 6) = 65
910# Setreg (Size=4 <= 12) resets the mode scope and clears bits[12:19] to 0.
1011# No VGPR instruction follows, so bits[12:19] remain 0. Setreg imm = 5.
12+
13+ # ASM-LABEL: {{^}}setreg_size_lt_12:
14+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 4), 5 ; msbs: dst=0 src0=0 src1=0 src2=0
15+
1116name : setreg_size_lt_12
1217tracksRegLiveness : true
1318body : |
@@ -27,6 +32,10 @@ body: |
2732# Case 1b: Size == 12 (boundary), imm32[12:19]=0
2833# Setreg (Size=12 <= 12) resets the mode scope and clears bits[12:19] to 0.
2934# No VGPR instruction follows, so bits[12:19] remain 0. Setreg imm = 0xABC = 2748.
35+
36+ # ASM-LABEL: {{^}}setreg_size_eq_12:
37+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 12), 0xabc ; msbs: dst=0 src0=0 src1=0 src2=0
38+
3039name : setreg_size_eq_12
3140tracksRegLiveness : true
3241body : |
@@ -46,6 +55,10 @@ body: |
4655# Case 1c: Size <= 12 with existing non-zero bits in imm32[12:19]
4756# imm32 = 0x23005 (bits 12:19 = 0x23). Setreg resets mode scope and clears
4857# bits[12:19] to 0. No VGPR instruction follows, so result = 0x00005 = 5.
58+
59+ # ASM-LABEL: {{^}}setreg_size_lt_12_nonzero_upper:
60+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 4), 5 ; msbs: dst=0 src0=0 src1=0 src2=0
61+
4962name : setreg_size_lt_12_nonzero_upper
5063tracksRegLiveness : true
5164body : |
@@ -66,6 +79,10 @@ body: |
6679# Case 2: Size > 12 (size=16), imm32[12:19] already matches VGPR MSBs
6780# vgpr256/257: S_SET_VGPR_MSB mode = 65, MODE register mode = 5
6881# imm32 = 0x5ABC = 23228 (bits 12:19 = 5), no modification needed
82+
83+ # ASM-LABEL: {{^}}setreg_size_gt_12_match:
84+ # ASM: _setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 16), 0x5abc ; msbs: dst=1 src0=1 src1=0 src2=0
85+
6986name : setreg_size_gt_12_match
7087tracksRegLiveness : true
7188body : |
@@ -86,6 +103,10 @@ body: |
86103# Case 3: Size > 12 (size=16), imm32[12:19] doesn't match VGPR MSBs
87104# vgpr256/257: S_SET_VGPR_MSB mode = 65, MODE register mode = 5
88105# imm32 = 0x23ABC = 146108 (bits 12:19 = 0x23 != 5), must insert s_set_vgpr_msb after
106+
107+ # ASM-LABEL: {{^}}setreg_size_gt_12_mismatch:
108+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 16), 0x23abc ; msbs: dst=3 src0=0 src1=2 src2=0
109+
89110name : setreg_size_gt_12_mismatch
90111tracksRegLiveness : true
91112body : |
@@ -108,6 +129,10 @@ body: |
108129# Case 4: Non-MODE hwreg should not be modified
109130# This uses ID_STATUS=2 instead of ID_MODE=1
110131# vgpr256/257: S_SET_VGPR_MSB mode = 65
132+
133+ # ASM-LABEL: {{^}}setreg_non_mode_hwreg:
134+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_STATUS, 0, 4), 5{{$}}
135+
111136name : setreg_non_mode_hwreg
112137tracksRegLiveness : true
113138body : |
@@ -127,6 +152,10 @@ body: |
127152# Case 5: Size <= 12 with VGPR MSBs already present in imm32[12:19]
128153# imm32 = 0x5005 = 20485 (bits 12:19 = 5). Setreg resets mode scope and clears
129154# bits[12:19] to 0, regardless of prior content. Result = 5.
155+
156+ # ASM-LABEL: {{^}}setreg_size_lt_12_already_correct:
157+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 4), 5 ; msbs: dst=0 src0=0 src1=0 src2=0
158+
130159name : setreg_size_lt_12_already_correct
131160tracksRegLiveness : true
132161body : |
@@ -147,6 +176,10 @@ body: |
147176# Case 6: Different VGPR MSB value (using different high VGPRs)
148177# vgpr512/513 (both MSB=2): S_SET_VGPR_MSB mode = (2 << 0) | (2 << 6) = 130
149178# Setreg resets mode scope and clears bits[12:19] to 0. No VGPR follows. Result = 5.
179+
180+ # ASM-LABEL: {{^}}setreg_different_vgpr_msb:
181+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 4), 5 ; msbs: dst=0 src0=0 src1=0 src2=0
182+
150183name : setreg_different_vgpr_msb
151184tracksRegLiveness : true
152185body : |
@@ -170,6 +203,10 @@ body: |
170203# MODE register mode = (1 << 0) | (1 << 2) | (2 << 4) = 37 (dst=1, src0=1, src1=2)
171204# Piggybacking updates setreg imm32[12:19] from 0 to 37.
172205# Final setreg imm = 5 | (37 << 12) = 151557
206+
207+ # ASM-LABEL: {{^}}setreg_size_le_12_piggyback_superset:
208+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 4), 0x25005 ; msbs: dst=1 src0=1 src1=2 src2=0
209+
173210name : setreg_size_le_12_piggyback_superset
174211tracksRegLiveness : true
175212body : |
@@ -195,6 +232,10 @@ body: |
195232# The setreg (Size=4 <= 12) resets the mode scope. Its bits[12:19] are cleared to 0.
196233# The second VGPR's setMode piggybacks mode = 65 into the setreg's bits[12:19],
197234# giving imm32 = 5 | (5 << 12) = 20485 = 0x5005. No separate S_SET_VGPR_MSB needed.
235+
236+ # ASM-LABEL: {{^}}setreg_size_le_12_then_different_vgpr:
237+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 4), 0x5005 ; msbs: dst=1 src0=1 src1=0 src2=0
238+
198239name : setreg_size_le_12_then_different_vgpr
199240tracksRegLiveness : true
200241body : |
@@ -224,6 +265,10 @@ body: |
224265# Second VGPR (vgpr512/513): S_SET_VGPR_MSB mode = 130, MODE register mode = 10
225266# Since MostRecentModeSet = nullptr, a new s_set_vgpr_msb is inserted.
226267# New s_set_vgpr_msb imm = NewMode | (OldMode << 8) = 130 | (65 << 8) = 16770
268+
269+ # ASM-LABEL: {{^}}setreg_size_gt_12_match_then_different_vgpr:
270+ # ASM: s_setreg_imm32_b32 hwreg(HW_REG_WAVE_MODE, 0, 16), 0x5abc ; msbs: dst=1 src0=1 src1=0 src2=0
271+
227272name : setreg_size_gt_12_match_then_different_vgpr
228273tracksRegLiveness : true
229274body : |
0 commit comments