1a7e926abSLuca Barbieri/* 2a7e926abSLuca Barbieri * atomic64_t for 386/486 3a7e926abSLuca Barbieri * 4a7e926abSLuca Barbieri * Copyright © 2010 Luca Barbieri 5a7e926abSLuca Barbieri * 6a7e926abSLuca Barbieri * This program is free software; you can redistribute it and/or modify 7a7e926abSLuca Barbieri * it under the terms of the GNU General Public License as published by 8a7e926abSLuca Barbieri * the Free Software Foundation; either version 2 of the License, or 9a7e926abSLuca Barbieri * (at your option) any later version. 10a7e926abSLuca Barbieri */ 11a7e926abSLuca Barbieri 12a7e926abSLuca Barbieri#include <linux/linkage.h> 13a7e926abSLuca Barbieri#include <asm/alternative-asm.h> 14a7e926abSLuca Barbieri#include <asm/dwarf2.h> 15a7e926abSLuca Barbieri 16a7e926abSLuca Barbieri/* if you want SMP support, implement these with real spinlocks */ 17a7e926abSLuca Barbieri.macro LOCK reg 18a7e926abSLuca Barbieri pushfl 19a7e926abSLuca Barbieri CFI_ADJUST_CFA_OFFSET 4 20a7e926abSLuca Barbieri cli 21a7e926abSLuca Barbieri.endm 22a7e926abSLuca Barbieri 23a7e926abSLuca Barbieri.macro UNLOCK reg 24a7e926abSLuca Barbieri popfl 25a7e926abSLuca Barbieri CFI_ADJUST_CFA_OFFSET -4 26a7e926abSLuca Barbieri.endm 27a7e926abSLuca Barbieri 28a7e926abSLuca Barbieri.macro BEGIN func reg 29a7e926abSLuca Barbieri$v = \reg 30a7e926abSLuca Barbieri 31a7e926abSLuca BarbieriENTRY(atomic64_\func\()_386) 32a7e926abSLuca Barbieri CFI_STARTPROC 33a7e926abSLuca Barbieri LOCK $v 34a7e926abSLuca Barbieri 35a7e926abSLuca Barbieri.macro RETURN 36a7e926abSLuca Barbieri UNLOCK $v 37a7e926abSLuca Barbieri ret 38a7e926abSLuca Barbieri.endm 39a7e926abSLuca Barbieri 40a7e926abSLuca Barbieri.macro END_ 41a7e926abSLuca Barbieri CFI_ENDPROC 42a7e926abSLuca BarbieriENDPROC(atomic64_\func\()_386) 43a7e926abSLuca Barbieri.purgem RETURN 44a7e926abSLuca Barbieri.purgem END_ 45a7e926abSLuca Barbieri.purgem END 46a7e926abSLuca Barbieri.endm 47a7e926abSLuca Barbieri 48a7e926abSLuca Barbieri.macro END 49a7e926abSLuca BarbieriRETURN 50a7e926abSLuca BarbieriEND_ 51a7e926abSLuca Barbieri.endm 52a7e926abSLuca Barbieri.endm 53a7e926abSLuca Barbieri 54a7e926abSLuca BarbieriBEGIN read %ecx 55a7e926abSLuca Barbieri movl ($v), %eax 56a7e926abSLuca Barbieri movl 4($v), %edx 57a7e926abSLuca BarbieriEND 58a7e926abSLuca Barbieri 59a7e926abSLuca BarbieriBEGIN set %esi 60a7e926abSLuca Barbieri movl %ebx, ($v) 61a7e926abSLuca Barbieri movl %ecx, 4($v) 62a7e926abSLuca BarbieriEND 63a7e926abSLuca Barbieri 64a7e926abSLuca BarbieriBEGIN xchg %esi 65a7e926abSLuca Barbieri movl ($v), %eax 66a7e926abSLuca Barbieri movl 4($v), %edx 67a7e926abSLuca Barbieri movl %ebx, ($v) 68a7e926abSLuca Barbieri movl %ecx, 4($v) 69a7e926abSLuca BarbieriEND 70a7e926abSLuca Barbieri 71a7e926abSLuca BarbieriBEGIN add %ecx 72a7e926abSLuca Barbieri addl %eax, ($v) 73a7e926abSLuca Barbieri adcl %edx, 4($v) 74a7e926abSLuca BarbieriEND 75a7e926abSLuca Barbieri 76a7e926abSLuca BarbieriBEGIN add_return %ecx 77a7e926abSLuca Barbieri addl ($v), %eax 78a7e926abSLuca Barbieri adcl 4($v), %edx 79a7e926abSLuca Barbieri movl %eax, ($v) 80a7e926abSLuca Barbieri movl %edx, 4($v) 81a7e926abSLuca BarbieriEND 82a7e926abSLuca Barbieri 83a7e926abSLuca BarbieriBEGIN sub %ecx 84a7e926abSLuca Barbieri subl %eax, ($v) 85a7e926abSLuca Barbieri sbbl %edx, 4($v) 86a7e926abSLuca BarbieriEND 87a7e926abSLuca Barbieri 88a7e926abSLuca BarbieriBEGIN sub_return %ecx 89a7e926abSLuca Barbieri negl %edx 90a7e926abSLuca Barbieri negl %eax 91a7e926abSLuca Barbieri sbbl $0, %edx 92a7e926abSLuca Barbieri addl ($v), %eax 93a7e926abSLuca Barbieri adcl 4($v), %edx 94a7e926abSLuca Barbieri movl %eax, ($v) 95a7e926abSLuca Barbieri movl %edx, 4($v) 96a7e926abSLuca BarbieriEND 97a7e926abSLuca Barbieri 98a7e926abSLuca BarbieriBEGIN inc %esi 99a7e926abSLuca Barbieri addl $1, ($v) 100a7e926abSLuca Barbieri adcl $0, 4($v) 101a7e926abSLuca BarbieriEND 102a7e926abSLuca Barbieri 103a7e926abSLuca BarbieriBEGIN inc_return %esi 104a7e926abSLuca Barbieri movl ($v), %eax 105a7e926abSLuca Barbieri movl 4($v), %edx 106a7e926abSLuca Barbieri addl $1, %eax 107a7e926abSLuca Barbieri adcl $0, %edx 108a7e926abSLuca Barbieri movl %eax, ($v) 109a7e926abSLuca Barbieri movl %edx, 4($v) 110a7e926abSLuca BarbieriEND 111a7e926abSLuca Barbieri 112a7e926abSLuca BarbieriBEGIN dec %esi 113a7e926abSLuca Barbieri subl $1, ($v) 114a7e926abSLuca Barbieri sbbl $0, 4($v) 115a7e926abSLuca BarbieriEND 116a7e926abSLuca Barbieri 117a7e926abSLuca BarbieriBEGIN dec_return %esi 118a7e926abSLuca Barbieri movl ($v), %eax 119a7e926abSLuca Barbieri movl 4($v), %edx 120a7e926abSLuca Barbieri subl $1, %eax 121a7e926abSLuca Barbieri sbbl $0, %edx 122a7e926abSLuca Barbieri movl %eax, ($v) 123a7e926abSLuca Barbieri movl %edx, 4($v) 124a7e926abSLuca BarbieriEND 125a7e926abSLuca Barbieri 126a7e926abSLuca BarbieriBEGIN add_unless %ecx 127a7e926abSLuca Barbieri addl %eax, %esi 128a7e926abSLuca Barbieri adcl %edx, %edi 129a7e926abSLuca Barbieri addl ($v), %eax 130a7e926abSLuca Barbieri adcl 4($v), %edx 131a7e926abSLuca Barbieri cmpl %eax, %esi 132a7e926abSLuca Barbieri je 3f 133a7e926abSLuca Barbieri1: 134a7e926abSLuca Barbieri movl %eax, ($v) 135a7e926abSLuca Barbieri movl %edx, 4($v) 136*6e6104feSLuca Barbieri movl $1, %eax 137a7e926abSLuca Barbieri2: 138a7e926abSLuca BarbieriRETURN 139a7e926abSLuca Barbieri3: 140a7e926abSLuca Barbieri cmpl %edx, %edi 141a7e926abSLuca Barbieri jne 1b 142*6e6104feSLuca Barbieri xorl %eax, %eax 143a7e926abSLuca Barbieri jmp 2b 144a7e926abSLuca BarbieriEND_ 145a7e926abSLuca Barbieri 146a7e926abSLuca BarbieriBEGIN inc_not_zero %esi 147a7e926abSLuca Barbieri movl ($v), %eax 148a7e926abSLuca Barbieri movl 4($v), %edx 149a7e926abSLuca Barbieri testl %eax, %eax 150a7e926abSLuca Barbieri je 3f 151a7e926abSLuca Barbieri1: 152a7e926abSLuca Barbieri addl $1, %eax 153a7e926abSLuca Barbieri adcl $0, %edx 154a7e926abSLuca Barbieri movl %eax, ($v) 155a7e926abSLuca Barbieri movl %edx, 4($v) 156a7e926abSLuca Barbieri xorl %eax, %eax 157a7e926abSLuca Barbieri2: 158a7e926abSLuca BarbieriRETURN 159a7e926abSLuca Barbieri3: 160a7e926abSLuca Barbieri testl %edx, %edx 161a7e926abSLuca Barbieri jne 1b 162a7e926abSLuca Barbieri movl $1, %eax 163a7e926abSLuca Barbieri jmp 2b 164a7e926abSLuca BarbieriEND_ 165a7e926abSLuca Barbieri 166a7e926abSLuca BarbieriBEGIN dec_if_positive %esi 167a7e926abSLuca Barbieri movl ($v), %eax 168a7e926abSLuca Barbieri movl 4($v), %edx 169a7e926abSLuca Barbieri subl $1, %eax 170a7e926abSLuca Barbieri sbbl $0, %edx 171a7e926abSLuca Barbieri js 1f 172a7e926abSLuca Barbieri movl %eax, ($v) 173a7e926abSLuca Barbieri movl %edx, 4($v) 174a7e926abSLuca Barbieri1: 175a7e926abSLuca BarbieriEND 176