cvsuser 02/07/24 07:19:27
Modified: languages/imcc imcc.l imcc.y
Log:
Add "global", "set_addr", and "clone" support.
Set IF_r0_read for "set Px, Ay".
Revision Changes Path
1.5 +5 -2 parrot/languages/imcc/imcc.l
Index: imcc.l
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.l,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -w -r1.4 -r1.5
--- imcc.l 11 Jul 2002 21:09:12 -0000 1.4
+++ imcc.l 24 Jul 2002 14:19:27 -0000 1.5
@@ -74,6 +74,9 @@
"float" return(FLOAT);
"new" return(NEW);
"defined" return(DEFINED);
+"addr" return(ADDR);
+"global" return(GLOBAL);
+"clone" return(CLONE);
"string" return(STRING);
"call" return(CALL);
"print" return(PRINT);
1.10 +77 -4 parrot/languages/imcc/imcc.y
Index: imcc.y
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.y,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -w -r1.9 -r1.10
--- imcc.y 22 Jul 2002 19:54:38 -0000 1.9
+++ imcc.y 24 Jul 2002 14:19:27 -0000 1.10
@@ -28,7 +28,15 @@
* many are polymorphic.
*/
SymReg * iMOVE(SymReg *r0, SymReg*r1) {
+ if (r0->set == 'P' && r1->set != 'P') {
+ /* r0 needs read access because set Px, Ax calls Px's set
+ * method, instead of just clobbering it. */
+ emitb(mk_instruction("set %s, %s", r0, r1, NULL, NULL,
+ IF_r0_write|IF_r0_read|IF_r1_read));
+ }
+ else {
emitb(mk_instruction("set %s, %s", r0, r1, NULL, NULL, IF_unary));
+ }
return r0;
}
@@ -147,7 +155,8 @@
}
SymReg * iLABEL(SymReg * r0) {
- Instruction *i = emitb(mk_instruction("%s:", r0, NULL, NULL, NULL,
IF_r0_read)); /* IF_r0_read ? */
+ Instruction *i = emitb(mk_instruction("%s:", r0, NULL, NULL, NULL,
+ 0)); /* IF_r0_read ? */
i->type = ITLABEL;
return r0;
}
@@ -214,7 +223,9 @@
emitb(mk_instruction("substr %s, %s, 1, %s", r0, r1, r2, NULL, IF_binary));
}
else if (r0->set == 'P') {
- emitb(mk_instruction("set %s[%s], %s", r0, r1, r2, NULL, IF_binary));
+ /* XXX: SEAN: is "read" right for setting an array? */
+ emitb(mk_instruction("set %s[%s], %s", r0, r1, r2, NULL,
+ IF_r0_read | IF_r1_read | IF_r2_read));
}
else {
fprintf(stderr, "FIXME: Internal error, unsupported indexed set
operation\n");
@@ -264,6 +275,57 @@
return r0;
}
+SymReg * iSET_ADDR(SymReg * r0, SymReg * r1) {
+ if (r0->set == 'I') {
+ emitb(mk_instruction("set_addr %s, %s", r0, r1, NULL, NULL,
+ IF_r0_write));
+ }
+ else {
+ fprintf(stderr, "line %ld: Syntax error, set_addr destination must be int
register\n", line);
+ exit(EX_DATAERR);
+ }
+ return r0;
+}
+
+SymReg * iSET_GLOBAL(SymReg * r0, SymReg * r1) {
+ if (r0->set == 'S' && r1->set == 'P') {
+ emitb(mk_instruction("store_global %s, %s", r1, r0,
+ NULL, NULL, IF_r0_read | IF_r1_read));
+ }
+ else {
+ fprintf(stderr, "line %ld: store_global arguments must be PMC, string\n",
+ line);
+ exit(EX_DATAERR);
+ }
+ return r0;
+}
+
+SymReg * iGET_GLOBAL(SymReg * r0, SymReg * r1) {
+ if (r0->set == 'P' && r1->set == 'S') {
+ emitb(mk_instruction("find_global %s, %s", r0, r1,
+ NULL, NULL, IF_r0_write | IF_r1_read));
+ }
+ else {
+ fprintf(stderr, "line %ld: find_global arguments must be PMC, string\n",
+ line);
+ exit(EX_DATAERR);
+ }
+ return r0;
+}
+
+SymReg * iCLONE(SymReg * r0, SymReg * r1) {
+ if (r0->set == r1->set && (r0->set == 'S' || r0->set == 'P')) {
+ emitb(mk_instruction("clone %s, %s", r0, r1,
+ NULL, NULL, IF_r0_write | IF_r1_read));
+ }
+ else {
+ fprintf(stderr, "line %ld: clone arguments must be PMCs or strings\n",
+ line);
+ exit(EX_DATAERR);
+ }
+ return r0;
+}
+
SymReg * iEMIT(char * assembly) {
emitb(mk_instruction(assembly, NULL, NULL, NULL, NULL, 0));
return 0;
@@ -300,13 +362,14 @@
%token <i> SUB NAMESPACE CLASS ENDCLASS SYM LOCAL PARAM PUSH POP INC DEC
%token <i> SHIFT_LEFT SHIFT_RIGHT INT FLOAT STRING DEFINED LOG_XOR
%token <i> RELOP_EQ RELOP_NE RELOP_GT RELOP_GTE RELOP_LT RELOP_LTE
+%token <i> GLOBAL ADDR CLONE
%token <s> EMIT LABEL
%token <s> IREG NREG SREG PREG IDENTIFIER STRINGC INTC FLOATC
%type <i> type program globals classes class subs sub sub_start relop
%type <s> classname
%type <sr> labels label statements statement
%type <sr> instruction assignment if_statement
-%type <sr> target reg const var rc
+%type <sr> target reg const var rc string
%start program
@@ -428,6 +491,10 @@
| labels var '[' var ']' '=' var { $$ = iINDEXSET($2, $4, $7); }
| labels target '=' NEW classname { $$ = iNEW($2, $5); }
| labels target '=' DEFINED var { $$ = iDEFINED($2, $5); }
+ | labels target '=' CLONE var { $$ = iCLONE($2, $5); }
+ | labels target '=' ADDR IDENTIFIER { $$ = iSET_ADDR($2,
mk_address($5)); }
+ | labels target '=' GLOBAL string { $$ = iGET_GLOBAL($2, $5); }
+ | labels GLOBAL string '=' var { $$ = iSET_GLOBAL($3, $5); }
;
if_statement:
@@ -483,6 +550,12 @@
{ $$ = mk_const($1, 'S'); }
;
+string:
+ SREG
+ { $$ = mk_symreg($1, 'S'); }
+ | STRINGC
+ { $$ = mk_const($1, 'S'); }
+ ;
%%
extern FILE *yyin;