Bolt mcg into the PowerPC backend. It doesn't build yet, but it is generating
authorDavid Given <dg@cowlark.com>
Sun, 16 Oct 2016 22:06:06 +0000 (00:06 +0200)
committerDavid Given <dg@cowlark.com>
Sun, 16 Oct 2016 22:06:06 +0000 (00:06 +0200)
*some* code.

build.lua
first/ackbuilder.lua
mach/powerpc/mcg/platform.c [moved from mach/proto/mcg/powerpc.c with 100% similarity]
mach/powerpc/mcg/table [moved from mach/proto/mcg/table with 99% similarity]
mach/proto/mcg/build.lua
mach/proto/mcg/treebuilder.c
plat/build.lua
plat/linuxppc/build-tools.lua
plat/linuxppc/descr

index 46d5b63..05a4eaf 100644 (file)
--- a/build.lua
+++ b/build.lua
@@ -33,7 +33,6 @@ installable {
                "util/misc+pkg",
                "util/opt+pkg",
                "examples+pkg",
-               "mach/proto/mcg+pkg",
                plat_packages
        }
 }
index 282e6f1..274ef11 100644 (file)
@@ -453,7 +453,7 @@ loadtarget = function(targetname)
                target = targets[targetname]
                if not target then
                        error(string.format("build file '%s' contains no target '%s'",
-                               filename, targetpart))
+                               filepart, targetpart))
                end
        end
 
similarity index 99%
rename from mach/proto/mcg/table
rename to mach/powerpc/mcg/table
index d744dbb..95ba2a9 100644 (file)
@@ -423,6 +423,10 @@ PATTERNS
         emit "subf %out, %out, %left"
                cost 12;
 
+       out:(int)reg = MUL4(left:(int)reg, right:(int)reg)
+               emit "mullw %out, %left, %right"
+               cost 4;
+
        out:(int)reg = DIV4(left:(int)reg, right:(int)reg)
                emit "divw %out, %left, %right"
                cost 4;
index 8fc41be..387d14d 100644 (file)
@@ -1,43 +1,51 @@
 include("util/mcgg/build.lua")
 
-mcgg {
-       name = "mcgg_c",
-       srcs = { "./table" }
-}
-
-cprogram {
-       name = "mcg",
-       srcs = {
-               "./*.c",
-               matching(filenamesof("+mcgg_c"), "%.c$"),
-       },
-       deps = {
-               "+mcgg_c",
-               "./*.h",
-               "h+emheaders",
-               "modules+headers",
-               "modules/src/alloc+lib",
-               "modules/src/data+lib",
-               "modules/src/em_code+lib_k",
-               "modules/src/em_data+lib",
-               "modules/src/idf+lib",
-               "modules/src/read_em+lib_ev",
-               "modules/src/string+lib",
-               "modules/src/system+lib",
-               "util/mcgg+lib",
+definerule("build_mcg",
+       {
+               arch = { type="string" }
        },
-       vars = {
-               ["+cflags"] = {
-                       "-Werror-implicit-function-declaration",
+       function(e)
+               -- Remember this is executed from the caller's directory; local
+               -- target names will resolve there
+               local headers = clibrary {
+                       name = e.name.."/headers",
+                       srcs = {},
+                       hdrs = {
+                               "mach/proto/mcg/*.h",
+                               "mach/"..e.arch.."/mcg/*.h",
+                       }
                }
-       }
-}
 
--- Just for test purposes for now
-installable {
-       name = "pkg",
-       map = {
-               ["$(PLATDEP)/mcg"] = "+mcg"
-       }
-}
+               local tables = mcgg {
+                       name = e.name.."/tables",
+                       srcs = { "mach/"..e.arch.."/mcg/table" }
+               }
+
+               return cprogram {
+                       name = e.name,
+                       srcs = {
+                               "mach/proto/mcg/*.c",
+                               "mach/"..e.arch.."/mcg/platform.c",
+                               matching(filenamesof(tables), "%.c$")
+                       },
+                       deps = {
+                               "h+emheaders",
+                               "modules+headers",
+                               "modules/src/alloc+lib",
+                               "modules/src/data+lib",
+                               "modules/src/em_code+lib_k",
+                               "modules/src/em_data+lib",
+                               "modules/src/flt_arith+lib",
+                               "modules/src/idf+lib",
+                               "modules/src/object+lib",
+                               "modules/src/read_em+lib_kv",
+                               "modules/src/string+lib",
+                               "modules/src/system+lib",
+                               "util/mcgg+lib",
+                               headers,
+                               tables, -- for .h file
+                       }
+               }
+       end
+)
 
index cf25de4..e3d0f52 100644 (file)
@@ -441,12 +441,13 @@ static void insn_ivalue(int opcode, arith value)
         case op_rmi: simple_alu2(opcode, value, IR_MOD); break;
         case op_sli: simple_alu2(opcode, value, IR_ASL); break;
         case op_sri: simple_alu2(opcode, value, IR_ASR); break;
-        case op_slu: simple_alu2(opcode, value, IR_LSL); break;
-        case op_sru: simple_alu2(opcode, value, IR_LSR); break;
         case op_ngi: simple_alu1(opcode, value, IR_NEG); break;
 
         case op_adu: simple_alu2(opcode, value, IR_ADD); break;
         case op_sbu: simple_alu2(opcode, value, IR_SUB); break;
+        case op_mlu: simple_alu2(opcode, value, IR_MUL); break;
+        case op_slu: simple_alu2(opcode, value, IR_LSL); break;
+        case op_sru: simple_alu2(opcode, value, IR_LSR); break;
 
         case op_and: simple_alu2(opcode, value, IR_AND); break;
         case op_ior: simple_alu2(opcode, value, IR_OR); break;
index dc0e87c..a6774b9 100644 (file)
@@ -1,5 +1,6 @@
 include("mach/proto/as/build.lua")
 include("mach/proto/ncg/build.lua")
+include("mach/proto/mcg/build.lua")
 include("mach/proto/top/build.lua")
 
 definerule("ackfile",
index 4d0f004..84f6e77 100644 (file)
@@ -5,8 +5,8 @@ build_as {
        arch = "powerpc",
 }
 
-build_ncg {
-       name = "ncg",
+build_mcg {
+       name = "mcg",
        arch = "powerpc",
 }
 
@@ -14,7 +14,7 @@ return installable {
        name = "tools",
        map = {
                ["$(PLATDEP)/linuxppc/as"] = "+as",
-               ["$(PLATDEP)/linuxppc/ncg"] = "+ncg",
+               ["$(PLATDEP)/linuxppc/mcg"] = "+mcg",
                ["$(PLATIND)/descr/linuxppc"] = "./descr",
                "util/opt+pkg",
        }
index b706802..770e883 100644 (file)
@@ -35,7 +35,7 @@ var C_INCLUDES=-I{PLATFORMDIR}/include -I{EM}/share/ack/include/ansi
 name be
        from .m.g
        to .s
-       program {EM}/lib/ack/{PLATFORM}/ncg
+       program {EM}/lib/ack/{PLATFORM}/mcg
        mapflag -gdb GF=-gdb
        args {GF?} <
        stdout