Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
39 changes: 39 additions & 0 deletions neon_intrinsics/advsimd.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ See [Changelog for year 2026](#changelog-for-year-2026).

### Changelog for year 2026

* Added proposed support for LDNP/STNP intrinsics.
* Added support for FEAT_F16F32DOT
* Added support for FEAT_F16F32MM and FEAT_F16MM
* Renamed vmmlaq_f16_f16 to vmmlaq_f16
Expand Down Expand Up @@ -3829,6 +3830,25 @@ The intrinsics in this section are guarded by the macro ``__ARM_NEON``.

### Load

#### Non-temporal pair


| Intrinsic | Argument preparation | AArch64 Instruction | Result | Supported architectures |
|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------|---------------------------------|---------------------------------------------------------------------------------------------------------------------|---------------------------|
| <code>int8x16x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_s8_x2" target="_blank">vldnq_s8_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; int8_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>int16x8x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_s16_x2" target="_blank">vldnq_s16_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; int16_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>int32x4x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_s32_x2" target="_blank">vldnq_s32_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; int32_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>int64x2x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_s64_x2" target="_blank">vldnq_s64_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; int64_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>uint8x16x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_u8_x2" target="_blank">vldnq_u8_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; uint8_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>uint16x8x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_u16_x2" target="_blank">vldnq_u16_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; uint16_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>uint32x4x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_u32_x2" target="_blank">vldnq_u32_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; uint32_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>uint64x2x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_u64_x2" target="_blank">vldnq_u64_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; uint64_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>float16x8x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_f16_x2" target="_blank">vldnq_f16_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; float16_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>bfloat16x8x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_bf16_x2" target="_blank">vldnq_bf16_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; bfloat16_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>float32x4x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_f32_x2" target="_blank">vldnq_f32_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; float32_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>float64x2x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_f64_x2" target="_blank">vldnq_f64_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; float64_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |
| <code>mfloat8x16x2_t <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vldnq_mf8_x2" target="_blank">vldnq_mf8_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; mfloat8_t const *ptr)</code> | `ptr -> Xn` | `LDNP Qt1,Qt2,[Xn]` | `Qt1/Qt2 -> result.val[0]/result.val[1]` | `A64` |

#### Stride

| Intrinsic | Argument preparation | AArch64 Instruction | Result | Supported architectures |
Expand Down Expand Up @@ -4308,6 +4328,25 @@ The intrinsics in this section are guarded by the macro ``__ARM_NEON``.

### Store

#### Non-temporal pair

| Intrinsic | Argument preparation | AArch64 Instruction | Result | Supported architectures |
|-----------|----------------------|---------------------|--------|-------------------------|
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_s8_x2" target="_blank">vstnq_s8_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; int8_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; int8x16x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_s16_x2" target="_blank">vstnq_s16_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; int16_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; int16x8x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_s32_x2" target="_blank">vstnq_s32_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; int32_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; int32x4x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_s64_x2" target="_blank">vstnq_s64_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; int64_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; int64x2x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_u8_x2" target="_blank">vstnq_u8_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; uint8_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; uint8x16x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_u16_x2" target="_blank">vstnq_u16_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; uint16_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; uint16x8x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_u32_x2" target="_blank">vstnq_u32_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; uint32_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; uint32x4x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_u64_x2" target="_blank">vstnq_u64_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; uint64_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; uint64x2x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_f16_x2" target="_blank">vstnq_f16_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; float16_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; float16x8x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_bf16_x2" target="_blank">vstnq_bf16_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; bfloat16_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; bfloat16x8x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_f32_x2" target="_blank">vstnq_f32_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; float32_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; float32x4x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_f64_x2" target="_blank">vstnq_f64_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; float64_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; float64x2x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |
| <code>void <a href="https://developer.arm.com/architectures/instruction-sets/intrinsics/vstnq_mf8_x2" target="_blank">vstnq_mf8_x2</a>(<br>&nbsp;&nbsp;&nbsp;&nbsp; mfloat8_t *ptr,<br>&nbsp;&nbsp;&nbsp;&nbsp; mfloat8x16x2_t val)</code> | `val.val[0]/val.val[1] -> Qt1/Qt2`<br>`ptr -> Xn` | `STNP Qt1,Qt2,[Xn]` | | `A64` |


#### Stride

| Intrinsic | Argument preparation | AArch64 Instruction | Result | Supported architectures |
Expand Down
1 change: 1 addition & 0 deletions neon_intrinsics/advsimd.template.md
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,7 @@ See [Changelog for year 2026](#changelog-for-year-2026).

### Changelog for year 2026

* Added proposed support for LDNP/STNP intrinsics.
* Added support for FEAT_F16F32DOT
* Added support for FEAT_F16F32MM and FEAT_F16MM
* Renamed vmmlaq_f16_f16 to vmmlaq_f16
Expand Down
27 changes: 27 additions & 0 deletions tools/intrinsic_db/advsimd.csv
Original file line number Diff line number Diff line change
Expand Up @@ -4863,3 +4863,30 @@ float32x4_t vmmlaq_f32_f16(float32x4_t r, float16x8_t a, float16x8_t b) r -> Vd.

<SECTION> Non-widening half-precision matrix multiply instruction. Requires the +f16mm architecture extension.
float16x8_t vmmlaq_f16(float16x8_t r, float16x8_t a, float16x8_t b) r -> Vd.8H;a -> Vn.8H;b -> Vm.8H FMMLA Vd.8H, Vn.8H, Vm.8H Vd.8H -> result A64
<SECTION> Non-temporal pair load and store intrinsics
int8x16x2_t vldnq_s8_x2(int8_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
int16x8x2_t vldnq_s16_x2(int16_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
int32x4x2_t vldnq_s32_x2(int32_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
int64x2x2_t vldnq_s64_x2(int64_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
uint8x16x2_t vldnq_u8_x2(uint8_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
uint16x8x2_t vldnq_u16_x2(uint16_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
uint32x4x2_t vldnq_u32_x2(uint32_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
uint64x2x2_t vldnq_u64_x2(uint64_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
float16x8x2_t vldnq_f16_x2(float16_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
bfloat16x8x2_t vldnq_bf16_x2(bfloat16_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
float32x4x2_t vldnq_f32_x2(float32_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
float64x2x2_t vldnq_f64_x2(float64_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
mfloat8x16x2_t vldnq_mf8_x2(mfloat8_t const *ptr) ptr -> Xn LDNP Qt1,Qt2,[Xn] Qt2 -> result.val[1];Qt1 -> result.val[0] A64
void vstnq_s8_x2(int8_t *ptr, int8x16x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_s16_x2(int16_t *ptr, int16x8x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_s32_x2(int32_t *ptr, int32x4x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_s64_x2(int64_t *ptr, int64x2x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_u8_x2(uint8_t *ptr, uint8x16x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_u16_x2(uint16_t *ptr, uint16x8x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_u32_x2(uint32_t *ptr, uint32x4x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_u64_x2(uint64_t *ptr, uint64x2x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_f16_x2(float16_t *ptr, float16x8x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_bf16_x2(bfloat16_t *ptr, bfloat16x8x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_f32_x2(float32_t *ptr, float32x4x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_f64_x2(float64_t *ptr, float64x2x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
void vstnq_mf8_x2(mfloat8_t *ptr, mfloat8x16x2_t val) val.val[1] -> Qt2;val.val[0] -> Qt1;ptr -> Xn STNP Qt1,Qt2,[Xn] A64
26 changes: 26 additions & 0 deletions tools/intrinsic_db/advsimd_classification.csv
Original file line number Diff line number Diff line change
Expand Up @@ -4745,3 +4745,29 @@ vdot_laneq_f32_f16 Vector arithmetic|Dot product
vdotq_lane_f32_f16 Vector arithmetic|Dot product
vmmlaq_f32_f16 Vector arithmetic|Matrix multiply
vmmlaq_f16 Vector arithmetic|Matrix multiply
vldnq_s8_x2 Load|Stride
vldnq_s16_x2 Load|Stride
vldnq_s32_x2 Load|Stride
vldnq_s64_x2 Load|Stride
vldnq_u8_x2 Load|Stride
vldnq_u16_x2 Load|Stride
vldnq_u32_x2 Load|Stride
vldnq_u64_x2 Load|Stride
vldnq_f16_x2 Load|Stride
vldnq_bf16_x2 Load|Stride
vldnq_f32_x2 Load|Stride
vldnq_f64_x2 Load|Stride
vldnq_mf8_x2 Load|Stride
vstnq_s8_x2 Store|Stride
vstnq_s16_x2 Store|Stride
vstnq_s32_x2 Store|Stride
vstnq_s64_x2 Store|Stride
vstnq_u8_x2 Store|Stride
vstnq_u16_x2 Store|Stride
vstnq_u32_x2 Store|Stride
vstnq_u64_x2 Store|Stride
vstnq_f16_x2 Store|Stride
vstnq_bf16_x2 Store|Stride
vstnq_f32_x2 Store|Stride
vstnq_f64_x2 Store|Stride
vstnq_mf8_x2 Store|Stride
Loading