[llvm] [AMDGPU][True16][MC] true16 for v_alignbit_b32 (PR #119409)
Ivan Kosarev via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 24 03:22:58 PST 2025
================
@@ -3013,35 +3050,69 @@ def : GCNPat <
(i32 (EXTRACT_SUBREG $a, sub0))), (i32 1))
>;
+let True16Predicate = NotHasTrue16BitInsts in
def : GCNPat <
(i32 (bswap i32:$a)),
(V_BFI_B32_e64 (S_MOV_B32 (i32 0x00ff00ff)),
(V_ALIGNBIT_B32_e64 VSrc_b32:$a, VSrc_b32:$a, (i32 24)),
(V_ALIGNBIT_B32_e64 VSrc_b32:$a, VSrc_b32:$a, (i32 8)))
>;
-// FIXME: This should have been narrowed to i32 during legalization.
-// This pattern should also be skipped for GlobalISel
+let True16Predicate = UseFakeTrue16Insts in
+def : GCNPat <
+ (i32 (bswap i32:$a)),
+ (V_BFI_B32_e64 (S_MOV_B32 (i32 0x00ff00ff)),
+ (V_ALIGNBIT_B32_fake16_e64 0, /* src0_modifiers */
+ VSrc_b32:$a,
+ 0, /* src1_modifiers */
+ VSrc_b32:$a,
+ 0, /* src2_modifiers */
+ (i32 24), /* clamp */ 0, /* op_sel */ 0),
+ (V_ALIGNBIT_B32_fake16_e64 0, /* src0_modifiers */
+ VSrc_b32:$a,
+ 0, /* src1_modifiers */
+ VSrc_b32:$a,
+ 0, /* src2_modifiers */
+ (i32 8), /* clamp */ 0, /* op_sel */ 0))
+>;
+
+class AlignBit32Inst<dag op1, dag op2, dag op3, bit hasTrue16> {
+ Instruction inst = !if(hasTrue16, V_ALIGNBIT_B32_fake16_e64, V_ALIGNBIT_B32_e64);
+ dag NoMods = !if(hasTrue16, (inst 0), (inst));
+ dag expr = !con(NoMods, (inst op1), NoMods, (inst op2),
----------------
kosarev wrote:
This would normally be called `ret` in .td files, which is probably slightly more descriptive than `expr`.
https://github.com/llvm/llvm-project/pull/119409
More information about the llvm-commits
mailing list