Neon Intrinsic
Neon Intrinsic和编译器的具体实现相关,Clang的neon Intrinsic的功能与官方文档《Arm Neon Intrinsics Reference》(以下简称ANIR文档)一致。
但生成ANIR文档上指定的汇编指令,需指定优化级别大于O0。
ANIR文档获取链接:https://developer.arm.com/documentation/ihi0073/g
使用举例
以内容如下的test.c为例:
#include <arm_neon.h> int32x2_t test_vsudot_lane_s32(int32x2_t r, int8x8_t a, uint8x8_t b) { return vsudot_lane_s32(r, a, b, 0); }
Intrinsic |
Argument Preparation |
Instruction |
Result |
Supported Architectures |
---|---|---|---|---|
int32x2_t vsudot_lane_s32(int32x2_t r, int8x8_t a, uint8x8_t b, const int lane) |
r -> Vd.2S a -> Vn.8B b -> Vm.4B 0 <= lane <= 1 |
SUDOT Vd.2S,Vn.8B,Vm.4B[lane] |
Vd.2S -> result |
A32/A64 |
使用命令clang -march=armv8.6-a+i8mm test.c -O0 -S生成的结果是以mov、dup和usdot等多条指令组合的形式。
test_vsudot_lane_s32: // @test_vsudot_lane_s32 // %bb.0: // %entry sub sp, sp, #112 // =112 str d0, [sp, #72] str d1, [sp, #64] str d2, [sp, #56] ldr d0, [sp, #72] str d0, [sp, #48] ldr d0, [sp, #64] str d0, [sp, #40] ldr d0, [sp, #56] str d0, [sp, #32] ldr d0, [sp, #32] str d0, [sp, #16] ldr d0, [sp, #48] ldr d1, [sp, #16] // implicit-def: $q3 mov v3.16b, v1.16b dup v1.2s, v3.s[0] ldr d2, [sp, #40] str d0, [sp, #104] str d1, [sp, #96] str d2, [sp, #88] ldr d0, [sp, #104] ldr d1, [sp, #96] ldr d2, [sp, #88] usdot v0.2s, v1.8b, v2.8b str d0, [sp, #80] ldr d0, [sp, #80] str d0, [sp, #24] ldr d0, [sp, #24] str d0, [sp, #8] ldr d0, [sp, #8] add sp, sp, #112 // =112 ret
使用命令clang -march=armv8.6-a+i8mm test.c -O1 -S生成结果与ANIR文档一致。
test_vsudot_lane_s32: // @test_vsudot_lane_s32 // %bb.0: // %entry // kill: def $d2 killed $d2 def $q2 sudot v0.2s, v1.8b, v2.4b[0] ret
父主题: Intrinsic Procedures