Skip to content

[compiler-rt] Make Arm builtins aware of endianness in VMOVs #123204

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jan 22, 2025
Merged
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
6 changes: 3 additions & 3 deletions compiler-rt/lib/builtins/arm/adddf3vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -19,10 +19,10 @@ DEFINE_COMPILERRT_FUNCTION(__adddf3vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vadd.f64 d0, d0, d1
#else
vmov d6, r0, r1 // move first param from r0/r1 pair into d6
vmov d7, r2, r3 // move second param from r2/r3 pair into d7
VMOV_TO_DOUBLE(d6, r0, r1) // move first param from r0/r1 pair into d6
VMOV_TO_DOUBLE(d7, r2, r3) // move second param from r2/r3 pair into d7
vadd.f64 d6, d6, d7
vmov r0, r1, d6 // move result back to r0/r1 pair
VMOV_FROM_DOUBLE(r0, r1, d6) // move result back to r0/r1 pair
#endif
bx lr
END_COMPILERRT_FUNCTION(__adddf3vfp)
Expand Down
6 changes: 3 additions & 3 deletions compiler-rt/lib/builtins/arm/aeabi_dcmp.S
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@
// }

#if defined(COMPILER_RT_ARMHF_TARGET)
# define CONVERT_DCMP_ARGS_TO_DF2_ARGS \
vmov d0, r0, r1 SEPARATOR \
vmov d1, r2, r3
# define CONVERT_DCMP_ARGS_TO_DF2_ARGS \
VMOV_TO_DOUBLE(d0, r0, r1) \
VMOV_TO_DOUBLE(d1, r2, r3)
#else
# define CONVERT_DCMP_ARGS_TO_DF2_ARGS
#endif
Expand Down
6 changes: 3 additions & 3 deletions compiler-rt/lib/builtins/arm/divdf3vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ DEFINE_COMPILERRT_FUNCTION(__divdf3vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vdiv.f64 d0, d0, d1
#else
vmov d6, r0, r1 // move first param from r0/r1 pair into d6
vmov d7, r2, r3 // move second param from r2/r3 pair into d7
VMOV_TO_DOUBLE(d6, r0, r1) // move first param from r0/r1 pair into d6
VMOV_TO_DOUBLE(d7, r2, r3) // move second param from r2/r3 pair into d7
vdiv.f64 d5, d6, d7
vmov r0, r1, d5 // move result back to r0/r1 pair
VMOV_FROM_DOUBLE(r0, r1, d5) // move result back to r0/r1 pair
#endif
bx lr
END_COMPILERRT_FUNCTION(__divdf3vfp)
Expand Down
4 changes: 2 additions & 2 deletions compiler-rt/lib/builtins/arm/eqdf2vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ DEFINE_COMPILERRT_FUNCTION(__eqdf2vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vcmp.f64 d0, d1
#else
vmov d6, r0, r1 // load r0/r1 pair in double register
vmov d7, r2, r3 // load r2/r3 pair in double register
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
vcmp.f64 d6, d7
#endif
vmrs apsr_nzcv, fpscr
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/builtins/arm/extendsfdf2vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ DEFINE_COMPILERRT_FUNCTION(__extendsfdf2vfp)
#else
vmov s15, r0 // load float register from R0
vcvt.f64.f32 d7, s15 // convert single to double
vmov r0, r1, d7 // return result in r0/r1 pair
VMOV_FROM_DOUBLE(r0, r1, d7) // return result in r0/r1 pair
#endif
bx lr
END_COMPILERRT_FUNCTION(__extendsfdf2vfp)
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/builtins/arm/fixdfsivfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ DEFINE_COMPILERRT_FUNCTION(__fixdfsivfp)
vcvt.s32.f64 s0, d0
vmov r0, s0
#else
vmov d7, r0, r1 // load double register from R0/R1
VMOV_TO_DOUBLE(d7, r0, r1) // load double register from R0/R1
vcvt.s32.f64 s15, d7 // convert double to 32-bit int into s15
vmov r0, s15 // move s15 to result register
#endif
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/builtins/arm/fixunsdfsivfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ DEFINE_COMPILERRT_FUNCTION(__fixunsdfsivfp)
vcvt.u32.f64 s0, d0
vmov r0, s0
#else
vmov d7, r0, r1 // load double register from R0/R1
VMOV_TO_DOUBLE(d7, r0, r1) // load double register from R0/R1
vcvt.u32.f64 s15, d7 // convert double to 32-bit int into s15
vmov r0, s15 // move s15 to result register
#endif
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/builtins/arm/floatsidfvfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ DEFINE_COMPILERRT_FUNCTION(__floatsidfvfp)
#else
vmov s15, r0 // move int to float register s15
vcvt.f64.s32 d7, s15 // convert 32-bit int in s15 to double in d7
vmov r0, r1, d7 // move d7 to result register pair r0/r1
VMOV_FROM_DOUBLE(r0, r1, d7) // move d7 to result register pair r0/r1
#endif
bx lr
END_COMPILERRT_FUNCTION(__floatsidfvfp)
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/builtins/arm/floatunssidfvfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ DEFINE_COMPILERRT_FUNCTION(__floatunssidfvfp)
#else
vmov s15, r0 // move int to float register s15
vcvt.f64.u32 d7, s15 // convert 32-bit int in s15 to double in d7
vmov r0, r1, d7 // move d7 to result register pair r0/r1
VMOV_FROM_DOUBLE(r0, r1, d7) // move d7 to result register pair r0/r1
#endif
bx lr
END_COMPILERRT_FUNCTION(__floatunssidfvfp)
Expand Down
4 changes: 2 additions & 2 deletions compiler-rt/lib/builtins/arm/gedf2vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__gedf2vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vcmp.f64 d0, d1
#else
vmov d6, r0, r1 // load r0/r1 pair in double register
vmov d7, r2, r3 // load r2/r3 pair in double register
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
vcmp.f64 d6, d7
#endif
vmrs apsr_nzcv, fpscr
Expand Down
4 changes: 2 additions & 2 deletions compiler-rt/lib/builtins/arm/gtdf2vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__gtdf2vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vcmp.f64 d0, d1
#else
vmov d6, r0, r1 // load r0/r1 pair in double register
vmov d7, r2, r3 // load r2/r3 pair in double register
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
vcmp.f64 d6, d7
#endif
vmrs apsr_nzcv, fpscr
Expand Down
4 changes: 2 additions & 2 deletions compiler-rt/lib/builtins/arm/ledf2vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__ledf2vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vcmp.f64 d0, d1
#else
vmov d6, r0, r1 // load r0/r1 pair in double register
vmov d7, r2, r3 // load r2/r3 pair in double register
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
vcmp.f64 d6, d7
#endif
vmrs apsr_nzcv, fpscr
Expand Down
4 changes: 2 additions & 2 deletions compiler-rt/lib/builtins/arm/ltdf2vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__ltdf2vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vcmp.f64 d0, d1
#else
vmov d6, r0, r1 // load r0/r1 pair in double register
vmov d7, r2, r3 // load r2/r3 pair in double register
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
vcmp.f64 d6, d7
#endif
vmrs apsr_nzcv, fpscr
Expand Down
6 changes: 3 additions & 3 deletions compiler-rt/lib/builtins/arm/muldf3vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ DEFINE_COMPILERRT_FUNCTION(__muldf3vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vmul.f64 d0, d0, d1
#else
vmov d6, r0, r1 // move first param from r0/r1 pair into d6
vmov d7, r2, r3 // move second param from r2/r3 pair into d7
VMOV_TO_DOUBLE(d6, r0, r1) // move first param from r0/r1 pair into d6
VMOV_TO_DOUBLE(d7, r2, r3) // move second param from r2/r3 pair into d7
vmul.f64 d6, d6, d7
vmov r0, r1, d6 // move result back to r0/r1 pair
VMOV_FROM_DOUBLE(r0, r1, d6) // move result back to r0/r1 pair
#endif
bx lr
END_COMPILERRT_FUNCTION(__muldf3vfp)
Expand Down
4 changes: 2 additions & 2 deletions compiler-rt/lib/builtins/arm/nedf2vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,8 @@ DEFINE_COMPILERRT_FUNCTION(__nedf2vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vcmp.f64 d0, d1
#else
vmov d6, r0, r1 // load r0/r1 pair in double register
vmov d7, r2, r3 // load r2/r3 pair in double register
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
vcmp.f64 d6, d7
#endif
vmrs apsr_nzcv, fpscr
Expand Down
6 changes: 3 additions & 3 deletions compiler-rt/lib/builtins/arm/subdf3vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ DEFINE_COMPILERRT_FUNCTION(__subdf3vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vsub.f64 d0, d0, d1
#else
vmov d6, r0, r1 // move first param from r0/r1 pair into d6
vmov d7, r2, r3 // move second param from r2/r3 pair into d7
VMOV_TO_DOUBLE(d6, r0, r1) // move first param from r0/r1 pair into d6
VMOV_TO_DOUBLE(d7, r2, r3) // move second param from r2/r3 pair into d7
vsub.f64 d6, d6, d7
vmov r0, r1, d6 // move result back to r0/r1 pair
VMOV_FROM_DOUBLE(r0, r1, d6) // move result back to r0/r1 pair
#endif
bx lr
END_COMPILERRT_FUNCTION(__subdf3vfp)
Expand Down
2 changes: 1 addition & 1 deletion compiler-rt/lib/builtins/arm/truncdfsf2vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ DEFINE_COMPILERRT_FUNCTION(__truncdfsf2vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vcvt.f32.f64 s0, d0
#else
vmov d7, r0, r1 // load double from r0/r1 pair
VMOV_TO_DOUBLE(d7, r0, r1) // load double from r0/r1 pair
vcvt.f32.f64 s15, d7 // convert double to single (trucate precision)
vmov r0, s15 // return result in r0
#endif
Expand Down
4 changes: 2 additions & 2 deletions compiler-rt/lib/builtins/arm/unorddf2vfp.S
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__unorddf2vfp)
#if defined(COMPILER_RT_ARMHF_TARGET)
vcmp.f64 d0, d1
#else
vmov d6, r0, r1 // load r0/r1 pair in double register
vmov d7, r2, r3 // load r2/r3 pair in double register
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
vcmp.f64 d6, d7
#endif
vmrs apsr_nzcv, fpscr
Expand Down
12 changes: 12 additions & 0 deletions compiler-rt/lib/builtins/assembly.h
Original file line number Diff line number Diff line change
Expand Up @@ -290,4 +290,16 @@
CFI_END
#endif

#ifdef __arm__
#include "int_endianness.h"

#if _YUGA_BIG_ENDIAN
#define VMOV_TO_DOUBLE(dst, src0, src1) vmov dst, src1, src0 SEPARATOR
#define VMOV_FROM_DOUBLE(dst0, dst1, src) vmov dst1, dst0, src SEPARATOR
#else
#define VMOV_TO_DOUBLE(dst, src0, src1) vmov dst, src0, src1 SEPARATOR
#define VMOV_FROM_DOUBLE(dst0, dst1, src) vmov dst0, dst1, src SEPARATOR
#endif
#endif

#endif // COMPILERRT_ASSEMBLY_H
Loading