aboutsummaryrefslogtreecommitdiff
path: root/src/DSi_AES.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/DSi_AES.h')
-rw-r--r--src/DSi_AES.h20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/DSi_AES.h b/src/DSi_AES.h
index d8ef98a..9baf747 100644
--- a/src/DSi_AES.h
+++ b/src/DSi_AES.h
@@ -22,6 +22,25 @@
#include "types.h"
#include "Savestate.h"
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wattributes"
+#if defined(__GNUC__) && (__GNUC__ >= 11) // gcc 11.*
+// NOTE: Yes, the compiler does *not* recognize this code pattern, so it is indeed an optimization.
+__attribute((always_inline)) static void Bswap128(void* Dst, void* Src)
+{
+ *(__int128*)&Dst = __builtin_bswap128(*(__int128*)&Src);
+}
+#else
+__attribute((always_inline)) static void Bswap128(void* Dst, void* Src)
+{
+ for (int i = 0; i < 16; ++i)
+ {
+ ((char*)Src)[i] = ((char*)Src)[15 - i];
+ }
+}
+#endif
+#pragma GCC diagnostic pop
+
namespace DSi_AES
{
@@ -49,7 +68,6 @@ void WriteKeyNormal(u32 slot, u32 offset, u32 val, u32 mask);
void WriteKeyX(u32 slot, u32 offset, u32 val, u32 mask);
void WriteKeyY(u32 slot, u32 offset, u32 val, u32 mask);
-void Swap16(u8* dst, u8* src);
void DeriveNormalKey(u8* keyX, u8* keyY, u8* normalkey);
}