From d13f30e08fb35ccc5afdebad87851637733ade1e Mon Sep 17 00:00:00 2001 From: "H. Peter Anvin" Date: Tue, 13 Nov 2007 09:46:38 -0800 Subject: [PATCH] x86-host-specific performance improvement If we're on an x86 host, we can do unaligned littleendian memory references directly. Just do'em. --- nasmlib.c | 30 ++++++++++++++++++++++++++++++ nasmlib.h | 37 +++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+) diff --git a/nasmlib.c b/nasmlib.c index b89c711..dc55ce8 100644 --- a/nasmlib.c +++ b/nasmlib.c @@ -361,6 +361,34 @@ int32_t seg_alloc(void) return (next_seg += 2) - 2; } +#if X86_MEMORY + +void fwriteint16_t(int data, FILE * fp) +{ + uint16_t d = data; + fwrite(&d, 1, 2, fp); +} + +void fwriteint32_t(int32_t data, FILE * fp) +{ + uint32_t d = data; + fwrite(&d, 1, 4, fp); +} + +void fwriteint64_t(int64_t data, FILE * fp) +{ + uint64_t d = data; + fwrite(&d, 1, 8, fp); +} + +void fwriteaddr(int64_t data, int size, FILE * fp) +{ + uint64_t d = data; + fwrite(&d, 1, size, fp); +} + +#else /* !X86_MEMORY */ + void fwriteint16_t(int data, FILE * fp) { char buffer[2], *p = buffer; @@ -389,6 +417,8 @@ void fwriteaddr(int64_t data, int size, FILE * fp) fwrite(buffer, 1, size, fp); } +#endif + void standard_extension(char *inname, char *outname, char *extension, efunc error) { diff --git a/nasmlib.h b/nasmlib.h index 2e18f10..15f6984 100644 --- a/nasmlib.h +++ b/nasmlib.h @@ -178,6 +178,41 @@ void standard_extension(char *inname, char *outname, char *extension, * format in memory */ +#if X86_MEMORY + +#define WRITECHAR(p,v) \ + do { \ + *(uint8_t *)(p) = (v); \ + (p) += 1; \ + } while (0) + +#define WRITESHORT(p,v) \ + do { \ + *(uint16_t *)(p) = (v); \ + (p) += 2; \ + } while (0) + +#define WRITELONG(p,v) \ + do { \ + *(uint32_t *)(p) = (v); \ + (p) += 4; \ + } while (0) + +#define WRITEDLONG(p,v) \ + do { \ + *(uint64_t *)(p) = (v); \ + (p) += 8; \ + } while (0) + +#define WRITEADDR(p,v,s) \ + do { \ + uint64_t _v = (v); \ + memcpy((p), &_v, (s)); \ + (p) += (s); \ + } while (0) + +#else /* !X86_MEMORY */ + #define WRITECHAR(p,v) \ do { \ *(p)++ = (v) & 0xFF; \ @@ -219,6 +254,8 @@ void standard_extension(char *inname, char *outname, char *extension, } \ } while(0) +#endif + /* * and routines to do the same thing to a file */ -- 2.7.4