如何在GNAT Ada中定义__builtin_blendvps256并汇编实现vblendvps
问题:用Ada汇编实现AVX2的vblendvps函数报错
我正在基于GNAT开发针对x86 AVX/AVX2扩展的Ada库,已定义以下向量类型和内置函数声明:
-- 256-bit Vector of Single Precision Floating Point Numbers type Vector_256_Float_32 is array (0 .. 7) of IEEE_Float_32 with Alignment => 32, Size => 256, Object_Size => 256; pragma Machine_Attribute (Vector_256_Float_32, "vector_type"); pragma Machine_Attribute (Vector_256_Float_32, "may_alias"); -- 256-bit Vector of 32-bit Signed Integers type Vector_256_Integer_32 is array (0 .. 7) of Integer_32 with Alignment => 32, Size => 256, Object_Size => 256; pragma Machine_Attribute (Vector_256_Integer_32, "vector_type"); pragma Machine_Attribute (Vector_256_Integer_32, "may_alias"); -- 256-bit Vector of 32-bit Unsigned Integers type Vector_256_Unsigned_32 is array (0 .. 7) of Unsigned_32 with Alignment => 32, Size => 256, Object_Size => 256; pragma Machine_Attribute (Vector_256_Unsigned_32, "vector_type"); pragma Machine_Attribute (Vector_256_Unsigned_32, "may_alias"); function vblendvps (Left, Right, Mask : Vector_256_Float_32) return Vector_256_Float_32 with Inline_Always => True, Convention => Intrinsic, Import => True, External_Name => "__builtin_ia32_blendvps256";
为了学习,我尝试用System.Machine_Code中的Asm函数手动实现vblendvps,代码如下:
with System.Machine_Code; use System.Machine_Code; function vblendvps (Left, Right, Mask : Vector_256_Float_32) return Vector_256_Float_32 is result : Vector_256_Float_32; begin Asm (Template => "vblendvps %3, %0, %1, %2", Outputs => Vector_256_Float_32'Asm_Output ("=g", result), Inputs => (Vector_256_Float_32'Asm_Input ("g", Left), Vector_256_Float_32'Asm_Input ("g", Right), Vector_256_Unsigned_32'Asm_Input ("g", Mask))); return result; end vblendvps;
编译时出现错误:
Error: too many memory references for `vblendvps'
我猜测问题出在需要将参数从内存移动到寄存器,但不确定具体操作方法。同时我难以找到vblendvps指令的参数说明,希望获得相关参考资料,以及该函数的正确实现方式(非Ada示例也可)。
内容的提问来源于stack exchange,提问作者user20790983
相关产品推荐
相关产品推荐

