summaryrefslogtreecommitdiff
path: root/macros
diff options
context:
space:
mode:
authorH. Peter Anvin <hpa@zytor.com>2008-10-19 16:38:28 -0700
committerH. Peter Anvin <hpa@zytor.com>2008-10-19 16:38:28 -0700
commit777cdbee01d056e3f17d58b272d46c41c9583a61 (patch)
tree7bdf012dbf57c289967c1efd60a482b99a78f3a4 /macros
parent45d5f2f8223fe64a4ab27c7b7fce7fa974a62470 (diff)
downloadnasm-777cdbee01d056e3f17d58b272d46c41c9583a61.tar.gz
nasm-777cdbee01d056e3f17d58b272d46c41c9583a61.tar.bz2
nasm-777cdbee01d056e3f17d58b272d46c41c9583a61.zip
smartalign: rewrite to use the indirect construct, %[...]
This code can be made so much smaller with clever use of the indirection construct. Signed-off-by: H. Peter Anvin <hpa@zytor.com>
Diffstat (limited to 'macros')
-rw-r--r--macros/smartalign.mac104
1 files changed, 21 insertions, 83 deletions
diff --git a/macros/smartalign.mac b/macros/smartalign.mac
index f2ae104..4dc8fd5 100644
--- a/macros/smartalign.mac
+++ b/macros/smartalign.mac
@@ -15,6 +15,7 @@ USE: smartalign
%define __ALIGN_16BIT_6B__ 0x90,0x90,0x90,0x90,0x90,0x90
%define __ALIGN_16BIT_7B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90
%define __ALIGN_16BIT_8B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90
+ %define __ALIGN_16BIT_GROUP__ 8
%define __ALIGN_32BIT_1B__ 0x90
%define __ALIGN_32BIT_2B__ 0x90,0x90
@@ -24,6 +25,7 @@ USE: smartalign
%define __ALIGN_32BIT_6B__ 0x90,0x90,0x90,0x90,0x90,0x90
%define __ALIGN_32BIT_7B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90
%define __ALIGN_32BIT_8B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90
+ %define __ALIGN_32BIT_GROUP__ 8
%define __ALIGN_64BIT_1B__ 0x90
%define __ALIGN_64BIT_2B__ 0x90,0x90
@@ -33,6 +35,7 @@ USE: smartalign
%define __ALIGN_64BIT_6B__ 0x90,0x90,0x90,0x90,0x90,0x90
%define __ALIGN_64BIT_7B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90
%define __ALIGN_64BIT_8B__ 0x90,0x90,0x90,0x90,0x90,0x90,0x90,0x90
+ %define __ALIGN_64BIT_GROUP__ 8
%elifidni %1,generic
%define __ALIGN_JMP_THRESHOLD__ 8
@@ -44,6 +47,7 @@ USE: smartalign
%define __ALIGN_16BIT_6B__ 0x89,0xf6,0x8d,0xbd,0x00,0x00
%define __ALIGN_16BIT_7B__ 0x8d,0x74,0x00,0x8d,0xbd,0x00,0x00
%define __ALIGN_16BIT_8B__ 0x8d,0xb4,0x00,0x00,0x8d,0xbd,0x00,0x00
+ %define __ALIGN_16BIT_GROUP__ 8
%define __ALIGN_32BIT_1B__ 0x90
%define __ALIGN_32BIT_2B__ 0x89,0xf6
@@ -53,6 +57,7 @@ USE: smartalign
%define __ALIGN_32BIT_6B__ 0x8d,0xb6,0x00,0x00,0x00,0x00
%define __ALIGN_32BIT_7B__ 0x8d,0xb4,0x26,0x00,0x00,0x00,0x00
%undef __ALIGN_32BIT_8B__
+ %define __ALIGN_32BIT_GROUP__ 7
%define __ALIGN_64BIT_1B__ 0x90
%define __ALIGN_64BIT_2B__ 0x66,0x90
@@ -62,6 +67,7 @@ USE: smartalign
%define __ALIGN_64BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_64BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_64BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
+ %define __ALIGN_64BIT_GROUP__ 8
%elifidni %1,k8
%define __ALIGN_JMP_THRESHOLD__ 16
@@ -73,6 +79,7 @@ USE: smartalign
%define __ALIGN_16BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_16BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_16BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
+ %define __ALIGN_16BIT_GROUP__ 8
%define __ALIGN_32BIT_1B__ 0x90
%define __ALIGN_32BIT_2B__ 0x66,0x90
@@ -82,6 +89,7 @@ USE: smartalign
%define __ALIGN_32BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_32BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_32BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
+ %define __ALIGN_32BIT_GROUP__ 8
%define __ALIGN_64BIT_1B__ 0x90
%define __ALIGN_64BIT_2B__ 0x66,0x90
@@ -91,6 +99,7 @@ USE: smartalign
%define __ALIGN_64BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_64BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_64BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
+ %define __ALIGN_64BIT_GROUP__ 8
%elifidni %1,k7
%define __ALIGN_JMP_THRESHOLD__ 16
@@ -102,6 +111,7 @@ USE: smartalign
%define __ALIGN_16BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_16BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_16BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
+ %define __ALIGN_64BIT_GROUP__ 8
%define __ALIGN_32BIT_1B__ 0x90
%define __ALIGN_32BIT_2B__ 0x8b,0xc0
@@ -111,6 +121,7 @@ USE: smartalign
%define __ALIGN_32BIT_6B__ 0x8d,0x80,0x00,0x00,0x00,0x00
%define __ALIGN_32BIT_7B__ 0x8d,0x04,0x05,0x00,0x00,0x00,0x00
%undef __ALIGN_32BIT_8B__
+ %define __ALIGN_32BIT_GROUP__ 7
%define __ALIGN_64BIT_1B__ 0x90
%define __ALIGN_64BIT_2B__ 0x66,0x90
@@ -120,6 +131,7 @@ USE: smartalign
%define __ALIGN_64BIT_6B__ 0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_64BIT_7B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x90
%define __ALIGN_64BIT_8B__ 0x66,0x66,0x66,0x90,0x66,0x66,0x66,0x90
+ %define __ALIGN_64BIT_GROUP__ 8
%elifidni %1,p6
%define __ALIGN_JMP_THRESHOLD__ 16
@@ -131,6 +143,7 @@ USE: smartalign
%define __ALIGN_16BIT_6B__ 0x0f,0x1f,0x00,0x0f,0x1f,0x00
%define __ALIGN_16BIT_7B__ 0x0f,0x1f,0x00,0x0f,0x1f,0x40,0x00
%define __ALIGN_16BIT_8B__ 0x0f,0x1f,0x40,0x00,0x0f,0x1f,0x40,0x00
+ %define __ALIGN_16BIT_GROUP__ 8
%define __ALIGN_32BIT_1B__ 0x90
%define __ALIGN_32BIT_2B__ 0x66,0x90
@@ -140,6 +153,7 @@ USE: smartalign
%define __ALIGN_32BIT_6B__ 0x66,0x0f,0x1f,0x44,0x00,0x00
%define __ALIGN_32BIT_7B__ 0x0f,0x1f,0x80,0x00,0x00,0x00,0x00
%define __ALIGN_32BIT_8B__ 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00
+ %define __ALIGN_32BIT_GROUP__ 8
%define __ALIGN_64BIT_1B__ 0x90
%define __ALIGN_64BIT_2B__ 0x66,0x90
@@ -149,6 +163,7 @@ USE: smartalign
%define __ALIGN_64BIT_6B__ 0x66,0x0f,0x1f,0x44,0x00,0x00
%define __ALIGN_64BIT_7B__ 0x0f,0x1f,0x80,0x00,0x00,0x00,0x00
%define __ALIGN_64BIT_8B__ 0x0f,0x1f,0x84,0x00,0x00,0x00,0x00,0x00
+ %define __ALIGN_64BIT_GROUP__ 8
%else
%error unknown alignment mode: %1
%endif
@@ -171,89 +186,12 @@ USE: smartalign
times (((%1) - (($-$$) % (%1))) % (%1)) nop
%$end:
%else
- %if __BITS__ == 16
- %ifdef __ALIGN_16BIT_8B__
- %rep %$pad / 8
- db __ALIGN_16BIT_8B__
- %endrep
- %assign %$pad %$pad % 8
- %else
- %rep %$pad / 7
- db __ALIGN_16BIT_7B__
- %endrep
- %assign %$pad %$pad % 7
- %endif
- %if %$pad == 1
- db __ALIGN_16BIT_1B__
- %elif %$pad == 2
- db __ALIGN_16BIT_2B__
- %elif %$pad == 3
- db __ALIGN_16BIT_3B__
- %elif %$pad == 4
- db __ALIGN_16BIT_4B__
- %elif %$pad == 5
- db __ALIGN_16BIT_5B__
- %elif %$pad == 6
- db __ALIGN_16BIT_6B__
- %elif %$pad == 7
- db __ALIGN_16BIT_7B__
- %endif
- %elif __BITS__ == 32
- %ifdef __ALIGN_32BIT_8B__
- %rep %$pad / 8
- db __ALIGN_32BIT_8B__
- %endrep
- %assign %$pad %$pad % 8
- %else
- %rep %$pad / 7
- db __ALIGN_32BIT_7B__
- %endrep
- %assign %$pad %$pad % 7
- %endif
- %if %$pad == 1
- db __ALIGN_32BIT_1B__
- %elif %$pad == 2
- db __ALIGN_32BIT_2B__
- %elif %$pad == 3
- db __ALIGN_32BIT_3B__
- %elif %$pad == 4
- db __ALIGN_32BIT_4B__
- %elif %$pad == 5
- db __ALIGN_32BIT_5B__
- %elif %$pad == 6
- db __ALIGN_32BIT_6B__
- %elif %$pad == 7
- db __ALIGN_32BIT_7B__
- %endif
- %elif __BITS__ == 64
- %ifdef __ALIGN_64BIT_8B__
- %rep %$pad / 8
- db __ALIGN_64BIT_8B__
- %endrep
- %assign %$pad %$pad % 8
- %else
- %rep %$pad / 7
- db __ALIGN_64BIT_7B__
- %endrep
- %assign %$pad %$pad % 7
- %endif
- %if %$pad == 1
- db __ALIGN_64BIT_1B__
- %elif %$pad == 2
- db __ALIGN_64BIT_2B__
- %elif %$pad == 3
- db __ALIGN_64BIT_3B__
- %elif %$pad == 4
- db __ALIGN_64BIT_4B__
- %elif %$pad == 5
- db __ALIGN_64BIT_5B__
- %elif %$pad == 6
- db __ALIGN_64BIT_6B__
- %elif %$pad == 7
- db __ALIGN_64BIT_7B__
- %endif
- %else
- %error "Invalid __BITS__ value"
+ %rep %$pad / __ALIGN_%[__BITS__]BIT_GROUP__
+ db __ALIGN_%[__BITS__]BIT_%[__ALIGN_%[__BITS__]BIT_GROUP__]B__
+ %endrep
+ %assign %$pad %$pad % __ALIGN_%[__BITS__]BIT_GROUP__
+ %if %$pad > 0
+ db __ALIGN_%[__BITS__]BIT_%[%$pad]B__
%endif
%endif
%pop