---
title: Neon Intrinsic
description: "Neon Intrinsic和编译器的具体实现相关，Clang的neon Intrinsic的功能与Arm Neon Intrinsics Reference(https://developer.arm.com/documentation/ihi0073/g)一致。但生成ANIR文档上指定的汇编指令，需指定优化级别大于O0。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengdevps/compilation/ug-bisheng/kunpengbisheng_06_0066.html
sourcePath: /source/zh/kunpengdevps/compilation/ug-bisheng/kunpengbisheng_06_0066.html
indexId: 0e0b38695f7ef642c33741607488417a9577a7be44fd33afb20245d4c22548d174
---
# Neon Intrinsic

Neon Intrinsic和编译器的具体实现相关，Clang的neon Intrinsic的功能与Arm Neon Intrinsics Reference(https://developer.arm.com/documentation/ihi0073/g)一致。但生成ANIR文档上指定的汇编指令，需指定优化级别大于O0。

#### 使用举例

以内容如下的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);
}
```


**表1 ANIR文档上vsudot_lane_s32的描述**

| 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
```
