Made m4 more readable

This commit is contained in:
Louis Burke 2024-10-27 20:31:16 -04:00
parent 7626f83e90
commit 9ebaa2982c
2 changed files with 70 additions and 67 deletions

View file

@ -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

View file

@ -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 */