CScript 論理和/論理積に定数畳み込み最適化を実装
authorIssei Suzuki <issei@issei.org>
Fri Aug 17 15:56:41 2007 +0900 (16 months ago)
changeset 5426e81b5158064
parent 5419b3fd6b93979
child 543c6123a22c05a
CScript 論理和/論理積に定数畳み込み最適化を実装
tool/src/cscript/code/parser.y
--- a/tool/src/cscript/code/parser.y Fri Aug 17 13:45:36 2007 +0900
+++ b/tool/src/cscript/code/parser.y Fri Aug 17 15:56:41 2007 +0900
@@ -1149,10 +1149,58 @@ node_assignment_expression:
expr->setCast(Cast::INT);
if ((cast1 != Cast::ERROR && cast1 != Cast::INT) ||
- (cast2 != Cast::ERROR && cast2 != Cast::INT))
+ (cast2 != Cast::ERROR && cast2 != Cast::INT)) {
yyerror(std::string("operation `||' not defined [") + cast1.getStr() + "]");
- else
+ }
+#ifdef CSCR_CONSTANT_FOLDING_ENALBE
+ /*
+ ---------+--------------------------------------
+ | expr2
+ expr1 | 0 !=0 非定数
+ =========+======================================
+ 0 | 0 1 [expr2]
+ !=0 | 1 1 (*1)
+ 非定数 | [expr2] (*2) (最適化不可)
+ ---------+--------------------------------------
+
+ (*1)
+ [expr2]
+ shrink sizeof(expr2)
+ push 1
+ (*2)
+ [expr1]
+ shrink sizeof(expr1)
+ push 1
+ */
+ else if (expr1->isConst() && expr2->isConst()) {
+ expr->addGenCode(bl::bind(
+ &Comp::genCodePUSH_I,
+ bl::_1,
+ expr1->getVal<vm_int_t>() && expr2->getVal<vm_int_t>()
+ ));
+ }
+ else if (expr1->isConst()) {
+ if (expr1->getVal<vm_int_t>() == 0) {
+ expr = expr2;
+ } else { // expr1 != 0
+ expr->addGenCode(*expr2);
+ expr->addGenCode(bl::bind(&Comp::genCodeSHRINK, bl::_1, expr2->getCast().getSize()));
+ expr->addGenCode(bl::bind(&Comp::genCodePUSH_I, bl::_1, 1));
+ }
+ }
+ else if (expr2->isConst()) {
+ if (expr2->getVal<vm_int_t>() == 0) {
+ expr = expr1;
+ } else { // expr2 != 0
+ expr->addGenCode(*expr1);
+ expr->addGenCode(bl::bind(&Comp::genCodeSHRINK, bl::_1, expr2->getCast().getSize()));
+ expr->addGenCode(bl::bind(&Comp::genCodePUSH_I, bl::_1, 1));
+ }
+ }
+#endif // CSCR_CONSTANT_FOLDING_ENALBE
+ else {
expr->addGenCode(GenCodeLogicalOr(expr1, expr2));
+ }
$$ = expr;
}
| node_assignment_expression TOK_AND node_assignment_expression
@@ -1166,10 +1214,52 @@ node_assignment_expression:
expr->setCast(Cast::INT);
if ((cast1 != Cast::ERROR && cast1 != Cast::INT) ||
- (cast2 != Cast::ERROR && cast2 != Cast::INT))
+ (cast2 != Cast::ERROR && cast2 != Cast::INT)) {
yyerror(std::string("operation `&&' not defined [") + cast1.getStr() + "]");
- else
+ }
+#ifdef CSCR_CONSTANT_FOLDING_ENALBE
+ /*
+ ---------+--------------------------------------
+ | expr2
+ expr1 | 0 !=0 非定数
+ =========+======================================
+ 0 | 0 0 0
+ !=0 | 0 1 [expr2]
+ 非定数 | (*1) [expr1] (最適化不可)
+ ---------+--------------------------------------
+
+ (*1)
+ [expr1]
+ shrink sizeof(expr1)
+ push 0
+ */
+ else if (expr1->isConst() && expr2->isConst()) {
+ expr->addGenCode(bl::bind(
+ &Comp::genCodePUSH_I,
+ bl::_1,
+ expr1->getVal<vm_int_t>() || expr2->getVal<vm_int_t>()
+ ));
+ }
+ else if (expr1->isConst()) {
+ if (expr1->getVal<vm_int_t>() == 0) {
+ expr->addGenCode(bl::bind(&Comp::genCodePUSH_I, bl::_1, 0));
+ } else { // expr1 != 0
+ expr = expr2;
+ }
+ }
+ else if (expr2->isConst()) {
+ if (expr1->getVal<vm_int_t>() == 0) {
+ expr->addGenCode(*expr1);
+ expr->addGenCode(bl::bind(&Comp::genCodeSHRINK, bl::_1, expr1->getCast().getSize()));
+ expr->addGenCode(bl::bind(&Comp::genCodePUSH_I, bl::_1, 0));
+ } else { // expr2 != 0
+ expr = expr1;
+ }
+ }
+#endif // CSCR_CONSTANT_FOLDING_ENALBE
+ else {
expr->addGenCode(GenCodeLogicalAnd(expr1, expr2));
+ }
$$ = expr;
}
| M4_BINARY_OP(`|', '|', `OR', `int')
@@ -1213,7 +1303,7 @@ node_assignment_expression:
$$ = expr;
break;
}
-#endif
+#endif // CSCR_CONSTANT_FOLDING_ENALBE
else if (cast_s.getBase() == Cast::INT && cast_d.getBase() == Cast::FLOAT) {
expr1->addGenCode(bl::bind(&Comp::genOprFLOAT_I, bl::_1));
} else if (cast_s.getBase() == Cast::FLOAT && cast_d.getBase() == Cast::INT)