aboutsummaryrefslogtreecommitdiff
path: root/src/asm.cff
diff options
context:
space:
mode:
Diffstat (limited to 'src/asm.cff')
-rw-r--r--src/asm.cff109
1 files changed, 0 insertions, 109 deletions
diff --git a/src/asm.cff b/src/asm.cff
deleted file mode 100644
index a92e14d..0000000
--- a/src/asm.cff
+++ /dev/null
@@ -1,109 +0,0 @@
-import "cffc.hff";
-import "common.hff";
-
-struct ASM {
- outf *FILE,
- lastsection enum { none, data, text },
-
- fn gen(A *ASM, fmt *const u8, ...) void {
- let ap va_list #?;
- ap->start(fmt);
- fn fmtproc(c u8, fp *void) void {
- fputc(c, fp);
- }
- for let c = *fmt; c != 0; c = *++fmt {
- if c != '%' {
- fputc(c, A.outf);
- continue;
- }
- switch (c = *++fmt) {
- case 's';
- fprintf(A.outf, "%s", ap->arg(*const u8));
- case 'd';
- fprintf(A.outf, "%d", ap->arg(int));
- case 'I';
- fprintf(A.outf, "%lld", as(c_llong) ap->arg(i64));
- case 'f';
- fprintf(A.outf, "%.17f", ap->arg(f64));
- case 'z';
- fprintf(A.outf, "%llu", as(c_ullong) ap->arg(usize));
- case 'S';
- pfmt(&fmtproc, A.outf, "%S", ap->arg([#]const u8));
- case else
- assert(#f, "bad fmt '%c'", c);
- }
- }
- ap->end();
- }
-}
-
-fn init(B *Backend, outf *FILE) void {
- B.impl = calloc(1, sizeof ASM);
- let impl *ASM = B.impl;
- impl.outf = outf;
-}
-
-static directive4size []*const u8 = {
- [1] = "byte",
- [2] = "short",
- [4] = "int",
- [8] = "quad"
-};
-
-fn gendata(A *ASM, ty *const Type, ex *Expr) void {
- switch ex.u {
- case ZeroIni;
- A->gen(".fill %z", ty.size);
- case IntLit i;
- A->gen(".%s %I", directive4size[ty.size], i.i);
- case FloLit f;
- A->gen(".%s %f", ty.size == 4 ? "single" : "double", f);
- case StrLit s;
- if ty->is(:Arr) {
- A->gen(".ascii %S", s);
- } else {
- static id int = 0;
- A->gen(".%s strlit%d.", directive4size[g_targ.ptrsize], id);
- A->gen("\nstrlit%d.:\n\t.ascii %S", id++, s);
- }
- case else
- assert(#f, "NYI data");
- }
-}
-
-fn genstatic(A *ASM, decl *Decl) void {
- if decl.u.Static.fwd {
- return;
- }
- if A.lastsection != :data {
- A->gen(".section data\n");
- A.lastsection = :data;
- }
- if decl.externp {
- A->gen(".globl %s\n%s:\n", decl.name, decl.name);
- } else {
- A->gen("%s.s%d:\n", decl.name, decl.u.Static.id);
- }
- A->gen("\t.align %z\n", decl.u.Static.ty.align);
- switch decl.u.Static.ini {
- case None;
- A->gen("\t.fill %z\n", decl.u.Static.ty.size);
- case Some *ex;
- A->gen("\t");
- gendata(A, decl.u.Static.ty, ex);
- A->gen("\n");
- }
-}
-
-fn bgenstatic(B *Backend, decl *Decl) void {
- genstatic(B.impl, decl);
-}
-
-fn bgenfn(B *Backend, Fn *Fn) void {
-}
-
-extern static g_asmbackend Backend = {
- .initf: &init,
- .genstaticf: &bgenstatic,
- .genfnf: &bgenfn,
-};