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:
cxl 2020-05-08 13:55:42 +00:00
parent b7a2da6379
commit fc2f3f01ca
3 changed files with 39 additions and 180 deletions

View file

@ -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

View file

@ -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;

View file

@ -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);