base/asm-common.h, symm/rijndael-x86ish-aesni.S: Better section switching.
[catacomb] / base / asm-common.h
index 20a1d6a..e5e0f2f 100644 (file)
 #define _ENDLIT .text .L$_subsec
 #define _LTORG .L$_subsec = .L$_subsec + 2; .text .L$_subsec
 
+// ELF section types.
+#if __ELF__
+#  if CPUFAM_ARMEL
+#    define _SECTTY(ty) %ty
+#  else
+#    define _SECTTY(ty) @ty
+#  endif
+#endif
+
+// Section selection.
+#define TEXT .text .L$_subsec
+#if ABI_WIN
+#  define RODATA .section .rdata, "dr"
+#elif __ELF__
+#  define RODATA .section .rodata, "a", _SECTTY(progbits)
+#else
+#  define RODATA TEXT
+#endif
+#define DATA .data
+
 // Announcing an external function.
 #define FUNC(name)                                                     \
        .globl  F(name);                                                \
@@ -178,6 +198,117 @@ name:
 
 #endif
 
+#if CPUFAM_X86
+
+.macro _reg.0
+       // Stash GP registers and establish temporary stack frame.
+       pushfd
+       push    eax
+       push    ecx
+       push    edx
+       push    ebp
+       mov     ebp, esp
+       and     esp, ~15
+       sub     esp, 512
+       fxsave  [esp]
+.endm
+
+.macro _reg.1
+.endm
+
+.macro _reg.2
+.endm
+
+.macro _reg.3  fmt
+       // Print FMT and the other established arguments.
+       lea     eax, .L$_reg$msg.\@
+       push    eax
+       call    printf
+       jmp     .L$_reg$cont.\@
+.L$_reg$msg.\@:
+       .ascii  ";; \fmt\n\0"
+.L$_reg$cont.\@:
+       mov     eax, ebp
+       and     eax, ~15
+       sub     eax, 512
+       fxrstor [eax]
+       mov     esp, ebp
+       pop     ebp
+       pop     edx
+       pop     ecx
+       pop     eax
+       popfd
+.endm
+
+.macro msg     msg
+       _reg.0
+       _reg.1
+       _reg.2
+       _reg.3  "\msg"
+.endm
+
+.macro reg     r, msg
+       _reg.0
+  .ifeqs "\r", "esp"
+       lea     eax, [ebp + 20]
+       push    eax
+  .else
+    .ifeqs "\r", "ebp"
+       push    [ebp]
+    .else
+       push    \r
+    .endif
+  .endif
+       _reg.1
+       _reg.2
+       _reg.3  "\msg: \r = %08x"
+.endm
+
+.macro xmmreg  r, msg
+       _reg.0
+       _reg.1
+       _reg.2
+       movdqu  xmm0, \r
+       pshufd  xmm0, xmm0, 0x1b
+       sub     esp, 16
+       movdqa  [esp], xmm0
+       _reg.3  "\msg: \r = %08x %08x %08x %08x"
+.endm
+
+.macro mmreg   r, msg
+       _reg.0
+       _reg.1
+       _reg.2
+       pshufw  \r, \r, 0x4e
+       sub     esp, 8
+       movq    [esp], \r
+       _reg.3  "\msg: \r = %08x %08x"
+.endm
+
+.macro freg    i, msg
+       _reg.0
+       _reg.1
+       _reg.2
+       finit
+       fldt    [esp + 32 + 16*\i]
+       sub     esp, 12
+       fstpt   [esp]
+       _reg.3  "\msg: st(\i) = %.20Lg"
+.endm
+
+.macro fxreg   i, msg
+       _reg.0
+       _reg.1
+       _reg.2
+       finit
+       fldt    [esp + 32 + 16*\i]
+       sub     esp, 12
+       fstpt   [esp]
+       _reg.3  "\msg: st(\i) = %La"
+.endm
+
+#endif
+
 ///--------------------------------------------------------------------------
 /// ARM-specific hacking.
 
@@ -285,4 +416,9 @@ name:
 #  define SIZE_OBJ(name)
 #endif
 
+#if __ELF__ && defined(WANT_EXECUTABLE_STACK)
+       .pushsection .note.GNU-stack, "", _SECTTY(progbits)
+       .popsection
+#endif
+
 ///----- That's all, folks --------------------------------------------------