From 5de565f1b07b3e908604a06cc7bea518fed0f35a Mon Sep 17 00:00:00 2001 From: dzaima Date: Tue, 17 Jan 2023 01:01:13 +0200 Subject: [PATCH] use 'debug/printf' for Singeli printf --- build/singeliSubmodule | 2 +- src/singeli/src/base.singeli | 9 ++++- src/singeli/src/debug.singeli | 71 +---------------------------------- 3 files changed, 10 insertions(+), 72 deletions(-) diff --git a/build/singeliSubmodule b/build/singeliSubmodule index 69f494a4..4c05f5ba 160000 --- a/build/singeliSubmodule +++ b/build/singeliSubmodule @@ -1 +1 @@ -Subproject commit 69f494a4ab491cc52522f64516f27b71b18bc85d +Subproject commit 4c05f5ba96b3f83f0f1c10f1d4ee048ba55a13de diff --git a/src/singeli/src/base.singeli b/src/singeli/src/base.singeli index 884d43af..3943f8ed 100644 --- a/src/singeli/src/base.singeli +++ b/src/singeli/src/base.singeli @@ -161,9 +161,14 @@ def forNZ{vars,begin,end,block} = { } def tree_fold{F, x} = { - def h = tuplen{x}/2 - F{tree_fold{F, slice{x,0,h}}, tree_fold{F, slice{x,h,h*2}}} + def h = tuplen{x}>>1 + F{tree_fold{F, slice{x,0,h}}, tree_fold{F, slice{x,h,tuplen{x}}}} } def tree_fold{F, x & tuplen{x}==1} = tupsel{0,x} +def eachx{F, ...args} = { + def l = tree_fold{max, each{{x} => {if(ktup{x}) tuplen{x}; else 0}, args}} + each{F, ...each{{x} => {if (istup{x}) x; else l**x}, args}} +} + def makeregs{v, n} = @collect(n) { reg:=v } diff --git a/src/singeli/src/debug.singeli b/src/singeli/src/debug.singeli index 6d027709..4614fb4a 100644 --- a/src/singeli/src/debug.singeli +++ b/src/singeli/src/debug.singeli @@ -1,71 +1,4 @@ +include 'debug/printf' # printf & lprintf + def assert{x:u1} = { if (not x) emit{void, '__builtin_trap'} } - def test_assert = assert # test_assert is guaranteed to either not exist, or always trap on bad input - -def printf{...vs0} = { - def nsym = ~each{ksym, vs0} - def vs = join{each{{a,b}=>{ - if (b) tup{' ', a} - else tup{a} - }, vs0, nsym & shiftright{tup{0}, nsym}}} - - def listfmt{hex, s, e, vs} = { - if (tuplen{vs}==0) { - tup{merge{s, e}, tup{}} - } else { - def f = each{{v} => runfmt{hex, v}, vs} - def f2 = each{{f1, i} => { - if (i+1 == tuplen{f}) f1 - else merge{f1, tup{tup{',%c', tup{32}}}} - }, f, iota{tuplen{f}}} - tup{ - tup{s, tup{}}, - ...join{f2}, - tup{e, tup{}} - } - } - } - - def runfmt{hex, x} = { - if (ksym{x}) { - each{{c} => { - if (c==' ') tup{'%c', tup{32}} - else tup{c, tup{}} - }, symchars{x}} - } else if (ktup{x}) { - if (tuplen{x}==2 and match{tupsel{0,x}, 'x'}) runfmt{1, tupsel{1,x}} - else listfmt{hex, '{', '}', x} - } else if (kreg{x} or kcon{x}) { - def T = type{x} - if (match{typekind{T},'primitive'}) { - def q = quality{T} - def w = width{T} - def u = (w>1) & (q=='u') - def spec = { - if (q=='f') '%.18g' - else merge{tern{u & hex, '0x', ''}, '%', tern{w==64, 'l', ''}, tern{u, tern{hex, 'x', 'u'}, 'd'}} - } - tup{tup{spec, tup{x}}} - } else if (match{typekind{T},'vector'}) { - listfmt{hex, '[', ']', each{{i} => extract{x, i}, iota{vcount{T}}}} - } else { - tup{tup{'(unknown typekind)', tup{}}} - } - } else if (knum{x}) { - if ((x>>0) == x) { - if (x>=minvalue{i64} and x<=maxvalue{i64}) runfmt{0, i64~~x} - else if (x>=minvalue{u64} and x<=maxvalue{u64}) runfmt{0, u64~~x} - else runfmt{0, f64~~x} - } else runfmt{0, f64~~x} - } else { - tup{tup{'(unknown type)', tup{}}} - } - } - - def is = join{each{{v} => runfmt{0,v}, vs}} - - def e0s = join{each{{x}=>tupsel{0,x}, is}} - def e1s = join{each{{x}=>tupsel{1,x}, is}} - emit{void, 'printf', merge{'"', e0s, '"'}, ...e1s} -} -def lprintf{...vs} = printf{...vs, '\n'}