at master 6.2 kB view raw
1From 4fe3f21bf8b20c766877d2251d61118d0ff36688 Mon Sep 17 00:00:00 2001 2From: Ben Wolsieffer <benwolsieffer@gmail.com> 3Date: Wed, 7 Dec 2022 14:56:51 -0500 4Subject: [PATCH] [compiler-rt][builtins] Do not use ldrexd or strexd on ARMv6 5 6The ldrexd and strexd instructions are not available on base ARMv6, and were 7only added in ARMv6K (see [1]). This patch solves this problem once and for all 8using the __ARM_FEATURE_LDREX macro (see [2]) defined in the ARM C Language 9Extensions (ACLE). Although this macro is technically deprecated in the ACLE, 10it allows compiler-rt to reliably detect whether ldrexd and strexd are supported 11without complicated conditionals to detect different ARM architecture variants. 12 13[1] https://developer.arm.com/documentation/dht0008/a/ch01s02s01 14[2] https://arm-software.github.io/acle/main/acle.html#ldrexstrex 15 16Differential Revision: https://reviews.llvm.org/D139585 17--- 18 compiler-rt/lib/builtins/arm/sync_fetch_and_add_8.S | 2 +- 19 compiler-rt/lib/builtins/arm/sync_fetch_and_and_8.S | 2 +- 20 compiler-rt/lib/builtins/arm/sync_fetch_and_max_8.S | 2 +- 21 compiler-rt/lib/builtins/arm/sync_fetch_and_min_8.S | 2 +- 22 compiler-rt/lib/builtins/arm/sync_fetch_and_nand_8.S | 2 +- 23 compiler-rt/lib/builtins/arm/sync_fetch_and_or_8.S | 2 +- 24 compiler-rt/lib/builtins/arm/sync_fetch_and_sub_8.S | 2 +- 25 compiler-rt/lib/builtins/arm/sync_fetch_and_umax_8.S | 2 +- 26 compiler-rt/lib/builtins/arm/sync_fetch_and_umin_8.S | 2 +- 27 compiler-rt/lib/builtins/arm/sync_fetch_and_xor_8.S | 2 +- 28 10 files changed, 10 insertions(+), 10 deletions(-) 29 30diff --git a/lib/builtins/arm/sync_fetch_and_add_8.S b/lib/builtins/arm/sync_fetch_and_add_8.S 31index 18bdd875b8b7..bee6f7ba0f34 100644 32--- a/lib/builtins/arm/sync_fetch_and_add_8.S 33+++ b/lib/builtins/arm/sync_fetch_and_add_8.S 34@@ -13,7 +13,7 @@ 35 36 #include "sync-ops.h" 37 38-#if __ARM_ARCH_PROFILE != 'M' 39+#if __ARM_FEATURE_LDREX & 8 40 #define add_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ 41 adds rD_LO, rN_LO, rM_LO ; \ 42 adc rD_HI, rN_HI, rM_HI 43diff --git a/lib/builtins/arm/sync_fetch_and_and_8.S b/lib/builtins/arm/sync_fetch_and_and_8.S 44index 3716eff809d5..b4e77a54edf6 100644 45--- a/lib/builtins/arm/sync_fetch_and_and_8.S 46+++ b/lib/builtins/arm/sync_fetch_and_and_8.S 47@@ -13,7 +13,7 @@ 48 49 #include "sync-ops.h" 50 51-#if __ARM_ARCH_PROFILE != 'M' 52+#if __ARM_FEATURE_LDREX & 8 53 #define and_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ 54 and rD_LO, rN_LO, rM_LO ; \ 55 and rD_HI, rN_HI, rM_HI 56diff --git a/lib/builtins/arm/sync_fetch_and_max_8.S b/lib/builtins/arm/sync_fetch_and_max_8.S 57index 06115ab55246..1813274cc649 100644 58--- a/lib/builtins/arm/sync_fetch_and_max_8.S 59+++ b/lib/builtins/arm/sync_fetch_and_max_8.S 60@@ -13,7 +13,7 @@ 61 62 #include "sync-ops.h" 63 64-#if __ARM_ARCH_PROFILE != 'M' 65+#if __ARM_FEATURE_LDREX & 8 66 #define max_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, gt) 67 68 SYNC_OP_8(max_8) 69diff --git a/lib/builtins/arm/sync_fetch_and_min_8.S b/lib/builtins/arm/sync_fetch_and_min_8.S 70index 4f3e299d95cc..fa8f3477757b 100644 71--- a/lib/builtins/arm/sync_fetch_and_min_8.S 72+++ b/lib/builtins/arm/sync_fetch_and_min_8.S 73@@ -13,7 +13,7 @@ 74 75 #include "sync-ops.h" 76 77-#if __ARM_ARCH_PROFILE != 'M' 78+#if __ARM_FEATURE_LDREX & 8 79 #define min_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, lt) 80 81 SYNC_OP_8(min_8) 82diff --git a/lib/builtins/arm/sync_fetch_and_nand_8.S b/lib/builtins/arm/sync_fetch_and_nand_8.S 83index 425c94474af7..fb27219ee200 100644 84--- a/lib/builtins/arm/sync_fetch_and_nand_8.S 85+++ b/lib/builtins/arm/sync_fetch_and_nand_8.S 86@@ -13,7 +13,7 @@ 87 88 #include "sync-ops.h" 89 90-#if __ARM_ARCH_PROFILE != 'M' 91+#if __ARM_FEATURE_LDREX & 8 92 #define nand_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ 93 bic rD_LO, rN_LO, rM_LO ; \ 94 bic rD_HI, rN_HI, rM_HI 95diff --git a/lib/builtins/arm/sync_fetch_and_or_8.S b/lib/builtins/arm/sync_fetch_and_or_8.S 96index 4f18dcf84df9..3b077c8737b1 100644 97--- a/lib/builtins/arm/sync_fetch_and_or_8.S 98+++ b/lib/builtins/arm/sync_fetch_and_or_8.S 99@@ -13,7 +13,7 @@ 100 101 #include "sync-ops.h" 102 103-#if __ARM_ARCH_PROFILE != 'M' 104+#if __ARM_FEATURE_LDREX & 8 105 #define or_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ 106 orr rD_LO, rN_LO, rM_LO ; \ 107 orr rD_HI, rN_HI, rM_HI 108diff --git a/lib/builtins/arm/sync_fetch_and_sub_8.S b/lib/builtins/arm/sync_fetch_and_sub_8.S 109index 25a4a1076555..c171607eabd8 100644 110--- a/lib/builtins/arm/sync_fetch_and_sub_8.S 111+++ b/lib/builtins/arm/sync_fetch_and_sub_8.S 112@@ -13,7 +13,7 @@ 113 114 #include "sync-ops.h" 115 116-#if __ARM_ARCH_PROFILE != 'M' 117+#if __ARM_FEATURE_LDREX & 8 118 #define sub_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ 119 subs rD_LO, rN_LO, rM_LO ; \ 120 sbc rD_HI, rN_HI, rM_HI 121diff --git a/lib/builtins/arm/sync_fetch_and_umax_8.S b/lib/builtins/arm/sync_fetch_and_umax_8.S 122index aa5213ff1def..d1224f758049 100644 123--- a/lib/builtins/arm/sync_fetch_and_umax_8.S 124+++ b/lib/builtins/arm/sync_fetch_and_umax_8.S 125@@ -13,7 +13,7 @@ 126 127 #include "sync-ops.h" 128 129-#if __ARM_ARCH_PROFILE != 'M' 130+#if __ARM_FEATURE_LDREX & 8 131 #define umax_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, hi) 132 133 SYNC_OP_8(umax_8) 134diff --git a/lib/builtins/arm/sync_fetch_and_umin_8.S b/lib/builtins/arm/sync_fetch_and_umin_8.S 135index 8b40541ab47d..595444e6d053 100644 136--- a/lib/builtins/arm/sync_fetch_and_umin_8.S 137+++ b/lib/builtins/arm/sync_fetch_and_umin_8.S 138@@ -13,7 +13,7 @@ 139 140 #include "sync-ops.h" 141 142-#if __ARM_ARCH_PROFILE != 'M' 143+#if __ARM_FEATURE_LDREX & 8 144 #define umin_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, lo) 145 146 SYNC_OP_8(umin_8) 147diff --git a/lib/builtins/arm/sync_fetch_and_xor_8.S b/lib/builtins/arm/sync_fetch_and_xor_8.S 148index 7436eb1d4cae..9fc3d85cef75 100644 149--- a/lib/builtins/arm/sync_fetch_and_xor_8.S 150+++ b/lib/builtins/arm/sync_fetch_and_xor_8.S 151@@ -13,7 +13,7 @@ 152 153 #include "sync-ops.h" 154 155-#if __ARM_ARCH_PROFILE != 'M' 156+#if __ARM_FEATURE_LDREX & 8 157 #define xor_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI) \ 158 eor rD_LO, rN_LO, rM_LO ; \ 159 eor rD_HI, rN_HI, rM_HI 160-- 1612.38.1 162