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

View file

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