2 * Copyright (c) 2008 David Crawshaw <david@zentus.com>
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
23 /* "\%g0", always zero, removed due to 31-element class limit */
24 "\%g1", "\%g2", "\%g3", "\%g4", "\%g5", "\%g6", "\%g7",
25 "\%o0", "\%o1", "\%o2", "\%o3", "\%o4", "\%o5", "\%o6", "\%o7",
26 "\%l0", "\%l1", "\%l2", "\%l3", "\%l4", "\%l5", "\%l6", "\%l7",
27 "\%i0", "\%i1", "\%i2", "\%i3", "\%i4", "\%i5", "\%i6", "\%i7",
29 "\%f0", "\%f1", "\%f2", "\%f3", "\%f4", "\%f5", "\%f6", "\%f7",
30 "\%f8", "\%f9", "\%f10", "\%f11", "\%f12", "\%f13", "\%f14", "\%f15",
31 "\%f16", "\%f17", "\%f18", "\%f19", "\%f20", "\%f21", "\%f22", "\%f23",
32 "\%f24", "\%f25", "\%f26", "\%f27", "\%f28", "\%f29", "\%f30",
33 /*, "\%f31" XXX removed due to 31-element class limit */
35 "\%f0", "\%f2", "\%f4", "\%f6", "\%f8", "\%f10", "\%f12", "\%f14",
36 "\%f16", "\%f18", "\%f20", "\%f22", "\%f24", "\%f26", "\%f28", "\%f30",
44 printf(LABFMT
":\n", label
);
48 prologue(struct interpass_prolog
*ipp
)
52 stack
= V9RESERVE
+ V9STEP(p2maxautooff
);
54 for (i
= ipp
->ipp_regs
[0]; i
; i
>>= 1)
58 /* TODO printf("\t.proc %d\n"); */
60 printf("\t.global %s\n", ipp
->ipp_name
);
61 printf("\t.align 4\n");
62 printf("%s:\n", ipp
->ipp_name
);
64 printf("\tsave %%sp,-%d,%%sp\n", stack
);
66 printf("\tsetx -%d,%%g4,%%g1\n", stack
);
67 printf("\tsave %%sp,%%g1,%%sp\n");
72 eoftn(struct interpass_prolog
*ipp
)
75 printf("\trestore\n");
76 printf("\t.type %s,#function\n", ipp
->ipp_name
);
77 printf("\t.size %s,(.-%s)\n", ipp
->ipp_name
, ipp
->ipp_name
);
86 case EQ
: str
= "brz"; break;
87 case NE
: str
= "brnz"; break;
89 case LE
: str
= "brlez"; break;
91 case LT
: str
= "brlz"; break;
93 case GE
: str
= "brgez"; break;
95 case GT
: str
= "brgz"; break;
96 case PLUS
: str
= "add"; break;
97 case MINUS
: str
= "sub"; break;
98 case AND
: str
= "and"; break;
99 case OR
: str
= "or"; break;
100 case ER
: str
= "xor"; break;
102 comperr("unknown hopcode: %d (with %c)", o
, f
);
106 printf("%s%c", str
, f
);
118 return (SZSHORT
/ SZCHAR
);
120 return (SZFLOAT
/ SZCHAR
);
122 return (SZDOUBLE
/ SZCHAR
);
125 return (SZINT
/ SZCHAR
);
130 return SZLONGLONG
/ SZCHAR
;
132 if (!ISPTR(p
->n_type
))
133 comperr("tlen type unknown: %d");
134 return SZPOINT(p
->n_type
) / SZCHAR
;
139 zzzcode(NODE
* p
, int c
)
148 case 'A': /* Add const. */
149 if (ISPTR(l
->n_type
) && l
->n_rval
== FP
)
152 if (SIMM13(r
->n_lval
))
153 expand(p
, 0, "\tadd AL,AR,A1\t\t! add const\n");
155 expand(p
, 0, "\tsetx AR,A3,A2\t\t! add const\n"
158 case 'B': /* Subtract const. */
159 if (ISPTR(l
->n_type
) && l
->n_rval
== FP
)
162 if (SIMM13(r
->n_lval
))
163 expand(p
, 0, "\tsub AL,AR,A1\t\t! subtract const\n");
165 expand(p
, 0, "\tsetx AR,A3,A2\t\t! subtract const\n"
168 case 'C': /* Load constant to register. */
169 if (ISPTR(p
->n_type
))
171 "\tsethi %h44(AL),A1\t\t! load label\n"
172 "\tor A1,%m44(AL),A1\n"
174 "\tor A1,%l44(AL),A1\n");
175 else if (SIMM13(p
->n_lval
))
176 expand(p
, 0, "\tor %g0,AL,A1\t\t\t! load const\n");
178 expand(p
, 0, "\tsetx AL,A2,A1\t\t! load const\n");
180 case 'F': /* Floating-point comparison, cf. hopcode(). */
182 case EQ
: str
= "fbe"; break;
183 case NE
: str
= "fbne"; break;
185 case LE
: str
= "fbule"; break;
187 case LT
: str
= "fbul"; break;
189 case GE
: str
= "fbuge"; break;
191 case GT
: str
= "fbug"; break;
193 case PLUS: str = "add"; break;
194 case MINUS: str = "sub"; break;
195 case AND: str = "and"; break;
196 case OR: str = "or"; break;
197 case ER: str = "xor"; break;*/
199 comperr("unknown float code: %d", p
->n_op
);
205 case 'Q': /* Structure assignment. */
206 /* TODO Check if p->n_stsize is small and use a few ldx's
207 to move the struct instead of memcpy. The equiv.
208 could be done on all the architectures. */
210 printf("\tmov %s,%s\n", rnames
[l
->n_rval
], rnames
[O0
]);
211 if (SIMM13(p
->n_stsize
))
212 printf("\tor %%g0,%d,%%o2\n", p
->n_stsize
);
214 printf("\tsetx %d,%%g1,%%o2\n", p
->n_stsize
);
215 printf("\tcall memcpy\t\t\t! struct assign (dest, src, len)\n");
219 cerror("unknown zzzcode call: %c", c
);
230 fldexpand(NODE
*p
, int cookie
, char **cp
)
232 printf("XXX fldexpand called\n"); /* XXX */
255 conput(FILE * fp
, NODE
* p
)
257 if (p
->n_op
!= ICON
) {
258 comperr("conput got bad op: %s", copst(p
->n_op
));
262 if (p
->n_name
[0] != '\0') {
263 fprintf(fp
, "%s", p
->n_name
);
267 fprintf(fp
, CONFMT
, p
->n_lval
);
269 fprintf(fp
, CONFMT
, p
->n_lval
);
279 upput(NODE
*p
, int size
)
285 adrput(FILE * io
, NODE
* p
)
289 if (p
->n_op
== FLD
) {
290 printf("adrput a FLD\n");
294 if (p
->n_op
== UMUL
&& p
->n_right
== 0)
301 if (p
->n_name
[0] != '\0')
302 fputs(p
->n_name
, io
);
306 fprintf(io
, CONFMT
, (long long int)off
);
309 fprintf(io
, "%s", rnames
[p
->n_rval
]);
313 off
+= V9BIAS
+ V9RESERVE
;
317 fprintf(io
, CONFMT
, (CONSZ
)off
);
320 /* addressable value of the constant */
324 fputs(rnames
[p
->n_rval
], io
);
327 /* We do something odd and store the stack offset in n_rval. */
328 fprintf(io
, "%d", V9BIAS
+ V9RESERVE
+ p
->n_rval
);
331 comperr("bad address, %s, node %p", copst(p
->n_op
), p
);
337 cbgen(int o
, int lab
)
342 myreader(struct interpass
* ipole
)
352 myoptim(struct interpass
* ipole
)
357 rmove(int s
, int d
, TWORD t
)
361 if (t
== FLOAT
) printf("fmovs");
362 else if (t
== DOUBLE
) printf("fmovd");
365 printf(" %s,%s\t\t\t! rmove()\n", rnames
[s
], rnames
[d
]);
384 special(NODE
*p
, int shape
)
389 void mflags(char *str
)
394 COLORMAP(int c
, int *r
)
413 comperr("COLORMAP: unknown class: %d", c
);
418 * Do something target-dependent for xasm arguments.
419 * Supposed to find target-specific constraints and rewrite them.
422 myxasm(struct interpass
*ip
, NODE
*p
)