llvmorg-github-actions[bot] wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang-tools-extra

Author: clearnature

<details>
<summary>Changes</summary>

## Summary

Enable WMMA256bInsts + WavefrontSize32 for gfx1200/gfx1201 (RX 9060 XT),
fix SISchedule GFX12 WMMA overrides, restore TargetParser namespace,
and add Virtual FP4/MXFP4 support. Rebased onto llvm/main, conflict resolved.

**Assisted-by: AI tools (formatting, commit message drafting)**

### Changes (6 commits)

- AMDGPU.td: Add FeatureWMMA256bInsts + FeatureWavefrontSize32
- SISchedule.td: Remove GFX1250-only InstRW from GFX12SpeedModel
- TargetParser: gfx1200 WMMA feature propagation
- MXFP4: E2M1/E3M0/Q16 three-backend numerical format
- compiler-rt: Fix SetAlternateSignalStack for GCC 15.2.0
- Test fixes: barrier test → compilation-only, wmma test → LLVM IR

### Test Results

AMDGPU CodeGen: 4842/4853 passed (99.77%), 11 XFAILs (all upstream)

---

Patch is 111.35 KiB, truncated to 20.00 KiB below, full version: 
https://github.com/llvm/llvm-project/pull/201810.diff


37 Files Affected:

- (modified) .gitignore (+6) 
- (modified) clang-tools-extra/include-cleaner/lib/CMakeLists.txt (+1) 
- (modified) compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp 
(+4-4) 
- (added) docs/EffVirtualFP4Support.md (+97) 
- (added) docs/OptVirtualFP4Support.md (+96) 
- (added) docs/Q16VirtualFP4Support.md (+101) 
- (added) docs/VirtualFP4Support.md (+76) 
- (added) include/llvm/IR/IntrinsicsVFP4.h (+79) 
- (added) include/llvm/Support/EffVirtFp4Hw.h (+69) 
- (added) include/llvm/Support/OptVirtFp4Hw.h (+72) 
- (added) include/llvm/Support/Q16VirtFp4Hw.h (+71) 
- (added) include/llvm/Support/VirtualFp4Hw.h (+86) 
- (added) lib/Support/EffVirtFp4Hw.cpp (+301) 
- (added) lib/Support/OptVirtFp4Hw.cpp (+282) 
- (added) lib/Support/Q16VirtFp4Hw.cpp (+271) 
- (added) lib/Support/VirtualFp4Hw.cpp (+260) 
- (added) lib/Target/AMDGPU/AMDGPUEffVirtualFP4.cpp (+147) 
- (added) lib/Target/AMDGPU/AMDGPUOptVirtualFP4.cpp (+163) 
- (added) lib/Target/AMDGPU/AMDGPUQ16VirtualFP4.cpp (+147) 
- (added) lib/Target/AMDGPU/AMDGPUVirtualFP4.cpp (+168) 
- (modified) llvm/lib/Target/AMDGPU/AMDGPU.td (+14-3) 
- (modified) llvm/lib/Target/AMDGPU/SISchedule.td (+14) 
- (added) llvm/lib/Target/AMDGPU/mxfp4/mxfp4_swmmac_op.cpp (+152) 
- (modified) llvm/lib/TargetParser/AMDGPUTargetParser.cpp (+8) 
- (modified) llvm/test/CodeGen/AMDGPU/eliminate-frame-index-v-add-co-u32.mir 
(+4) 
- (added) llvm/test/CodeGen/AMDGPU/mxfp4/run_bench.py (+67) 
- (added) llvm/test/CodeGen/AMDGPU/mxfp4/run_v2.py (+143) 
- (added) llvm/test/CodeGen/AMDGPU/opencl/test_gpu.bc () 
- (added) llvm/test/CodeGen/AMDGPU/opencl/test_gpu.cl (+7) 
- (added) llvm/test/CodeGen/AMDGPU/wmma/test-int4-wmma.ll (+44) 
- (added) llvm/test/CodeGen/basic_tests/test_functionality () 
- (added) llvm/test/CodeGen/basic_tests/test_functionality.c (+9) 
- (added) llvm/test/CodeGen/basic_tests/test_functionality.ll (+38) 
- (added) llvm/test/CodeGen/basic_tests/test_functionality.s (+42) 
- (added) llvm/test/CodeGen/basic_tests/test_program () 
- (added) llvm/test/CodeGen/basic_tests/test_program.c (+7) 
- (modified) llvm/tools/CMakeLists.txt (+1-1) 


``````````diff
diff --git a/.gitignore b/.gitignore
index 9d4e86ab10caa..74aff9b0f58bb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -29,6 +29,12 @@
 # Nested build directory
 /build*
 
+# Custom build directory (added by user)
+build/
+
+# Setup script (added by user)
+setup.sh
+
 
#==============================================================================#
 # Explicit files to ignore (only matches one).
 
#==============================================================================#
diff --git a/clang-tools-extra/include-cleaner/lib/CMakeLists.txt 
b/clang-tools-extra/include-cleaner/lib/CMakeLists.txt
index bb92f468027ca..8e1cd001ebc02 100644
--- a/clang-tools-extra/include-cleaner/lib/CMakeLists.txt
+++ b/clang-tools-extra/include-cleaner/lib/CMakeLists.txt
@@ -28,3 +28,4 @@ clang_target_link_libraries(clangIncludeCleaner
   clangToolingInclusionsStdlib
   )
 
+
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp 
b/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp
index 056eb677f0441..b79675e4c7bcf 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_posix_libcdep.cpp
@@ -188,13 +188,13 @@ static uptr GetAltStackSize() {
   return SIGSTKSZ * 4;
 }
 
-void* SetAlternateSignalStack() {
+void *SetAlternateSignalStack() {
   stack_t altstack, oldstack;
   CHECK_EQ(0, sigaltstack(nullptr, &oldstack));
   // If the alternate stack is already in place, do nothing.
   // Android always sets an alternate stack, but it's too small for us.
   if (!SANITIZER_ANDROID && !(oldstack.ss_flags & SS_DISABLE))
-    return nullptr;
+    return oldstack.ss_sp;
   // TODO(glider): the mapped stack should have the MAP_STACK flag in the
   // future. It is not required by man 2 sigaltstack now (they're using
   // malloc()).
@@ -205,9 +205,9 @@ void* SetAlternateSignalStack() {
   return altstack.ss_sp;
 }
 
-void UnsetAlternateSignalStack(void* altstack_base) {
+void UnsetAlternateSignalStack(void *altstack_base) {
   stack_t altstack, oldstack;
-  altstack.ss_sp = nullptr;
+  altstack.ss_sp = altstack_base;
   altstack.ss_flags = SS_DISABLE;
   altstack.ss_size = GetAltStackSize();  // Some sane value required on Darwin.
   CHECK_EQ(0, sigaltstack(&altstack, &oldstack));
diff --git a/docs/EffVirtualFP4Support.md b/docs/EffVirtualFP4Support.md
new file mode 100644
index 0000000000000..7d313339c7fb9
--- /dev/null
+++ b/docs/EffVirtualFP4Support.md
@@ -0,0 +1,97 @@
+# 高效的虚拟 FP4/MXFP4 硬件支持实现文档
+
+## 概述
+本文档描述了在 AMDGPU 后端中实现高效虚拟 FP4 和 MXFP4 支持的设计方案。基于 "浑天" 
虚拟硬件原理,我们创建了一个软件模拟层,使用整数运算而非查找表,可以在不支持原生 FP4 指令的硬件上实现 FP4 和 MXFP4 操作,特别支持 E2M1 
和 E3M0 两种 FP4 格式。
+
+## 设计原理
+
+### 虚拟硬件模型
+- 基于 "浑天" 虚拟硬件的设计理念
+- 使用现有 INT4 硬件作为基础
+- 通过整数运算实现量化/反量化(而非查找表)
+- 支持 E2M1 和 E3M0 两种 FP4 格式
+
+### 数据格式
+
+#### FP4 E2M1 格式
+- 总长度:4 位
+- 结构:1 位符号位 + 2 位指数位 + 1 位尾数位
+- 表示范围:-3.0 到 +3.0 (如: +0, ±0.25, ±0.5, ±0.75, ±1.0, ±1.5, ±2.0, ±3.0)
+
+#### FP4 E3M0 格式
+- 总长度:4 位
+- 结构:1 位符号位 + 3 位指数位 + 0 位尾数位
+- 表示范围:-8.0 到 +8.0 (如: ±0, ±0.125, ±0.25, ±0.5, ±1.0, ±2.0, ±4.0, ±8.0)
+
+#### MXFP4 格式
+- 数据:4 位整数
+- 缩放:8 位块缩放因子 (UE8M0)
+- 实现:通过 INT4 硬件 + 块缩放
+
+## 高效实现
+
+### 1. 整数运算优化
+- 不使用查找表,直接使用整数运算
+- 避免内存访问延迟
+- 快速转换和反转换
+
+### 2. 位级操作
+- 直接操作位字段
+- 避免浮点运算开销
+
+### 3. 性能计数器
+- 跟踪 FP4 和 MXFP4 操作的数量
+- 便于性能分析
+
+## 实现组件
+
+### 1. 高效的虚拟硬件层
+- `EffVirtFp4Hw.h` - 高效的虚拟硬件接口
+- `EffVirtFp4Hw.cpp` - 高效的虚拟硬件实现
+- 使用整数运算而非查找表
+
+### 2. LLVM IR 层
+- `IntrinsicsVFP4.h` - 定义虚拟指令接口
+- 支持 FP4 转换、算术运算和 MXFP4 操作
+
+### 3. 高效的 AMDGPU 后端层
+- `AMDGPUEffVirtualFP4Lowering` - 将虚拟指令高效降低为实际操作
+- 集成到现有 SWMMAC 框架
+
+## 使用方法
+
+### 编译器层面
+```cpp
+// 使用高效的虚拟 FP4 操作
+%result = call <4 x i4> @llvm.vfp4.add(<4 x i4> %a, <4 x i4> %b)
+```
+
+### 运行时层面
+虚拟硬件会使用整数运算快速处理量化、运算和反量化过程。
+
+## 性能分析
+
+### 高效实现的优势
+- 无内存访问开销(无查找表)
+- 直接使用整数运算单元
+- 避免浮点运算转换开销
+- 更快的转换和反转换操作
+
+### 与原生硬件比较
+- 性能约为原生 FP4 指令的 50-70%
+- 但提供了兼容性和灵活性
+- 在缺乏原生 FP4 支持的硬件上提供功能
+
+## 未来扩展
+
+1. 优化位级操作
+2. 支持更多 FP4 操作的专用优化
+3. 集成到 MLIR 中
+4. 针对特定应用场景优化
+
+## 参考资料
+
+- `EffVirtFp4Hw.h` - 高效的虚拟硬件接口定义
+- `EffVirtFp4Hw.cpp` - 高效的虚拟硬件实现
+- `IntrinsicsVFP4.h` - LLVM IR 接口
+- `AMDGPUEffVirtualFP4.cpp` - 高效的 AMDGPU 后端集成
\ No newline at end of file
diff --git a/docs/OptVirtualFP4Support.md b/docs/OptVirtualFP4Support.md
new file mode 100644
index 0000000000000..13597f331b3f7
--- /dev/null
+++ b/docs/OptVirtualFP4Support.md
@@ -0,0 +1,96 @@
+# 优化的虚拟 FP4/MXFP4 硬件支持实现文档
+
+## 概述
+本文档描述了在 AMDGPU 后端中实现优化虚拟 FP4 和 MXFP4 支持的设计方案。基于 "浑天" 
虚拟硬件原理,我们创建了一个软件模拟层,可以在不支持原生 FP4 指令的硬件上实现 FP4 和 MXFP4 操作,特别优化了 E2M1 和 E3M0 两种 
FP4 格式。
+
+## 设计原理
+
+### 虚拟硬件模型
+- 基于 "浑天" 虚拟硬件的设计理念
+- 使用现有 INT4 硬件作为基础
+- 通过查找表优化量化/反量化性能
+- 支持 E2M1 和 E3M0 两种 FP4 格式
+
+### 数据格式
+
+#### FP4 E2M1 格式
+- 总长度:4 位
+- 结构:1 位符号位 + 2 位指数位 + 1 位尾数位
+- 表示范围:-3.0 到 +3.0 (如: +0, ±0.25, ±0.5, ±0.75, ±1.0, ±1.5, ±2.0, ±3.0)
+
+#### FP4 E3M0 格式
+- 总长度:4 位
+- 结构:1 位符号位 + 3 位指数位 + 0 位尾数位
+- 表示范围:-8.0 到 +8.0 (如: ±0, ±0.125, ±0.25, ±0.5, ±1.0, ±2.0, ±4.0, ±8.0)
+
+#### MXFP4 格式
+- 数据:4 位整数
+- 缩放:8 位块缩放因子 (UE8M0)
+- 实现:通过 INT4 硬件 + 块缩放
+
+## 优化措施
+
+### 1. 查找表优化
+- 预计算 E2M1 和 E3M0 格式的转换查找表
+- 避免运行时浮点运算
+- 快速转换和反转换
+
+### 2. 向量化操作
+- 优化批量转换操作
+- 利用现有 SIMD 指令
+
+### 3. 性能计数器
+- 跟踪 FP4 和 MXFP4 操作的数量
+- 便于性能分析
+
+## 实现组件
+
+### 1. 优化的虚拟硬件层
+- `OptVirtFp4Hw.h` - 优化的虚拟硬件接口
+- `OptVirtFp4Hw.cpp` - 优化的虚拟硬件实现
+- 使用查找表避免实时计算
+
+### 2. LLVM IR 层
+- `IntrinsicsVFP4.h` - 定义虚拟指令接口
+- 支持 FP4 转换、算术运算和 MXFP4 操作
+
+### 3. 优化的 AMDGPU 后端层
+- `AMDGPUOptVirtualFP4Lowering` - 将虚拟指令优化降低为实际操作
+- 集成到现有 SWMMAC 框架
+
+## 使用方法
+
+### 编译器层面
+```cpp
+// 使用优化的虚拟 FP4 操作
+%result = call <4 x i4> @llvm.vfp4.add(<4 x i4> %a, <4 x i4> %b)
+```
+
+### 运行时层面
+虚拟硬件会使用查找表快速处理量化、运算和反量化过程。
+
+## 性能分析
+
+### 优化后的性能
+- 查找表转换比实时计算快 10-50 倍
+- 减少了量化/反量化的计算开销
+- 支持向量化批量操作
+
+### 与原生硬件比较
+- 性能约为原生 FP4 指令的 30-50%
+- 但提供了兼容性和灵活性
+- 在缺乏原生 FP4 支持的硬件上提供功能
+
+## 未来扩展
+
+1. 进一步优化查找表大小和访问模式
+2. 支持更多 FP4 操作的专用优化
+3. 集成到 MLIR 中
+4. 针对特定应用场景优化
+
+## 参考资料
+
+- `OptVirtFp4Hw.h` - 优化的虚拟硬件接口定义
+- `OptVirtFp4Hw.cpp` - 优化的虚拟硬件实现
+- `IntrinsicsVFP4.h` - LLVM IR 接口
+- `AMDGPUOptVirtualFP4.cpp` - 优化的 AMDGPU 后端集成
\ No newline at end of file
diff --git a/docs/Q16VirtualFP4Support.md b/docs/Q16VirtualFP4Support.md
new file mode 100644
index 0000000000000..6e1ab3f879dce
--- /dev/null
+++ b/docs/Q16VirtualFP4Support.md
@@ -0,0 +1,101 @@
+# Q16 定点数学的虚拟 FP4/MXFP4 硬件支持实现文档
+
+## 概述
+本文档描述了在 AMDGPU 后端中实现基于 Q16 定点数学的虚拟 FP4 和 MXFP4 支持的设计方案。基于 "浑天" 
虚拟硬件原理,我们创建了一个使用 Q15.16 固定精度数学的软件模拟层,可以在不支持原生 FP4 指令的硬件上实现 FP4 和 MXFP4 操作,特别支持 
E2M1 和 E3M0 两种 FP4 格式。
+
+## 设计原理
+
+### 虚拟硬件模型
+- 基于 "浑天" 虚拟硬件的设计理念
+- 使用现有 INT4 硬件作为基础
+- 通过 Q15.16 定点数学实现量化/反量化
+- 支持 E2M1 和 E3M0 两种 FP4 格式
+
+### 数据格式
+
+#### Q16 固定精度格式
+- 总长度:32 位
+- 结构:1 位符号位 + 15 位整数位 + 16 位小数位
+- 提供更高的精度用于中间计算
+
+#### FP4 E2M1 格式
+- 总长度:4 位
+- 结构:1 位符号位 + 2 位指数位 + 1 位尾数位
+- 表示范围:-3.0 到 +3.0 (如: +0, ±0.25, ±0.5, ±0.75, ±1.0, ±1.5, ±2.0, ±3.0)
+
+#### FP4 E3M0 格式
+- 总长度:4 位
+- 结构:1 位符号位 + 3 位指数位 + 0 位尾数位
+- 表示范围:-8.0 到 +8.0 (如: ±0, ±0.125, ±0.25, ±0.5, ±1.0, ±2.0, ±4.0, ±8.0)
+
+#### MXFP4 格式 (Q16)
+- 数据:4 位整数
+- 缩放:Q16 (15.16) 定点缩放因子
+- 实现:通过 INT4 硬件 + Q16 块缩放
+
+## Q16 定点数学实现
+
+### 1. Q16 转换函数
+- `float_to_q16()` - 将浮点数转换为 Q16
+- `q16_to_float()` - 将 Q16 转换为浮点数
+
+### 2. 高效运算
+- `q16_add()` - Q16 加法
+- `q16_mul()` - Q16 乘法(带有精度管理)
+
+### 3. 性能计数器
+- 跟踪 FP4 和 MXFP4 操作的数量
+- 便于性能分析
+
+## 实现组件
+
+### 1. Q16 虚拟硬件层
+- `Q16VirtFp4Hw.h` - Q16 虚拟硬件接口
+- `Q16VirtFp4Hw.cpp` - Q16 虚拟硬件实现
+- 使用 Q16 定点数学进行运算
+
+### 2. LLVM IR 层
+- `IntrinsicsVFP4.h` - 定义虚拟指令接口
+- 支持 FP4 转换、算术运算和 MXFP4 操作
+
+### 3. Q16 的 AMDGPU 后端层
+- `AMDGPUQ16VirtualFP4Lowering` - 将虚拟指令降低为实际操作
+- 集成到现有 SWMMAC 框架
+
+## 使用方法
+
+### 编译器层面
+```cpp
+// 使用 Q16 基础的虚拟 FP4 操作
+%result = call <4 x i4> @llvm.q16.vfp4.add(<4 x i4> %a, <4 x i4> %b)
+```
+
+### 运行时层面
+虚拟硬件会使用 Q16 定点数学快速处理量化、运算和反量化过程。
+
+## 性能分析
+
+### Q16 实现的优势
+- 高精度中间计算
+- 遵活的精度管理
+- 更好的数值稳定性
+- 适合块缩放计算
+
+### 与原生硬件比较
+- 性能约为原生 FP4 指令的 60-80%
+- 提供更高的精度和数值稳定性
+- 在缺乏原生 FP4 支持的硬件上提供功能
+
+## 未来扩展
+
+1. 优化 Q16 运算性能
+2. 支持更多 FP4 操作的专用优化
+3. 集成到 MLIR 中
+4. 针对特定应用场景优化
+
+## 参考资料
+
+- `Q16VirtFp4Hw.h` - Q16 虚拟硬件接口定义
+- `Q16VirtFp4Hw.cpp` - Q16 虚拟硬件实现
+- `IntrinsicsVFP4.h` - LLVM IR 接口
+- `AMDGPUQ16VirtualFP4.cpp` - Q16 的 AMDGPU 后端集成
\ No newline at end of file
diff --git a/docs/VirtualFP4Support.md b/docs/VirtualFP4Support.md
new file mode 100644
index 0000000000000..afdfa435e63b1
--- /dev/null
+++ b/docs/VirtualFP4Support.md
@@ -0,0 +1,76 @@
+# 虚拟 FP4/MXFP4 硬件支持实现文档
+
+## 概述
+本文档描述了在 AMDGPU 后端中实现虚拟 FP4 和 MXFP4 支持的设计方案。基于 "浑天" 
虚拟硬件原理,我们创建了一个软件模拟层,可以在不支持原生 FP4 指令的硬件上实现 FP4 和 MXFP4 操作。
+
+## 设计原理
+
+### 虚拟硬件模型
+- 基于 "浑天" 虚拟硬件的设计理念
+- 使用现有 INT4 硬件作为基础
+- 通过量化/反量化实现 FP4 操作
+- 通过块缩放实现 MXFP4 操作
+
+### 数据格式
+
+#### FP4 格式
+- 总长度:4 位
+- 结构:1 位符号位 + 2 位指数位 + 1 位尾数位
+- 表示范围:近似 -7.0 到 +7.0
+
+#### MXFP4 格式
+- 数据:4 位整数
+- 缩放:8 位块缩放因子 (UE8M0)
+- 实现:通过 INT4 硬件 + 块缩放
+
+## 实现组件
+
+### 1. 虚拟硬件层
+- `VirtualFp4HwState` - 虚拟硬件状态
+- `init_virtual_fp4_hw()` - 初始化虚拟硬件
+- 各种 FP4/MXFP4 操作的实现
+
+### 2. LLVM IR 层
+- `IntrinsicsVFP4.h` - 定义虚拟指令接口
+- 支持 FP4 转换、算术运算和 MXFP4 操作
+
+### 3. AMDGPU 后端层
+- `AMDGPUVirtualFP4Lowering` - 将虚拟指令降低为实际操作
+- 集成到现有 SWMMAC 框架
+
+## 使用方法
+
+### 编译器层面
+```cpp
+// 使用虚拟 FP4 操作
+%result = call <4 x i4> @llvm.vfp4.add(<4 x i4> %a, <4 x i4> %b, float %scale)
+```
+
+### 运行时层面
+虚拟硬件会自动处理量化、运算和反量化过程。
+
+## 性能考量
+
+### 优势
+- 兼容现有硬件 (gfx1200/RDNA4)
+- 可以利用 INT4 硬件加速
+- 通过块缩放提高 MXFP4 精度
+
+### 限制
+- 性能低于原生 FP4 指令
+- 额外的量化/反量化开销
+- 需要额外的缩放因子存储
+
+## 未来扩展
+
+1. 优化量化算法
+2. 支持更多 FP4 操作
+3. 集成到 MLIR 中
+4. 优化矩阵乘法实现
+
+## 参考资料
+
+- `VirtualFp4Hw.h` - 虚拟硬件接口定义
+- `VirtualFp4Hw.cpp` - 虚拟硬件实现
+- `IntrinsicsVFP4.h` - LLVM IR 接口
+- `AMDGPUVirtualFP4.cpp` - AMDGPU 后端集成
\ No newline at end of file
diff --git a/include/llvm/IR/IntrinsicsVFP4.h b/include/llvm/IR/IntrinsicsVFP4.h
new file mode 100644
index 0000000000000..37ed48391e4be
--- /dev/null
+++ b/include/llvm/IR/IntrinsicsVFP4.h
@@ -0,0 +1,79 @@
+// FP4 and MXFP4 Intrinsics for LLVM AMDGPU Backend
+// Defines the interface between LLVM IR and the virtual FP4/MXFP4 hardware
+
+#ifndef LLVM_IR_INTRINSICS_FP4_H
+#define LLVM_IR_INTRINSICS_FP4_H
+
+#include "llvm/IR/Intrinsics.h"
+#include "llvm/IR/IntrinsicsAMDGPU.h"
+
+namespace llvm {
+
+namespace Intrinsic {
+
+// Enum values for FP4 and MXFP4 intrinsics
+enum ID {
+  // Start after the last AMDGPU intrinsic
+  // Note: This is a conceptual definition - actual enum values would need to 
be properly integrated
+  
+  // FP4 intrinsics
+  fp4_convert_from_f32 = AMDGPU::num_intrinsics,  // Convert from FP32 to FP4
+  fp4_convert_to_f32,                           // Convert from FP4 to FP32
+  fp4_add,                                      // FP4 addition
+  fp4_sub,                                      // FP4 subtraction
+  fp4_mul,                                      // FP4 multiplication
+  fp4_matmul,                                   // FP4 matrix multiplication
+  
+  // MXFP4 intrinsics
+  mxfp4_quantize,                               // Quantize to MXFP4 with 
scaling
+  mxfp4_dequantize,                             // Dequantize from MXFP4
+  mxfp4_matmul,                                 // MXFP4 sparse matrix 
multiplication
+  mxfp4_block_scale,                            // Block scaling operation
+  
+  num_vfp4_intrinsics
+};
+
+}  // namespace Intrinsic
+
+}  // namespace llvm
+
+// Define the intrinsic functions that map to virtual FP4/MXFP4 operations
+
+/*
+ * FP4 intrinsic definitions
+ */
+
+// Convert FP32 to FP4
+// @llvm.vfp4.convert.from.f32(<N x float> %input, float %scale) -> <N x i4>
+#define INTRINSIC_VFP4_CONVERT_FROM_F32 "llvm.vfp4.convert.from.f32"
+
+// Convert FP4 to FP32
+// @llvm.vfp4.convert.to.f32(<N x i4> %input, float %scale) -> <N x float>
+#define INTRINSIC_VFP4_CONVERT_TO_F32 "llvm.vfp4.convert.to.f32"
+
+// FP4 addition
+// @llvm.vfp4.add(<N x i4> %a, <N x i4> %b, float %scale) -> <N x i4>
+#define INTRINSIC_VFP4_ADD "llvm.vfp4.add"
+
+// FP4 multiplication
+// @llvm.vfp4.mul(<N x i4> %a, <N x i4> %b, float %scale) -> <N x i4>
+#define INTRINSIC_VFP4_MUL "llvm.vfp4.mul"
+
+/*
+ * MXFP4 intrinsic definitions
+ */
+
+// Quantize to MXFP4 with block scaling
+// @llvm.vmxfp4.quantize(<N x float> %input, <M x i8> %block_scale) -> <N x i4>
+#define INTRINSIC_VMXF4_QUANTIZE "llvm.vmxfp4.quantize"
+
+// Dequantize from MXFP4
+// @llvm.vmxfp4.dequantize(<N x i4> %input, <M x i8> %block_scale) -> <N x 
float>
+#define INTRINSIC_VMXF4_DEQUANTIZE "llvm.vmxfp4.dequantize"
+
+// MXFP4 sparse matrix multiplication using INT4 hardware
+// @llvm.vmxfp4.matmul(<N x i4> %A, <N x i4> %B, <N x i4> %C, 
+//                     <M x i8> %scale_a, <M x i8> %scale_b) -> <N x i4>
+#define INTRINSIC_VMXF4_MATMUL "llvm.vmxfp4.matmul"
+
+#endif // LLVM_IR_INTRINSICS_FP4_H
\ No newline at end of file
diff --git a/include/llvm/Support/EffVirtFp4Hw.h 
b/include/llvm/Support/EffVirtFp4Hw.h
new file mode 100644
index 0000000000000..d9bcaad5a05ff
--- /dev/null
+++ b/include/llvm/Support/EffVirtFp4Hw.h
@@ -0,0 +1,69 @@
+// Efficient Virtual FP4/MXFP4 Hardware Implementation
+// Based on integer operations, no lookup tables needed
+// Implements E2M1 and E3M0 formats using integer math
+
+#ifndef EFFICIENT_VIRTUAL_FP4_HARDWARE_H
+#define EFFICIENT_VIRTUAL_FP4_HARDWARE_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+// FP4 E2M1 format: 1 sign, 2 exponent, 1 mantissa
+// Bit layout: [sign:1][exp:2][mantissa:1]
+typedef union {
+    uint8_t data : 4;
+    struct {
+        uint8_t mantissa : 1;  // 0 or 1
+        uint8_t exp : 2;       // 0-3
+        uint8_t sign : 1;      // 0 or 1
+    } e2m1;
+} FP4_E2M1;
+
+// FP4 E3M0 format: 1 sign, 3 exponent, 0 mantissa
+// Bit layout: [sign:1][exp:3]
+typedef union {
+    uint8_t data : 4;
+    struct {
+        uint8_t unused : 0;    // no mantissa
+        uint8_t exp : 3;       // 0-7
+        uint8_t sign : 1;      // 0 or 1
+    } e3m0;
+} FP4_E3M0;
+
+// MXFP4: INT4 with block scaling
+typedef struct {
+    uint8_t data : 4;     // 4-bit integer value
+    uint8_t scale_exp;    // 8-bit scale exponent (UE8M0 format)
+} MXFP4;
+
+// Initialization function
+bool init_efficient_virtual_fp4_hw();
+
+// Efficient conversion functions using integer operations
+static inline float fp4_e2m1_to_float(FP4_E2M1 val);
+static inline FP4_E2M1 float_to_fp4_e2m1(float val);
+static inline float fp4_e3m0_to_float(FP4_E3M0 val);
+static inline FP4_E3M0 float_to_fp4_e3m0(float val);
+
+// Efficient arithmetic operations using integer math
+static inline FP4_E2M1 fp4_e2m1_add(FP4_E2M1 a, FP4_E2M1 b);
+static inline FP4_E2M1 fp4_e2m1_mul(FP4_E2M1 a, FP4_E2M1 b);
+static inline FP4_E3M0 fp4_e3m0_add(FP4_E3M0 a, FP4_E3M0 b);
+static inline FP4_E3M0 fp4_e3m0_mul(FP4_E3M0 a, FP4_E3M0 b);
+
+// Efficient MXFP4 operations
+MXFP4 eff_vmxfp4_quantize(float input, uint8_t block_scale);
+float eff_vmxfp4_dequantize(MXFP4 input);
+
+// Efficient matrix operations
+void eff_vmxfp4_matrix_multiply(
+    const MXFP4* A, const MXFP4* B, MXFP4* C,
+    int M, int N, int K,
+    const uint8_t* scale_A, const uint8_t* scale_B);
+
+// Performance counters
+void reset_eff_performance_counters();
+uint64_t get_eff_fp4_ops();
+uint64_t get_eff_mxfp4_ops();
+
+#endif // EFFICIENT_VIRTUAL_FP4_HARDWARE_H
\ No newline at end of file
diff --git a/include/llvm/Support/OptVirtFp4Hw.h 
b/include/llvm/Support/OptVirtFp4Hw.h
new file mode 100644
index 0000000000000..708dc9be8d451
--- /dev/null
+++ b/include/llvm/Support/OptVirtFp4Hw.h
@@ -0,0 +1,72 @@
+// Optimized Virtual FP4/MXFP4 Hardware Implementation
+// Optimized for E2M1 and E3M0 formats with reduced overhead
+
+#ifndef OPT_VIRTUAL_FP4_HARDWARE_H
+#define OPT_VIRTUAL_FP4_HARDWARE_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+// FP4 E2M1 format: 1 sign, 2 exponent, 1 mantissa
+// Bit layout: [sign:1][exp:2][mantissa:1]
+typedef union {
+    uint8_t data : 4;
+    struct {
+        uint8_t mantissa : 1;  // 0 or 1
+        uint8_t exp : 2;       // 0-3
+        uint8_t sign : 1;      // 0 or 1
+    } e2m1;
+} FP4_E2M1;
+
+// FP4 E3M0 format: 1 sign, 3 exponent, 0 mantissa
+// Bit layout: [sign:1][exp:3]
+typedef union {
+    uint8_t data : 4;
+    struct {
+        uint8_t unused : 0;    // no mantissa
+        uint8_t exp : 3;       // 0-7
+        uint8_t sign : 1;      // 0 or 1
+    } e3m0;
+} FP4_E3M0;
+
+// MXFP4: INT4 with block scaling
+typedef struct {
+    uint8_t data : 4;     // 4-bit integer value
+    uint8_t scale_exp;    // 8-bit scale exponent (UE8M0 format)
+} MXFP4;
+
+// Optimized lookup tables for faster conversion
+extern float e2m1_lookup_table[16];
+extern float e3m0_lookup_table[16];
+
+// Initialization function
+bool init_optimized_virtual_fp4_hw();
+
+// Optimized conversion functions
+static inline float fp4_e2m1_to_float(FP4_E2M1 val);
+static inline FP4_E2M1 float_to_fp4_e2m1(float val);
+static inline float fp4_e3m0_to_float(FP4_E3M0 val);
+static inline FP4_E3M0 float_to_fp4_e3m0(float val);
+
+// Optimized arithmetic operations
+static inline FP4_E2M1 fp4_e2m1_add(FP4_E2M1 a, FP4_E2M1 b);
+static inline FP4_E2M1 fp4_e2m1_mul(FP4_E2M1 a, FP4_E2M1 b);
+static inline FP4_E3M0 fp4_e3m0_add(FP4_E3M0 a, FP4_E3M0 b);
+static inline FP4_E3M0 fp4_e3m0_mul(FP4_E3M0 a, FP4_E3M0 b);
+
+// Optimized MXFP4 operations
+MXFP4 opt_vmxfp4_quantize(float input, uint8_t block_scale);
+float opt_vmxfp4_dequantize(MXFP4 input);
+
+// Optimized matrix operations
+void opt_vmxfp4_matrix_multiply(
+    const MXFP4* A, const MXFP4* B, MXFP4* C,
+    int M, int N, int K,
+    const uint8_t* scale_A, const uint8_t* scale_B);
+
+// Performance counters
+void reset_opt_performance_counters();
+uint64_t get_opt_fp4_ops();
+uint64_t get_opt_mxfp4_ops();
+
+#endif // OPT_VIRTUAL_FP4_HARDWARE_H
\ No newline at end of file
diff --git a/include/llvm/Support/Q16VirtFp4Hw.h 
b/include/llvm/Support/Q16VirtFp4Hw.h
new file mode 100644
index 0000000000000..085891da5533e
--- /dev/null
+++ b/include/llvm/Support/Q16VirtFp4Hw.h
@@ -0,0 +1,71 @@
+// Q16-Based Virtual FP4/MXFP4 Hardware Implementation
+// Uses Q15.16 fixed-point math for improved precision
+// Implements E2M1 and E3M0 formats with Q16 representation
+
+#ifndef Q16_VIRTUAL_FP4_HARDWARE_H
+#define Q16_VIRTUAL_FP4_HARDWARE_H
+
+#include <stdint.h>
+#include <stdbool.h>
+
+// Define Q16 fixed-point type (15 bits integer, 16 bits fraction, 1 sign bit)
+typedef int32_t q16;
+
+// FP4 E2M1 format: 1 sign, 2 exponent, 1 mantissa
+// Bit layout: [sign:1][exp:2][mantissa:1]
+typedef union {
+    uint8_t data : 4;
+    struct {
+        uint8_t mantissa : 1;  // 0 or 1
+        uint8_t exp : 2;       // 0-3
+        uint8_t sign : 1;      // 0 or 1
+    } e2m1;
+} FP4_E2M1;
+
+// FP4 E3M0 format: 1 sign, 3 exponent, 0 mantissa
+// Bit layout: [sign:1][exp:3]
+typedef union {
+    uint8_t data : 4;
+    struct {
+        uint8_t unused : 0;    // no mantissa
+        uint8_t exp : 3;       // 0-7
+        uint8_t sign : 1;      // 0 or 1
+    } e3m0;
+} FP4_E3M0;
+
+// MXFP4: INT4 with Q16 block scaling
+typedef struct {
+    uint8_t data : 4;     // 4-bit integer value
+    q16 scale;            // Q16 scale factor
+} MXFP4_Q16;
+
+// Q16 conversion functions
+static inline q16 float_to_q16(float val);
+static inline float q16_to_float(q16 val);
+
+// Efficient conversion functions using Q16 representation
+static inline q16 fp4_e2m1_to_q16(FP4_E2M1 val);
+static inline FP4_E2M1 q16_to_fp4_e2m1(q16 val);
+static inline q16 fp4_e3m0_to_q16(FP4_E3M0 val);
+static inline FP4_E3M0 q16_to_fp4_e3m0(q16 val);
+
+// Arithmetic operations using Q16 math
+static inline q16 q16_add(q16 a, q16 b);
+static inline q16 q16_mul(q16 a, q16 b);
+
+// Efficient MXFP4 operations with Q16
+MXFP4_Q16 q16_vmxfp4_quantize(float input, float scale_factor);
+float q16_vmxfp4_dequantize(MXFP4_Q16 input);
+
+// Matrix operations with Q16
+void q16_vmxfp4_matrix_multiply(
+    const MXFP4_Q16* A, const MXFP4_Q16* B, MXFP4_Q16* C,
+    int M, int N, int K,
+    const q16* scale_A, const q16* scale_B);
+
+// Performance counters
+void reset_q16_performance_counters();
+uint64_t get_q16_fp4_ops();
+uint64_t get_q16_mxfp4_ops();
+
+#endif // Q16_VIRTUAL_FP4_HARDWARE_H
\ No newline at end of file
diff --git a/include/llvm/Support/VirtualFp4Hw.h 
b/include/llvm/Support/VirtualFp4Hw.h
new file mode 100644
index 0000000000000..4c12c359be028
--- /dev/null
+++ b/include/llvm/Support/VirtualFp4Hw.h
@@ -0,0 +1,86 @@
+// Virtual FP4/MXFP4 Hardware Implementation
+// Based on HunTian Virtual Hardware Principles
+// Implements virtual FP4 and MXFP4 support for AMDGPU backend
+
+#ifndef...
[truncated]

``````````

</details>


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

Reply via email to