diff --git a/uppsrc/Core/Ops.h b/uppsrc/Core/Ops.h index 9337be2e7..ad035f446 100644 --- a/uppsrc/Core/Ops.h +++ b/uppsrc/Core/Ops.h @@ -1,4 +1,4 @@ -#if defined(CPU_UNALIGNED) && defined(CPU_LE) || __ARM_ARCH_7A__ +#if defined(CPU_UNALIGNED) && defined(CPU_LE) NOUBSAN inline int Peek16le(const void *ptr) { return *(const word *)ptr; } NOUBSAN inline int Peek32le(const void *ptr) { return *(const dword *)ptr; } NOUBSAN inline int64 Peek64le(const void *ptr) { return *(const int64 *)ptr; } @@ -32,6 +32,7 @@ inline void Poke64be(const void *ptr, int64 val) { Poke32be(ptr, HIDWORD(val) inline int Peek16(const void *ptr) { return Peek16le(ptr); } inline int Peek32(const void *ptr) { return Peek32le(ptr); } inline int64 Peek64(const void *ptr) { return Peek64le(ptr); } + inline void Poke16(const void *ptr, int val) { Poke16le(ptr, val); } inline void Poke32(const void *ptr, int val) { Poke32le(ptr, val); } inline void Poke64(const void *ptr, int64 val) { Poke64le(ptr, val); } @@ -44,13 +45,14 @@ inline void Poke64(const void *ptr, int64 val) { Poke64le(ptr, val); } inline int Peek16(const void *ptr) { return Peek16be(ptr); } inline int Peek32(const void *ptr) { return Peek32be(ptr); } inline int64 Peek64(const void *ptr) { return Peek64be(ptr); } + inline void Poke16(const void *ptr, int val) { Poke16be(ptr, val); } inline void Poke32(const void *ptr, int val) { Poke32be(ptr, val); } inline void Poke64(const void *ptr, int64 val) { Poke64be(ptr, val); } #endif -#if defined(CPU_X86) && (defined(COMPILER_GCC) || defined(COMPILER_MSC)) +#if defined(CPU_X86) && defined(COMPILER_MSC) #ifdef COMPILER_GCC #ifdef CPU_64 inline word SwapEndian16(word v) { __asm__("xchgb %b0,%h0" : "=Q" (v) : "0" (v)); return v; } @@ -120,6 +122,9 @@ inline int64 SwapEndian64(int64 v) { return _byteswap_uint64(v); } inline void EndianSwap(int64& v) { v = SwapEndian64(v); } inline void EndianSwap(uint64& v) { v = SwapEndian64(v); } +inline word SwapEndian16(int w) { return SwapEndian16((word)w); } +inline word SwapEndian16(dword w) { return SwapEndian16((word)w); } + #else #ifdef COMPILER_GCC diff --git a/uppsrc/Core/Stream.cpp b/uppsrc/Core/Stream.cpp index 5a43d2e4d..d7fcb0e2b 100644 --- a/uppsrc/Core/Stream.cpp +++ b/uppsrc/Core/Stream.cpp @@ -221,84 +221,6 @@ int64 Stream::_Get64() { return GetAll(&l, 8) ? l : -1; } -#ifdef CPU_LE -int Stream::Get16be() { - byte h[2]; - int q; - h[1] = Get(); - h[0] = q = Get(); - if(q < 0) { - LoadError(); - return -1; - } - return *(word *)h; -} - -int Stream::Get32be() { - byte h[4]; - int q; - h[3] = Get(); - h[2] = Get(); - h[1] = Get(); - h[0] = q = Get(); - if(q < 0) { - LoadError(); - return -1; - } - return *(int32 *)h; -} - -int64 Stream::Get64be() { - byte h[8]; - int q; - h[7] = Get(); - h[6] = Get(); - h[5] = Get(); - h[4] = Get(); - h[3] = Get(); - h[2] = Get(); - h[1] = Get(); - h[0] = q = Get(); - if(q < 0) { - LoadError(); - return -1; - } - return *(int64 *)h; -} -#else -int Stream::Get16le() { - byte h[2]; - int q; - h[0] = Get(); - h[1] = q = Get(); - return q < 0 ? -1 : *(word *)h; -} - -int Stream::Get32le() { - byte h[4]; - int q; - h[0] = Get(); - h[1] = Get(); - h[2] = Get(); - h[3] = q = Get(); - return q < 0 ? -1 : *(int32 *)h; -} - -int64 Stream::Get64le() { - byte h[8]; - int q; - h[0] = Get(); - h[1] = Get(); - h[2] = Get(); - h[3] = Get(); - h[4] = Get(); - h[5] = Get(); - h[6] = Get(); - h[7] = q = Get(); - return q < 0 ? -1 : *(int64 *)h; -} -#endif - int Stream::GetUtf8() { int code = Get(); @@ -407,60 +329,6 @@ String Stream::GetLine() { return result; } -#ifdef CPU_LE -void Stream::Put16be(word q) { - byte *h = (byte *) &q; - Put(h[1]); - Put(h[0]); -} - -void Stream::Put32be(dword q) { - byte *h = (byte *) &q; - Put(h[3]); - Put(h[2]); - Put(h[1]); - Put(h[0]); -} - -void Stream::Put64be(int64 q) { - byte *h = (byte *) &q; - Put(h[7]); - Put(h[6]); - Put(h[5]); - Put(h[4]); - Put(h[3]); - Put(h[2]); - Put(h[1]); - Put(h[0]); -} -#else -void Stream::Put16le(word q) { - byte *h = (byte *) &q; - Put(h[0]); - Put(h[1]); -} - -void Stream::Put32le(dword q) { - byte *h = (byte *) &q; - Put(h[0]); - Put(h[1]); - Put(h[2]); - Put(h[3]); -} - -void Stream::Put64le(int64 q) { - byte *h = (byte *) &q; - Put(h[0]); - Put(h[1]); - Put(h[2]); - Put(h[3]); - Put(h[4]); - Put(h[5]); - Put(h[6]); - Put(h[7]); -} -#endif - void Stream::PutUtf8(int c) { word code = c; diff --git a/uppsrc/Core/Stream.h b/uppsrc/Core/Stream.h index 76e3f65cc..05bb524ad 100644 --- a/uppsrc/Core/Stream.h +++ b/uppsrc/Core/Stream.h @@ -113,60 +113,46 @@ public: bool GetAll(Huge& h, size_t size); int Get8() { return ptr < rdlim ? *ptr++ : _Get8(); } -#if defined(CPU_UNALIGNED) && defined(CPU_LE) - NOUBSAN int Get16() { if(ptr + 1 >= rdlim) return _Get16(); int q = *(word *)ptr; ptr += 2; return q; } - NOUBSAN int Get32() { if(ptr + 3 >= rdlim) return _Get32(); int q = *(dword *)ptr; ptr += 4; return q; } - NOUBSAN int64 Get64() { if(ptr + 7 >= rdlim) return _Get64(); int64 q = *(int64 *)ptr; ptr += 8; return q; } -#else - int Get16() { return _Get16(); } - int Get32() { return _Get32(); } - int64 Get64() { return _Get64(); } -#endif - -#ifdef CPU_LE - int Get16le() { return Get16(); } - int Get32le() { return Get32(); } - int64 Get64le() { return Get64(); } - int Get16be(); - int Get32be(); - int64 Get64be(); -#else - int Get16le(); - int Get32le(); - int64 Get64le(); - int Get16be() { return Get16(); } - int Get32be() { return Get32(); } - int64 Get64be() { return Get64(); } -#endif + int Get16() { if(ptr + 1 >= rdlim) return _Get16(); int q = Peek16(ptr); ptr += 2; return q; } + int Get32() { if(ptr + 3 >= rdlim) return _Get32(); int q = Peek32(ptr); ptr += 4; return q; } + int64 Get64() { if(ptr + 7 >= rdlim) return _Get64(); int64 q = Peek64(ptr); ptr += 8; return q; } int GetUtf8(); String GetLine(); -#if defined(CPU_UNALIGNED) && defined(CPU_LE) - NOUBSAN void Put16(word q) { if(ptr + 1 < wrlim) { *(word *)ptr = q; ptr += 2; } else Put(&q, 2); } - NOUBSAN void Put32(dword q) { if(ptr + 3 < wrlim) { *(dword *)ptr = q; ptr += 4; } else Put(&q, 4); } - NOUBSAN void Put64(int64 q) { if(ptr + 7 < wrlim) { *(int64 *)ptr = q; ptr += 8; } else Put(&q, 8); } -#else - void Put16(word q) { Put(&q, 2); } - void Put32(dword q) { Put(&q, 4); } - void Put64(int64 q) { Put(&q, 8); } -#endif + void Put16(word q) { if(ptr + 1 < wrlim) { Poke16(ptr, q); ptr += 2; } else Put(&q, 2); } + void Put32(dword q) { if(ptr + 3 < wrlim) { Poke32(ptr, q); ptr += 4; } else Put(&q, 4); } + void Put64(int64 q) { if(ptr + 7 < wrlim) { Poke64(ptr, q); ptr += 8; } else Put(&q, 8); } #ifdef CPU_LE - void Put16le(word q) { Put(&q, 2); } - void Put32le(dword q) { Put(&q, 4); } - void Put64le(int64 q) { Put(&q, 8); } - void Put16be(word q); - void Put32be(dword q); - void Put64be(int64 q); + int Get16le() { return Get16(); } + int Get32le() { return Get32(); } + int64 Get64le() { return Get64(); } + int Get16be() { return SwapEndian16(Get16()); } + int Get32be() { return SwapEndian32(Get32()); } + int64 Get64be() { return SwapEndian64(Get64()); } + + void Put16le(word q) { Put16(q); } + void Put32le(dword q) { Put32(q); } + void Put64le(int64 q) { Put64(q); } + void Put16be(word q) { Put16(SwapEndian16(q)); } + void Put32be(dword q) { Put32(SwapEndian32(q)); } + void Put64be(int64 q) { Put64(SwapEndian64(q)); } #else - void Put16le(word q); - void Put32le(dword q); - void Put64le(int64 q); - void Put16be(word q) { Put(&q, 2); } - void Put32be(dword q) { Put(&q, 4); } - void Put64be(int64 q) { Put(&q, 8); } + int Get16le() { return SwapEndian16(Get16()); } + int Get32le() { return SwapEndian32(Get32()); } + int64 Get64le() { return SwapEndian64(Get64()); } + int Get16be() { return Get16(); } + int Get32be() { return Get32(); } + int64 Get64be() { return Get64(); } + + void Put16le(word q) { Put16(SwapEndian16(q)); } + void Put32le(dword q) { Put32(SwapEndian32(q)); } + void Put64le(int64 q) { Put64(SwapEndian64(q)); } + void Put16be(word q) { Put16(q); } + void Put32be(dword q) { Put32(q); } + void Put64be(int64 q) { Put64(q); } #endif void PutUtf8(int c);