Made m4 more readable
This commit is contained in:
parent
7626f83e90
commit
9ebaa2982c
|
@ -1,50 +1,53 @@
|
|||
divert(`-1')dnl
|
||||
#changequote(`[', `]')dnl
|
||||
changequote(`«', `»')
|
||||
changecom(«/*», «*/»)
|
||||
\ note: use https://github.com/vim-scripts/syntaxm4.vim.git
|
||||
vim-m4-syntax: quote=«,» comment=\\
|
||||
|
||||
define(`TICK', changequote([,])[changequote([,])'changequote(`,')]changequote(`,'))
|
||||
define(«TICK», changequote([,])[changequote([,])»changequote(«,»)]changequote(«,»))
|
||||
|
||||
# forloop(var, from, to, stmt) - improved version:
|
||||
# works even if VAR is not a strict macro name
|
||||
# performs sanity check that FROM is larger than TO
|
||||
# allows complex numerical expressions in TO and FROM
|
||||
define(`forloop', `ifelse(eval(`($2) <= ($3)'), `1',
|
||||
`pushdef(`$1')_$0(`$1', eval(`$2'),
|
||||
eval(`$3'), `$4')popdef(`$1')')')
|
||||
define(`_forloop',
|
||||
`define(`$1', `$2')$4`'ifelse(`$2', `$3', `',
|
||||
`$0(`$1', incr(`$2'), `$3', `$4')')')
|
||||
\ forloop(var, from, to, stmt) - improved version:
|
||||
\ works even if VAR is not a strict macro name
|
||||
\ performs sanity check that FROM is larger than TO
|
||||
\ allows complex numerical expressions in TO and FROM
|
||||
define(«forloop», «ifelse(eval(«($2) <= ($3)»), «1»,
|
||||
«pushdef(«$1»)_$0(«$1», eval(«$2»),
|
||||
eval(«$3»), «$4»)popdef(«$1»)»)»)
|
||||
define(«_forloop»,
|
||||
«define(«$1», «$2»)$4«»ifelse(«$2», «$3», «»,
|
||||
«$0(«$1», incr(«$2»), «$3», «$4»)»)»)
|
||||
|
||||
# foreachq(x, `item_1, item_2, ..., item_n', stmt)
|
||||
# quoted list, version based on forloop
|
||||
define(`foreachq',
|
||||
`ifelse(`$2', `', `', `_$0(`$1', `$3', $2)')')
|
||||
define(`_foreachq',
|
||||
`pushdef(`$1', forloop(`$1', `3', `$#',
|
||||
`$0_(`1', `2', indir(`$1'))')`popdef(
|
||||
`$1')')indir(`$1', $@)')
|
||||
define(`_foreachq_',
|
||||
``define(`$$1', `$$3')$$2`''')
|
||||
\ foreachq(x, «item_1, item_2, ..., item_n», stmt)
|
||||
\ quoted list, version based on forloop
|
||||
define(«foreachq»,
|
||||
«ifelse(«$2», «», «», «_$0(«$1», «$3», $2)»)»)
|
||||
define(«_foreachq»,
|
||||
«pushdef(«$1», forloop(«$1», «3», «$#»,
|
||||
«$0_(«1», «2», indir(«$1»))»)«popdef(
|
||||
«$1»)»)indir(«$1», $@)»)
|
||||
define(«_foreachq_»,
|
||||
««define(«$$1», «$$3»)$$2«»»»)
|
||||
|
||||
# foreach(x, (item_1, item_2, ..., item_n), stmt)
|
||||
# parenthesized list, improved version
|
||||
define(`foreach', `pushdef(`$1')_$0(`$1',
|
||||
(dquote(dquote_elt$2)), `$3')popdef(`$1')')
|
||||
define(`_arg1', `$1')
|
||||
define(`_foreach', `ifelse(`$2', `(`')', `',
|
||||
`define(`$1', _arg1$2)$3`'$0(`$1', (dquote(shift$2)), `$3')')')
|
||||
\ foreach(x, (item_1, item_2, ..., item_n), stmt)
|
||||
\ parenthesized list, improved version
|
||||
define(«foreach», «pushdef(«$1»)_$0(«$1»,
|
||||
(dquote(dquote_elt$2)), «$3»)popdef(«$1»)»)
|
||||
define(«_arg1», «$1»)
|
||||
define(«_foreach», «ifelse(«$2», «(«»)», «»,
|
||||
«define(«$1», _arg1$2)$3«»$0(«$1», (dquote(shift$2)), «$3»)»)»)
|
||||
|
||||
# hextox(x)
|
||||
# hexadecimal number to series of X(0xZZ)X(0xZZ)...
|
||||
define(`hextox', `patsubst(`$1', `..', `X(0x\&)')')
|
||||
\ hextox(x)
|
||||
\ hexadecimal number to series of X(0xZZ)X(0xZZ)...
|
||||
define(«hextox», «patsubst(«$1», «..», «X(0x\&)»)»)
|
||||
|
||||
# hashtag(x)
|
||||
# expands to #x
|
||||
define(`hashtag', `changecom()dnl
|
||||
#$1`'dnl
|
||||
changecom(`#')')
|
||||
\ hashtag(x)
|
||||
\ expands to #x
|
||||
define(«hashtag», «changecom()dnl
|
||||
#$1«»dnl
|
||||
changecom(«#»)»)
|
||||
|
||||
# rtrimn(x, n)
|
||||
# expands to all but the last n characters of x
|
||||
define(`rtrimn', `substr($1, 0, eval(len($1)-$2))')
|
||||
\ rtrimn(x, n)
|
||||
\ expands to all but the last n characters of x
|
||||
define(«rtrimn», «substr($1, 0, eval(len($1)-$2))»)
|
||||
|
||||
divert(`0')dnl
|
||||
divert(«0»)dnl
|
||||
|
|
|
@ -1,19 +1,19 @@
|
|||
include(`misc/utils.m4')dnl vim-m4-syntax: quote=«,» comment=\\
|
||||
#ifndef X86_64_H
|
||||
#define X86_64_H
|
||||
|
||||
#include "../utils.h"
|
||||
|
||||
/*******************************************************************************
|
||||
include(`misc/utils.m4')dnl
|
||||
divert(`-1')dnl
|
||||
divert(«-1»)dnl
|
||||
|
||||
define(`registers', `RAX, RCX, RDX, RBX, R8, R9, R10, R11, R12, R13, R14, R15')
|
||||
define(«registers», «RAX, RCX, RDX, RBX, R8, R9, R10, R11, R12, R13, R14, R15»)
|
||||
|
||||
define(`x86_encoding_of', `translit(esyscmd(`echo 'TICK`$1'TICK` | ./tools/x86_64dump'),`
|
||||
')')
|
||||
define(`assemble', `hextox(x86_encoding_of($1)) Y("$1")')
|
||||
define(«x86_encoding_of», «translit(esyscmd(«echo '$1' | ./tools/x86_64dump»),«
|
||||
»)»)
|
||||
define(«assemble», «hextox(x86_encoding_of($1)) Y("$1")»)
|
||||
|
||||
divert(`0')dnl
|
||||
divert(«0»)dnl
|
||||
|
||||
Types:
|
||||
|
||||
|
@ -40,29 +40,29 @@ Implementations (auto generated):
|
|||
#define XX(x) X(BYTE_0xFF(x)) X(BYTE_0xFF00(x))
|
||||
#define XXX(x) X(BYTE_0xFF(x)) X(BYTE_0xFF00(x)) X(BYTE_0xFF0000(x))
|
||||
#define XXXX(x) X(BYTE_0xFF(x)) X(BYTE_0xFF00(x)) X(BYTE_0xFF0000(x)) X(BYTE_0xFF000000(x))
|
||||
foreachq(register, `registers', `hashtag(define) PUSH_`'register`' assemble(`push register')
|
||||
')
|
||||
foreachq(register, «registers», «#define PUSH_«»register«» assemble(«push register»)
|
||||
»)
|
||||
#define PUSH_BYTE(x) X(0x6a) X(x) Y("push " #x)
|
||||
#define PUSH_WORD(x) X(0x86) XXXX(x) Y("push " #x)
|
||||
|
||||
foreachq(register, `registers', `hashtag(define) POP_`'register`' assemble(`pop register')
|
||||
')
|
||||
foreachq(registera, `registers', `
|
||||
foreachq(registerb, `registers', `ifelse(registera,registerb,,hashtag(define) MOV_`'registera`'_`'registerb`' assemble(`mov registera`,'registerb')
|
||||
)')')
|
||||
foreachq(register, `registers', `hashtag(define) MOV_`'register`'_WORD(x) hextox(rtrimn(x86_encoding_of(`mov 'register`, 0'), 8)) XXXX(x) Y("mov register," hashtag(x))
|
||||
')
|
||||
foreachq(register, «registers», «#define POP_«»register«» assemble(«pop register»)
|
||||
»)
|
||||
foreachq(registera, «registers», «
|
||||
foreachq(registerb, «registers», «ifelse(registera,registerb,,#define MOV_«»registera«»_«»registerb«» assemble(«mov registera«,»registerb»)
|
||||
)»)»)
|
||||
foreachq(register, «registers», «#define MOV_«»register«»_WORD(x) hextox(rtrimn(x86_encoding_of(«mov »register«, 0»), 8)) XXXX(x) Y("mov register," #x)
|
||||
»)
|
||||
|
||||
foreachq(registera, `registers', `
|
||||
foreachq(registerb, `registers', `ifelse(registera,registerb,,hashtag(define) ADD_`'registera`'_`'registerb`' assemble(`add registera`,'registerb')
|
||||
)')')
|
||||
foreachq(register, `registers', `hashtag(define) ADD_`'register`'_WORD(x) hextox(rtrimn(x86_encoding_of(`add 'register`, 0x12345678'), 8)) XXXX(x) Y("add register," hashtag(x))
|
||||
')
|
||||
foreachq(registera, «registers», «
|
||||
foreachq(registerb, «registers», «ifelse(registera,registerb,,#define ADD_«»registera«»_«»registerb«» assemble(«add registera«,»registerb»)
|
||||
)»)»)
|
||||
foreachq(register, «registers», «#define ADD_«»register«»_WORD(x) hextox(rtrimn(x86_encoding_of(«add »register«, 0x12345678»), 8)) XXXX(x) Y("add register," #x)
|
||||
»)
|
||||
|
||||
foreachq(registera, `registers', `
|
||||
foreachq(registerb, `registers', `ifelse(registera,registerb,,hashtag(define) SUB_`'registera`'_`'registerb`' assemble(`sub registera`,'registerb')
|
||||
)')')
|
||||
foreachq(register, `registers', `hashtag(define) SUB_`'register`'_WORD(x) hextox(rtrimn(x86_encoding_of(`sub 'register`, 0x12345678'), 8)) XXXX(x) Y("sub register," hashtag(x))
|
||||
')
|
||||
foreachq(registera, «registers», «
|
||||
foreachq(registerb, «registers», «ifelse(registera,registerb,,#define SUB_«»registera«»_«»registerb«» assemble(«sub registera«,»registerb»)
|
||||
)»)»)
|
||||
foreachq(register, «registers», «#define SUB_«»register«»_WORD(x) hextox(rtrimn(x86_encoding_of(«sub »register«, 0x12345678»), 8)) XXXX(x) Y("sub register," #x)
|
||||
»)
|
||||
|
||||
#endif /* X86_64_H */
|
||||
|
|
Loading…
Reference in a new issue