70 lines
1.1 KiB
C
70 lines
1.1 KiB
C
// This is NEW CODE to implement the sync operations supported by other C compilers
|
|
|
|
#include "sync.h"
|
|
|
|
#ifdef _ZCC
|
|
|
|
void __naked __sync_synchronize() __asm {
|
|
//fence
|
|
fence rw,rw
|
|
ret
|
|
}
|
|
unsigned int __naked __sync_lock_test_and_set(unsigned int* p, unsigned int v) __asm {
|
|
amoswap.w.aq a1, a1, (a0)
|
|
mv a0, a1
|
|
ret
|
|
// a5 = 1
|
|
// s1 = &lk->locked
|
|
// amoswap.w.aq a5, a5, (s1)
|
|
//uint old = *p;
|
|
// *p = v;
|
|
//return old;
|
|
}
|
|
void __naked __sync_lock_release(unsigned int* p) __asm {
|
|
amoswap.w zero, zero, (a0)
|
|
ret
|
|
// *p = 0;
|
|
}
|
|
/*
|
|
void __naked __sync_synchronize() __asm {
|
|
addi sp,sp,-16
|
|
sd s0,8(sp)
|
|
addi s0,sp,16
|
|
fence rw,rw
|
|
nop
|
|
ld s0,8(sp)
|
|
addi sp,sp,16
|
|
jr ra
|
|
}
|
|
uint __naked __sync_lock_test_and_set(uint*p, uint v) __asm {
|
|
addi sp,sp,-32
|
|
sd s0,24(sp)
|
|
addi s0,sp,32
|
|
sd a0,-24(s0)
|
|
mv a5,a1
|
|
sw a5,-28(s0)
|
|
ld a5,-24(s0)
|
|
lw a4,-28(s0)
|
|
amoswap.w.aq a4,a4,0(a5)
|
|
sext.w a5,a4
|
|
mv a0,a5
|
|
ld s0,24(sp)
|
|
addi sp,sp,32
|
|
jr ra
|
|
}
|
|
void __naked __sync_lock_release(uint* p) __asm {
|
|
addi sp,sp,-32
|
|
sd s0,24(sp)
|
|
addi s0,sp,32
|
|
sd a0,-24(s0)
|
|
ld a5,-24(s0)
|
|
fence rw,w
|
|
sw zero,0(a5)
|
|
nop
|
|
ld s0,24(sp)
|
|
addi sp,sp,32
|
|
jr ra
|
|
}
|
|
*/
|
|
#endif
|