On Tue, May 23, 2017 at 11:41:47AM +0200, Andrew Jones wrote: > On Mon, May 22, 2017 at 07:41:13PM +0100, Alex Bennée wrote: > > > > Andrew Jones <drjones@xxxxxxxxxx> writes: > > > Any reason not to implement the above functions with > > > loops? E.g. > > > > > > while (--n >= 0) { > > > write_debug_wcr(array[n].dbgwcr, n); > > > write_debug_wvr(array[n].dbgwvr, n); > > > } > > > > Well we are using macro pasting here so we need to instantiate all > > possible asm fragments. > > > > Oh right. So how about fighting fire with fire - i.e. creating > more macros > > #define dbg_case_readb(nr, array) \ > case (nr): \ > (array)[nr].dbgbcr = read_debug_bcr(nr); \ > (array)[nr].dbgbvr = read_debug_bvr(nr); \ > /* fall through */ > #define dbg_case_readw(nr, array) \ > case (nr): \ > (array)[nr].dbgwcr = read_debug_wcr(nr); \ > (array)[nr].dbgwvr = read_debug_wvr(nr); \ > /* fall through */ > #define dbg_case_writeb(nr, array) \ > case (nr): \ > write_debug_bcr((array)[nr].dbgbcr, nr); \ > write_debug_bvr((array)[nr].dbgbvr, nr); \ > /* fall through */ > #define dbg_case_writew(nr, array) \ > case (nr): \ > write_debug_wcr((array)[nr].dbgwcr, nr); \ > write_debug_wvr((array)[nr].dbgwvr, nr); \ > /* fall through */ > > #define dbg_func(rw, type) \ > static void rw ## _dbg ## type(int n, struct dbgregs *array) \ > { \ > switch (n - 1) { \ > dbg_case_ ## rw ## type(15, array); \ > dbg_case_ ## rw ## type(14, array); \ > dbg_case_ ## rw ## type(13, array); \ > dbg_case_ ## rw ## type(12, array); \ > dbg_case_ ## rw ## type(11, array); \ > dbg_case_ ## rw ## type(10, array); \ > dbg_case_ ## rw ## type(9, array); \ > dbg_case_ ## rw ## type(8, array); \ > dbg_case_ ## rw ## type(7, array); \ > dbg_case_ ## rw ## type(6, array); \ > dbg_case_ ## rw ## type(5, array); \ > dbg_case_ ## rw ## type(4, array); \ > dbg_case_ ## rw ## type(3, array); \ > dbg_case_ ## rw ## type(2, array); \ > dbg_case_ ## rw ## type(1, array); \ > dbg_case_ ## rw ## type(0, array); \ > } \ > } > > dbg_func(read, b) > dbg_func(read, w) > dbg_func(write, b) > dbg_func(write, w) > Eh, I guess there's no need to pass 'array' to the case macros. drew