Ric*_*III 8 vector objective-c simd clang objective-c-runtime
在对矢量类型和ObjC运行时进行一些处理时,我遇到了一个非常令人困惑的问题.
就我所知,clang或GCC都不会为任何SIMD矢量类型提供"正确的"类型编码.
#import <Foundation/Foundation.h>
int main() {
typedef int int4 __attribute__((vector_size(16)));
typedef float float4 __attribute__((vector_size(16)));
NSLog(@"Int4: %s", @encode(int4));
NSLog(@"Float4: %s", @encode(float4));
}
Run Code Online (Sandbox Code Playgroud)
当使用GCC或clang编译和运行时,我得到以下输出:
2014-04-09 06:21:01.102 test[1707:507] Int4: 2014-04-09 06:21:01.103 test[1707:507] Float4:
而不是我期望的,这将是这样的:
2014-04-09 06:21:01.102 test[1707:507] Int4: ![16,16i] 2014-04-09 06:21:01.103 test[1707:507] Float4: ![16,16f]
根据此处的文档:
vectors'!['后跟vector_size(构成向量的字节数),后跟逗号,后跟向量的对齐(以字节为单位),后跟元素的类型,后跟']'
尝试从ObjC方法返回这些类型时会出现问题,而不是像![16,16i]@:以下方法的编码那样获得逻辑:
-(int4) foo;
Run Code Online (Sandbox Code Playgroud)
我只得到了这个字符串@:,这会导致他们两个NSMethodSignature并且NSInvocation基本上扯掉他们的裤子和段错误.
是否有一些编译器选项可以启用以恢复矢量类型的正确编码?或者这里唯一的解决方案是"不从ObjC方法返回向量"?
注意:返回(或传递)指向向量的指针也没有帮助,因为指向矢量的指针的编码很简单^,然后贪婪地匹配列表中的下一个参数,导致我的参数计数关闭再来一次.我想我可以将矢量转换为a void *,但那时真的是一个丑陋的黑客.
看起来这是一个已知问题,clang 显然已被修改以在这种情况下显示警告:https://github.com/llvm-mirror/clang/commit/024d9c65e9d3887045c82be09e4f630f19da48b4
| 归档时间: |
|
| 查看次数: |
467 次 |
| 最近记录: |