From 85f3e9f5cbde6e22965816a0d2328e208bc553f9 Mon Sep 17 00:00:00 2001 From: Matthew Flatt Date: Thu, 20 Aug 2020 07:34:56 -0600 Subject: [PATCH] arm32: using ARMv6 memory fence --- racket/src/ChezScheme/c/version.h | 6 +++++- racket/src/ChezScheme/s/arm32.def | 2 ++ racket/src/ChezScheme/s/arm32.ss | 14 +++++++++----- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/racket/src/ChezScheme/c/version.h b/racket/src/ChezScheme/c/version.h index 45fe7444d6..c9bdf2fd5d 100644 --- a/racket/src/ChezScheme/c/version.h +++ b/racket/src/ChezScheme/c/version.h @@ -470,7 +470,11 @@ typedef char tputsputcchar; #define USE_DEV_URANDOM_UUID #if defined(__arm64__) || defined(__arm32__) -# define STORE_FENCE() __asm__ __volatile__ ("dmb ishst" : : : "memory") +# if arm_isa_version == 6 +# define STORE_FENCE() __asm__ __volatile__ ("mcr p15, 0, %0, c7, c10, 5" : : "r" (0) : "memory") +# else +# define STORE_FENCE() __asm__ __volatile__ ("dmb ishst" : : : "memory") +# endif #elif defined(__powerpc64__) # define STORE_FENCE() __asm__ __volatile__ ("lwsync" : : : "memory") #elif defined(__powerpc__) || defined(__POWERPC__) diff --git a/racket/src/ChezScheme/s/arm32.def b/racket/src/ChezScheme/s/arm32.def index 842477885c..1d757713b9 100644 --- a/racket/src/ChezScheme/s/arm32.def +++ b/racket/src/ChezScheme/s/arm32.def @@ -12,3 +12,5 @@ (define-constant unaligned-floats #f) (define-constant unaligned-integers #t) + +(define-constant arm-isa-version 6) diff --git a/racket/src/ChezScheme/s/arm32.ss b/racket/src/ChezScheme/s/arm32.ss index a24d417268..c7ec4bf61c 100644 --- a/racket/src/ChezScheme/s/arm32.ss +++ b/racket/src/ChezScheme/s/arm32.ss @@ -2009,11 +2009,15 @@ (define-who asm-fence (lambda (kind) (lambda (code*) - (case kind - [(store-store) (emit dmbishst code*)] - [(acquire) (emit dmbish code*)] - [(release) (emit dmbish code*)] - [else (sorry! who "unexpected kind ~s" kind)])))) + (constant-case arm-isa-version + [(6) + (emit mcr 'al #b1111 #b000 `(reg . ,%r0) #b0111 #b1010 #b101 code*)] + [(7) + (case kind + [(store-store) (emit dmbishst code*)] + [(acquire) (emit dmbish code*)] + [(release) (emit dmbish code*)] + [else (sorry! who "unexpected kind ~s" kind)])])))) (define asm-fp-relop (lambda (info)