<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/58324>58324</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
[AMDGPU][MC][GFX8+] Inconsistent behavior v_cndmask modifiers
</td>
</tr>
<tr>
<th>Labels</th>
<td>
backend:AMDGPU,
mc
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
dpreobra
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
dpreobra
</td>
</tr>
</table>
<pre>
`cndmask` opcodes are unique in that they have b16/b32 type, but may be used with floating-point modifiers.
The modifiers work fine for VOP3, but there are issues with other variants:
- SDWA: accepts `sext`, `abs`, `neg`, but fp modifiers are encoded incorrectly.
- DPP64: does not accept fp modifiers.
- E64_DPP: has several problems:
- using `sext` causes assembler crash;
- `abs` and `neg` are encoded as expected, but disassembler decodes these modifiers incorrectly.
Examples of passed and failed tests:
E64 (GFX9, GFX10)
v_cndmask_b32_e64 v5, -v1, v2, s[0:1] // ok
v_cndmask_b32_e64 v5, abs(v1), v2, s[0:1] // ok
v_cndmask_b32_e64 v5, sext(v1), v2, s[0:1] // crashed
SDWA (GFX9, GFX10)
v_cndmask_b32_sdwa v5, v1, sext(v2), vcc // sext is accepted
v_cndmask_b32_sdwa v5, v1, abs(v2), vcc // abs is silently ignored
v_cndmask_b32_sdwa v5, v1, -v2, vcc // neg is encoded as sext
DPP16 (GFX10, GFX11)
v_cndmask_b32_dpp v5, v1, sext(v2), vcc // rejected by parser
v_cndmask_b32_dpp v5, v1, abs(v2), vcc // rejected by parser
v_cndmask_b32_dpp v5, v1, neg(v2), vcc // rejected by parser
E64_DPP (GFX11)
v_cndmask_b32_e64_dpp v5, sext(v1), v2, vcc dpp8:[7,6,5,4,3,2,1,0] // crashed
v_cndmask_b32_e64_dpp v5, abs(v1), v2, vcc dpp8:[7,6,5,4,3,2,1,0] // ok, but cannot be disassembled
v_cndmask_b32_e64_dpp v5, neg(v1), v2, vcc dpp8:[7,6,5,4,3,2,1,0] // ok, but cannot be disassembled
One reason for this issue is that current design expects that all variants have the same kind of modifiers (fp/int).
This is not the case with `cndmask` opcodes. E64 have fp modifiers while other variants have int modifiers.
A fix is pending.
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy9Vk1zozgQ_TX4orKLD0PgwMGJJ1N7mJpU7ectJVBjWGPEStiJ__0-CTDEm5kktVOTchAg6fXr161uMinOqRO5eSMOXO9xx2SbS0GacUXs2FT_HIlVDetK3uFCZ1byE7HMixz_Pgt81p1bcvw7lh07duBnlmGXJsGeqq5kRS15VzW7ZSurBvNSVEVFSq8cd-u4m99Kmt6xJ6n2rKgaYoVU7I-vD8GIC7sgYwhVWh_BzYJL85qduKp402kn2PSgS_br9s8NHhnPc2o7zeCVpucOgwHEwDM9PTS0Gx6MqaKdMTIWqTFyCGiQS6Uo7-rzajS0fXiI1saSkCDVyG4w-QLlsvpTtH7EDrO-5JppOpHiNWuVzGo6TA4w_C0hInSbUWc5h67gpDUdsEGxXHFdOsHtfNfFOcYbMXn3whPYpucWnpAYvRaVnnAF9QkAefU8Pv9VoL9-euaHtsYGWbDWwAhrvOBVjduO9Cw4E1eowRw__nz_V2JYYPQQhGRawNjpcUjLRyTaI2HDKTRrlyfPDCffXLUT3rrA95xw228D7D1-TO7fA2bk8mODmHwT9EOANl5vIA6ANoKIwpU0Jn8_po0WT3ww32szkvBHEnk-U8bM4igN2ToSeBfwINcV7giMWYOrEfkGacKqXSPVh_CXvVwj7gwbmWywZ1lsnbzSDgfMiwbxPHdUz_uueqJt3xZvYKHob3tyWHZGsitN6v24r2r3A3DNGf8o7ouDaMrSqNn3pUKaz8y_nurGPtbE5tCHtzd4hV5xZzas8W-KullmmLvfPAxv2746t__PNk72UAlz3pg6ji42q4nvJjVE4meS6q9f0TUVcS0b2zy7stJ9rzRHxvbu_IjajR6Myo5TOXSAYY7X9aWP9v0dtZ9pfiC2r1DKUdinNgAHixb80NDh5qWTW4O2B5q9OUfrsF361Y-LlS3_1tKLhvtUonJcNfZ-2WufD_11g2-GZ2O7pUagZw6TC0q9KAoj1wvX3kKkgUiChC-6qqspRRg2X7afH36H3rj_ctePyP_Y8W9NEH5BmWl0pTujWUbgUEHXS-wnLoujqtOy61rb5GzkdvD7mK1yecBDXZ_GYYlWb06jEc9-x-AmjAN_vSjTMKQoCYVIojguiiTjUXzD10WQU0KxH3mLmmdUa8Pc8f2M53t4C4uDG75NNAyH3NyH20WV-q7ve67ne4kLCVZrT4ibkHt4DHJXBM7apQN69MpQW0m1W6jUssyOO43JGs7raRJph7whGhiIVpHMFB-s8WNXSpWObxfWv9Q69y-ZBBK6">