CScript 定数畳み込み最適化の実装
authorIssei Suzuki <issei@issei.org>
Fri Aug 17 01:04:49 2007 +0900 (16 months ago)
changeset 538158c82406eb0
parent 5379adeeb27ffe8
child 539a3a6c4313773
CScript 定数畳み込み最適化の実装
tool/src/cscript/code/code.cc
tool/src/cscript/code/cscript.h
tool/src/cscript/code/cscript_parser.cc
tool/src/cscript/code/parser.y
tool/src/cscript/m4/parser.m4
tool/src/cscript/sample/const.scs
--- a/tool/src/cscript/code/code.cc Fri Aug 17 00:14:08 2007 +0900
+++ b/tool/src/cscript/code/code.cc Fri Aug 17 01:04:49 2007 +0900
@@ -28,7 +28,8 @@
#include "common.h"
#include "inst.h"
-#define CODE_PEEPHOLE_OPTIMIZATION_ENABLE
+// 覗き穴最適化を有効にする
+// #define CSCR_CODE_PEEPHOLE_OPTIMIZATION_ENABLE
CSCRIPT_NAMESPACE_BEGIN
@@ -89,7 +90,7 @@ vm_taddr_t Code::Impl::_addCodeImmediate
{
assert(m_inst_table.getOprandType(code) == CSCR_OPRAND_IMMEDIATE);
-#ifdef CODE_PEEPHOLE_OPTIMIZATION_ENABLE
+#ifdef CSCR_CODE_PEEPHOLE_OPTIMIZATION_ENABLE
if (code == INST_shrink && immediate == 0)
return 0;
--- a/tool/src/cscript/code/cscript.h Fri Aug 17 00:14:08 2007 +0900
+++ b/tool/src/cscript/code/cscript.h Fri Aug 17 01:04:49 2007 +0900
@@ -34,6 +34,10 @@
// システム関数呼び出し時に handle の有効チェックを行なう
#define CSCR_VM_SYS_BASE_VALIDATE_HANDLE
+// 覗き穴最適化を有効にする
+#define CSCR_CODE_PEEPHOLE_OPTIMIZATION_ENABLE
+// 定数畳み込み最適化を有効にする
+#define CSCR_CONSTANT_FOLDING_ENALBE
// 1秒間の標準実行回数
#ifndef CSCR_FRAMES_PER_SEC
--- a/tool/src/cscript/code/cscript_parser.cc Fri Aug 17 00:14:08 2007 +0900
+++ b/tool/src/cscript/code/cscript_parser.cc Fri Aug 17 01:04:49 2007 +0900
@@ -51,12 +51,6 @@ ExpressionInfo::ExpressionInfo(vm_float_
, m_is_const(true)
{}
-ExpressionInfo::ExpressionInfo(std::string const& s, Cast const& c)
- : m_cast(c)
- , m_val(s)
- , m_is_const(true)
-{}
-
void ExpressionInfo::addGenCode(GenCode const& gen)
{
m_gen_code_list.push_back(gen);
--- a/tool/src/cscript/code/parser.y Fri Aug 17 00:14:08 2007 +0900
+++ b/tool/src/cscript/code/parser.y Fri Aug 17 01:04:49 2007 +0900
@@ -1138,19 +1138,35 @@ node_assignment_expression:
| M4_UNARY_OP(`-', '-', `NEG', `int float')
| '(' TOK_CAST ')' node_assignment_expression %prec UNARY_OP
{
- ExpressionInfoP expr = boost::any_cast<ExpressionInfoP>($4);
- Cast const& cast_s = expr->getCast();
+ ExpressionInfoP expr1 = boost::any_cast<ExpressionInfoP>($4);
+ Cast const& cast_s = expr1->getCast();
Cast const& cast_d = boost::any_cast<Cast const&>($2);
if (cast_s.getBase() == cast_d.getBase() || cast_s == Cast::ERROR)
;
+#ifdef CSCR_CONSTANT_FOLDING_ENALBE
+ else if (expr1->isConst() && cast_s.getBase() == Cast::INT && cast_d.getBase() == Cast::FLOAT) {
+ vm_float_t val = static_cast<vm_float_t>(expr1->getVal<vm_int_t>());
+ ExpressionInfoP expr(new ExpressionInfo(val));
+ expr->addGenCode(bl::bind(&_genPushF, bl::_1, val));
+ $$ = expr;
+ break;
+ }
+ else if (expr1->isConst() && cast_s.getBase() == Cast::FLOAT && cast_d.getBase() == Cast::INT) {
+ vm_int_t val = static_cast<vm_int_t>(expr1->getVal<vm_float_t>());
+ ExpressionInfoP expr(new ExpressionInfo(val));
+ expr->addGenCode(bl::bind(&_genPushI, bl::_1, val));
+ $$ = expr;
+ break;
+ }
+#endif
else if (cast_s.getBase() == Cast::INT && cast_d.getBase() == Cast::FLOAT) {
- expr->addGenCode(bl::bind(&Comp::genOprFLOAT_I, bl::_1));
+ expr1->addGenCode(bl::bind(&Comp::genOprFLOAT_I, bl::_1));
} else if (cast_s.getBase() == Cast::FLOAT && cast_d.getBase() == Cast::INT)
- expr->addGenCode(bl::bind(&Comp::genOprINT_F, bl::_1));
+ expr1->addGenCode(bl::bind(&Comp::genOprINT_F, bl::_1));
else
yyerror(std::string("cannot convert cast[" + cast_s.getStr() + " -> " + cast_d.getStr() + "]"));
- expr->setCast(cast_d);
- $$ = expr;
+ expr1->setCast(cast_d);
+ $$ = expr1;
}
;
--- a/tool/src/cscript/m4/parser.m4 Fri Aug 17 00:14:08 2007 +0900
+++ b/tool/src/cscript/m4/parser.m4 Fri Aug 17 01:04:49 2007 +0900
@@ -22,6 +22,9 @@ dnl LIABILITY, WHETHER IN AN ACTION OF C
dnl LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
dnl FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
dnl DEALINGS IN THE SOFTWARE.
+dnl
+dnl 定数畳み込み最適化を有効にする
+dnl #define CSCR_CONSTANT_FOLDING_ENALBE
dnl
dnl -----------------------------------------------------------------
dnl 代入演算子に対応するコード生成
@@ -134,28 +137,49 @@ dnl 単項演算子に対応するコー
dnl 単項演算子に対応するコード生成
dnl
dnl 引数
-dnl $1 演算子文字列 (メッセージ表示用)
+dnl $1 演算子文字列
dnl $2 演算子 lex トークン
dnl $3 仮想マシン演算命令
dnl $4 適応可能データ型
dnl -----------------------------------------------------------------
m4_define(`M4_UNARY_OP',`$2 node_assignment_expression %prec UNARY_OP
{
- ExpressionInfoP expr = boost::any_cast<ExpressionInfoP>(`$'2);
- Cast const& cast = expr->getCast();
+ ExpressionInfoP expr1 = boost::any_cast<ExpressionInfoP>(`$'2);
+ Cast const& cast = expr1->getCast();
+
+#ifdef CSCR_CONSTANT_FOLDING_ENALBE
+ if (expr1->isConst()) {
+m4_ifelse(m4_index($4, `int'), `-1',,`dnl
+ if (cast.getBase() == Cast::INT) {
+ vm_int_t val = $1 expr1->getVal<vm_int_t>();
+ ExpressionInfoP expr(new ExpressionInfo(val));
+ expr->addGenCode(bl::bind(&_genPushI, bl::_1, val));
+ $$ = expr;
+ break;
+ }')
+m4_ifelse(m4_index($4, `float'), `-1',,`dnl
+ if (cast.getBase() == Cast::FLOAT) {
+ vm_float_t val = $1 expr1->getVal<vm_float_t>();
+ ExpressionInfoP expr(new ExpressionInfo(val));
+ expr->addGenCode(bl::bind(&_genPushF, bl::_1, val));
+ $$ = expr;
+ break;
+ }')
+ }
+#endif
if (cast == Cast::ERROR)
;
m4_ifelse(m4_index($4, `int'), `-1',,`dnl
else if (cast.getBase() == Cast::INT)
- expr->addGenCode(bl::bind(&Comp::genOpr$3_I, bl::_1));
+ expr1->addGenCode(bl::bind(&Comp::genOpr$3_I, bl::_1));
')
m4_ifelse(m4_index($4, `float'), `-1',,`dnl
else if (cast.getBase() == Cast::FLOAT)
- expr->addGenCode(bl::bind(&Comp::genOpr$3_F, bl::_1));
+ expr1->addGenCode(bl::bind(&Comp::genOpr$3_F, bl::_1));
')
else
yyerror(std::string("operation unary ``$1'' not defined[" + cast.getStr() + "]"));
- $$ = expr;
+ $$ = expr1;
}')dnl
dnl -----------------------------------------------------------------
dnl 前置・後置演算子に対するコード生成
@@ -193,7 +217,7 @@ dnl 二項演算子に対応するコー
dnl 二項演算子に対応するコード生成
dnl
dnl 引数
-dnl $1 演算子文字列 (メッセージ表示用)
+dnl $1 演算子文字列
dnl $2 演算子 lex トークン
dnl $3 仮想マシン演算命令
dnl $4 適応可能データ型
@@ -215,6 +239,27 @@ m4_define(`M4_BINARY_OP',`node_assignmen
break;
}
+#ifdef CSCR_CONSTANT_FOLDING_ENALBE
+ if (expr1->isConst() && expr2->isConst()) {
+m4_ifelse(m4_index($4, `int'), `-1',,`dnl
+ if (cast1.getBase() == Cast::INT) {
+ vm_int_t val = expr1->getVal<vm_int_t>() $1 expr2->getVal<vm_int_t>();
+ ExpressionInfoP expr(new ExpressionInfo(val));
+ expr->addGenCode(bl::bind(&_genPushI, bl::_1, val));
+ $$ = expr;
+ break;
+ }')
+m4_ifelse(m4_index($4, `float'), `-1',,`dnl
+ if (cast1.getBase() == Cast::FLOAT) {
+ vm_float_t val = expr1->getVal<vm_float_t>() $1 expr2->getVal<vm_float_t>();
+ ExpressionInfoP expr(new ExpressionInfo(val));
+ expr->addGenCode(bl::bind(&_genPushF, bl::_1, val));
+ $$ = expr;
+ break;
+ }')
+ }
+#endif
+
ExpressionInfoP expr(new ExpressionInfo(m4_ifelse($#, 4, cast1, Cast::m4_translit($5, `a-z', `A-Z'))));
expr->addGenCode(*expr1);
expr->addGenCode(*expr2);
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/tool/src/cscript/sample/const.scs Fri Aug 17 01:04:49 2007 +0900
@@ -0,0 +1,26 @@
+/*
+ * 定数 畳み込み最適化
+ * $Id: ack.scs 444 2007-06-04 23:03:03Z issei $
+ */
+
+#include <system.sch>
+#include <stdfunc.sch>
+
+void
+main()
+{
+ sysPrintI(1 + 2);
+ sysPrintLn();
+ sysPrintI(~0);
+ sysPrintLn();
+ sysPrintI(1 << 2);
+ sysPrintLn();
+ sysPrintF(1.2 * 3.0);
+ sysPrintLn();
+ sysPrintF(1.2 / 3.0 * 3.0);
+ sysPrintLn();
+ sysPrintF((float)(1 + 2));
+ sysPrintLn();
+}
+
+// vim: syntax=c