diff options
Diffstat (limited to 'contrib/llvm-project/compiler-rt/lib/builtins/arm/sync-ops.h')
| -rw-r--r-- | contrib/llvm-project/compiler-rt/lib/builtins/arm/sync-ops.h | 61 | 
1 files changed, 61 insertions, 0 deletions
diff --git a/contrib/llvm-project/compiler-rt/lib/builtins/arm/sync-ops.h b/contrib/llvm-project/compiler-rt/lib/builtins/arm/sync-ops.h new file mode 100644 index 000000000000..c9623249e5d2 --- /dev/null +++ b/contrib/llvm-project/compiler-rt/lib/builtins/arm/sync-ops.h @@ -0,0 +1,61 @@ +//===-- sync-ops.h - --===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements outline macros for the __sync_fetch_and_* +// operations. Different instantiations will generate appropriate assembly for +// ARM and Thumb-2 versions of the functions. +// +//===----------------------------------------------------------------------===// + +#include "../assembly.h" + +#define SYNC_OP_4(op)                                                          \ +  .p2align 2;                                                                  \ +  .thumb;                                                                      \ +  .syntax unified;                                                             \ +  DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op)                      \ +  dmb;                                                                         \ +  mov r12, r0;                                                                 \ +  LOCAL_LABEL(tryatomic_##op) : ldrex r0, [r12];                               \ +  op(r2, r0, r1);                                                              \ +  strex r3, r2, [r12];                                                         \ +  cmp r3, #0;                                                                  \ +  bne LOCAL_LABEL(tryatomic_##op);                                             \ +  dmb;                                                                         \ +  bx lr + +#define SYNC_OP_8(op)                                                          \ +  .p2align 2;                                                                  \ +  .thumb;                                                                      \ +  .syntax unified;                                                             \ +  DEFINE_COMPILERRT_THUMB_FUNCTION(__sync_fetch_and_##op)                      \ +  push {r4, r5, r6, lr};                                                       \ +  dmb;                                                                         \ +  mov r12, r0;                                                                 \ +  LOCAL_LABEL(tryatomic_##op) : ldrexd r0, r1, [r12];                          \ +  op(r4, r5, r0, r1, r2, r3);                                                  \ +  strexd r6, r4, r5, [r12];                                                    \ +  cmp r6, #0;                                                                  \ +  bne LOCAL_LABEL(tryatomic_##op);                                             \ +  dmb;                                                                         \ +  pop { r4, r5, r6, pc } + +#define MINMAX_4(rD, rN, rM, cmp_kind)                                         \ +  cmp rN, rM;                                                                  \ +  mov rD, rM;                                                                  \ +  it cmp_kind;                                                                 \ +  mov##cmp_kind rD, rN + +#define MINMAX_8(rD_LO, rD_HI, rN_LO, rN_HI, rM_LO, rM_HI, cmp_kind)           \ +  cmp rN_LO, rM_LO;                                                            \ +  sbcs rN_HI, rM_HI;                                                           \ +  mov rD_LO, rM_LO;                                                            \ +  mov rD_HI, rM_HI;                                                            \ +  itt cmp_kind;                                                                \ +  mov##cmp_kind rD_LO, rN_LO;                                                  \ +  mov##cmp_kind rD_HI, rN_HI  | 
