Mercurial > hg > Members > anatofuz > MoarVM
comparison cbctools/change_OP_to_cbc.pl @ 11:e08e6dca633f
add switch code
author | Takahiro SHIMIZU <anatofuz@cr.ie.u-ryukyu.ac.jp> |
---|---|
date | Tue, 09 Oct 2018 16:17:01 +0900 |
parents | 30098d746672 |
children | 618c343f4a17 |
comparison
equal
deleted
inserted
replaced
10:30098d746672 | 11:e08e6dca633f |
---|---|
11 my @rewritec = (); | 11 my @rewritec = (); |
12 my $indent = " " x 12; | 12 my $indent = " " x 12; |
13 my $none_left_blanket = 0; | 13 my $none_left_blanket = 0; |
14 | 14 |
15 my $i = 0; | 15 my $i = 0; |
16 | |
17 my @upside = (); | |
16 for (;$i < scalar(@cbc_lines); $i++){ | 18 for (;$i < scalar(@cbc_lines); $i++){ |
17 push @rewritec,$cbc_lines[$i]; | 19 push @upside,$cbc_lines[$i]; |
20 if ($cbc_lines[$i+1] =~ /\/\* This is the interpreter run loop. We have one of these per thread. \*\//){ | |
21 last; | |
22 } | |
23 } | |
24 | |
25 my @middle = (); | |
26 | |
27 for (;$i < scalar(@cbc_lines); $i++){ | |
28 push @middle,$cbc_lines[$i]; | |
18 if ($cbc_lines[$i] =~ /DISPATCH\(NEXT_OP\)/){ # DISPATCHの中身を書き換えるのでそこまで飛ばす | 29 if ($cbc_lines[$i] =~ /DISPATCH\(NEXT_OP\)/){ # DISPATCHの中身を書き換えるのでそこまで飛ばす |
19 $i++; | 30 $i++; |
20 last; | 31 last; |
21 } | 32 } |
22 } | 33 } |
34 my @dispatch = (); | |
23 | 35 |
24 for (;$i < scalar(@cbc_lines); $i++){ | 36 for (;$i < scalar(@cbc_lines); $i++){ |
25 # check OP(.*) { codes | 37 # check OP(.*) { codes |
38 | |
39 if ($cbc_lines[$i] =~ /#if MVM_CGOTO/){ | |
40 $i--; | |
41 last; | |
42 } | |
43 | |
26 if ($cbc_lines[$i] =~ /^\s+OP\((.*)\):/ ){ | 44 if ($cbc_lines[$i] =~ /^\s+OP\((.*)\):/ ){ |
27 my $opcode = $1; | 45 my $opcode = $1; |
46 push @dispatch,"${indent}OP($opcode):\n"; | |
28 $none_left_blanket = $cbc_lines[$i] =~ /{/ ? 0 : 1; | 47 $none_left_blanket = $cbc_lines[$i] =~ /{/ ? 0 : 1; |
29 # transrate OP(HOGE) to __code hoge(INTERP *i){ | 48 # transrate OP(HOGE) to __code hoge(INTERP *i){ |
30 $cbc_lines[$i] = $indent. "__code ".$opcode."(INTERP i){\n"; | 49 $cbc_lines[$i] = "__code ".$opcode."(INTERP i){\n"; |
50 #$cbc_lines[$i] = $indent. "__code ".$opcode."(INTERP i){\n"; | |
31 push @rewritec,$cbc_lines[$i]; | 51 push @rewritec,$cbc_lines[$i]; |
32 | 52 |
33 # 次の行に移動 | 53 # 次の行に移動 |
34 $i++; | 54 $i++; |
35 | 55 |
38 # OP(DEPRECATED_5): <- $i | 58 # OP(DEPRECATED_5): <- $i |
39 # このような宣言になっているので$iにgotoするように関数を書き直し | 59 # このような宣言になっているので$iにgotoするように関数を書き直し |
40 # $iの部分の関数定義を次ループでするために一行戻して再ループ | 60 # $iの部分の関数定義を次ループでするために一行戻して再ループ |
41 | 61 |
42 if ($cbc_lines[$i] =~ /^\s+OP\((.*)\):/){ | 62 if ($cbc_lines[$i] =~ /^\s+OP\((.*)\):/){ |
43 push @rewritec,"$indent goto $1(i);\n"; | 63 push @rewritec," goto $1(i);\n"; |
64 #push @rewritec,"$indent goto $1(i);\n"; | |
44 insert_right_blanket(); | 65 insert_right_blanket(); |
45 $i--; | 66 $i--; |
46 next; | 67 next; |
47 } | 68 } |
48 | 69 |
62 insert_right_blanket(); | 83 insert_right_blanket(); |
63 $none_left_blanket = 0; | 84 $none_left_blanket = 0; |
64 } | 85 } |
65 } | 86 } |
66 | 87 |
67 map { print; } @rewritec; | 88 my @after = (); |
89 map { push @after,$cbc_lines[$_]} ($i+1.. scalar(@cbc_lines)-1); | |
90 map { print; } (@upside,@rewritec,@middle,@dispatch,@after); | |
68 | 91 |
69 | 92 |
70 sub change_i { | 93 sub change_i { |
71 my $str = shift; | 94 my $str = shift; |
72 $str =~ s/cur_op/i->cur_op/g; | 95 $str =~ s/cur_op/i->cur_op/g; |
73 $str =~ s/tc/i->tc/g; | 96 $str =~ s/tc/i->tc/g; |
74 $str =~ s/cur_callsite/i->cur_callsite/g; | 97 $str =~ s/cur_callsite/i->cur_callsite/g; |
75 $str =~ s/NEXT;/NEXT(i);/; | 98 $str =~ s/NEXT;/NEXT(i);/; |
99 $str =~ s/^\s{16}/ /g; | |
76 return $str; | 100 return $str; |
77 } | 101 } |
78 | 102 |
79 sub insert_right_blanket { | 103 sub insert_right_blanket { |
80 push @rewritec,"$indent}\n"; | 104 #push @rewritec,"$indent}\n"; |
105 push @rewritec,"}\n"; | |
81 } | 106 } |