7 gasemitlnk(char *n
, Lnk
*l
, char *s
, FILE *f
)
12 fprintf(f
, ".section %s", l
->sec
);
14 fprintf(f
, ", %s", l
->secf
);
20 fprintf(f
, ".balign %d\n", l
->align
);
21 p
= n
[0] == '"' ? "" : gassym
;
23 fprintf(f
, ".globl %s%s\n", p
, n
);
24 fprintf(f
, "%s%s:\n", p
, n
);
28 gasemitdat(Dat
*d
, FILE *f
)
30 static char *dtoa
[] = {
45 gasemitlnk(d
->name
, d
->lnk
, ".bss", f
);
46 fprintf(f
, "\t.fill %"PRId64
",1,0\n", zero
);
53 fprintf(f
, "\t.fill %"PRId64
",1,0\n", d
->u
.num
);
57 gasemitlnk(d
->name
, d
->lnk
, ".data", f
);
59 fprintf(f
, "\t.fill %"PRId64
",1,0\n", zero
);
64 err("strings only supported for 'b' currently");
65 fprintf(f
, "\t.ascii %s\n", d
->u
.str
);
68 p
= d
->u
.ref
.name
[0] == '"' ? "" : gassym
;
69 fprintf(f
, "%s %s%s%+"PRId64
"\n",
70 dtoa
[d
->type
], p
, d
->u
.ref
.name
,
74 fprintf(f
, "%s %"PRId64
"\n",
75 dtoa
[d
->type
], d
->u
.num
);
81 typedef struct Asmbits Asmbits
;
89 static Asmbits
*stash
;
92 gasstash(void *bits
, int size
)
97 assert(size
== 4 || size
== 8 || size
== 16);
98 for (pb
=&stash
, i
=0; (b
=*pb
); pb
=&b
->link
, i
++)
100 if (memcmp(bits
, b
->bits
, size
) == 0)
102 b
= emalloc(sizeof *b
);
103 memcpy(b
->bits
, bits
, size
);
120 fprintf(f
, "/* floating point constants */\n.data\n");
121 for (sz
=16; sz
>=4; sz
/=2)
122 for (b
=stash
, i
=0; b
; b
=b
->link
, i
++) {
129 for (p
=b
->bits
; p
<&b
->bits
[sz
]; p
+=4)
130 fprintf(f
, "\n\t.int %"PRId32
,
134 d
= *(float *)b
->bits
;
136 d
= *(double *)b
->bits
;
137 fprintf(f
, " /* %f */\n", d
);