load: handle all cases in cast()
[qbe.git] / gas.c
blobd339f3ed67c7a97e942108c95ffaada8ec1873d8
1 #include "all.h"
4 char *gasloc, *gassym;
6 void
7 gasemitdat(Dat *d, FILE *f)
9 static int aligned;
10 static char *dtoa[] = {
11 [DAlign] = ".balign",
12 [DB] = "\t.byte",
13 [DH] = "\t.short",
14 [DW] = "\t.int",
15 [DL] = "\t.quad"
17 char *p;
19 switch (d->type) {
20 case DStart:
21 aligned = 0;
22 if (d->u.str) {
23 fprintf(f, ".section %s\n", d->u.str);
24 } else {
25 fprintf(f, ".data\n");
27 break;
28 case DEnd:
29 break;
30 case DName:
31 if (!aligned)
32 fprintf(f, ".balign 8\n");
33 p = d->u.str[0] == '"' ? "" : gassym;
34 if (d->export)
35 fprintf(f, ".globl %s%s\n", p, d->u.str);
36 fprintf(f, "%s%s:\n", p, d->u.str);
37 break;
38 case DZ:
39 fprintf(f, "\t.fill %"PRId64",1,0\n", d->u.num);
40 break;
41 default:
42 if (d->type == DAlign)
43 aligned = 1;
45 if (d->isstr) {
46 if (d->type != DB)
47 err("strings only supported for 'b' currently");
48 fprintf(f, "\t.ascii %s\n", d->u.str);
50 else if (d->isref) {
51 p = d->u.ref.nam[0] == '"' ? "" : gassym;
52 fprintf(f, "%s %s%s%+"PRId64"\n",
53 dtoa[d->type], p, d->u.ref.nam,
54 d->u.ref.off);
56 else {
57 fprintf(f, "%s %"PRId64"\n",
58 dtoa[d->type], d->u.num);
60 break;
64 typedef struct Asmbits Asmbits;
66 struct Asmbits {
67 char bits[16];
68 int size;
69 Asmbits *link;
72 static Asmbits *stash;
74 int
75 gasstash(void *bits, int size)
77 Asmbits **pb, *b;
78 int i;
80 assert(size == 4 || size == 8 || size == 16);
81 for (pb=&stash, i=0; (b=*pb); pb=&b->link, i++)
82 if (size <= b->size)
83 if (memcmp(bits, b->bits, size) == 0)
84 return i;
85 b = emalloc(sizeof *b);
86 memcpy(b->bits, bits, size);
87 b->size = size;
88 b->link = 0;
89 *pb = b;
90 return i;
93 void
94 gasemitfin(FILE *f)
96 Asmbits *b;
97 char *p;
98 int sz, i;
99 double d;
101 if (!stash)
102 return;
103 fprintf(f, "/* floating point constants */\n.data\n");
104 for (sz=16; sz>=4; sz/=2)
105 for (b=stash, i=0; b; b=b->link, i++) {
106 if (b->size == sz) {
107 fprintf(f,
108 ".balign %d\n"
109 "%sfp%d:",
110 sz, gasloc, i
112 for (p=b->bits; p<&b->bits[sz]; p+=4)
113 fprintf(f, "\n\t.int %"PRId32,
114 *(int32_t *)p);
115 if (sz <= 8) {
116 if (sz == 4)
117 d = *(float *)b->bits;
118 else
119 d = *(double *)b->bits;
120 fprintf(f, " /* %f */\n", d);
121 } else
122 fprintf(f, "\n");
125 while ((b=stash)) {
126 stash = b->link;
127 free(b);
129 fprintf(f, ".section .note.GNU-stack,\"\",@progbits\n");