Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(216)

Unified Diff: third_party/sqlite/src/tool/mkopcodeh.tcl

Issue 2751253002: [sql] Import SQLite 3.17.0. (Closed)
Patch Set: also clang on Linux i386 Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « third_party/sqlite/src/tool/mkopcodec.tcl ('k') | third_party/sqlite/src/tool/mkpragmatab.tcl » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: third_party/sqlite/src/tool/mkopcodeh.tcl
diff --git a/third_party/sqlite/src/tool/mkopcodeh.tcl b/third_party/sqlite/src/tool/mkopcodeh.tcl
index 4c36f24ba47398e98f8f7efd668bcb877ecf7e26..3c2a59789c1e7de4cfaab60702bfb8d8803afa7d 100644
--- a/third_party/sqlite/src/tool/mkopcodeh.tcl
+++ b/third_party/sqlite/src/tool/mkopcodeh.tcl
@@ -20,8 +20,7 @@
# during code generation, we need to generate corresponding opcodes like
# OP_Add and OP_Divide. By making TK_ADD==OP_Add and TK_DIVIDE==OP_Divide,
# code to translate from one to the other is avoided. This makes the
-# code generator run (infinitesimally) faster and more importantly it makes
-# the library footprint smaller.
+# code generator smaller and faster.
#
# This script also scans for lines of the form:
#
@@ -81,8 +80,8 @@ while {![eof $in]} {
set in1($name) 0
set in2($name) 0
set in3($name) 0
- set out1($name) 0
set out2($name) 0
+ set out3($name) 0
for {set i 3} {$i<[llength $line]-1} {incr i} {
switch [string trim [lindex $line $i] ,] {
same {
@@ -112,16 +111,19 @@ while {![eof $in]} {
# Assign numbers to all opcodes and output the result.
#
-set cnt 0
-set max 0
puts "/* Automatically generated. Do not edit */"
puts "/* See the tool/mkopcodeh.tcl script for details */"
-set op(OP_Noop) -1
-set order($nOp) OP_Noop
-incr nOp
-set op(OP_Explain) -1
-set order($nOp) OP_Explain
-incr nOp
+foreach name {OP_Noop OP_Explain} {
+ set jump($name) 0
+ set in1($name) 0
+ set in2($name) 0
+ set in3($name) 0
+ set out2($name) 0
+ set out3($name) 0
+ set op($name) -1
+ set order($nOp) $name
+ incr nOp
+}
# The following are the opcodes that are processed by resolveP2Values()
#
@@ -144,7 +146,7 @@ set rp2v_ops {
# Assign small values to opcodes that are processed by resolveP2Values()
# to make code generation for the switch() statement smaller and faster.
#
-set cnt 0
+set cnt -1
for {set i 0} {$i<$nOp} {incr i} {
set name $order($i)
if {[lsearch $rp2v_ops $name]>=0} {
@@ -156,7 +158,29 @@ for {set i 0} {$i<$nOp} {incr i} {
}
}
-# Generate the numeric values for remaining opcodes
+# Assign the next group of values to JUMP opcodes
+#
+for {set i 0} {$i<$nOp} {incr i} {
+ set name $order($i)
+ if {$op($name)>=0} continue
+ if {!$jump($name)} continue
+ incr cnt
+ while {[info exists used($cnt)]} {incr cnt}
+ set op($name) $cnt
+ set used($cnt) 1
+ set def($cnt) $name
+}
+
+# Find the numeric value for the largest JUMP opcode
+#
+set mxJump -1
+for {set i 0} {$i<$nOp} {incr i} {
+ set name $order($i)
+ if {$jump($name) && $op($name)>$mxJump} {set mxJump $op($name)}
+}
+
+
+# Generate the numeric values for all remaining opcodes
#
for {set i 0} {$i<$nOp} {incr i} {
set name $order($i)
@@ -169,7 +193,7 @@ for {set i 0} {$i<$nOp} {incr i} {
}
}
set max $cnt
-for {set i 1} {$i<=$nOp} {incr i} {
+for {set i 0} {$i<$nOp} {incr i} {
if {![info exists used($i)]} {
set def($i) "OP_NotUsed_$i"
}
@@ -196,27 +220,28 @@ for {set i 1} {$i<=$nOp} {incr i} {
# Generate the bitvectors:
#
set bv(0) 0
-for {set i 1} {$i<=$max} {incr i} {
+for {set i 0} {$i<=$max} {incr i} {
set name $def($i)
- if {[info exists jump($name)] && $jump($name)} {set a0 1} {set a0 0}
- if {[info exists in1($name)] && $in1($name)} {set a1 2} {set a1 0}
- if {[info exists in2($name)] && $in2($name)} {set a2 4} {set a2 0}
- if {[info exists in3($name)] && $in3($name)} {set a3 8} {set a3 0}
- if {[info exists out2($name)] && $out2($name)} {set a4 16} {set a4 0}
- if {[info exists out3($name)] && $out3($name)} {set a5 32} {set a5 0}
- set bv($i) [expr {$a0+$a1+$a2+$a3+$a4+$a5}]
+ set x 0
+ if {$jump($name)} {incr x 1}
+ if {$in1($name)} {incr x 2}
+ if {$in2($name)} {incr x 4}
+ if {$in3($name)} {incr x 8}
+ if {$out2($name)} {incr x 16}
+ if {$out3($name)} {incr x 32}
+ set bv($i) $x
}
puts ""
puts "/* Properties such as \"out2\" or \"jump\" that are specified in"
puts "** comments following the \"case\" for each opcode in the vdbe.c"
puts "** are encoded into bitvectors as follows:"
puts "*/"
-puts "#define OPFLG_JUMP 0x0001 /* jump: P2 holds jmp target */"
-puts "#define OPFLG_IN1 0x0002 /* in1: P1 is an input */"
-puts "#define OPFLG_IN2 0x0004 /* in2: P2 is an input */"
-puts "#define OPFLG_IN3 0x0008 /* in3: P3 is an input */"
-puts "#define OPFLG_OUT2 0x0010 /* out2: P2 is an output */"
-puts "#define OPFLG_OUT3 0x0020 /* out3: P3 is an output */"
+puts "#define OPFLG_JUMP 0x01 /* jump: P2 holds jmp target */"
+puts "#define OPFLG_IN1 0x02 /* in1: P1 is an input */"
+puts "#define OPFLG_IN2 0x04 /* in2: P2 is an input */"
+puts "#define OPFLG_IN3 0x08 /* in3: P3 is an input */"
+puts "#define OPFLG_OUT2 0x10 /* out2: P2 is an output */"
+puts "#define OPFLG_OUT3 0x20 /* out3: P3 is an output */"
puts "#define OPFLG_INITIALIZER \173\\"
for {set i 0} {$i<=$max} {incr i} {
if {$i%8==0} {
@@ -228,3 +253,11 @@ for {set i 0} {$i<=$max} {incr i} {
}
}
puts "\175"
+puts ""
+puts "/* The sqlite3P2Values() routine is able to run faster if it knows"
+puts "** the value of the largest JUMP opcode. The smaller the maximum"
+puts "** JUMP opcode the better, so the mkopcodeh.tcl script that"
+puts "** generated this include file strives to group all JUMP opcodes"
+puts "** together near the beginning of the list."
+puts "*/"
+puts "#define SQLITE_MX_JUMP_OPCODE $mxJump /* Maximum JUMP opcode */"
« no previous file with comments | « third_party/sqlite/src/tool/mkopcodec.tcl ('k') | third_party/sqlite/src/tool/mkpragmatab.tcl » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698