================
@@ -0,0 +1,588 @@
+//===-- X86InstrAVX10_V2_AUX.td - AVX10 V2 AUX Instructions --*- tablegen 
-*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM 
Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+//
+// This file describes the X86 AVX10 V2 AUX instruction set, defining the
+// instructions and their encoding.
+//
+//===----------------------------------------------------------------------===//
+
+//===----------------------------------------------------------------------===//
+// AVX10 V2 AUX Multiclass Definitions
+//===----------------------------------------------------------------------===//
+
+// Group A multiclass: PS(f32) -> i8 truncating conversion (quarter-size 
output)
+// Output is always xmm for all VL variants.
+// Adapts avx512_vcvt_fp for each VL level with explicit dest/src type 
mappings.
+multiclass avx10_v2aux_cvt_trunc_ps2i8<bits<8> opc, string OpcodeStr,
+                                        SDPatternOperator OpNode,
+                                        SDPatternOperator MaskOpNode> {
+  let Predicates = [HasAVX10_V2_AUX] in {
+    let ExeDomain = SSEPackedSingle in {
+      let Uses = []<Register>, mayRaiseFPException = 0 in {
+        defm Z : avx512_vcvt_fp<opc, OpcodeStr, v16i8x_info, v16f32_info,
+                                OpNode, OpNode, WriteCvtPH2PSZ>, EVEX_V512;
+        // Z256/Z128: use null_frag because element count mismatch between
+        // dest (v16i8) and source (v8f32/v4f32) prevents avx512_vcvt_fp from
+        // generating correct masked patterns. Explicit Pat patterns below.
+        defm Z256 : avx512_vcvt_fp<opc, OpcodeStr, v16i8x_info, v8f32x_info,
+                                   null_frag, null_frag,
+                                   WriteCvtPH2PSZ, v8f32x_info.BroadcastStr,
+                                   "{y}", v8f32x_info.MemOp,
+                                   v8f32x_info.KRCWM>, EVEX_V256;
+        defm Z128 : avx512_vcvt_fp<opc, OpcodeStr, v16i8x_info, v4f32x_info,
+                                   null_frag, null_frag,
+                                   WriteCvtPH2PSZ, v4f32x_info.BroadcastStr,
+                                   "{x}", f128mem,
+                                   v4f32x_info.KRCWM>, EVEX_V128;
+      }
+    }
+
+    // InstAliases for x/y suffixes
+    def : InstAlias<OpcodeStr#"x\t{$src, $dst|$dst, $src}",
+                    (!cast<Instruction>(NAME # "Z128rr") VR128X:$dst,
+                    VR128X:$src), 0>;
+    def : InstAlias<OpcodeStr#"x\t{$src, $dst|$dst, $src}",
+                    (!cast<Instruction>(NAME # "Z128rm") VR128X:$dst,
+                    f128mem:$src), 0, "intel">;
+    def : InstAlias<OpcodeStr#"y\t{$src, $dst|$dst, $src}",
+                    (!cast<Instruction>(NAME # "Z256rr") VR128X:$dst,
+                    VR256X:$src), 0>;
+    def : InstAlias<OpcodeStr#"y\t{$src, $dst|$dst, $src}",
+                    (!cast<Instruction>(NAME # "Z256rm") VR128X:$dst,
+                    f256mem:$src), 0, "intel">;
+
+    // Explicit patterns for Z256 (8 source elements, VK8WM mask)
+    // Unmasked
+    def : Pat<(v16i8 (OpNode (v8f32 VR256X:$src))),
+              (!cast<Instruction>(NAME # "Z256rr") VR256X:$src)>;
+    // Masked (merge)
+    def : Pat<(MaskOpNode (v8f32 VR256X:$src), (v16i8 VR128X:$src0),
+                           VK8WM:$mask),
+              (!cast<Instruction>(NAME # "Z256rrk") VR128X:$src0, VK8WM:$mask,
+                                  VR256X:$src)>;
+    // Masked (zero)
+    def : Pat<(MaskOpNode (v8f32 VR256X:$src), v16i8x_info.ImmAllZerosV,
+                           VK8WM:$mask),
+              (!cast<Instruction>(NAME # "Z256rrkz") VK8WM:$mask,
+                                  VR256X:$src)>;
+    // Memory
+    def : Pat<(v16i8 (OpNode (loadv8f32 addr:$src))),
+              (!cast<Instruction>(NAME # "Z256rm") addr:$src)>;
+    def : Pat<(MaskOpNode (loadv8f32 addr:$src), (v16i8 VR128X:$src0),
+                           VK8WM:$mask),
+              (!cast<Instruction>(NAME # "Z256rmk") VR128X:$src0, VK8WM:$mask,
+                                  addr:$src)>;
+    def : Pat<(MaskOpNode (loadv8f32 addr:$src), v16i8x_info.ImmAllZerosV,
+                           VK8WM:$mask),
+              (!cast<Instruction>(NAME # "Z256rmkz") VK8WM:$mask, addr:$src)>;
+    // Broadcast
+    def : Pat<(v16i8 (OpNode (v8f32 (X86VBroadcastld32 addr:$src)))),
+              (!cast<Instruction>(NAME # "Z256rmb") addr:$src)>;
+    def : Pat<(MaskOpNode (v8f32 (X86VBroadcastld32 addr:$src)),
+                            (v16i8 VR128X:$src0), VK8WM:$mask),
+              (!cast<Instruction>(NAME # "Z256rmbk") VR128X:$src0, VK8WM:$mask,
+                                  addr:$src)>;
+    def : Pat<(MaskOpNode (v8f32 (X86VBroadcastld32 addr:$src)),
+                            v16i8x_info.ImmAllZerosV, VK8WM:$mask),
+              (!cast<Instruction>(NAME # "Z256rmbkz") VK8WM:$mask, addr:$src)>;
+
+    // Explicit patterns for Z128 (4 source elements, VK4WM mask)
+    // Unmasked
+    def : Pat<(v16i8 (OpNode (v4f32 VR128X:$src))),
+              (!cast<Instruction>(NAME # "Z128rr") VR128X:$src)>;
+    // Masked (merge)
+    def : Pat<(MaskOpNode (v4f32 VR128X:$src), (v16i8 VR128X:$src0),
+                           VK4WM:$mask),
+              (!cast<Instruction>(NAME # "Z128rrk") VR128X:$src0, VK4WM:$mask,
+                                  VR128X:$src)>;
+    // Masked (zero)
+    def : Pat<(MaskOpNode (v4f32 VR128X:$src), v16i8x_info.ImmAllZerosV,
+                           VK4WM:$mask),
+              (!cast<Instruction>(NAME # "Z128rrkz") VK4WM:$mask,
+                                  VR128X:$src)>;
+    // Memory
+    def : Pat<(v16i8 (OpNode (loadv4f32 addr:$src))),
+              (!cast<Instruction>(NAME # "Z128rm") addr:$src)>;
+    def : Pat<(MaskOpNode (loadv4f32 addr:$src), (v16i8 VR128X:$src0),
+                           VK4WM:$mask),
+              (!cast<Instruction>(NAME # "Z128rmk") VR128X:$src0, VK4WM:$mask,
+                                  addr:$src)>;
+    def : Pat<(MaskOpNode (loadv4f32 addr:$src), v16i8x_info.ImmAllZerosV,
+                           VK4WM:$mask),
+              (!cast<Instruction>(NAME # "Z128rmkz") VK4WM:$mask, addr:$src)>;
+    // Broadcast
+    def : Pat<(v16i8 (OpNode (v4f32 (X86VBroadcastld32 addr:$src)))),
+              (!cast<Instruction>(NAME # "Z128rmb") addr:$src)>;
+    def : Pat<(MaskOpNode (v4f32 (X86VBroadcastld32 addr:$src)),
+                            (v16i8 VR128X:$src0), VK4WM:$mask),
+              (!cast<Instruction>(NAME # "Z128rmbk") VR128X:$src0, VK4WM:$mask,
+                                  addr:$src)>;
+    def : Pat<(MaskOpNode (v4f32 (X86VBroadcastld32 addr:$src)),
+                            v16i8x_info.ImmAllZerosV, VK4WM:$mask),
+              (!cast<Instruction>(NAME # "Z128rmbkz") VK4WM:$mask, addr:$src)>;
+  }
+}
+
+// Group B multiclass: 3-operand bias PS(f32) -> i8 conversion (quarter-size 
output)
+// bias + f32 source -> i8 dest
+// Reuses avx10_convert_3op_packed from X86InstrAVX10.td for each VL variant.
+multiclass avx10_v2aux_convert_3op_ps<bits<8> OpCode, string OpcodeStr,
----------------
mahesh-attarde wrote:

How about `avx10_v2aux_convert_3op_ps`  -> `avx10_v2aux_cvt_3op_ps` ?

https://github.com/llvm/llvm-project/pull/206888
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to