Skip to content

Commit ffde268

Browse files
authored
[compiler-rt] Make Arm builtins aware of endianness in VMOVs (#123204)
This patch makes Arm builtins aware of endianness in VMOVs. Before this patch, the functions' definitions assumed little endian, which made any program compiled for big endian incorrect.
1 parent c4ef805 commit ffde268

19 files changed

+47
-35
lines changed

compiler-rt/lib/builtins/arm/adddf3vfp.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,10 @@ DEFINE_COMPILERRT_FUNCTION(__adddf3vfp)
1919
#if defined(COMPILER_RT_ARMHF_TARGET)
2020
vadd.f64 d0, d0, d1
2121
#else
22-
vmov d6, r0, r1 // move first param from r0/r1 pair into d6
23-
vmov d7, r2, r3 // move second param from r2/r3 pair into d7
22+
VMOV_TO_DOUBLE(d6, r0, r1) // move first param from r0/r1 pair into d6
23+
VMOV_TO_DOUBLE(d7, r2, r3) // move second param from r2/r3 pair into d7
2424
vadd.f64 d6, d6, d7
25-
vmov r0, r1, d6 // move result back to r0/r1 pair
25+
VMOV_FROM_DOUBLE(r0, r1, d6) // move result back to r0/r1 pair
2626
#endif
2727
bx lr
2828
END_COMPILERRT_FUNCTION(__adddf3vfp)

compiler-rt/lib/builtins/arm/aeabi_dcmp.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@
1818
// }
1919

2020
#if defined(COMPILER_RT_ARMHF_TARGET)
21-
# define CONVERT_DCMP_ARGS_TO_DF2_ARGS \
22-
vmov d0, r0, r1 SEPARATOR \
23-
vmov d1, r2, r3
21+
# define CONVERT_DCMP_ARGS_TO_DF2_ARGS \
22+
VMOV_TO_DOUBLE(d0, r0, r1) \
23+
VMOV_TO_DOUBLE(d1, r2, r3)
2424
#else
2525
# define CONVERT_DCMP_ARGS_TO_DF2_ARGS
2626
#endif

compiler-rt/lib/builtins/arm/divdf3vfp.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ DEFINE_COMPILERRT_FUNCTION(__divdf3vfp)
2020
#if defined(COMPILER_RT_ARMHF_TARGET)
2121
vdiv.f64 d0, d0, d1
2222
#else
23-
vmov d6, r0, r1 // move first param from r0/r1 pair into d6
24-
vmov d7, r2, r3 // move second param from r2/r3 pair into d7
23+
VMOV_TO_DOUBLE(d6, r0, r1) // move first param from r0/r1 pair into d6
24+
VMOV_TO_DOUBLE(d7, r2, r3) // move second param from r2/r3 pair into d7
2525
vdiv.f64 d5, d6, d7
26-
vmov r0, r1, d5 // move result back to r0/r1 pair
26+
VMOV_FROM_DOUBLE(r0, r1, d5) // move result back to r0/r1 pair
2727
#endif
2828
bx lr
2929
END_COMPILERRT_FUNCTION(__divdf3vfp)

compiler-rt/lib/builtins/arm/eqdf2vfp.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ DEFINE_COMPILERRT_FUNCTION(__eqdf2vfp)
2020
#if defined(COMPILER_RT_ARMHF_TARGET)
2121
vcmp.f64 d0, d1
2222
#else
23-
vmov d6, r0, r1 // load r0/r1 pair in double register
24-
vmov d7, r2, r3 // load r2/r3 pair in double register
23+
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
24+
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
2525
vcmp.f64 d6, d7
2626
#endif
2727
vmrs apsr_nzcv, fpscr

compiler-rt/lib/builtins/arm/extendsfdf2vfp.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ DEFINE_COMPILERRT_FUNCTION(__extendsfdf2vfp)
2323
#else
2424
vmov s15, r0 // load float register from R0
2525
vcvt.f64.f32 d7, s15 // convert single to double
26-
vmov r0, r1, d7 // return result in r0/r1 pair
26+
VMOV_FROM_DOUBLE(r0, r1, d7) // return result in r0/r1 pair
2727
#endif
2828
bx lr
2929
END_COMPILERRT_FUNCTION(__extendsfdf2vfp)

compiler-rt/lib/builtins/arm/fixdfsivfp.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ DEFINE_COMPILERRT_FUNCTION(__fixdfsivfp)
2222
vcvt.s32.f64 s0, d0
2323
vmov r0, s0
2424
#else
25-
vmov d7, r0, r1 // load double register from R0/R1
25+
VMOV_TO_DOUBLE(d7, r0, r1) // load double register from R0/R1
2626
vcvt.s32.f64 s15, d7 // convert double to 32-bit int into s15
2727
vmov r0, s15 // move s15 to result register
2828
#endif

compiler-rt/lib/builtins/arm/fixunsdfsivfp.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ DEFINE_COMPILERRT_FUNCTION(__fixunsdfsivfp)
2323
vcvt.u32.f64 s0, d0
2424
vmov r0, s0
2525
#else
26-
vmov d7, r0, r1 // load double register from R0/R1
26+
VMOV_TO_DOUBLE(d7, r0, r1) // load double register from R0/R1
2727
vcvt.u32.f64 s15, d7 // convert double to 32-bit int into s15
2828
vmov r0, s15 // move s15 to result register
2929
#endif

compiler-rt/lib/builtins/arm/floatsidfvfp.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ DEFINE_COMPILERRT_FUNCTION(__floatsidfvfp)
2424
#else
2525
vmov s15, r0 // move int to float register s15
2626
vcvt.f64.s32 d7, s15 // convert 32-bit int in s15 to double in d7
27-
vmov r0, r1, d7 // move d7 to result register pair r0/r1
27+
VMOV_FROM_DOUBLE(r0, r1, d7) // move d7 to result register pair r0/r1
2828
#endif
2929
bx lr
3030
END_COMPILERRT_FUNCTION(__floatsidfvfp)

compiler-rt/lib/builtins/arm/floatunssidfvfp.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ DEFINE_COMPILERRT_FUNCTION(__floatunssidfvfp)
2424
#else
2525
vmov s15, r0 // move int to float register s15
2626
vcvt.f64.u32 d7, s15 // convert 32-bit int in s15 to double in d7
27-
vmov r0, r1, d7 // move d7 to result register pair r0/r1
27+
VMOV_FROM_DOUBLE(r0, r1, d7) // move d7 to result register pair r0/r1
2828
#endif
2929
bx lr
3030
END_COMPILERRT_FUNCTION(__floatunssidfvfp)

compiler-rt/lib/builtins/arm/gedf2vfp.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__gedf2vfp)
2121
#if defined(COMPILER_RT_ARMHF_TARGET)
2222
vcmp.f64 d0, d1
2323
#else
24-
vmov d6, r0, r1 // load r0/r1 pair in double register
25-
vmov d7, r2, r3 // load r2/r3 pair in double register
24+
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
25+
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
2626
vcmp.f64 d6, d7
2727
#endif
2828
vmrs apsr_nzcv, fpscr

compiler-rt/lib/builtins/arm/gtdf2vfp.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__gtdf2vfp)
2121
#if defined(COMPILER_RT_ARMHF_TARGET)
2222
vcmp.f64 d0, d1
2323
#else
24-
vmov d6, r0, r1 // load r0/r1 pair in double register
25-
vmov d7, r2, r3 // load r2/r3 pair in double register
24+
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
25+
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
2626
vcmp.f64 d6, d7
2727
#endif
2828
vmrs apsr_nzcv, fpscr

compiler-rt/lib/builtins/arm/ledf2vfp.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__ledf2vfp)
2121
#if defined(COMPILER_RT_ARMHF_TARGET)
2222
vcmp.f64 d0, d1
2323
#else
24-
vmov d6, r0, r1 // load r0/r1 pair in double register
25-
vmov d7, r2, r3 // load r2/r3 pair in double register
24+
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
25+
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
2626
vcmp.f64 d6, d7
2727
#endif
2828
vmrs apsr_nzcv, fpscr

compiler-rt/lib/builtins/arm/ltdf2vfp.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__ltdf2vfp)
2121
#if defined(COMPILER_RT_ARMHF_TARGET)
2222
vcmp.f64 d0, d1
2323
#else
24-
vmov d6, r0, r1 // load r0/r1 pair in double register
25-
vmov d7, r2, r3 // load r2/r3 pair in double register
24+
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
25+
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
2626
vcmp.f64 d6, d7
2727
#endif
2828
vmrs apsr_nzcv, fpscr

compiler-rt/lib/builtins/arm/muldf3vfp.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ DEFINE_COMPILERRT_FUNCTION(__muldf3vfp)
2020
#if defined(COMPILER_RT_ARMHF_TARGET)
2121
vmul.f64 d0, d0, d1
2222
#else
23-
vmov d6, r0, r1 // move first param from r0/r1 pair into d6
24-
vmov d7, r2, r3 // move second param from r2/r3 pair into d7
23+
VMOV_TO_DOUBLE(d6, r0, r1) // move first param from r0/r1 pair into d6
24+
VMOV_TO_DOUBLE(d7, r2, r3) // move second param from r2/r3 pair into d7
2525
vmul.f64 d6, d6, d7
26-
vmov r0, r1, d6 // move result back to r0/r1 pair
26+
VMOV_FROM_DOUBLE(r0, r1, d6) // move result back to r0/r1 pair
2727
#endif
2828
bx lr
2929
END_COMPILERRT_FUNCTION(__muldf3vfp)

compiler-rt/lib/builtins/arm/nedf2vfp.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,8 @@ DEFINE_COMPILERRT_FUNCTION(__nedf2vfp)
2020
#if defined(COMPILER_RT_ARMHF_TARGET)
2121
vcmp.f64 d0, d1
2222
#else
23-
vmov d6, r0, r1 // load r0/r1 pair in double register
24-
vmov d7, r2, r3 // load r2/r3 pair in double register
23+
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
24+
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
2525
vcmp.f64 d6, d7
2626
#endif
2727
vmrs apsr_nzcv, fpscr

compiler-rt/lib/builtins/arm/subdf3vfp.S

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,10 @@ DEFINE_COMPILERRT_FUNCTION(__subdf3vfp)
2020
#if defined(COMPILER_RT_ARMHF_TARGET)
2121
vsub.f64 d0, d0, d1
2222
#else
23-
vmov d6, r0, r1 // move first param from r0/r1 pair into d6
24-
vmov d7, r2, r3 // move second param from r2/r3 pair into d7
23+
VMOV_TO_DOUBLE(d6, r0, r1) // move first param from r0/r1 pair into d6
24+
VMOV_TO_DOUBLE(d7, r2, r3) // move second param from r2/r3 pair into d7
2525
vsub.f64 d6, d6, d7
26-
vmov r0, r1, d6 // move result back to r0/r1 pair
26+
VMOV_FROM_DOUBLE(r0, r1, d6) // move result back to r0/r1 pair
2727
#endif
2828
bx lr
2929
END_COMPILERRT_FUNCTION(__subdf3vfp)

compiler-rt/lib/builtins/arm/truncdfsf2vfp.S

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ DEFINE_COMPILERRT_FUNCTION(__truncdfsf2vfp)
2121
#if defined(COMPILER_RT_ARMHF_TARGET)
2222
vcvt.f32.f64 s0, d0
2323
#else
24-
vmov d7, r0, r1 // load double from r0/r1 pair
24+
VMOV_TO_DOUBLE(d7, r0, r1) // load double from r0/r1 pair
2525
vcvt.f32.f64 s15, d7 // convert double to single (trucate precision)
2626
vmov r0, s15 // return result in r0
2727
#endif

compiler-rt/lib/builtins/arm/unorddf2vfp.S

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ DEFINE_COMPILERRT_FUNCTION(__unorddf2vfp)
2121
#if defined(COMPILER_RT_ARMHF_TARGET)
2222
vcmp.f64 d0, d1
2323
#else
24-
vmov d6, r0, r1 // load r0/r1 pair in double register
25-
vmov d7, r2, r3 // load r2/r3 pair in double register
24+
VMOV_TO_DOUBLE(d6, r0, r1) // load r0/r1 pair in double register
25+
VMOV_TO_DOUBLE(d7, r2, r3) // load r2/r3 pair in double register
2626
vcmp.f64 d6, d7
2727
#endif
2828
vmrs apsr_nzcv, fpscr

compiler-rt/lib/builtins/assembly.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -290,4 +290,16 @@
290290
CFI_END
291291
#endif
292292

293+
#ifdef __arm__
294+
#include "int_endianness.h"
295+
296+
#if _YUGA_BIG_ENDIAN
297+
#define VMOV_TO_DOUBLE(dst, src0, src1) vmov dst, src1, src0 SEPARATOR
298+
#define VMOV_FROM_DOUBLE(dst0, dst1, src) vmov dst1, dst0, src SEPARATOR
299+
#else
300+
#define VMOV_TO_DOUBLE(dst, src0, src1) vmov dst, src0, src1 SEPARATOR
301+
#define VMOV_FROM_DOUBLE(dst0, dst1, src) vmov dst0, dst1, src SEPARATOR
302+
#endif
303+
#endif
304+
293305
#endif // COMPILERRT_ASSEMBLY_H

0 commit comments

Comments
 (0)