1. Выравнивание данных в CREATED/CREATE :
: CREATED ( addr u -- )
SHEADER
ALIGN-BYTES @ DUP 4 >
IF 5 - ALLOT
ELSE 1 - ALLOT
THEN
HERE DUP LAST-CFA @ !
DOES>A ! ( для DOES )
['] _CREATE-CODE COMPILE,
;
Если целью было обеспечить выровненность на ALIGN-BYTES байтов адреса получаемого при вызове новосозданного слова, то этого сейчас нет.
Должно быть:
: CREATED ( addr u -- )
SHEADER
ALIGN
ALIGN-BYTES @ DUP 4 >
IF CFL - ALLOT
ELSE 1 - ALLOT
THEN
HERE DUP LAST-CFA @ !
DOES>A ! ( для DOES )
['] _CREATE-CODE COMPILE,
;
Или положить ALIGN в SHEADER (в строчку перед HERE SWAP ! ).
2. Выравнивание кода -- ALIGN-NOP. Agner Fog (
http://www.agner.org/optimize/ ) в том числе советует использовать более длинные маш. инструкции аналогичные "обычному" NOP'у (0x90). Есть двухбайтовые NOP'ы -- XCHG EAX, EAX (0x87C0) и LEA EBX , [EBX] (0x8D1B) и есть даже шестибайтовые NOP'ы -- LEA EBX, DWORD 0 [EBX] (0x8D9B00000000) и т.д.
Имеет ли смысл:
: ALIGN-NOP ( n -- )
\ выровнять HERE на n и заполнить NOP
HERE DUP ROT ALIGN-TO
\ OVER - DUP ALLOT 0x90 FILL \ <-- оригинальная строчка
SWAP - ( u )
BEGIN
DUP 5 > IF 0x9B8D W, 0 , 6 - ELSE \ LEA EBX, DWORD 0 [EBX]
DUP 1 > IF 0x1B8D W, 2 - ELSE \ LEA EBX, [EBX]
DUP 1 = IF 0x90 C, 1 - THEN \ NOP
THEN THEN
DUP 0= UNTIL DROP
;
Проверка:
0 C, 0 C, 0 C, 0 C, 0 C, \ 0 C, 0 C, 0 C, 0 C,
: r [ 16 ALIGN-NOP ] ;
lib/ext/disasm.f
SEE r
3. Проблема существенного оставания SPF в бенчмарке от MPE (последняя версия от сентября 2007-го:
http://www.mpeforth.com/arena/benchmrk.fth ) -- непонятная чувствительность к выравниванию данных по 4кб (размер страницы?..). Сравните оригинальный тест с изменённым (я включил выравнивание по 4кб для SPF):
http://forth.org.ru/~profit/benchmark.f .