Skip to contentSkip to conversation

package/opus: don't use vcvtaq_s32_f32 on 32 bit ARM

PATCH In review Michele Comignano 3 participants 6 messages Jun 13 – Jun 15

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 package/opus: don't use vcvtaq_s32_f32 on 32 bit ARM

From: Comick <[email protected]>

Upstream issues is waiting for feedback.

See here for details:
https://gitlab.xiph.org/xiph/opus/-/work_items/2397

---
 ...use-vcvtaq_s32_f32-on-32-bit-systems.patch | 26 +++++++++++++++++++
 1 file changed, 26 insertions(+)
 create mode 100644 package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +26 -0
new file mode 100644
index 0000000000..ddd572921f
@@ -0,0 +1,26 @@
+From 321532001d59367466a6a4a60f5c6f0fe5fa2176 Mon Sep 17 00:00:00 2001
+From: Comick <[email protected]>
+Date: Sat, 13 Jun 2026 21:48:00 +0200
+Subject: [PATCH] celt/arm don't use vcvtaq_s32_f32 on 32 bit systems
+Upstream: N/A https://gitlab.xiph.org/xiph/opus/-/work_items/2397
+
+---
+ celt/arm/mathops_arm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/celt/arm/mathops_arm.h b/celt/arm/mathops_arm.h
+index b1f9169..c612dae 100644
+--- a/celt/arm/mathops_arm.h
++++ b/celt/arm/mathops_arm.h
+@@ -37,7 +37,7 @@
+ 
+ static inline int32x4_t vroundf(float32x4_t x)
+ {
+-#  if defined(__aarch64__) || (defined(__ARM_ARCH) && __ARM_ARCH >= 8)
++#  if defined(__aarch64__)
+     return vcvtaq_s32_f32(x);
+ #  else
+     uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), vdupq_n_u32(0x80000000));
+-- 
+2.54.0
+
Signature · 6 lines
2.54.0

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
#1 lore raw
Quoted 7 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Michele" == Michele Comignano <[email protected]> writes:

From: Comick <[email protected]>
Upstream issues is waiting for feedback.

See here for details:
https://gitlab.xiph.org/xiph/opus/-/work_items/2397

Hmm, indeed - There is no vcvtaq_s32_f32 intrinsic in gcc/config/arm/arm_neon.h but there is in gcc/config/aarch64/arm_neon.h but I do not understand the finer details - Julien?

Quoted 46 lines
---
 ...use-vcvtaq_s32_f32-on-32-bit-systems.patch | 26 +++++++++++++++++++
 1 file changed, 26 insertions(+)
 create mode 100644 package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +26 -0
new file mode 100644
index 0000000000..ddd572921f
@@ -0,0 +1,26 @@
+From 321532001d59367466a6a4a60f5c6f0fe5fa2176 Mon Sep 17 00:00:00 2001
+From: Comick <[email protected]>
+Date: Sat, 13 Jun 2026 21:48:00 +0200
+Subject: [PATCH] celt/arm don't use vcvtaq_s32_f32 on 32 bit systems
+Upstream: N/A https://gitlab.xiph.org/xiph/opus/-/work_items/2397
+
+---
+ celt/arm/mathops_arm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/celt/arm/mathops_arm.h b/celt/arm/mathops_arm.h
+index b1f9169..c612dae 100644
+--- a/celt/arm/mathops_arm.h
++++ b/celt/arm/mathops_arm.h
+@@ -37,7 +37,7 @@
+ 
+ static inline int32x4_t vroundf(float32x4_t x)
+ {
+-#  if defined(__aarch64__) || (defined(__ARM_ARCH) && __ARM_ARCH >= 8)
++#  if defined(__aarch64__)
+     return vcvtaq_s32_f32(x);
+ #  else
+     uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), vdupq_n_u32(0x80000000));
+-- 
+2.54.0
+
Signature · 6 lines
2.54.0

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
Signature · 5 lines
Bye, Peter Korsgaard
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot
#2 lore raw

Hi Peter, All,

Quoted 5 lines · Peter Korsgaard
Quoted 4 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Michele" == Michele Comignano <[email protected]> writes:

From: Comick <[email protected]>
Upstream issues is waiting for feedback.

Quoted 7 lines
Quoted 2 lines

See here for details:
https://gitlab.xiph.org/xiph/opus/-/work_items/2397

Hmm, indeed - There is no vcvtaq_s32_f32 intrinsic in gcc/config/arm/arm_neon.h but there is in gcc/config/aarch64/arm_neon.h but I do not understand the finer details - Julien?

Armv8-A Aarch32 is in fact a superset of Armv7-A. This is why there is few 32bit Armv8-A instructions which are not available in original Armv7-A.

See the column "Supported architectures" in the following table:
https://arm-software.github.io/acle/neon_intrinsics/advsimd.html#conversions

vcvtaq_s32_f32 is maked "A32/A64", whereas, for example vcvt_s32_f32 is marked "v7/A32/A64".

There is also a search engine for intrinsics available at:
https://developer.arm.com/architectures/instruction-sets/intrinsics/

Quoted 50 lines
Quoted 3 lines
---
 ...use-vcvtaq_s32_f32-on-32-bit-systems.patch | 26 

+++++++++++++++++++

Quoted 2 lines
 1 file changed, 26 insertions(+)
 create mode 100644 

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Review

Quoted 1 line
(quoted diff) +0 -0

a/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch b/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 4 lines

new file mode 100644
index 0000000000..ddd572921f
--- /dev/null
+++

b/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Review line 1

Quoted 2 lines
(quoted diff) +1 -0
@@ -0,0 +1,26 @@
+From 321532001d59367466a6a4a60f5c6f0fe5fa2176 Mon Sep 17 00:00:00 

2001

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 3 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +3 -0
+From: Comick <[email protected]>
+Date: Sat, 13 Jun 2026 21:48:00 +0200
+Subject: [PATCH] celt/arm don't use vcvtaq_s32_f32 on 32 bit 

systems

Quoted 17 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +15 -0
+Upstream: N/A https://gitlab.xiph.org/xiph/opus/-/work_items/2397
+
+---
+ celt/arm/mathops_arm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/celt/arm/mathops_arm.h b/celt/arm/mathops_arm.h
+index b1f9169..c612dae 100644
+--- a/celt/arm/mathops_arm.h
++++ b/celt/arm/mathops_arm.h
+@@ -37,7 +37,7 @@
+
+ static inline int32x4_t vroundf(float32x4_t x)
+ {
+-#  if defined(__aarch64__) || (defined(__ARM_ARCH) && __ARM_ARCH 

= 8)
++# if defined(__aarch64__)

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 3 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +3 -0
+     return vcvtaq_s32_f32(x);
+ #  else
+     uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), 

vdupq_n_u32(0x80000000));

Quoted 6 lines

+--
+2.54.0
+
--

2.54.0

Quoted 8 lines
Quoted 4 lines

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

--
Bye, Peter Korsgaard

Best regards,

Julien.
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

#3 lore raw

Thanks for all the hints! I tried going a bit deeper.

Looking at GCC arm_neon.h (https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/arm/arm_neon.h;h=6785dd2578a8ee0fd28b04d30934b764ea5fff3e;hb=HEAD), vcvtaq_s32_f32 is not present, though the arm instrinsics search suggests it is supported for the reference arch combo https://developer.arm.com/architectures/instruction-sets/intrinsics/#f:@navigationhierarchiessimdisa=[Neon]&f:@navigationhierarchiesarchitectures=[A32]&q=vcvtaq_s32_f32.

In a way, the ifdef from opus seems to match arm documentation, though GCC is not making it available.

According to https://gcc.gnu.org/pipermail/gcc-patches/2016-January/439845.html the intrinsics vcvtaq_s32_f32 was added in circa 2016 to arm_neon.h, yet reported as missing in circa 2020 https://gcc.gnu.org/pipermail/gcc-bugs/2020-May/703594.html.
The latter led to the creation of a GCC issue at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95399 which still sits new.

Interesting enough, rust (I wanted to check some other compiler) seems to match arm docs, though arm instrisics are deemed as experimental https://doc.rust-lang.org/core/arch/arm/fn.vcvtq_s32_f32.html.
Clang as well seems to support vcvtaq_s32_f32 https://godbolt.org/z/xsMfSz (link taken from from gcc bug at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95399).

So the problem seems to be GCC only.

After all the research, the problem arguably sits in either upstream gcc or opus, but as a matter of fact opus package build through buildroot is currently broken on 32 bit arm neon.

Do you think my proposed patch could apply as a buildroot-only quick fix?

Best regards,
Michele

Il Dom, 14 Giu 2026, alle ore 18:58, Julien Olivain via buildroot ha scritto:

Quoted 89 lines

Hi Peter, All,

Quoted 5 lines · Peter Korsgaard
Quoted 4 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Michele" == Michele Comignano <[email protected]> writes:

From: Comick <[email protected]>
Upstream issues is waiting for feedback.

Quoted 7 lines
Quoted 2 lines

See here for details:
https://gitlab.xiph.org/xiph/opus/-/work_items/2397

Hmm, indeed - There is no vcvtaq_s32_f32 intrinsic in gcc/config/arm/arm_neon.h but there is in gcc/config/aarch64/arm_neon.h but I do not understand the finer details - Julien?

Armv8-A Aarch32 is in fact a superset of Armv7-A. This is why there is few 32bit Armv8-A instructions which are not available in original Armv7-A.

See the column "Supported architectures" in the following table:
https://arm-software.github.io/acle/neon_intrinsics/advsimd.html#conversions

vcvtaq_s32_f32 is maked "A32/A64", whereas, for example vcvt_s32_f32 is marked "v7/A32/A64".

There is also a search engine for intrinsics available at:
https://developer.arm.com/architectures/instruction-sets/intrinsics/

Quoted 51 lines
Quoted 3 lines
---
 ...use-vcvtaq_s32_f32-on-32-bit-systems.patch | 26 

+++++++++++++++++++

Quoted 2 lines
 1 file changed, 26 insertions(+)
 create mode 100644 

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Review

Quoted 1 line
(quoted diff) +0 -0

a/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch b/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 4 lines

new file mode 100644
index 0000000000..ddd572921f
--- /dev/null
+++

b/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Review line 1

Quoted 2 lines
(quoted diff) +1 -0
@@ -0,0 +1,26 @@
+From 321532001d59367466a6a4a60f5c6f0fe5fa2176 Mon Sep 17 00:00:00 

2001

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 3 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +3 -0
+From: Comick <[email protected]>
+Date: Sat, 13 Jun 2026 21:48:00 +0200
+Subject: [PATCH] celt/arm don't use vcvtaq_s32_f32 on 32 bit 

systems

Quoted 17 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +15 -0
+Upstream: N/A https://gitlab.xiph.org/xiph/opus/-/work_items/2397
+
+---
+ celt/arm/mathops_arm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/celt/arm/mathops_arm.h b/celt/arm/mathops_arm.h
+index b1f9169..c612dae 100644
+--- a/celt/arm/mathops_arm.h
++++ b/celt/arm/mathops_arm.h
+@@ -37,7 +37,7 @@
+
+ static inline int32x4_t vroundf(float32x4_t x)
+ {
+-#  if defined(__aarch64__) || (defined(__ARM_ARCH) && __ARM_ARCH 

= 8)
++# if defined(__aarch64__)

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 3 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +3 -0
+     return vcvtaq_s32_f32(x);
+ #  else
+     uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), 

vdupq_n_u32(0x80000000));

Quoted 6 lines

+--
+2.54.0
+
--

2.54.0

Quoted 8 lines
Quoted 4 lines

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

--
Bye, Peter Korsgaard

Quoted 8 lines

Best regards,

Julien.
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

#4 lore raw

Just noticed that I linked the wrong rust arm intrinsics docs.
The right link is https://doc.rust-lang.org/core/arch/aarch64/fn.vcvtaq_s32_f32.html which matches gcc observations (arm 64 only). As for clang, the example code used another intrinsics, here is one using exactly vcvtaq_s32_f32 https://godbolt.org/z/31f1xnjvz, which also works.

Kind regards,
Michele

Il Lun, 15 Giu 2026, alle ore 11:23, Michele Comignano ha scritto:

Quoted 121 lines

Thanks for all the hints! I tried going a bit deeper.

Looking at GCC arm_neon.h (https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/arm/arm_neon.h;h=6785dd2578a8ee0fd28b04d30934b764ea5fff3e;hb=HEAD), vcvtaq_s32_f32 is not present, though the arm instrinsics search suggests it is supported for the reference arch combo https://developer.arm.com/architectures/instruction-sets/intrinsics/#f:@navigationhierarchiessimdisa=[Neon]&f:@navigationhierarchiesarchitectures=[A32]&q=vcvtaq_s32_f32.

In a way, the ifdef from opus seems to match arm documentation, though GCC is not making it available.

According to https://gcc.gnu.org/pipermail/gcc-patches/2016-January/439845.html the intrinsics vcvtaq_s32_f32 was added in circa 2016 to arm_neon.h, yet reported as missing in circa 2020 https://gcc.gnu.org/pipermail/gcc-bugs/2020-May/703594.html.
The latter led to the creation of a GCC issue at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95399 which still sits new.

Interesting enough, rust (I wanted to check some other compiler) seems to match arm docs, though arm instrisics are deemed as experimental https://doc.rust-lang.org/core/arch/arm/fn.vcvtq_s32_f32.html.
Clang as well seems to support vcvtaq_s32_f32 https://godbolt.org/z/xsMfSz (link taken from from gcc bug at https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95399).

So the problem seems to be GCC only.

After all the research, the problem arguably sits in either upstream gcc or opus, but as a matter of fact opus package build through buildroot is currently broken on 32 bit arm neon.

Do you think my proposed patch could apply as a buildroot-only quick fix?

Best regards,
Michele

Il Dom, 14 Giu 2026, alle ore 18:58, Julien Olivain via buildroot ha scritto:

Quoted 89 lines

Hi Peter, All,

Quoted 5 lines · Peter Korsgaard
Quoted 4 lines
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Michele" == Michele Comignano <[email protected]> writes:

From: Comick <[email protected]>
Upstream issues is waiting for feedback.

Quoted 7 lines
Quoted 2 lines

See here for details:
https://gitlab.xiph.org/xiph/opus/-/work_items/2397

Hmm, indeed - There is no vcvtaq_s32_f32 intrinsic in gcc/config/arm/arm_neon.h but there is in gcc/config/aarch64/arm_neon.h but I do not understand the finer details - Julien?

Armv8-A Aarch32 is in fact a superset of Armv7-A. This is why there is few 32bit Armv8-A instructions which are not available in original Armv7-A.

See the column "Supported architectures" in the following table:
https://arm-software.github.io/acle/neon_intrinsics/advsimd.html#conversions

vcvtaq_s32_f32 is maked "A32/A64", whereas, for example vcvt_s32_f32 is marked "v7/A32/A64".

There is also a search engine for intrinsics available at:
https://developer.arm.com/architectures/instruction-sets/intrinsics/

Quoted 51 lines
Quoted 3 lines
---
 ...use-vcvtaq_s32_f32-on-32-bit-systems.patch | 26 

+++++++++++++++++++

Quoted 2 lines
 1 file changed, 26 insertions(+)
 create mode 100644 

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Review

Quoted 1 line
(quoted diff) +0 -0

a/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch b/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 4 lines

new file mode 100644
index 0000000000..ddd572921f
--- /dev/null
+++

b/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Review line 1

Quoted 2 lines
(quoted diff) +1 -0
@@ -0,0 +1,26 @@
+From 321532001d59367466a6a4a60f5c6f0fe5fa2176 Mon Sep 17 00:00:00 

2001

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 3 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +3 -0
+From: Comick <[email protected]>
+Date: Sat, 13 Jun 2026 21:48:00 +0200
+Subject: [PATCH] celt/arm don't use vcvtaq_s32_f32 on 32 bit 

systems

Quoted 17 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +15 -0
+Upstream: N/A https://gitlab.xiph.org/xiph/opus/-/work_items/2397
+
+---
+ celt/arm/mathops_arm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/celt/arm/mathops_arm.h b/celt/arm/mathops_arm.h
+index b1f9169..c612dae 100644
+--- a/celt/arm/mathops_arm.h
++++ b/celt/arm/mathops_arm.h
+@@ -37,7 +37,7 @@
+
+ static inline int32x4_t vroundf(float32x4_t x)
+ {
+-#  if defined(__aarch64__) || (defined(__ARM_ARCH) && __ARM_ARCH 

= 8)
++# if defined(__aarch64__)

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 3 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +3 -0
+     return vcvtaq_s32_f32(x);
+ #  else
+     uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x), 

vdupq_n_u32(0x80000000));

Quoted 6 lines

+--
+2.54.0
+
--

2.54.0

Quoted 8 lines
Quoted 4 lines

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

--
Bye, Peter Korsgaard

Quoted 8 lines

Best regards,

Julien.
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

Quoted 5 lines

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

#5 lore raw

Hi Michele,

Quoted 15 lines · Michele Comignano

Just noticed that I linked the wrong rust arm intrinsics docs. The right link is
https://doc.rust-lang.org/core/arch/aarch64/fn.vcvtaq_s32_f32.html
which matches gcc observations (arm 64 only).
As for clang, the example code used another intrinsics, here is one using exactly vcvtaq_s32_f32 https://godbolt.org/z/31f1xnjvz, which also works.

Kind regards,
Michele

Il Lun, 15 Giu 2026, alle ore 11:23, Michele Comignano ha scritto:

Quoted 2 lines

Thanks for all the hints! I tried going a bit deeper.

Quoted 37 lines
Quoted 2 lines

Looking at GCC arm_neon.h

(https://gcc.gnu.org/git/?p=gcc.git;a=blob;f=gcc/config/arm/arm_neon.h;h=6785dd2578a8ee0fd28b04d30934b764ea5fff3e;hb=HEAD),

Quoted 3 lines

vcvtaq_s32_f32 is not present, though the arm instrinsics search suggests it is supported for the reference arch combo

https://developer.arm.com/architectures/instruction-sets/intrinsics/#f:@navigationhierarchiessimdisa=[Neon]&f:@navigationhierarchiesarchitectures=[A32]&q=vcvtaq_s32_f32

Quoted 30 lines

[1].

In a way, the ifdef from opus seems to match arm documentation, though GCC is not making it available.

According to
https://gcc.gnu.org/pipermail/gcc-patches/2016-January/439845.html
the intrinsics vcvtaq_s32_f32 was added in circa 2016 to arm_neon.h, yet reported as missing in circa 2020
https://gcc.gnu.org/pipermail/gcc-bugs/2020-May/703594.html.
The latter led to the creation of a GCC issue at
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95399 which still sits new.

Interesting enough, rust (I wanted to check some other compiler) seems to match arm docs, though arm instrisics are deemed as experimental
https://doc.rust-lang.org/core/arch/arm/fn.vcvtq_s32_f32.html.
Clang as well seems to support vcvtaq_s32_f32
https://godbolt.org/z/xsMfSz (link taken from from gcc bug at
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=95399).

So the problem seems to be GCC only.

After all the research, the problem arguably sits in either upstream gcc or opus, but as a matter of fact opus package build through buildroot is currently broken on 32 bit arm neon.

Do you think my proposed patch could apply as a buildroot-only quick fix?

From Arm documentation, Armv8-A Aarch32 does support vcvtaq_s32_f32. Gcc apparently does not support it in 32-bit, but clang does.

Since it seems it is just the gcc support which is missing, maybe your patch could changed for upstream as:

/*
* 32bit Arm gcc does not support vcvtaq_s32_f32()
* See: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71233
*/
#if defined(__aarch64__) || (defined(__ARM_ARCH) && (__ARM_ARCH >= 8) && defined(__clang__))
...

It does not really change anything in Buildroot, since there is only Gcc. But for opus upstream, it will still allow other users to keep using this on Armv8-A Aarch32.

Also, we try to avoid carrying Buildroot-specific package patches, so it's better the fix is accepted upstream (your initial proposal, or a revised one).

Quoted 134 lines
Quoted 33 lines

Best regards,
Michele

Il Dom, 14 Giu 2026, alle ore 18:58, Julien Olivain via buildroot ha scritto:

Quoted 26 lines

Hi Peter, All,

Quoted 1 line · Peter Korsgaard
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Michele" == Michele Comignano <[email protected]>

Quoted 10 lines · writes:
Quoted 6 lines

From: Comick <[email protected]>
Upstream issues is waiting for feedback.

See here for details:
https://gitlab.xiph.org/xiph/opus/-/work_items/2397

Hmm, indeed - There is no vcvtaq_s32_f32 intrinsic in gcc/config/arm/arm_neon.h but there is in

gcc/config/aarch64/arm_neon.h

Quoted 1 line

but I do not understand the finer details - Julien?

Armv8-A Aarch32 is in fact a superset of Armv7-A. This is why there
is few 32bit Armv8-A instructions which are not available in original
Armv7-A.

See the column "Supported architectures" in the following table:

https://arm-software.github.io/acle/neon_intrinsics/advsimd.html#conversions

Quoted 17 lines
Quoted 6 lines

vcvtaq_s32_f32 is maked "A32/A64", whereas, for example vcvt_s32_f32 is marked "v7/A32/A64".

There is also a search engine for intrinsics available at:

https://developer.arm.com/architectures/instruction-sets/intrinsics/

Quoted 9 lines
Quoted 8 lines
Quoted 4 lines

---
...use-vcvtaq_s32_f32-on-32-bit-systems.patch | 26

+++++++++++++++++++

Quoted 2 lines
1 file changed, 26 insertions(+)

create mode 100644

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 5 lines
Quoted 4 lines
Quoted 3 lines
Quoted 2 lines

diff --git

a/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 4 lines
Quoted 3 lines
Quoted 2 lines

b/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 7 lines
Quoted 6 lines
Quoted 5 lines
Quoted 4 lines

new file mode 100644
index 0000000000..ddd572921f
--- /dev/null
+++

b/package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 56 lines
Quoted 48 lines
Quoted 2 lines

Review line 1

Quoted 2 lines
(quoted diff) +1 -0
@@ -0,0 +1,26 @@
+From 321532001d59367466a6a4a60f5c6f0fe5fa2176 Mon Sep 17

00:00:00

Quoted 7 lines

2001

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 3 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +3 -0
+From: Comick <[email protected]>
+Date: Sat, 13 Jun 2026 21:48:00 +0200
+Subject: [PATCH] celt/arm don't use vcvtaq_s32_f32 on 32 bit

systems

Quoted 1 line
(quoted diff) +1 -0
+Upstream: N/A

https://gitlab.xiph.org/xiph/opus/-/work_items/2397

Quoted 6 lines
Quoted 6 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +6 -0
+
+---
+ celt/arm/mathops_arm.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/celt/arm/mathops_arm.h b/celt/arm/mathops_arm.h
Quoted 8 lines

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 8 lines
package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +8 -0
+index b1f9169..c612dae 100644
+--- a/celt/arm/mathops_arm.h
++++ b/celt/arm/mathops_arm.h
+@@ -37,7 +37,7 @@
+
+ static inline int32x4_t vroundf(float32x4_t x)
+ {
+-#  if defined(__aarch64__) || (defined(__ARM_ARCH) &&

__ARM_ARCH

Quoted 13 lines

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch

Quoted 5 lines

= 8)
++# if defined(__aarch64__)

package/opus/0001-celt-arm-don-t-use-vcvtaq_s32_f32-on-32-bit-systems.patch new file +3 -0
+     return vcvtaq_s32_f32(x);
+ #  else
+     uint32x4_t sign = vandq_u32(vreinterpretq_u32_f32(x),

vdupq_n_u32(0x80000000));

Quoted 6 lines

+--
+2.54.0
+
--

2.54.0

Quoted 8 lines
Quoted 4 lines

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

--
Bye, Peter Korsgaard

Quoted 7 lines

Best regards,

Julien.
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

Quoted 4 lines

_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot

Quoted 3 lines

Links:
------
[1] https://developer.arm.com/architectures/instruction-sets/intrinsics/#f:@navigationhierarchiessimdisa=[Neon]&f:@navigationhierarchiesarchitectures=[A32]&q=vcvtaq_s32_f32

Best regards,

Julien.
_______________________________________________
buildroot mailing list
[email protected]
https://lists.buildroot.org/mailman/listinfo/buildroot