cvsuser 02/08/09 13:11:18
Modified: languages/imcc imcc.l imcc.y
Log:
Some mods from Leopold (result,return, pow and unless) added to imcc.
Revision Changes Path
1.6 +4 -0 parrot/languages/imcc/imcc.l
Index: imcc.l
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.l,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -w -r1.5 -r1.6
--- imcc.l 24 Jul 2002 14:19:27 -0000 1.5
+++ imcc.l 9 Aug 2002 20:11:18 -0000 1.6
@@ -59,6 +59,8 @@
".sym" return(SYM);
".arg" return(ARG);
".sub" return(SUB);
+".result" return(RESULT);
+".return" return(RETURN);
".class" return(CLASS);
".endclass" return(ENDCLASS);
".namespace" return(NAMESPACE);
@@ -68,6 +70,7 @@
"end" return(END);
"goto" return(GOTO);
"if" return(IF);
+"unless" return(UNLESS);
"int" return(INT);
"inc" return(INC);
"dec" return(DEC);
@@ -94,6 +97,7 @@
">=" return(RELOP_GTE);
"==" return(RELOP_EQ);
"!=" return(RELOP_NE);
+"**" return(POW);
{LETTER}{LETTERDIGIT}*":" {
yytext[yyleng-1] = 0; /* trim last ':' */
1.13 +22 -5 parrot/languages/imcc/imcc.y
Index: imcc.y
===================================================================
RCS file: /cvs/public/parrot/languages/imcc/imcc.y,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -w -r1.12 -r1.13
--- imcc.y 8 Aug 2002 13:37:52 -0000 1.12
+++ imcc.y 9 Aug 2002 20:11:18 -0000 1.13
@@ -82,6 +82,10 @@
return r0;
}
+SymReg * iPOW(SymReg *r0, SymReg*r1, SymReg *r2) {
+ emitb(mk_instruction("pow %s, %s, %s", r0, r1, r2, NULL, IF_binary));
+ return r0;
+}
SymReg * iDIV(SymReg *r0, SymReg*r1, SymReg *r2) {
emitb(mk_instruction("div %s, %s, %s", r0, r1, r2, NULL, IF_binary));
return r0;
@@ -176,6 +180,14 @@
return r0;
}
+SymReg * iRESULT(SymReg * r0) {
+ return iPOP(r0);
+}
+
+SymReg * iRETURN(SymReg * r0) {
+ return iPUSH(r0);
+}
+
SymReg * iSAVEALL() {
emitb(mk_instruction("saveall", NULL, NULL, NULL, NULL, 0));
return 0;
@@ -244,11 +256,11 @@
return 0;
}
-SymReg * iIF1(SymReg * r0, SymReg * dest)
+SymReg * iIF1(char *f, SymReg * r0, SymReg * dest)
{
Instruction * i;
char op[256];
- strcpy(op, "if %s, %s");
+ sprintf(op, "%s %%s, %%s", f);
i = emitb(mk_instruction(op, r0, dest, 0, NULL, IF_r0_read | IF_r1_branch));
i->type = ITBRANCH;
return 0;
@@ -358,11 +370,11 @@
SymReg * sr;
}
-%token <i> CALL GOTO BRANCH ARG RET PRINT IF NEW END SAVEALL RESTOREALL
+%token <i> CALL GOTO BRANCH ARG RET PRINT IF UNLESS NEW END SAVEALL RESTOREALL
%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 <i> GLOBAL ADDR CLONE RESULT RETURN POW
%token <s> EMIT LABEL
%token <s> IREG NREG SREG PREG IDENTIFIER STRINGC INTC FLOATC
%type <i> type program subs sub sub_start relop
@@ -434,6 +446,8 @@
| labels PARAM type IDENTIFIER { $$ = iPOP(mk_ident($4, $3));}
| labels PARAM reg { $$ = iPOP($3); }
| labels ARG var { $$ = iARG($3); }
+ | labels RESULT var { $$ = iRESULT($3); }
+ | labels RETURN var { $$ = iRETURN($3); }
| labels CALL IDENTIFIER { $$ = iCALL(mk_address($3)); }
| labels GOTO IDENTIFIER { $$ = iBRANCH(mk_address($3));}
| labels PUSH var { $$ = iPUSH($3); }
@@ -464,6 +478,7 @@
| labels target '=' var '+' var { $$ = iADD($2, $4, $6); }
| labels target '=' var '-' var { $$ = iSUB($2, $4, $6); }
| labels target '=' var '*' var { $$ = iMUL($2, $4, $6); }
+ | labels target '=' var POW var { $$ = iPOW($2, $4, $6); }
| labels target '=' var '/' var { $$ = iDIV($2, $4, $6); }
| labels target '=' var '%' var { $$ = iMOD($2, $4, $6); }
| labels target '=' var '.' var { $$ = iCONCAT($2, $4, $6); }
@@ -487,7 +502,9 @@
labels IF var relop var GOTO IDENTIFIER
{ $$ = iIF($4, $3, $5, mk_address($7)); }
| labels IF var GOTO IDENTIFIER
- { $$ = iIF1($3, mk_address($5)); }
+ { $$ = iIF1("if",$3, mk_address($5)); }
+ | labels UNLESS var GOTO IDENTIFIER
+ { $$ = iIF1("unless", $3, mk_address($5)); }
;
relop: