summaryrefslogtreecommitdiff
path: root/template/optinsn.inc.tmpl
diff options
context:
space:
mode:
Diffstat (limited to 'template/optinsn.inc.tmpl')
-rw-r--r--template/optinsn.inc.tmpl78
1 files changed, 78 insertions, 0 deletions
diff --git a/template/optinsn.inc.tmpl b/template/optinsn.inc.tmpl
new file mode 100644
index 0000000000..b1fba6dea3
--- /dev/null
+++ b/template/optinsn.inc.tmpl
@@ -0,0 +1,78 @@
+/* -*-c-*- *********************************************************/
+/*******************************************************************/
+/*******************************************************************/
+/**
+ This file is for threaded code.
+
+ ----
+ This file is auto generated by insns2vm.rb
+ DO NOT TOUCH!
+
+ If you want to fix something, you must edit 'template/optinsn.inc.tmpl'
+ or tool/insns2vm.rb
+ */
+
+static INSN *
+insn_operands_unification(INSN *insnobj)
+{
+#ifdef OPT_OPERANDS_UNIFICATION
+ /* optimize rule */
+ switch(insnobj->insn_id){
+% opt_insns_map.each do |originsn, optinsns|
+ case BIN(<%=originsn.name%>):
+% optinsns.each {|opti|
+ if (
+% opti.defopes.each_with_index {|opinfo, i|
+% next if opinfo[1] == '*'
+ insnobj->operands[<%=i%>] == <%=val_as_type(opinfo)%> &&
+% }
+ 1) {
+% idx = 0
+% opti.defopes.each_with_index {|opinfo, n|
+% if opinfo[1] == '*'
+% if idx != n
+ insnobj->operands[<%=idx%>] = insnobj->operands[<%=n%>];
+% end
+% idx += 1
+% end
+% }
+ insnobj->insn_id = BIN(<%=opti.name%>);
+ insnobj->operand_size = <%=idx%>;
+ break;
+ }
+% }
+ break;
+% end
+
+ default:
+ /* do nothing */;
+ break;
+ }
+#endif
+ return insnobj;
+}
+
+int
+rb_insn_unified_local_var_level(VALUE insn)
+{
+#ifdef OPT_OPERANDS_UNIFICATION
+ /* optimize rule */
+ switch (insn) {
+% opt_insns_map.each do |originsn, optinsns|
+% optinsns.each {|opti|
+ case BIN(<%=opti.name%>):
+% opti.defopes.each {|opinfo|
+% next if opinfo[1] == '*'
+ return <%=opinfo[1]%>;
+% break
+% }
+% }
+% end
+
+ default:
+ /* do nothing */;
+ break;
+ }
+#endif
+ return -1;
+}