linux/arch/x86/lib/atomic64_386_32.S
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0-or-later */
   2/*
   3 * atomic64_t for 386/486
   4 *
   5 * Copyright © 2010  Luca Barbieri
   6 */
   7
   8#include <linux/linkage.h>
   9#include <asm/alternative.h>
  10
  11/* if you want SMP support, implement these with real spinlocks */
  12.macro LOCK reg
  13        pushfl
  14        cli
  15.endm
  16
  17.macro UNLOCK reg
  18        popfl
  19.endm
  20
  21#define BEGIN(op) \
  22.macro endp; \
  23SYM_FUNC_END(atomic64_##op##_386); \
  24.purgem endp; \
  25.endm; \
  26SYM_FUNC_START(atomic64_##op##_386); \
  27        LOCK v;
  28
  29#define ENDP endp
  30
  31#define RET \
  32        UNLOCK v; \
  33        ret
  34
  35#define RET_ENDP \
  36        RET; \
  37        ENDP
  38
  39#define v %ecx
  40BEGIN(read)
  41        movl  (v), %eax
  42        movl 4(v), %edx
  43RET_ENDP
  44#undef v
  45
  46#define v %esi
  47BEGIN(set)
  48        movl %ebx,  (v)
  49        movl %ecx, 4(v)
  50RET_ENDP
  51#undef v
  52
  53#define v  %esi
  54BEGIN(xchg)
  55        movl  (v), %eax
  56        movl 4(v), %edx
  57        movl %ebx,  (v)
  58        movl %ecx, 4(v)
  59RET_ENDP
  60#undef v
  61
  62#define v %ecx
  63BEGIN(add)
  64        addl %eax,  (v)
  65        adcl %edx, 4(v)
  66RET_ENDP
  67#undef v
  68
  69#define v %ecx
  70BEGIN(add_return)
  71        addl  (v), %eax
  72        adcl 4(v), %edx
  73        movl %eax,  (v)
  74        movl %edx, 4(v)
  75RET_ENDP
  76#undef v
  77
  78#define v %ecx
  79BEGIN(sub)
  80        subl %eax,  (v)
  81        sbbl %edx, 4(v)
  82RET_ENDP
  83#undef v
  84
  85#define v %ecx
  86BEGIN(sub_return)
  87        negl %edx
  88        negl %eax
  89        sbbl $0, %edx
  90        addl  (v), %eax
  91        adcl 4(v), %edx
  92        movl %eax,  (v)
  93        movl %edx, 4(v)
  94RET_ENDP
  95#undef v
  96
  97#define v %esi
  98BEGIN(inc)
  99        addl $1,  (v)
 100        adcl $0, 4(v)
 101RET_ENDP
 102#undef v
 103
 104#define v %esi
 105BEGIN(inc_return)
 106        movl  (v), %eax
 107        movl 4(v), %edx
 108        addl $1, %eax
 109        adcl $0, %edx
 110        movl %eax,  (v)
 111        movl %edx, 4(v)
 112RET_ENDP
 113#undef v
 114
 115#define v %esi
 116BEGIN(dec)
 117        subl $1,  (v)
 118        sbbl $0, 4(v)
 119RET_ENDP
 120#undef v
 121
 122#define v %esi
 123BEGIN(dec_return)
 124        movl  (v), %eax
 125        movl 4(v), %edx
 126        subl $1, %eax
 127        sbbl $0, %edx
 128        movl %eax,  (v)
 129        movl %edx, 4(v)
 130RET_ENDP
 131#undef v
 132
 133#define v %esi
 134BEGIN(add_unless)
 135        addl %eax, %ecx
 136        adcl %edx, %edi
 137        addl  (v), %eax
 138        adcl 4(v), %edx
 139        cmpl %eax, %ecx
 140        je 3f
 1411:
 142        movl %eax,  (v)
 143        movl %edx, 4(v)
 144        movl $1, %eax
 1452:
 146        RET
 1473:
 148        cmpl %edx, %edi
 149        jne 1b
 150        xorl %eax, %eax
 151        jmp 2b
 152ENDP
 153#undef v
 154
 155#define v %esi
 156BEGIN(inc_not_zero)
 157        movl  (v), %eax
 158        movl 4(v), %edx
 159        testl %eax, %eax
 160        je 3f
 1611:
 162        addl $1, %eax
 163        adcl $0, %edx
 164        movl %eax,  (v)
 165        movl %edx, 4(v)
 166        movl $1, %eax
 1672:
 168        RET
 1693:
 170        testl %edx, %edx
 171        jne 1b
 172        jmp 2b
 173ENDP
 174#undef v
 175
 176#define v %esi
 177BEGIN(dec_if_positive)
 178        movl  (v), %eax
 179        movl 4(v), %edx
 180        subl $1, %eax
 181        sbbl $0, %edx
 182        js 1f
 183        movl %eax,  (v)
 184        movl %edx, 4(v)
 1851:
 186RET_ENDP
 187#undef v
 188