// 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