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