週末の過ごし方
日曜は「うみねこのなく頃に」と amazon で注文していたマンガが何冊か届いたので、そちらを消化して終わりそう。
ラベル: 日常あるいは平穏な日々
ラベル: 日常あるいは平穏な日々
/*
* 変更前
*/
node_primary_expression:
TOK_INT {
vm_int_t val = boost::any_cast<vm_int_t>($1);
p_comp-<genCodePUSH_I(val);
$$ = Cast::INT;
}
node_assignment_expression:
node_primary_expression
| node_assignment_expression '+' node_assignment_expression: {
p_comp->genOprADD_I();
$$ = $1;
}
/*
* 変更後
*/
node_primary_expression:
TOK_INT {
vm_int_t val = boost::any_cast<vm_int_t>($1);
ExpressionInfoP expr(new ExpressionInfo(val));
expr->addGenCode(boost::lambda::bind(&Comp::genCodePUSH_I, boost::lambda::_1, val));
$$ = expr;
}
node_assignment_expression:
node_primary_expression
| node_assignment_expression '+' node_assignment_expression
{
// 定数同士の加算の場合は、この場で計算して結果に置き換え
ExpressionInfoP expr1 = boost::any_cast<ExpressionInfoP>($1);
ExpressionInfoP expr2 = boost::any_cast<ExpressionInfoP>($3);
if (expr1->isConst() && expr2->isConst()) {
vm_int_t val = expr1->getVal<vm_int_t>() + expr2->getVal<vm_int_t>()
ExpressionInfoP expr(new ExpressionInfo(val));
expr->addGenCode(boost::lambda::bind(&Comp::genCodePUSH_I, boost::lambda::_1, val));
$$ = expr;
}
// 定数たたみこみできない場合は、それぞれの命令出力後に add 命令を出力するように
else {
ExpressionInfoP expr(new ExpressionInfo());
expr->setCast(Cast::INT);
expr->addGenCode(*expr1);
expr->addGenCode(*expr2);
expr->addGenCode(boost::lambda::bind(&Comp::genOprADD_I, boost::lambda::_1));
$$ = expr;
}
}
// 三項演算子
typedef boost::function<void (Comp* comp)> GenCode;
typedef std::vector<GenCode> GenCodeList;
struct GenCode3Op
{
GenCode3Op(ExpressionInfoP expr_cond, ExpressionInfoP expr_true, ExpressionInfoP expr_false)
{
expr_cond->gt;swapGenCode(m_gen_cond);
expr_true->gt;swapGenCode(m_gen_true);
expr_false->gt;swapGenCode(m_gen_false);
}
/*
[expr_cond]
jump_if0 L_false
[expr_true]
jump L_exit
L_false:
[expr_false]
L_exit:
*/
void operator()(Comp* comp) const
{
_genCode(comp, m_gen_cond);
vm_taddr_t taddr1 = comp->gt;genCodeJUMP_IF0();
_genCode(comp, m_gen_true);
vm_taddr_t taddr2 = comp->gt;genCodeJUMP();
comp->gt;backpatchJUMP_IF0(taddr1, comp->gt;getCodeSize());
// L_false
_genCode(comp, m_gen_false);
// L_exit
comp->gt;backpatchJUMP(taddr2, comp->gt;getCodeSize());
}
private:
GenCodeList m_gen_cond;
GenCodeList m_gen_true;
GenCodeList m_gen_false;
};
25.06 real 11.60 user 2.51 sys
275828 maximum resident set size
4008 average shared memory size
20237 average unshared data size
203 average unshared stack size
81429 page reclaims
0 page faults
0 swaps
0 block input operations
74 block output operations
0 messages sent
0 messages received
0 signals received
1121 voluntary context switches
418 involuntary context switches
27.06 real 23.48 user 4.56 sys
493700 maximum resident set size
4221 average shared memory size
87521 average unshared data size
220 average unshared stack size
151172 page reclaims
0 page faults
0 swaps
0 block input operations
42 block output operations
0 messages sent
0 messages received
0 signals received
826 voluntary context switches
670 involuntary context switches
24.05 real 21.79 user 3.14 sys
493684 maximum resident set size
4226 average shared memory size
91473 average unshared data size
225 average unshared stack size
151171 page reclaims
0 page faults
0 swaps
0 block input operations
69 block output operations
0 messages sent
0 messages received
0 signals received
832 voluntary context switches
581 involuntary context switches
31.42 real 23.95 user 8.32 sys
493700 maximum resident set size
4268 average shared memory size
109638 average unshared data size
230 average unshared stack size
151169 page reclaims
0 page faults
0 swaps
0 block input operations
67 block output operations
0 messages sent
0 messages received
0 signals received
831 voluntary context switches
602 involuntary context switches
ラベル: プログラミング
ラベル: バイク
ラベル: リサーチ
ラベル: リサーチ
ラベル: リサーチ
ラベル: リサーチ
ラベル: プログラミング