c - Compatibility of inline assembly - \n\t versus ; -
what correct way write inline assembly (except avoid it)? better use ; or \n\t?
(except microsoft compiler __asm)
there not "correct" way multi-line assembly vs inline. whatever readable.
exemple : gmp use differents asm code style same bswap function
/* bswap available on i486 , , fast. combination rorw $8 / roll $16 / rorw $8 used in glibc plain i386 (and in linux kernel xchgb instead of rorw), not done here, because i386 means generic x86 , mixing word , dword operations cause partial register stalls on p6 chips. */ #if defined (__gnuc__) && ! defined (no_asm) \ && have_host_cpu_family_x86 && ! have_host_cpu_i386 \ && gmp_limb_bits == 32 #define bswap_limb(dst, src) \ { \ __asm__ ("bswap %0" : "=r" (dst) : "0" (src)); \ } while (0) #endif #if defined (__gnuc__) && ! defined (no_asm) \ && defined (__amd64__) && gmp_limb_bits == 64 #define bswap_limb(dst, src) \ { \ __asm__ ("bswap %q0" : "=r" (dst) : "0" (src)); \ } while (0) #endif #if defined (__gnuc__) && ! defined (__intel_compiler) \ && ! defined (no_asm) && defined (__ia64) && gmp_limb_bits == 64 #define bswap_limb(dst, src) \ { \ __asm__ ("mux1 %0 = %1, @rev" : "=r" (dst) : "r" (src)); \ } while (0) #endif /* per glibc. */ #if defined (__gnuc__) && ! defined (no_asm) \ && have_host_cpu_family_m68k && gmp_limb_bits == 32 #define bswap_limb(dst, src) \ { \ mp_limb_t __bswapl_src = (src); \ __asm__ ("ror%.w %#8, %0\n\t" \ "swap %0\n\t" \ "ror%.w %#8, %0" \ : "=d" (dst) \ : "0" (__bswapl_src)); \ } while (0) #endif
Comments
Post a Comment