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 }