| 95 | return nullptr; \ |
| 96 | } \ |
| 97 | virtual void set(SimNode_Op2Fusion * result, SimNode * node) override { \ |
| 98 | result->set(#OPNAME,Type(ToBasicType<CTYPE>::type),node->debugInfo); \ |
| 99 | IMPLEMENT_OP2_SETUP_NODE(result,node); \ |
| 100 | } \ |
| 101 | virtual SimNode * fuse(const SimNodeInfoLookup & info, SimNode * node, Context * context) override { \ |
| 102 | return fuseOp2(info, node, FUSION_OP2_SUBEXPR_LEFT(CTYPE,node), FUSION_OP2_SUBEXPR_RIGHT(CTYPE,node), context); \ |
| 103 | } \ |
| 104 | }; |
| 105 | |
| 106 | #else |
| 107 | |
| 108 | // A opname B |
| 109 | #define IMPLEMENT_ANY_OP2(INLINE,OPNAME,TYPE,CTYPE) \ |
| 110 | struct FusionPoint_##OPNAME##_##CTYPE : FusionPointOp2 { \ |
| 111 | IMPLEMENT_OP2_NODE_ANYR(INLINE,OPNAME,TYPE,CTYPE,Argument); \ |
| 112 | IMPLEMENT_OP2_NODE_ANYL(INLINE,OPNAME,TYPE,CTYPE,Argument); \ |
| 113 | IMPLEMENT_OP2_NODE_ANYR(INLINE,OPNAME,TYPE,CTYPE,ArgumentRefOff); \ |
| 114 | IMPLEMENT_OP2_NODE_ANYL(INLINE,OPNAME,TYPE,CTYPE,ArgumentRefOff); \ |
| 115 | IMPLEMENT_OP2_NODE_ANYR(INLINE,OPNAME,TYPE,CTYPE,ThisBlockArgument); \ |
| 116 | IMPLEMENT_OP2_NODE_ANYL(INLINE,OPNAME,TYPE,CTYPE,ThisBlockArgument); \ |
| 117 | IMPLEMENT_OP2_NODE_ANYR(INLINE,OPNAME,TYPE,CTYPE,Const); \ |
| 118 | IMPLEMENT_OP2_NODE_ANYL(INLINE,OPNAME,TYPE,CTYPE,Const); \ |
| 119 | IMPLEMENT_OP2_NODE_ANYR(INLINE,OPNAME,TYPE,CTYPE,Local); \ |
| 120 | IMPLEMENT_OP2_NODE_ANYL(INLINE,OPNAME,TYPE,CTYPE,Local); \ |
| 121 | IMPLEMENT_OP2_NODE_ANYR(INLINE,OPNAME,TYPE,CTYPE,LocalRefOff); \ |
| 122 | IMPLEMENT_OP2_NODE_ANYL(INLINE,OPNAME,TYPE,CTYPE,LocalRefOff); \ |
| 123 | virtual SimNode * match(const SimNodeInfoLookup & info, SimNode *, SimNode * node_l, SimNode * node_r, Context * context) override { \ |
| 124 | auto & ccode = *(context->code); \ |
| 125 | /* match op2 */ if ( !node_l || !node_r ) { return nullptr; } \ |
| 126 | MATCH_OP2_ANYR(OPNAME,"GetArgument",Argument) \ |
| 127 | MATCH_OP2_ANYL(OPNAME,"GetArgument",Argument) \ |
| 128 | MATCH_OP2_ANYR(OPNAME,"GetArgumentRefOffR2V",ArgumentRefOff) \ |
| 129 | MATCH_OP2_ANYL(OPNAME,"GetArgumentRefOffR2V",ArgumentRefOff) \ |
| 130 | MATCH_OP2_ANYR(OPNAME,"GetThisBlockArgument",ThisBlockArgument) \ |
| 131 | MATCH_OP2_ANYL(OPNAME,"GetThisBlockArgument",ThisBlockArgument) \ |
| 132 | MATCH_OP2_ANYR(OPNAME,"ConstValue",Const) \ |
| 133 | MATCH_OP2_ANYL(OPNAME,"ConstValue",Const) \ |
| 134 | MATCH_OP2_ANYR(OPNAME,"GetLocalR2V",Local) \ |
| 135 | MATCH_OP2_ANYL(OPNAME,"GetLocalR2V",Local) \ |
| 136 | MATCH_OP2_ANYR(OPNAME,"GetLocalRefOffR2V",LocalRefOff) \ |
| 137 | MATCH_OP2_ANYL(OPNAME,"GetLocalRefOffR2V",LocalRefOff) \ |
| 138 | return nullptr; \ |
| 139 | } \ |
| 140 | virtual void set(SimNode_Op2Fusion * result, SimNode * node) override { \ |
| 141 | result->set(#OPNAME,Type(ToBasicType<CTYPE>::type),node->debugInfo); \ |
| 142 | IMPLEMENT_OP2_SETUP_NODE(result,node); \ |