mirror of
https://github.com/ultimatepp/ultimatepp.git
synced 2026-07-11 22:03:01 -06:00
Core: Peek, Poke, Stream: Get16, 32, 64 optimized
git-svn-id: svn://ultimatepp.org/upp/trunk@14440 f0d560ea-af0d-0410-9eb7-867de7ffcac7
This commit is contained in:
parent
b7a2da6379
commit
fc2f3f01ca
3 changed files with 39 additions and 180 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue