#include <asm_defs.h>
.text
FUNCTION(atomic_add):
move.l (4,%a7),%a0
move.l (%a0),%d0
miss1: move.l %d0,%d1
add.l (8,%a7),%d1
cas.l %d0,%d1,(%a0)
bne miss1
rts
FUNCTION_END(atomic_add)
FUNCTION(atomic_and):
move.l (4,%a7),%a0
move.l (%a0),%d0
miss2: move.l %d0,%d1
and.l (8,%a7),%d1
cas.l %d0,%d1,(%a0)
bne miss2
rts
FUNCTION_END(atomic_and)
FUNCTION(atomic_or):
move.l (4,%a7),%a0
move.l (%a0),%d0
miss3: move.l %d0,%d1
or.l (8,%a7),%d1
cas.l %d0,%d1,(%a0)
bne miss3
rts
FUNCTION_END(atomic_or)
FUNCTION(atomic_set):
move.l (4,%a7),%a0
move.l (%a0),%d0
move.l (8,%a7),%d1
miss4: cas.l %d0,%d1,(%a0)
bne miss4
rts
FUNCTION_END(atomic_set)
FUNCTION(atomic_test_and_set):
move.l (4,%a7),%a0
move.l (8,%a7),%d1
move.l (12,%a7),%d0
cas.l %d0,%d1,(%a0)
rts
FUNCTION_END(atomic_test_and_set)
FUNCTION(atomic_get):
move.l (4,%a7),%a0
move.l (%a0),%d0
move.l %d0,%d1
cas.l %d0,%d1,(%a0)
rts
FUNCTION_END(atomic_get)
#warning M68K: 68060 doesn't have CAS2: use spinlock ??
FUNCTION(atomic_add64):
movem.l %d2-%d3/%a2,-(%a7)
move.l (4,%a7),%a2
lea.l (4,%a2),%a1
move.l (12,%a7),%d3
move.l (8,%a7),%d2
miss5:
move.l (%a1),%d1
move.l (%a2),%d0
add.l %d1,%d3
addx.l %d0,%d2
cas2.l %d0:%d1,%d2:%d3,(%a2):(%a1)
bne miss5
movem.l (%a7)+,%d2-%d3/%a2
rts
FUNCTION_END(atomic_add64)
FUNCTION(atomic_and64):
movem.l %d2-%d3/%a2,-(%a7)
move.l (4,%a7),%a2
lea.l (4,%a2),%a1
move.l (12,%a7),%d3
move.l (8,%a7),%d2
miss6:
move.l (%a1),%d1
move.l (%a2),%d0
and.l %d1,%d3
and.l %d0,%d2
cas2.l %d0:%d1,%d2:%d3,(%a2):(%a1)
bne miss6
movem.l (%a7)+,%d2-%d3/%a2
rts
FUNCTION_END(atomic_and64)
FUNCTION(atomic_or64):
movem.l %d2-%d3/%a2,-(%a7)
move.l (4,%a7),%a2
lea.l (4,%a2),%a1
move.l (12,%a7),%d3
move.l (8,%a7),%d2
miss7:
move.l (%a1),%d1
move.l (%a2),%d0
or.l %d1,%d3
or.l %d0,%d2
cas2.l %d0:%d1,%d2:%d3,(%a2):(%a1)
bne miss7
movem.l (%a7)+,%d2-%d3/%a2
rts
FUNCTION_END(atomic_or64)
FUNCTION(atomic_set64):
movem.l %d2-%d3/%a2,-(%a7)
move.l (4,%a7),%a2
lea.l (4,%a2),%a1
move.l (12,%a7),%d3
move.l (8,%a7),%d2
move.l (%a1),%d1
move.l (%a2),%d0
miss8: cas2.l %d0:%d1,%d2:%d3,(%a2):(%a1)
bne miss8
movem.l (%a7)+,%d2-%d3/%a2
rts
FUNCTION_END(atomic_set64)
FUNCTION(atomic_test_and_set64):
movem.l %d2-%d3/%a2,-(%a7)
move.l (4,%a7),%a2
lea.l (4,%a2),%a1
move.l (12,%a7),%d3
move.l (8,%a7),%d2
move.l (20,%a7),%d1
move.l (16,%a7),%d0
cas2.l %d0:%d1,%d2:%d3,(%a2):(%a1)
movem.l (%a7)+,%d2-%d3/%a2
rts
FUNCTION_END(atomic_test_and_set64)
FUNCTION(atomic_get64):
movem.l %d2-%d3/%a2,-(%a7)
move.l (4,%a7),%a2
lea.l (4,%a2),%a1
move.l (%a1),%d1
move.l (%a2),%d0
move.l %d1,%d3
move.l %d0,%d2
cas2.l %d0:%d1,%d2:%d3,(%a2):(%a1)
movem.l (%a7)+,%d2-%d3/%a2
rts
FUNCTION_END(atomic_get64)
.text
#warning IMPLEMENT GCC 64-bit ATOMICS ON m68k!
FUNCTION(__atomic_fetch_add_8):
nop
rts
FUNCTION_END(__atomic_fetch_add_8)
FUNCTION(__atomic_store_8):
nop
rts
FUNCTION_END(__atomic_store_8)
FUNCTION(__atomic_load_8):
nop
rts
FUNCTION_END(__atomic_load_8)