use 'debug/printf' for Singeli printf
This commit is contained in:
parent
10c98685ab
commit
5de565f1b0
@ -1 +1 @@
|
|||||||
Subproject commit 69f494a4ab491cc52522f64516f27b71b18bc85d
|
Subproject commit 4c05f5ba96b3f83f0f1c10f1d4ee048ba55a13de
|
||||||
@ -161,9 +161,14 @@ def forNZ{vars,begin,end,block} = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
def tree_fold{F, x} = {
|
def tree_fold{F, x} = {
|
||||||
def h = tuplen{x}/2
|
def h = tuplen{x}>>1
|
||||||
F{tree_fold{F, slice{x,0,h}}, tree_fold{F, slice{x,h,h*2}}}
|
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 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 }
|
def makeregs{v, n} = @collect(n) { reg:=v }
|
||||||
|
|||||||
@ -1,71 +1,4 @@
|
|||||||
|
include 'debug/printf' # printf & lprintf
|
||||||
|
|
||||||
def assert{x:u1} = { if (not x) emit{void, '__builtin_trap'} }
|
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 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'}
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user