Made m4 more readable
This commit is contained in:
parent
7626f83e90
commit
9ebaa2982c
|
@ -1,50 +1,53 @@
|
||||||
divert(`-1')dnl
|
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:
|
\ forloop(var, from, to, stmt) - improved version:
|
||||||
# works even if VAR is not a strict macro name
|
\ works even if VAR is not a strict macro name
|
||||||
# performs sanity check that FROM is larger than TO
|
\ performs sanity check that FROM is larger than TO
|
||||||
# allows complex numerical expressions in TO and FROM
|
\ allows complex numerical expressions in TO and FROM
|
||||||
define(`forloop', `ifelse(eval(`($2) <= ($3)'), `1',
|
define(«forloop», «ifelse(eval(«($2) <= ($3)»), «1»,
|
||||||
`pushdef(`$1')_$0(`$1', eval(`$2'),
|
«pushdef(«$1»)_$0(«$1», eval(«$2»),
|
||||||
eval(`$3'), `$4')popdef(`$1')')')
|
eval(«$3»), «$4»)popdef(«$1»)»)»)
|
||||||
define(`_forloop',
|
define(«_forloop»,
|
||||||
`define(`$1', `$2')$4`'ifelse(`$2', `$3', `',
|
«define(«$1», «$2»)$4«»ifelse(«$2», «$3», «»,
|
||||||
`$0(`$1', incr(`$2'), `$3', `$4')')')
|
«$0(«$1», incr(«$2»), «$3», «$4»)»)»)
|
||||||
|
|
||||||
# foreachq(x, `item_1, item_2, ..., item_n', stmt)
|
\ foreachq(x, «item_1, item_2, ..., item_n», stmt)
|
||||||
# quoted list, version based on forloop
|
\ quoted list, version based on forloop
|
||||||
define(`foreachq',
|
define(«foreachq»,
|
||||||
`ifelse(`$2', `', `', `_$0(`$1', `$3', $2)')')
|
«ifelse(«$2», «», «», «_$0(«$1», «$3», $2)»)»)
|
||||||
define(`_foreachq',
|
define(«_foreachq»,
|
||||||
`pushdef(`$1', forloop(`$1', `3', `$#',
|
«pushdef(«$1», forloop(«$1», «3», «$#»,
|
||||||
`$0_(`1', `2', indir(`$1'))')`popdef(
|
«$0_(«1», «2», indir(«$1»))»)«popdef(
|
||||||
`$1')')indir(`$1', $@)')
|
«$1»)»)indir(«$1», $@)»)
|
||||||
define(`_foreachq_',
|
define(«_foreachq_»,
|
||||||
``define(`$$1', `$$3')$$2`''')
|
««define(«$$1», «$$3»)$$2«»»»)
|
||||||
|
|
||||||
# foreach(x, (item_1, item_2, ..., item_n), stmt)
|
\ foreach(x, (item_1, item_2, ..., item_n), stmt)
|
||||||
# parenthesized list, improved version
|
\ parenthesized list, improved version
|
||||||
define(`foreach', `pushdef(`$1')_$0(`$1',
|
define(«foreach», «pushdef(«$1»)_$0(«$1»,
|
||||||
(dquote(dquote_elt$2)), `$3')popdef(`$1')')
|
(dquote(dquote_elt$2)), «$3»)popdef(«$1»)»)
|
||||||
define(`_arg1', `$1')
|
define(«_arg1», «$1»)
|
||||||
define(`_foreach', `ifelse(`$2', `(`')', `',
|
define(«_foreach», «ifelse(«$2», «(«»)», «»,
|
||||||
`define(`$1', _arg1$2)$3`'$0(`$1', (dquote(shift$2)), `$3')')')
|
«define(«$1», _arg1$2)$3«»$0(«$1», (dquote(shift$2)), «$3»)»)»)
|
||||||
|
|
||||||
# hextox(x)
|
\ hextox(x)
|
||||||
# hexadecimal number to series of X(0xZZ)X(0xZZ)...
|
\ hexadecimal number to series of X(0xZZ)X(0xZZ)...
|
||||||
define(`hextox', `patsubst(`$1', `..', `X(0x\&)')')
|
define(«hextox», «patsubst(«$1», «..», «X(0x\&)»)»)
|
||||||
|
|
||||||
# hashtag(x)
|
\ hashtag(x)
|
||||||
# expands to #x
|
\ expands to #x
|
||||||
define(`hashtag', `changecom()dnl
|
define(«hashtag», «changecom()dnl
|
||||||
#$1`'dnl
|
#$1«»dnl
|
||||||
changecom(`#')')
|
changecom(«#»)»)
|
||||||
|
|
||||||
# rtrimn(x, n)
|
\ rtrimn(x, n)
|
||||||
# expands to all but the last n characters of x
|
\ expands to all but the last n characters of x
|
||||||
define(`rtrimn', `substr($1, 0, eval(len($1)-$2))')
|
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
|
#ifndef X86_64_H
|
||||||
#define X86_64_H
|
#define X86_64_H
|
||||||
|
|
||||||
#include "../utils.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(«x86_encoding_of», «translit(esyscmd(«echo '$1' | ./tools/x86_64dump»),«
|
||||||
')')
|
»)»)
|
||||||
define(`assemble', `hextox(x86_encoding_of($1)) Y("$1")')
|
define(«assemble», «hextox(x86_encoding_of($1)) Y("$1")»)
|
||||||
|
|
||||||
divert(`0')dnl
|
divert(«0»)dnl
|
||||||
|
|
||||||
Types:
|
Types:
|
||||||
|
|
||||||
|
@ -40,29 +40,29 @@ Implementations (auto generated):
|
||||||
#define XX(x) X(BYTE_0xFF(x)) X(BYTE_0xFF00(x))
|
#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 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))
|
#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_BYTE(x) X(0x6a) X(x) Y("push " #x)
|
||||||
#define PUSH_WORD(x) X(0x86) XXXX(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(register, «registers», «#define POP_«»register«» assemble(«pop register»)
|
||||||
')
|
»)
|
||||||
foreachq(registera, `registers', `
|
foreachq(registera, «registers», «
|
||||||
foreachq(registerb, `registers', `ifelse(registera,registerb,,hashtag(define) MOV_`'registera`'_`'registerb`' assemble(`mov registera`,'registerb')
|
foreachq(registerb, «registers», «ifelse(registera,registerb,,#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 MOV_«»register«»_WORD(x) hextox(rtrimn(x86_encoding_of(«mov »register«, 0»), 8)) XXXX(x) Y("mov register," #x)
|
||||||
')
|
»)
|
||||||
|
|
||||||
foreachq(registera, `registers', `
|
foreachq(registera, «registers», «
|
||||||
foreachq(registerb, `registers', `ifelse(registera,registerb,,hashtag(define) ADD_`'registera`'_`'registerb`' assemble(`add registera`,'registerb')
|
foreachq(registerb, «registers», «ifelse(registera,registerb,,#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(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(registera, «registers», «
|
||||||
foreachq(registerb, `registers', `ifelse(registera,registerb,,hashtag(define) SUB_`'registera`'_`'registerb`' assemble(`sub registera`,'registerb')
|
foreachq(registerb, «registers», «ifelse(registera,registerb,,#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(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 */
|
#endif /* X86_64_H */
|
||||||
|
|
Loading…
Reference in a new issue