G'day Kurt, On Wed, Nov 18, 2009 at 08:18:30AM -0500, Kurt Miller wrote: > Greg Lewis wrote: > > Anyway, I'm looking for alternatives before I breakdown and write > > any assembler. Any suggestions gratefully accepted. > > > > On OpenBSD we continue to use gcc 3.x on most archs since 4.x is > substantially slower on older and slower architectures (among other > reasons). In the cases where custom asm has been written to support > an arch I think we should use it and fall back to the gcc builtins > if gcc is being used. > > For example: > > > inline jint Atomic::add(jint add_value, volatile jint* dest) { > > -#ifdef ARM > > - return arm_add_and_fetch(dest, add_value); > > -#else > > -#ifdef M68K > > - return m68k_add_and_fetch(dest, add_value); > > -#else > > - return __sync_add_and_fetch(dest, add_value); > > -#endif // M68K > > -#endif // ARM > > + atomic_add_int((volatile u_int*) dest, add_value); > > + return *dest; > > } > > Would look something like: > > inline jint Atomic::add(jint add_value, volatile jint* dest) { > #if defined(ARM) > return arm_add_and_fetch(dest, add_value); > #elif defined(M68K) > return m68k_add_and_fetch(dest, add_value); > #elif defined(__GNUC__) > #if defined (__GNUC_MINOR__) && ((4 < __GNUC__) || (4 == __GNUC__ && 1 > <= __GNUC_MINOR__)) > return __sync_add_and_fetch(dest, add_value); > #else > atomic_add_int((volatile u_int*) dest, add_value); > #endif // GCC ver > #else > #error "No atomic add implementation" > #endif // GNUC > > Does that sound reasonable?
I'm ok with that. I'm just against us writing assembler for Zero without a good reason. BTW, is that GCC conditional correct? It looks like you want to use __sync_add_and_fetch if we're using <= gcc 4.1, but I didn't think it was added until after that. One other comment is IMHO that all those conditionals make the code harder to read, which was one of the reasons I was thinking of just using the atomic* functions. -- Greg Lewis Email : gle...@eyesbeyond.com Eyes Beyond Web : http://www.eyesbeyond.com Information Technology FreeBSD : gle...@freebsd.org