From b9b3428e0132c359e84463afc5286a2e520be7de Mon Sep 17 00:00:00 2001 From: George Koehler Date: Wed, 25 Apr 2018 00:17:19 -0400 Subject: [PATCH] Build (but don't use) libfp for cpm. This library is for software floating point. The i80 back end has never implemented floating point, and might not be ready for libfp. This commit only builds libfp without using it. I edit first/build.lua and plat/build.lua to allow `ack -c.s`, then use FP.script to edit the assembly code. I edit FP.script so it writes the edited assembly code to stdout, not to the input file. --- first/build.lua | 3 ++- mach/proto/fp/FP.script | 2 +- mach/proto/fp/build.lua | 53 +++++++++++++++++++++++++++++++++++++++++ plat/build.lua | 32 ++++++++++++++++--------- 4 files changed, 77 insertions(+), 13 deletions(-) create mode 100644 mach/proto/fp/build.lua diff --git a/first/build.lua b/first/build.lua index b9fa0ab1f..2f56bf0c6 100644 --- a/first/build.lua +++ b/first/build.lua @@ -40,6 +40,7 @@ definerule("cfile", { srcs = { type="targets" }, deps = { type="targets", default={} }, + suffix = { type="string", default=".o" }, commands = { type="strings", default={ @@ -56,7 +57,7 @@ definerule("cfile", end hdrpaths = uniquify(hdrpaths) - local outleaf = basename(e.name)..".o" + local outleaf = basename(e.name)..e.suffix return normalrule { name = e.name, diff --git a/mach/proto/fp/FP.script b/mach/proto/fp/FP.script index de2c407ed..22bda6b90 100644 --- a/mach/proto/fp/FP.script +++ b/mach/proto/fp/FP.script @@ -37,5 +37,5 @@ g/_b64_add/s//.b64_add/g g/_b64_sft/s//.b64_sft/g g/_b64_rsft/s//.b64_rsft/g g/_b64_lsft/s//.b64_lsft/g -w +1,$p q diff --git a/mach/proto/fp/build.lua b/mach/proto/fp/build.lua new file mode 100644 index 000000000..2a0f1b39c --- /dev/null +++ b/mach/proto/fp/build.lua @@ -0,0 +1,53 @@ +include("plat/build.lua") + +-- For now, all floats are little-endian. +local byte_order = "mach/i86/libfp/byte_order.h" + +-- For now, only cpm uses software floating-point. +for _, plat in ipairs({"cpm"}) do + local edits = {} + for _, src in fpairs("./*.c", "./*.e") do + + -- Compile each src file into assembly code. + local n = basename(src):gsub("%.%w*$", "") + local assembly = ackfile { + name = "s_"..plat.."/"..n, + srcs = { src }, + deps = { + "./*.h", + byte_order, + }, + suffix = ".s", + vars = { + ackcflags = "-I"..dirname(byte_order), + plat = plat + } + } + + -- Run FP.script to edit the assembly code. + edits[#edits+1] = normalrule { + name = "ed_"..plat.."/"..n, + ins = { + "./FP.script", + assembly, + }, + outleaves = { n..".s" }, + commands = { + "ed -s %{ins[2]} <%{ins[1]} >%{outs}" + } + } + end + + acklibrary { + name = "lib_"..plat, + srcs = { edits }, + vars = { plat = plat } + } + + installable { + name = "pkg_"..plat, + map = { + ["$(PLATIND)/"..plat.."/libfp.a"] = "+lib_"..plat, + } + } +end diff --git a/plat/build.lua b/plat/build.lua index 6fc96f85d..439a80c5d 100644 --- a/plat/build.lua +++ b/plat/build.lua @@ -8,8 +8,10 @@ definerule("ackfile", { srcs = { type="targets" }, deps = { type="targets", default={} }, + suffix = { type="string", default=".o" }, }, function (e) + local c = (e.suffix == ".o" and "-c" or "-c"..e.suffix) local plat = e.vars.plat return cfile { @@ -28,8 +30,9 @@ definerule("ackfile", "util/misc+pkg", e.deps }, + suffix = e.suffix, commands = { - "ACKDIR=$(INSDIR) $(INSDIR)/bin/ack -m%{plat} -c -o %{outs} %{ins} %{hdrpaths} %{ackcflags}" + "ACKDIR=$(INSDIR) $(INSDIR)/bin/ack -m%{plat} "..c.." -o %{outs} %{ins} %{hdrpaths} %{ackcflags}" } } end @@ -100,18 +103,25 @@ definerule("build_plat_libs", plat = { type="string" }, }, function(e) + local installmap = { + "lang/b/lib+pkg_"..e.plat, + "lang/basic/lib+pkg_"..e.plat, + "lang/cem/libcc.ansi+pkg_"..e.plat, + "lang/m2/libm2+pkg_"..e.plat, + "lang/pc/libpc+pkg_"..e.plat, + "lang/b/lib+pkg_"..e.plat, + ["$(PLATIND)/"..e.plat.."/libem.a"] = "mach/"..e.arch.."/libem+lib_"..e.plat, + ["$(PLATIND)/"..e.plat.."/libend.a"] = "mach/"..e.arch.."/libend+lib_"..e.plat, + } + + -- For now, only cpm uses software floating-point. + if e.plat == "cpm" then + installmap[#installmap+1] = "mach/proto/fp+pkg_"..e.plat + end + return installable { name = e.name, - map = { - "lang/b/lib+pkg_"..e.plat, - "lang/basic/lib+pkg_"..e.plat, - "lang/cem/libcc.ansi+pkg_"..e.plat, - "lang/m2/libm2+pkg_"..e.plat, - "lang/pc/libpc+pkg_"..e.plat, - "lang/b/lib+pkg_"..e.plat, - ["$(PLATIND)/"..e.plat.."/libem.a"] = "mach/"..e.arch.."/libem+lib_"..e.plat, - ["$(PLATIND)/"..e.plat.."/libend.a"] = "mach/"..e.arch.."/libend+lib_"..e.plat, - } + map = installmap, } end )