public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
* Performance degradation on g++ 4.6
@ 2011-07-29 18:08 Oleg Smolsky
  2011-07-29 18:14 ` Xinliang David Li
  2011-07-30  9:24 ` Richard Guenther
  0 siblings, 2 replies; 22+ messages in thread
From: Oleg Smolsky @ 2011-07-29 18:08 UTC (permalink / raw)
  To: gcc

[-- Attachment #1: Type: text/plain, Size: 1529 bytes --]

Hi there, I have compiled and run a set of C++ benchmarks on a 
CentOS4/64 box using the following compilers:
     a) g++4.1 that is available for this distro (GCC version 4.1.2 
20071124 (Red Hat 4.1.2-42)
     b) g++4.6 that I built (stock version 4.6.1)

The machine has two Intel quad core processors in x86_64 mode 
(/proc/cpuinfo attached)

Benchmarks were taken from this page:
     http://stlab.adobe.com/performance/

Results:
     - some of these tests showed 20..30% performance degradation
       (eg the second section in the simple_types_constant_folding test: 
30s -> 44s)
     - a few were quicker
     - full reports are attached

I would assume that performance of the generated code is closely 
monitored by the dev community and obvious blunders should not sneak 
in... However, my findings are reproducible with these synthetic 
benchmarks as well as production code at work. The latter shows 
approximately 25% degradation on CPU bound tests.

Is there a trick to building the compiler or using a specific 
-mtune/-march flag for my CPU? I built the compiler with all the default 
options (it just has a distinct installation path):
     ../gcc-%{version}/configure --prefix=/work/tools/gcc46 
--enable-languages=c,c++ --with-system-zlib 
--with-mpfr=/work/tools/mpfr24 --with-gmp=/work/tools/gmp 
--with-mpc=/work/tools/mpc 
LD_LIBRARY_PATH=/work/tools/mpfr/lib24:/work/tools/gmp/lib:/work/tools/mpc/lib

Are there any published benchmarks? I'd appreciate any advice or pointers.

Thanks in advance,
Oleg.

[-- Attachment #2: cpuinfo --]
[-- Type: text/plain, Size: 4816 bytes --]

processor	: 0
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Genuine Intel(R) CPU                  @ 2.40GHz
stepping	: 4
cpu MHz		: 2393.943
cache size	: 4096 KB
physical id	: 0
siblings	: 4
core id		: 0
cpu cores	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl tm2 cx16 xtpr lahf_lm
bogomips	: 4793.09
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 1
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Genuine Intel(R) CPU                  @ 2.40GHz
stepping	: 4
cpu MHz		: 2393.943
cache size	: 4096 KB
physical id	: 1
siblings	: 4
core id		: 4
cpu cores	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl tm2 cx16 xtpr lahf_lm
bogomips	: 4787.17
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 2
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Genuine Intel(R) CPU                  @ 2.40GHz
stepping	: 4
cpu MHz		: 2393.943
cache size	: 4096 KB
physical id	: 0
siblings	: 4
core id		: 1
cpu cores	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl tm2 cx16 xtpr lahf_lm
bogomips	: 4787.12
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 3
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Genuine Intel(R) CPU                  @ 2.40GHz
stepping	: 4
cpu MHz		: 2393.943
cache size	: 4096 KB
physical id	: 1
siblings	: 4
core id		: 5
cpu cores	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl tm2 cx16 xtpr lahf_lm
bogomips	: 4787.16
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 4
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Genuine Intel(R) CPU                  @ 2.40GHz
stepping	: 4
cpu MHz		: 2393.943
cache size	: 4096 KB
physical id	: 0
siblings	: 4
core id		: 2
cpu cores	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl tm2 cx16 xtpr lahf_lm
bogomips	: 4787.15
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 5
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Genuine Intel(R) CPU                  @ 2.40GHz
stepping	: 4
cpu MHz		: 2393.943
cache size	: 4096 KB
physical id	: 1
siblings	: 4
core id		: 6
cpu cores	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl tm2 cx16 xtpr lahf_lm
bogomips	: 4787.16
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 6
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Genuine Intel(R) CPU                  @ 2.40GHz
stepping	: 4
cpu MHz		: 2393.943
cache size	: 4096 KB
physical id	: 0
siblings	: 4
core id		: 3
cpu cores	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl tm2 cx16 xtpr lahf_lm
bogomips	: 4787.15
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:

processor	: 7
vendor_id	: GenuineIntel
cpu family	: 6
model		: 15
model name	: Genuine Intel(R) CPU                  @ 2.40GHz
stepping	: 4
cpu MHz		: 2393.943
cache size	: 4096 KB
physical id	: 1
siblings	: 4
core id		: 7
cpu cores	: 4
fpu		: yes
fpu_exception	: yes
cpuid level	: 10
wp		: yes
flags		: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm syscall nx lm pni monitor ds_cpl tm2 cx16 xtpr lahf_lm
bogomips	: 4787.19
clflush size	: 64
cache_alignment	: 64
address sizes	: 36 bits physical, 48 bits virtual
power management:


[-- Attachment #3: report41.txt --]
[-- Type: text/plain, Size: 66594 bytes --]

##STARTING Version 1.0
Thu Jul 28 11:58:41 PDT 2011
##CFlags: 
##CPPFlags: -I. -O3
##Start machine report version 1.0
##Compiler
GCC version 4.1.2 20071124 (Red Hat 4.1.2-42)
Compiled for LP64
##Target CPU
Compiled for x86 64bit
##Physical CPU
Little Endian
##Machine
##Operating System
##End machine report
./stepanov_abstraction 

test                        description   absolute   operations   ratio with
number                                    time       per second   test0

 0                     "double pointer"   5.03 sec   795.23 M     1.00
 1               "double pointer_class"   5.04 sec   793.65 M     1.00
 2         "DoubleValueWrapper pointer"   5.03 sec   795.23 M     1.00
 3   "DoubleValueWrapper pointer_class"   5.04 sec   793.65 M     1.00
 4       "DoubleValueWrapper10 pointer"   5.04 sec   793.65 M     1.00
 5 "DoubleValueWrapper10 pointer_class"   5.04 sec   793.65 M     1.00

Total absolute time for Abstraction Accumulate: 30.22 sec

Abstraction Accumulate Penalty: 1.00


test                                       description   absolute   operations   ratio with
number                                                   time       per second   test0

 0                     "insertion_sort double pointer"   0.86 sec    2.33 M     1.00
 1               "insertion_sort double pointer_class"   0.86 sec    2.33 M     1.00
 2         "insertion_sort DoubleValueWrapper pointer"   1.28 sec    1.56 M     1.49
 3   "insertion_sort DoubleValueWrapper pointer_class"   1.28 sec    1.56 M     1.49
 4       "insertion_sort DoubleValueWrapper10 pointer"   1.28 sec    1.56 M     1.49
 5 "insertion_sort DoubleValueWrapper10 pointer_class"   1.27 sec    1.57 M     1.48

Total absolute time for Abstraction Insertion Sort: 6.83 sec

Abstraction Insertion Sort Penalty: 1.37


test                                  description   absolute   operations   ratio with
number                                              time       per second   test0

 0                     "quicksort double pointer"   1.35 sec   11.85 M     1.00
 1               "quicksort double pointer_class"   1.30 sec   12.31 M     0.96
 2         "quicksort DoubleValueWrapper pointer"   1.37 sec   11.68 M     1.01
 3   "quicksort DoubleValueWrapper pointer_class"   1.27 sec   12.60 M     0.94
 4       "quicksort DoubleValueWrapper10 pointer"   1.36 sec   11.76 M     1.01
 5 "quicksort DoubleValueWrapper10 pointer_class"   1.27 sec   12.60 M     0.94

Total absolute time for Abstraction Quicksort: 7.92 sec

Abstraction Quicksort Penalty: 0.97


test                                  description   absolute   operations   ratio with
number                                              time       per second   test0

 0                     "heap_sort double pointer"   1.34 sec   11.94 M     1.00
 1               "heap_sort double pointer_class"   1.40 sec   11.43 M     1.04
 2         "heap_sort DoubleValueWrapper pointer"   1.37 sec   11.68 M     1.02
 3   "heap_sort DoubleValueWrapper pointer_class"   1.38 sec   11.59 M     1.03
 4       "heap_sort DoubleValueWrapper10 pointer"   1.34 sec   11.94 M     1.00
 5 "heap_sort DoubleValueWrapper10 pointer_class"   1.42 sec   11.27 M     1.06

Total absolute time for Abstraction Heap Sort: 8.25 sec

Abstraction Heap Sort Penalty: 1.03

./stepanov_vector 

test                            description   absolute   operations   ratio with
number                                        time       per second   test0

 0                 "double pointer verify2"   3.78 sec   793.65 M     1.00
 1                 "double vector iterator"   3.77 sec   795.76 M     1.00
 2                 "double pointer reverse"   3.78 sec   793.65 M     1.00
 3         "double vector reverse_iterator"   3.78 sec   793.65 M     1.00
 4         "double vector iterator reverse"   3.78 sec   793.65 M     1.00
 5         "double pointer reverse reverse"   3.81 sec   787.40 M     1.01
 6 "double vector reverse_iterator reverse"   3.80 sec   789.47 M     1.01
 7 "double vector iterator reverse reverse"   3.79 sec   791.56 M     1.00

Total absolute time for Vector accumulate: 30.29 sec

Vector accumulate Penalty: 1.00


test                                           description   absolute   operations   ratio with
number                                                       time       per second   test0

 0                 "insertion_sort double pointer verify2"   1.29 sec    2.33 M     1.00
 1                 "insertion_sort double vector iterator"   1.30 sec    2.31 M     1.01
 2                 "insertion_sort double pointer reverse"   1.30 sec    2.31 M     1.01
 3         "insertion_sort double vector reverse_iterator"   1.53 sec    1.96 M     1.19
 4         "insertion_sort double vector iterator reverse"   1.52 sec    1.97 M     1.18
 5         "insertion_sort double pointer reverse reverse"   1.91 sec    1.57 M     1.48
 6 "insertion_sort double vector reverse_iterator reverse"   1.92 sec    1.56 M     1.49
 7 "insertion_sort double vector iterator reverse reverse"   1.91 sec    1.57 M     1.48

Total absolute time for Vector Insertion Sort: 12.68 sec

Vector Insertion Sort Penalty: 1.24


test                                      description   absolute   operations   ratio with
number                                                  time       per second   test0

 0                 "quicksort double pointer verify2"   2.04 sec   11.76 M     1.00
 1                 "quicksort double vector iterator"   1.93 sec   12.44 M     0.95
 2                 "quicksort double pointer reverse"   2.18 sec   11.01 M     1.07
 3         "quicksort double vector reverse_iterator"   2.24 sec   10.71 M     1.10
 4         "quicksort double vector iterator reverse"   2.23 sec   10.76 M     1.09
 5         "quicksort double pointer reverse reverse"   2.15 sec   11.16 M     1.05
 6 "quicksort double vector reverse_iterator reverse"   2.18 sec   11.01 M     1.07
 7 "quicksort double vector iterator reverse reverse"   2.19 sec   10.96 M     1.07

Total absolute time for Vector Quicksort: 17.14 sec

Vector Quicksort Penalty: 1.06


test                                      description   absolute   operations   ratio with
number                                                  time       per second   test0

 0                 "heap_sort double pointer verify2"   1.97 sec   12.18 M     1.00
 1                 "heap_sort double vector iterator"   2.07 sec   11.59 M     1.05
 2                 "heap_sort double pointer reverse"   2.49 sec    9.64 M     1.26
 3         "heap_sort double vector reverse_iterator"   2.48 sec    9.68 M     1.26
 4         "heap_sort double vector iterator reverse"   2.48 sec    9.68 M     1.26
 5         "heap_sort double pointer reverse reverse"   2.20 sec   10.91 M     1.12
 6 "heap_sort double vector reverse_iterator reverse"   2.14 sec   11.21 M     1.09
 7 "heap_sort double vector iterator reverse reverse"   2.15 sec   11.16 M     1.09

Total absolute time for Vector Heap Sort: 17.98 sec

Vector Heap Sort Penalty: 1.16

./functionobjects 

test                                                description   absolute   operations   ratio with
number                                                            time       per second   test0

 0                          "qsort array with function pointer"   4.43 sec    4.51 M     1.00
 1             "quicksort function array with function pointer"   2.57 sec    7.78 M     0.58
 2             "quicksort template array with function pointer"   2.57 sec    7.78 M     0.58
 3    "quicksort template array with template function pointer"   2.52 sec    7.94 M     0.57
 4                           "sort array with function pointer"   2.00 sec   10.00 M     0.45
 5        "quicksort template array with user-supplied functor"   1.97 sec   10.15 M     0.44
 6                      "sort array with user-supplied functor"   1.44 sec   13.89 M     0.33
 7 "quicksort template array with user-supplied inline functor"   1.97 sec   10.15 M     0.44
 8               "sort array with user-supplied inline functor"   1.43 sec   13.99 M     0.32
 9             "quicksort template array with standard functor"   1.97 sec   10.15 M     0.44
10                           "sort array with standard functor"   1.44 sec   13.89 M     0.33
11            "quicksort template array with native < operator"   1.96 sec   10.20 M     0.44
12                          "sort array with native < operator"   1.42 sec   14.08 M     0.32

Total absolute time for Function Objects: 27.69 sec
./simple_types_constant_folding 

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                     "int8_t constant"   0.00 sec     inf M     nan
 1                "int8_t add constants"   0.00 sec     inf M     nan
 2           "int8_t subtract constants"   0.00 sec     inf M     nan
 3           "int8_t multiply constants"   0.01 sec   1600000.00 M     inf
 4             "int8_t divide constants"   0.01 sec   1600000.00 M     inf
 5                "int8_t mod constants"   0.00 sec     inf M     nan
 6              "int8_t equal constants"   0.01 sec   1600000.00 M     inf
 7           "int8_t notequal constants"   0.01 sec   1600000.00 M     inf
 8       "int8_t greater than constants"   0.00 sec     inf M     nan
 9          "int8_t less than constants"   0.01 sec   1600000.00 M     inf
10 "int8_t greater than equal constants"   0.01 sec   1600000.00 M     inf
11    "int8_t less than equal constants"   0.00 sec     inf M     nan
12                "int8_t and constants"   0.01 sec   1600000.00 M     inf
13                 "int8_t or constants"   0.01 sec   1600000.00 M     inf
14                "int8_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int8_t simple constant folding: 0.08 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                 "int8_t constant add"   1.35 sec   1185.19 M     1.00
 1       "int8_t multiple constant adds"   1.34 sec   1194.03 M     0.99
 2            "int8_t constant subtract"   1.34 sec   1194.03 M     0.99
 3  "int8_t multiple constant subtracts"   1.34 sec   1194.03 M     0.99
 4            "int8_t constant multiply"   1.71 sec   935.67 M     1.27
 5 "int8_t multiple constant multiplies"   1.71 sec   935.67 M     1.27
 6  "int8_t multiple constant multiply2"   1.34 sec   1194.03 M     0.99
 7              "int8_t constant divide"   3.85 sec   415.58 M     2.85
 8    "int8_t multiple constant divides"   6.02 sec   265.78 M     4.46
 9    "int8_t multiple constant divide2"   1.34 sec   1194.03 M     0.99
10      "int8_t multiple constant mixed"   0.97 sec   1649.48 M     0.72
11                 "int8_t constant and"   1.34 sec   1194.03 M     0.99
12        "int8_t multiple constant and"   1.34 sec   1194.03 M     0.99
13                  "int8_t constant or"   1.34 sec   1194.03 M     0.99
14         "int8_t multiple constant or"   1.34 sec   1194.03 M     0.99
15                 "int8_t constant xor"   1.34 sec   1194.03 M     0.99
16        "int8_t multiple constant xor"   1.34 sec   1194.03 M     0.99

Total absolute time for int8_t constant folding: 30.35 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "uint8_t constant"   0.01 sec   1600000.00 M     1.00
 1                "uint8_t add constants"   0.01 sec   1600000.00 M     1.00
 2           "uint8_t subtract constants"   0.00 sec     inf M     0.00
 3           "uint8_t multiply constants"   0.01 sec   1600000.00 M     1.00
 4             "uint8_t divide constants"   0.00 sec     inf M     0.00
 5                "uint8_t mod constants"   0.01 sec   1600000.00 M     1.00
 6              "uint8_t equal constants"   0.01 sec   1600000.00 M     1.00
 7           "uint8_t notequal constants"   0.00 sec     inf M     0.00
 8       "uint8_t greater than constants"   0.01 sec   1600000.00 M     1.00
 9          "uint8_t less than constants"   0.00 sec     inf M     0.00
10 "uint8_t greater than equal constants"   0.01 sec   1600000.00 M     1.00
11    "uint8_t less than equal constants"   0.01 sec   1600000.00 M     1.00
12                "uint8_t and constants"   0.00 sec     inf M     0.00
13                 "uint8_t or constants"   0.01 sec   1600000.00 M     1.00
14                "uint8_t xor constants"   0.01 sec   1600000.00 M     1.00

Total absolute time for uint8_t simple constant folding: 0.10 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "uint8_t constant add"   1.34 sec   1194.03 M     1.00
 1       "uint8_t multiple constant adds"   1.34 sec   1194.03 M     1.00
 2            "uint8_t constant subtract"   1.34 sec   1194.03 M     1.00
 3  "uint8_t multiple constant subtracts"   1.34 sec   1194.03 M     1.00
 4            "uint8_t constant multiply"   1.68 sec   952.38 M     1.25
 5 "uint8_t multiple constant multiplies"   1.69 sec   946.75 M     1.26
 6  "uint8_t multiple constant multiply2"   1.34 sec   1194.03 M     1.00
 7              "uint8_t constant divide"   3.51 sec   455.84 M     2.62
 8    "uint8_t multiple constant divides"   3.52 sec   454.55 M     2.63
 9    "uint8_t multiple constant divide2"   1.34 sec   1194.03 M     1.00
10      "uint8_t multiple constant mixed"   0.96 sec   1666.67 M     0.72
11                 "uint8_t constant and"   1.35 sec   1185.19 M     1.01
12        "uint8_t multiple constant and"   1.34 sec   1194.03 M     1.00
13                  "uint8_t constant or"   1.35 sec   1185.19 M     1.01
14         "uint8_t multiple constant or"   1.35 sec   1185.19 M     1.01
15                 "uint8_t constant xor"   1.35 sec   1185.19 M     1.01
16        "uint8_t multiple constant xor"   1.35 sec   1185.19 M     1.01

Total absolute time for uint8_t constant folding: 27.49 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int16_t constant"   0.01 sec   1600000.00 M     1.00
 1                "int16_t add constants"   0.01 sec   1600000.00 M     1.00
 2           "int16_t subtract constants"   0.01 sec   1600000.00 M     1.00
 3           "int16_t multiply constants"   0.01 sec   1600000.00 M     1.00
 4             "int16_t divide constants"   0.01 sec   1600000.00 M     1.00
 5                "int16_t mod constants"   0.01 sec   1600000.00 M     1.00
 6              "int16_t equal constants"   0.01 sec   1600000.00 M     1.00
 7           "int16_t notequal constants"   0.01 sec   1600000.00 M     1.00
 8       "int16_t greater than constants"   0.01 sec   1600000.00 M     1.00
 9          "int16_t less than constants"   0.01 sec   1600000.00 M     1.00
10 "int16_t greater than equal constants"   0.01 sec   1600000.00 M     1.00
11    "int16_t less than equal constants"   0.01 sec   1600000.00 M     1.00
12                "int16_t and constants"   0.01 sec   1600000.00 M     1.00
13                 "int16_t or constants"   0.01 sec   1600000.00 M     1.00
14                "int16_t xor constants"   0.01 sec   1600000.00 M     1.00

Total absolute time for int16_t simple constant folding: 0.15 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int16_t constant add"   1.35 sec   1185.19 M     1.00
 1       "int16_t multiple constant adds"   1.35 sec   1185.19 M     1.00
 2            "int16_t constant subtract"   1.35 sec   1185.19 M     1.00
 3  "int16_t multiple constant subtracts"   1.34 sec   1194.03 M     0.99
 4            "int16_t constant multiply"   1.76 sec   909.09 M     1.30
 5 "int16_t multiple constant multiplies"   1.72 sec   930.23 M     1.27
 6  "int16_t multiple constant multiply2"   1.34 sec   1194.03 M     0.99
 7              "int16_t constant divide"   3.85 sec   415.58 M     2.85
 8    "int16_t multiple constant divides"   4.02 sec   398.01 M     2.98
 9    "int16_t multiple constant divide2"   1.34 sec   1194.03 M     0.99
10      "int16_t multiple constant mixed"   0.97 sec   1649.48 M     0.72
11                 "int16_t constant and"   1.34 sec   1194.03 M     0.99
12        "int16_t multiple constant and"   1.37 sec   1167.88 M     1.01
13                  "int16_t constant or"   1.34 sec   1194.03 M     0.99
14         "int16_t multiple constant or"   1.34 sec   1194.03 M     0.99
15                 "int16_t constant xor"   1.34 sec   1194.03 M     0.99
16        "int16_t multiple constant xor"   1.34 sec   1194.03 M     0.99

Total absolute time for int16_t constant folding: 28.46 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint16_t constant"   0.01 sec   1600000.00 M     1.00
 1                "uint16_t add constants"   0.01 sec   1600000.00 M     1.00
 2           "uint16_t subtract constants"   0.01 sec   1600000.00 M     1.00
 3           "uint16_t multiply constants"   0.01 sec   1600000.00 M     1.00
 4             "uint16_t divide constants"   0.01 sec   1600000.00 M     1.00
 5                "uint16_t mod constants"   0.01 sec   1600000.00 M     1.00
 6              "uint16_t equal constants"   0.00 sec     inf M     0.00
 7           "uint16_t notequal constants"   0.01 sec   1600000.00 M     1.00
 8       "uint16_t greater than constants"   0.01 sec   1600000.00 M     1.00
 9          "uint16_t less than constants"   0.01 sec   1600000.00 M     1.00
10 "uint16_t greater than equal constants"   0.01 sec   1600000.00 M     1.00
11    "uint16_t less than equal constants"   0.00 sec     inf M     0.00
12                "uint16_t and constants"   0.00 sec     inf M     0.00
13                 "uint16_t or constants"   0.00 sec     inf M     0.00
14                "uint16_t xor constants"   0.01 sec   1600000.00 M     1.00

Total absolute time for uint16_t simple constant folding: 0.11 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint16_t constant add"   1.52 sec   1052.63 M     1.00
 1       "uint16_t multiple constant adds"   1.52 sec   1052.63 M     1.00
 2            "uint16_t constant subtract"   1.53 sec   1045.75 M     1.01
 3  "uint16_t multiple constant subtracts"   1.52 sec   1052.63 M     1.00
 4            "uint16_t constant multiply"   2.04 sec   784.31 M     1.34
 5 "uint16_t multiple constant multiplies"   2.03 sec   788.18 M     1.34
 6  "uint16_t multiple constant multiply2"   1.52 sec   1052.63 M     1.00
 7              "uint16_t constant divide"   1.99 sec   804.02 M     1.31
 8    "uint16_t multiple constant divides"   1.99 sec   804.02 M     1.31
 9    "uint16_t multiple constant divide2"   1.52 sec   1052.63 M     1.00
10      "uint16_t multiple constant mixed"   1.34 sec   1194.03 M     0.88
11                 "uint16_t constant and"   1.52 sec   1052.63 M     1.00
12        "uint16_t multiple constant and"   1.52 sec   1052.63 M     1.00
13                  "uint16_t constant or"   1.52 sec   1052.63 M     1.00
14         "uint16_t multiple constant or"   1.52 sec   1052.63 M     1.00
15                 "uint16_t constant xor"   1.52 sec   1052.63 M     1.00
16        "uint16_t multiple constant xor"   1.53 sec   1045.75 M     1.01

Total absolute time for uint16_t constant folding: 27.65 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int32_t constant"   0.00 sec     inf M     nan
 1                "int32_t add constants"   0.00 sec     inf M     nan
 2           "int32_t subtract constants"   0.00 sec     inf M     nan
 3           "int32_t multiply constants"   0.00 sec     inf M     nan
 4             "int32_t divide constants"   0.00 sec     inf M     nan
 5                "int32_t mod constants"   0.00 sec     inf M     nan
 6              "int32_t equal constants"   0.00 sec     inf M     nan
 7           "int32_t notequal constants"   0.00 sec     inf M     nan
 8       "int32_t greater than constants"   0.00 sec     inf M     nan
 9          "int32_t less than constants"   0.00 sec     inf M     nan
10 "int32_t greater than equal constants"   0.00 sec     inf M     nan
11    "int32_t less than equal constants"   0.00 sec     inf M     nan
12                "int32_t and constants"   0.01 sec   1600000.00 M     inf
13                 "int32_t or constants"   0.00 sec     inf M     nan
14                "int32_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int32_t simple constant folding: 0.01 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int32_t constant add"   1.51 sec   1059.60 M     1.00
 1       "int32_t multiple constant adds"   1.51 sec   1059.60 M     1.00
 2            "int32_t constant subtract"   1.51 sec   1059.60 M     1.00
 3  "int32_t multiple constant subtracts"   1.52 sec   1052.63 M     1.01
 4            "int32_t constant multiply"   1.94 sec   824.74 M     1.28
 5 "int32_t multiple constant multiplies"   1.78 sec   898.88 M     1.18
 6  "int32_t multiple constant multiply2"   1.51 sec   1059.60 M     1.00
 7              "int32_t constant divide"   3.53 sec   453.26 M     2.34
 8    "int32_t multiple constant divides"   3.86 sec   414.51 M     2.56
 9    "int32_t multiple constant divide2"   1.52 sec   1052.63 M     1.01
10      "int32_t multiple constant mixed"   1.35 sec   1185.19 M     0.89
11                 "int32_t constant and"   1.53 sec   1045.75 M     1.01
12        "int32_t multiple constant and"   1.52 sec   1052.63 M     1.01
13                  "int32_t constant or"   1.52 sec   1052.63 M     1.01
14         "int32_t multiple constant or"   1.53 sec   1045.75 M     1.01
15                 "int32_t constant xor"   1.51 sec   1059.60 M     1.00
16        "int32_t multiple constant xor"   1.51 sec   1059.60 M     1.00

Total absolute time for int32_t constant folding: 30.66 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint32_t constant"   0.01 sec   1600000.00 M     1.00
 1                "uint32_t add constants"   0.00 sec     inf M     0.00
 2           "uint32_t subtract constants"   0.00 sec     inf M     0.00
 3           "uint32_t multiply constants"   0.00 sec     inf M     0.00
 4             "uint32_t divide constants"   0.00 sec     inf M     0.00
 5                "uint32_t mod constants"   0.00 sec     inf M     0.00
 6              "uint32_t equal constants"   0.00 sec     inf M     0.00
 7           "uint32_t notequal constants"   0.00 sec     inf M     0.00
 8       "uint32_t greater than constants"   0.00 sec     inf M     0.00
 9          "uint32_t less than constants"   0.00 sec     inf M     0.00
10 "uint32_t greater than equal constants"   0.00 sec     inf M     0.00
11    "uint32_t less than equal constants"   0.00 sec     inf M     0.00
12                "uint32_t and constants"   0.01 sec   1600000.00 M     1.00
13                 "uint32_t or constants"   0.00 sec     inf M     0.00
14                "uint32_t xor constants"   0.00 sec     inf M     0.00

Total absolute time for uint32_t simple constant folding: 0.02 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint32_t constant add"   1.51 sec   1059.60 M     1.00
 1       "uint32_t multiple constant adds"   1.51 sec   1059.60 M     1.00
 2            "uint32_t constant subtract"   1.51 sec   1059.60 M     1.00
 3  "uint32_t multiple constant subtracts"   1.52 sec   1052.63 M     1.01
 4            "uint32_t constant multiply"   1.94 sec   824.74 M     1.28
 5 "uint32_t multiple constant multiplies"   1.78 sec   898.88 M     1.18
 6  "uint32_t multiple constant multiply2"   1.51 sec   1059.60 M     1.00
 7              "uint32_t constant divide"   2.77 sec   577.62 M     1.83
 8    "uint32_t multiple constant divides"   2.77 sec   577.62 M     1.83
 9    "uint32_t multiple constant divide2"   1.52 sec   1052.63 M     1.01
10      "uint32_t multiple constant mixed"   1.35 sec   1185.19 M     0.89
11                 "uint32_t constant and"   1.51 sec   1059.60 M     1.00
12        "uint32_t multiple constant and"   1.51 sec   1059.60 M     1.00
13                  "uint32_t constant or"   1.52 sec   1052.63 M     1.01
14         "uint32_t multiple constant or"   1.51 sec   1059.60 M     1.00
15                 "uint32_t constant xor"   1.51 sec   1059.60 M     1.00
16        "uint32_t multiple constant xor"   1.51 sec   1059.60 M     1.00

Total absolute time for uint32_t constant folding: 28.76 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int64_t constant"   0.01 sec   1600000.00 M     1.00
 1                "int64_t add constants"   0.00 sec     inf M     0.00
 2           "int64_t subtract constants"   0.00 sec     inf M     0.00
 3           "int64_t multiply constants"   0.00 sec     inf M     0.00
 4             "int64_t divide constants"   0.00 sec     inf M     0.00
 5                "int64_t mod constants"   0.00 sec     inf M     0.00
 6              "int64_t equal constants"   0.00 sec     inf M     0.00
 7           "int64_t notequal constants"   0.00 sec     inf M     0.00
 8       "int64_t greater than constants"   0.00 sec     inf M     0.00
 9          "int64_t less than constants"   0.00 sec     inf M     0.00
10 "int64_t greater than equal constants"   0.00 sec     inf M     0.00
11    "int64_t less than equal constants"   0.00 sec     inf M     0.00
12                "int64_t and constants"   0.00 sec     inf M     0.00
13                 "int64_t or constants"   0.00 sec     inf M     0.00
14                "int64_t xor constants"   0.00 sec     inf M     0.00

Total absolute time for int64_t simple constant folding: 0.01 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int64_t constant add"   1.57 sec   1019.11 M     1.00
 1       "int64_t multiple constant adds"   1.57 sec   1019.11 M     1.00
 2            "int64_t constant subtract"   1.57 sec   1019.11 M     1.00
 3  "int64_t multiple constant subtracts"   1.56 sec   1025.64 M     0.99
 4            "int64_t constant multiply"   2.02 sec   792.08 M     1.29
 5 "int64_t multiple constant multiplies"   2.01 sec   796.02 M     1.28
 6  "int64_t multiple constant multiply2"   1.57 sec   1019.11 M     1.00
 7              "int64_t constant divide"   3.38 sec   473.37 M     2.15
 8    "int64_t multiple constant divides"   3.76 sec   425.53 M     2.39
 9    "int64_t multiple constant divide2"   1.57 sec   1019.11 M     1.00
10      "int64_t multiple constant mixed"   1.34 sec   1194.03 M     0.85
11                 "int64_t constant and"   1.57 sec   1019.11 M     1.00
12        "int64_t multiple constant and"   1.56 sec   1025.64 M     0.99
13                  "int64_t constant or"   1.57 sec   1019.11 M     1.00
14         "int64_t multiple constant or"   1.57 sec   1019.11 M     1.00
15                 "int64_t constant xor"   1.56 sec   1025.64 M     0.99
16        "int64_t multiple constant xor"   1.57 sec   1019.11 M     1.00

Total absolute time for int64_t constant folding: 31.32 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint64_t constant"   0.00 sec     inf M     nan
 1                "uint64_t add constants"   0.00 sec     inf M     nan
 2           "uint64_t subtract constants"   0.00 sec     inf M     nan
 3           "uint64_t multiply constants"   0.00 sec     inf M     nan
 4             "uint64_t divide constants"   0.01 sec   1600000.00 M     inf
 5                "uint64_t mod constants"   0.00 sec     inf M     nan
 6              "uint64_t equal constants"   0.00 sec     inf M     nan
 7           "uint64_t notequal constants"   0.00 sec     inf M     nan
 8       "uint64_t greater than constants"   0.00 sec     inf M     nan
 9          "uint64_t less than constants"   0.00 sec     inf M     nan
10 "uint64_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint64_t less than equal constants"   0.00 sec     inf M     nan
12                "uint64_t and constants"   0.00 sec     inf M     nan
13                 "uint64_t or constants"   0.00 sec     inf M     nan
14                "uint64_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint64_t simple constant folding: 0.01 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint64_t constant add"   1.57 sec   1019.11 M     1.00
 1       "uint64_t multiple constant adds"   1.57 sec   1019.11 M     1.00
 2            "uint64_t constant subtract"   1.57 sec   1019.11 M     1.00
 3  "uint64_t multiple constant subtracts"   1.57 sec   1019.11 M     1.00
 4            "uint64_t constant multiply"   2.03 sec   788.18 M     1.29
 5 "uint64_t multiple constant multiplies"   2.03 sec   788.18 M     1.29
 6  "uint64_t multiple constant multiply2"   1.58 sec   1012.66 M     1.01
 7              "uint64_t constant divide"   2.70 sec   592.59 M     1.72
 8    "uint64_t multiple constant divides"   2.70 sec   592.59 M     1.72
 9    "uint64_t multiple constant divide2"   1.57 sec   1019.11 M     1.00
10      "uint64_t multiple constant mixed"   1.35 sec   1185.19 M     0.86
11                 "uint64_t constant and"   1.57 sec   1019.11 M     1.00
12        "uint64_t multiple constant and"   1.57 sec   1019.11 M     1.00
13                  "uint64_t constant or"   1.57 sec   1019.11 M     1.00
14         "uint64_t multiple constant or"   1.57 sec   1019.11 M     1.00
15                 "uint64_t constant xor"   1.57 sec   1019.11 M     1.00
16        "uint64_t multiple constant xor"   1.57 sec   1019.11 M     1.00

Total absolute time for uint64_t constant folding: 29.66 sec

test              description   absolute   operations   ratio with
number                          time       per second   test0

 0           "float constant"  20.09 sec   796.42 M     1.00
 1      "float add constants"  20.09 sec   796.42 M     1.00
 2 "float subtract constants"  20.11 sec   795.62 M     1.00
 3 "float multiply constants"  20.14 sec   794.44 M     1.00
 4   "float divide constants"  20.09 sec   796.42 M     1.00

Total absolute time for float simple constant folding: 100.52 sec

test                        description   absolute   operations   ratio with
number                                    time       per second   test0

 0                 "float constant add"   2.01 sec   796.02 M     1.00
 1       "float multiple constant adds"   3.36 sec   476.19 M     1.67
 2            "float constant subtract"   2.01 sec   796.02 M     1.00
 3  "float multiple constant subtracts"   3.36 sec   476.19 M     1.67
 4            "float constant multiply"   2.01 sec   796.02 M     1.00
 5 "float multiple constant multiplies"   2.70 sec   592.59 M     1.34
 6  "float multiple constant multiply2"   2.01 sec   796.02 M     1.00
 7              "float constant divide"  11.45 sec   139.74 M     5.70
 8    "float multiple constant divides"  22.92 sec   69.81 M     11.40
 9    "float multiple constant divide2"   2.01 sec   796.02 M     1.00
10      "float multiple constant mixed"   2.02 sec   792.08 M     1.00

Total absolute time for float constant folding: 55.86 sec

test               description   absolute   operations   ratio with
number                           time       per second   test0

 0           "double constant"  20.09 sec   796.42 M     1.00
 1      "double add constants"  20.10 sec   796.02 M     1.00
 2 "double subtract constants"  20.09 sec   796.42 M     1.00
 3 "double multiply constants"  20.16 sec   793.65 M     1.00
 4   "double divide constants"  20.09 sec   796.42 M     1.00

Total absolute time for double simple constant folding: 100.53 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                 "double constant add"   2.04 sec   784.31 M     1.00
 1       "double multiple constant adds"   3.52 sec   454.55 M     1.73
 2            "double constant subtract"   2.05 sec   780.49 M     1.00
 3  "double multiple constant subtracts"   3.52 sec   454.55 M     1.73
 4            "double constant multiply"   2.01 sec   796.02 M     0.99
 5 "double multiple constant multiplies"   2.88 sec   555.56 M     1.41
 6  "double multiple constant multiply2"   2.04 sec   784.31 M     1.00
 7              "double constant divide"  20.74 sec   77.15 M     10.17
 8    "double multiple constant divides"  42.41 sec   37.73 M     20.79
 9    "double multiple constant divide2"   2.04 sec   784.31 M     1.00
10      "double multiple constant mixed"   2.19 sec   730.59 M     1.07

Total absolute time for double constant folding: 85.44 sec
./simple_types_loop_invariant 

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                  "int8_t variable add"   1.52 sec   1052.63 M     1.00
 1          "int8_t variable add hoisted"   1.34 sec   1194.03 M     0.88
 2        "int8_t multiple variable adds"   1.34 sec   1194.03 M     0.88
 3             "int8_t variable subtract"   1.71 sec   935.67 M     1.12
 4   "int8_t multiple variable subtracts"   4.02 sec   398.01 M     2.64
 5             "int8_t variable multiply"   1.81 sec   883.98 M     1.19
 6  "int8_t multiple variable multiplies"   1.62 sec   987.65 M     1.07
 7 "int8_t multiple variable multiplies2"   1.35 sec   1185.19 M     0.89
 8               "int8_t variable divide"   8.03 sec   199.25 M     5.28
 9     "int8_t multiple variable divides"  32.29 sec   49.55 M     21.24
10    "int8_t multiple variable divides2"   1.68 sec   952.38 M     1.11
11       "int8_t multiple variable mixed"   1.65 sec   969.70 M     1.09
12                  "int8_t variable and"   1.53 sec   1045.75 M     1.01
13         "int8_t multiple variable and"   1.34 sec   1194.03 M     0.88
14                   "int8_t variable or"   1.52 sec   1052.63 M     1.00
15          "int8_t multiple variable or"   1.34 sec   1194.03 M     0.88
16                  "int8_t variable xor"   1.51 sec   1059.60 M     0.99
17         "int8_t multiple variable xor"   1.34 sec   1194.03 M     0.88

Total absolute time for int8_t loop invariant: 66.94 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                  "uint8_t variable add"   1.52 sec   1052.63 M     1.00
 1          "uint8_t variable add hoisted"   1.34 sec   1194.03 M     0.88
 2        "uint8_t multiple variable adds"   1.34 sec   1194.03 M     0.88
 3             "uint8_t variable subtract"   1.68 sec   952.38 M     1.11
 4   "uint8_t multiple variable subtracts"   4.02 sec   398.01 M     2.64
 5             "uint8_t variable multiply"   1.80 sec   888.89 M     1.18
 6  "uint8_t multiple variable multiplies"   1.63 sec   981.60 M     1.07
 7 "uint8_t multiple variable multiplies2"   1.34 sec   1194.03 M     0.88
 8               "uint8_t variable divide"   8.04 sec   199.00 M     5.29
 9     "uint8_t multiple variable divides"  32.23 sec   49.64 M     21.20
10    "uint8_t multiple variable divides2"   1.83 sec   874.32 M     1.20
11       "uint8_t multiple variable mixed"   1.82 sec   879.12 M     1.20
12                  "uint8_t variable and"   1.53 sec   1045.75 M     1.01
13         "uint8_t multiple variable and"   1.51 sec   1059.60 M     0.99
14                   "uint8_t variable or"   1.52 sec   1052.63 M     1.00
15          "uint8_t multiple variable or"   1.51 sec   1059.60 M     0.99
16                  "uint8_t variable xor"   1.52 sec   1052.63 M     1.00
17         "uint8_t multiple variable xor"   1.52 sec   1052.63 M     1.00

Total absolute time for uint8_t loop invariant: 67.70 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                  "int16_t variable add"   1.51 sec   1059.60 M     1.00
 1          "int16_t variable add hoisted"   1.35 sec   1185.19 M     0.89
 2        "int16_t multiple variable adds"   1.34 sec   1194.03 M     0.89
 3             "int16_t variable subtract"   1.68 sec   952.38 M     1.11
 4   "int16_t multiple variable subtracts"   4.02 sec   398.01 M     2.66
 5             "int16_t variable multiply"   1.81 sec   883.98 M     1.20
 6  "int16_t multiple variable multiplies"   1.58 sec   1012.66 M     1.05
 7 "int16_t multiple variable multiplies2"   1.34 sec   1194.03 M     0.89
 8               "int16_t variable divide"   8.03 sec   199.25 M     5.32
 9     "int16_t multiple variable divides"  32.22 sec   49.66 M     21.34
10    "int16_t multiple variable divides2"   1.82 sec   879.12 M     1.21
11       "int16_t multiple variable mixed"   1.81 sec   883.98 M     1.20
12                  "int16_t variable and"   1.52 sec   1052.63 M     1.01
13         "int16_t multiple variable and"   1.34 sec   1194.03 M     0.89
14                   "int16_t variable or"   1.53 sec   1045.75 M     1.01
15          "int16_t multiple variable or"   1.35 sec   1185.19 M     0.89
16                  "int16_t variable xor"   1.52 sec   1052.63 M     1.01
17         "int16_t multiple variable xor"   1.36 sec   1176.47 M     0.90

Total absolute time for int16_t loop invariant: 67.13 sec

test                            description   absolute   operations   ratio with
number                                        time       per second   test0

 0                  "uint16_t variable add"   1.53 sec   1045.75 M     1.00
 1          "uint16_t variable add hoisted"   1.35 sec   1185.19 M     0.88
 2        "uint16_t multiple variable adds"   1.35 sec   1185.19 M     0.88
 3             "uint16_t variable subtract"   1.68 sec   952.38 M     1.10
 4   "uint16_t multiple variable subtracts"   4.01 sec   399.00 M     2.62
 5             "uint16_t variable multiply"   1.80 sec   888.89 M     1.18
 6  "uint16_t multiple variable multiplies"   1.63 sec   981.60 M     1.07
 7 "uint16_t multiple variable multiplies2"   1.34 sec   1194.03 M     0.88
 8               "uint16_t variable divide"   8.15 sec   196.32 M     5.33
 9     "uint16_t multiple variable divides"  32.17 sec   49.74 M     21.03
10    "uint16_t multiple variable divides2"   1.66 sec   963.86 M     1.08
11       "uint16_t multiple variable mixed"   1.65 sec   969.70 M     1.08
12                  "uint16_t variable and"   1.52 sec   1052.63 M     0.99
13         "uint16_t multiple variable and"   1.51 sec   1059.60 M     0.99
14                   "uint16_t variable or"   1.53 sec   1045.75 M     1.00
15          "uint16_t multiple variable or"   1.50 sec   1066.67 M     0.98
16                  "uint16_t variable xor"   1.53 sec   1045.75 M     1.00
17         "uint16_t multiple variable xor"   1.50 sec   1066.67 M     0.98

Total absolute time for uint16_t loop invariant: 67.41 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                  "int32_t variable add"   1.67 sec   958.08 M     1.00
 1          "int32_t variable add hoisted"   1.34 sec   1194.03 M     0.80
 2        "int32_t multiple variable adds"   1.43 sec   1118.88 M     0.86
 3             "int32_t variable subtract"   1.51 sec   1059.60 M     0.90
 4   "int32_t multiple variable subtracts"   2.05 sec   780.49 M     1.23
 5             "int32_t variable multiply"   1.93 sec   829.02 M     1.16
 6  "int32_t multiple variable multiplies"   1.72 sec   930.23 M     1.03
 7 "int32_t multiple variable multiplies2"   1.41 sec   1134.75 M     0.84
 8               "int32_t variable divide"   8.06 sec   198.51 M     4.83
 9     "int32_t multiple variable divides"  32.14 sec   49.78 M     19.25
10    "int32_t multiple variable divides2"   1.66 sec   963.86 M     0.99
11       "int32_t multiple variable mixed"   1.65 sec   969.70 M     0.99
12                  "int32_t variable and"   1.41 sec   1134.75 M     0.84
13         "int32_t multiple variable and"   1.41 sec   1134.75 M     0.84
14                   "int32_t variable or"   1.41 sec   1134.75 M     0.84
15          "int32_t multiple variable or"   1.43 sec   1118.88 M     0.86
16                  "int32_t variable xor"   1.66 sec   963.86 M     0.99
17         "int32_t multiple variable xor"   1.43 sec   1118.88 M     0.86

Total absolute time for int32_t loop invariant: 65.32 sec

test                            description   absolute   operations   ratio with
number                                        time       per second   test0

 0                  "uint32_t variable add"   1.66 sec   963.86 M     1.00
 1          "uint32_t variable add hoisted"   1.34 sec   1194.03 M     0.81
 2        "uint32_t multiple variable adds"   1.43 sec   1118.88 M     0.86
 3             "uint32_t variable subtract"   1.52 sec   1052.63 M     0.92
 4   "uint32_t multiple variable subtracts"   2.03 sec   788.18 M     1.22
 5             "uint32_t variable multiply"   1.87 sec   855.61 M     1.13
 6  "uint32_t multiple variable multiplies"   1.71 sec   935.67 M     1.03
 7 "uint32_t multiple variable multiplies2"   1.43 sec   1118.88 M     0.86
 8               "uint32_t variable divide"   8.04 sec   199.00 M     4.84
 9     "uint32_t multiple variable divides"  32.21 sec   49.67 M     19.40
10    "uint32_t multiple variable divides2"   1.67 sec   958.08 M     1.01
11       "uint32_t multiple variable mixed"   1.65 sec   969.70 M     0.99
12                  "uint32_t variable and"   1.66 sec   963.86 M     1.00
13         "uint32_t multiple variable and"   1.44 sec   1111.11 M     0.87
14                   "uint32_t variable or"   1.65 sec   969.70 M     0.99
15          "uint32_t multiple variable or"   1.43 sec   1118.88 M     0.86
16                  "uint32_t variable xor"   1.66 sec   963.86 M     1.00
17         "uint32_t multiple variable xor"   1.43 sec   1118.88 M     0.86

Total absolute time for uint32_t loop invariant: 65.83 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                  "int64_t variable add"   1.69 sec   946.75 M     1.00
 1          "int64_t variable add hoisted"   1.34 sec   1194.03 M     0.79
 2        "int64_t multiple variable adds"   1.50 sec   1066.67 M     0.89
 3             "int64_t variable subtract"   1.57 sec   1019.11 M     0.93
 4   "int64_t multiple variable subtracts"   2.04 sec   784.31 M     1.21
 5             "int64_t variable multiply"   1.81 sec   883.98 M     1.07
 6  "int64_t multiple variable multiplies"   1.59 sec   1006.29 M     0.94
 7 "int64_t multiple variable multiplies2"   1.50 sec   1066.67 M     0.89
 8               "int64_t variable divide"  22.18 sec   72.14 M     13.12
 9     "int64_t multiple variable divides"  100.84 sec   15.87 M     59.67
10    "int64_t multiple variable divides2"   1.69 sec   946.75 M     1.00
11       "int64_t multiple variable mixed"   1.69 sec   946.75 M     1.00
12                  "int64_t variable and"   1.70 sec   941.18 M     1.01
13         "int64_t multiple variable and"   1.50 sec   1066.67 M     0.89
14                   "int64_t variable or"   1.69 sec   946.75 M     1.00
15          "int64_t multiple variable or"   1.50 sec   1066.67 M     0.89
16                  "int64_t variable xor"   1.70 sec   941.18 M     1.01
17         "int64_t multiple variable xor"   1.50 sec   1066.67 M     0.89

Total absolute time for int64_t loop invariant: 149.03 sec

test                            description   absolute   operations   ratio with
number                                        time       per second   test0

 0                  "uint64_t variable add"   1.69 sec   946.75 M     1.00
 1          "uint64_t variable add hoisted"   1.34 sec   1194.03 M     0.79
 2        "uint64_t multiple variable adds"   1.50 sec   1066.67 M     0.89
 3             "uint64_t variable subtract"   1.57 sec   1019.11 M     0.93
 4   "uint64_t multiple variable subtracts"   2.05 sec   780.49 M     1.21
 5             "uint64_t variable multiply"   1.81 sec   883.98 M     1.07
 6  "uint64_t multiple variable multiplies"   1.59 sec   1006.29 M     0.94
 7 "uint64_t multiple variable multiplies2"   1.49 sec   1073.83 M     0.88
 8               "uint64_t variable divide"  13.08 sec   122.32 M     7.74
 9     "uint64_t multiple variable divides"  64.18 sec   24.93 M     37.98
10    "uint64_t multiple variable divides2"   1.69 sec   946.75 M     1.00
11       "uint64_t multiple variable mixed"   1.69 sec   946.75 M     1.00
12                  "uint64_t variable and"   1.70 sec   941.18 M     1.01
13         "uint64_t multiple variable and"   1.50 sec   1066.67 M     0.89
14                   "uint64_t variable or"   1.69 sec   946.75 M     1.00
15          "uint64_t multiple variable or"   1.50 sec   1066.67 M     0.89
16                  "uint64_t variable xor"   1.69 sec   946.75 M     1.00
17         "uint64_t multiple variable xor"   1.50 sec   1066.67 M     0.89

Total absolute time for uint64_t loop invariant: 103.26 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                  "float variable add"   2.01 sec   796.02 M     1.00
 1          "float variable add hoisted"   2.01 sec   796.02 M     1.00
 2        "float multiple variable adds"   3.36 sec   476.19 M     1.67
 3             "float variable subtract"   2.01 sec   796.02 M     1.00
 4   "float multiple variable subtracts"   3.36 sec   476.19 M     1.67
 5             "float variable multiply"   2.01 sec   796.02 M     1.00
 6  "float multiple variable multiplies"   3.36 sec   476.19 M     1.67
 7 "float multiple variable multiplies2"   2.01 sec   796.02 M     1.00
 8               "float variable divide"   3.36 sec   476.19 M     1.67
 9     "float multiple variable divides"  29.68 sec   53.91 M     14.77
10    "float multiple variable divides2"   2.01 sec   796.02 M     1.00
11       "float multiple variable mixed"   2.02 sec   792.08 M     1.00

Total absolute time for float loop invariant: 57.20 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                  "double variable add"   2.01 sec   796.02 M     1.00
 1          "double variable add hoisted"   2.01 sec   796.02 M     1.00
 2        "double multiple variable adds"   3.53 sec   453.26 M     1.76
 3             "double variable subtract"   2.04 sec   784.31 M     1.01
 4   "double multiple variable subtracts"   3.52 sec   454.55 M     1.75
 5             "double variable multiply"   2.02 sec   792.08 M     1.00
 6  "double multiple variable multiplies"   3.64 sec   439.56 M     1.81
 7 "double multiple variable multiplies2"   2.02 sec   792.08 M     1.00
 8               "double variable divide"   3.35 sec   477.61 M     1.67
 9     "double multiple variable divides"  49.13 sec   32.57 M     24.44
10    "double multiple variable divides2"   2.02 sec   792.08 M     1.00
11       "double multiple variable mixed"   2.03 sec   788.18 M     1.01

Total absolute time for double loop invariant: 77.32 sec
./loop_unroll 

test                description   absolute   operations   ratio with
number                            time       per second   test0

 0  "int32_t for loop unroll 1"   3.14 sec   764.33 M     1.00
 1  "int32_t for loop unroll 2"   2.15 sec   1116.28 M     0.68
 2  "int32_t for loop unroll 3"   1.82 sec   1318.68 M     0.58
 3  "int32_t for loop unroll 4"   1.73 sec   1387.28 M     0.55
 4  "int32_t for loop unroll 5"   1.61 sec   1490.68 M     0.51
 5  "int32_t for loop unroll 6"   1.76 sec   1363.64 M     0.56
 6  "int32_t for loop unroll 7"   1.64 sec   1463.41 M     0.52
 7  "int32_t for loop unroll 8"   1.63 sec   1472.39 M     0.52
 8  "int32_t for loop unroll 9"   1.53 sec   1568.63 M     0.49
 9 "int32_t for loop unroll 10"   1.45 sec   1655.17 M     0.46
10 "int32_t for loop unroll 11"   2.31 sec   1038.96 M     0.74
11 "int32_t for loop unroll 12"   2.27 sec   1057.27 M     0.72
12 "int32_t for loop unroll 13"   2.14 sec   1121.50 M     0.68
13 "int32_t for loop unroll 14"   2.07 sec   1159.42 M     0.66
14 "int32_t for loop unroll 15"   1.96 sec   1224.49 M     0.62
15 "int32_t for loop unroll 16"   1.96 sec   1224.49 M     0.62
16 "int32_t for loop unroll 17"   1.86 sec   1290.32 M     0.59
17 "int32_t for loop unroll 18"   2.34 sec   1025.64 M     0.75
18 "int32_t for loop unroll 19"   2.44 sec   983.61 M     0.78
19 "int32_t for loop unroll 20"   2.38 sec   1008.40 M     0.76
20 "int32_t for loop unroll 21"   2.28 sec   1052.63 M     0.73
21 "int32_t for loop unroll 22"   2.18 sec   1100.92 M     0.69
22 "int32_t for loop unroll 23"   2.25 sec   1066.67 M     0.72
23 "int32_t for loop unroll 24"   2.13 sec   1126.76 M     0.68
24 "int32_t for loop unroll 25"   2.12 sec   1132.08 M     0.68
25 "int32_t for loop unroll 26"   2.03 sec   1182.27 M     0.65
26 "int32_t for loop unroll 27"   2.08 sec   1153.85 M     0.66
27 "int32_t for loop unroll 28"   1.97 sec   1218.27 M     0.63
28 "int32_t for loop unroll 29"   2.44 sec   983.61 M     0.78
29 "int32_t for loop unroll 30"   2.60 sec   923.08 M     0.83
30 "int32_t for loop unroll 31"   1.96 sec   1224.49 M     0.62
31 "int32_t for loop unroll 32"   1.92 sec   1250.00 M     0.61

Total absolute time for int32_t for loop unrolling: 66.15 sec

test                  description   absolute   operations   ratio with
number                              time       per second   test0

 0  "int32_t while loop unroll 1"   3.14 sec   764.33 M     1.00
 1  "int32_t while loop unroll 2"   2.16 sec   1111.11 M     0.69
 2  "int32_t while loop unroll 3"   1.83 sec   1311.48 M     0.58
 3  "int32_t while loop unroll 4"   1.72 sec   1395.35 M     0.55
 4  "int32_t while loop unroll 5"   1.62 sec   1481.48 M     0.52
 5  "int32_t while loop unroll 6"   1.76 sec   1363.64 M     0.56
 6  "int32_t while loop unroll 7"   1.75 sec   1371.43 M     0.56
 7  "int32_t while loop unroll 8"   1.64 sec   1463.41 M     0.52
 8  "int32_t while loop unroll 9"   1.53 sec   1568.63 M     0.49
 9 "int32_t while loop unroll 10"   2.44 sec   983.61 M     0.78
10 "int32_t while loop unroll 11"   2.31 sec   1038.96 M     0.74
11 "int32_t while loop unroll 12"   2.27 sec   1057.27 M     0.72
12 "int32_t while loop unroll 13"   2.14 sec   1121.50 M     0.68
13 "int32_t while loop unroll 14"   2.07 sec   1159.42 M     0.66
14 "int32_t while loop unroll 15"   1.96 sec   1224.49 M     0.62
15 "int32_t while loop unroll 16"   1.45 sec   1655.17 M     0.46
16 "int32_t while loop unroll 17"   1.87 sec   1283.42 M     0.60
17 "int32_t while loop unroll 18"   2.36 sec   1016.95 M     0.75
18 "int32_t while loop unroll 19"   2.46 sec   975.61 M     0.78
19 "int32_t while loop unroll 20"   2.41 sec   995.85 M     0.77
20 "int32_t while loop unroll 21"   2.28 sec   1052.63 M     0.73
21 "int32_t while loop unroll 22"   2.18 sec   1100.92 M     0.69
22 "int32_t while loop unroll 23"   2.25 sec   1066.67 M     0.72
23 "int32_t while loop unroll 24"   2.13 sec   1126.76 M     0.68
24 "int32_t while loop unroll 25"   2.12 sec   1132.08 M     0.68
25 "int32_t while loop unroll 26"   2.03 sec   1182.27 M     0.65
26 "int32_t while loop unroll 27"   2.08 sec   1153.85 M     0.66
27 "int32_t while loop unroll 28"   1.96 sec   1224.49 M     0.62
28 "int32_t while loop unroll 29"   2.45 sec   979.59 M     0.78
29 "int32_t while loop unroll 30"   2.59 sec   926.64 M     0.82
30 "int32_t while loop unroll 31"   2.48 sec   967.74 M     0.79
31 "int32_t while loop unroll 32"   2.49 sec   963.86 M     0.79

Total absolute time for int32_t while loop unrolling: 67.93 sec

test               description   absolute   operations   ratio with
number                           time       per second   test0

 0  "int32_t do loop unroll 1"   3.15 sec   761.90 M     1.00
 1  "int32_t do loop unroll 2"   2.16 sec   1111.11 M     0.69
 2  "int32_t do loop unroll 3"   1.83 sec   1311.48 M     0.58
 3  "int32_t do loop unroll 4"   1.73 sec   1387.28 M     0.55
 4  "int32_t do loop unroll 5"   1.62 sec   1481.48 M     0.51
 5  "int32_t do loop unroll 6"   1.74 sec   1379.31 M     0.55
 6  "int32_t do loop unroll 7"   1.67 sec   1437.13 M     0.53
 7  "int32_t do loop unroll 8"   1.70 sec   1411.76 M     0.54
 8  "int32_t do loop unroll 9"   1.56 sec   1538.46 M     0.50
 9 "int32_t do loop unroll 10"   2.47 sec   971.66 M     0.78
10 "int32_t do loop unroll 11"   2.34 sec   1025.64 M     0.74
11 "int32_t do loop unroll 12"   2.21 sec   1085.97 M     0.70
12 "int32_t do loop unroll 13"   2.14 sec   1121.50 M     0.68
13 "int32_t do loop unroll 14"   2.09 sec   1148.33 M     0.66
14 "int32_t do loop unroll 15"   2.02 sec   1188.12 M     0.64
15 "int32_t do loop unroll 16"   1.45 sec   1655.17 M     0.46
16 "int32_t do loop unroll 17"   1.92 sec   1250.00 M     0.61
17 "int32_t do loop unroll 18"   1.41 sec   1702.13 M     0.45
18 "int32_t do loop unroll 19"   2.41 sec   995.85 M     0.77
19 "int32_t do loop unroll 20"   2.41 sec   995.85 M     0.77
20 "int32_t do loop unroll 21"   2.38 sec   1008.40 M     0.76
21 "int32_t do loop unroll 22"   2.29 sec   1048.03 M     0.73
22 "int32_t do loop unroll 23"   2.25 sec   1066.67 M     0.71
23 "int32_t do loop unroll 24"   2.26 sec   1061.95 M     0.72
24 "int32_t do loop unroll 25"   2.26 sec   1061.95 M     0.72
25 "int32_t do loop unroll 26"   2.09 sec   1148.33 M     0.66
26 "int32_t do loop unroll 27"   2.14 sec   1121.50 M     0.68
27 "int32_t do loop unroll 28"   2.41 sec   995.85 M     0.77
28 "int32_t do loop unroll 29"   2.36 sec   1016.95 M     0.75
29 "int32_t do loop unroll 30"   1.96 sec   1224.49 M     0.62
30 "int32_t do loop unroll 31"   2.54 sec   944.88 M     0.81
31 "int32_t do loop unroll 32"   2.34 sec   1025.64 M     0.74

Total absolute time for int32_t do loop unrolling: 67.31 sec

test                 description   absolute   operations   ratio with
number                             time       per second   test0

 0  "int32_t goto loop unroll 1"   3.14 sec   764.33 M     1.00
 1  "int32_t goto loop unroll 2"   2.15 sec   1116.28 M     0.68
 2  "int32_t goto loop unroll 3"   1.83 sec   1311.48 M     0.58
 3  "int32_t goto loop unroll 4"   1.73 sec   1387.28 M     0.55
 4  "int32_t goto loop unroll 5"   1.63 sec   1472.39 M     0.52
 5  "int32_t goto loop unroll 6"   1.75 sec   1371.43 M     0.56
 6  "int32_t goto loop unroll 7"   1.67 sec   1437.13 M     0.53
 7  "int32_t goto loop unroll 8"   2.69 sec   892.19 M     0.86
 8  "int32_t goto loop unroll 9"   1.57 sec   1528.66 M     0.50
 9 "int32_t goto loop unroll 10"   2.47 sec   971.66 M     0.79
10 "int32_t goto loop unroll 11"   2.34 sec   1025.64 M     0.75
11 "int32_t goto loop unroll 12"   2.21 sec   1085.97 M     0.70
12 "int32_t goto loop unroll 13"   2.14 sec   1121.50 M     0.68
13 "int32_t goto loop unroll 14"   2.08 sec   1153.85 M     0.66
14 "int32_t goto loop unroll 15"   2.04 sec   1176.47 M     0.65
15 "int32_t goto loop unroll 16"   1.45 sec   1655.17 M     0.46
16 "int32_t goto loop unroll 17"   1.92 sec   1250.00 M     0.61
17 "int32_t goto loop unroll 18"   1.40 sec   1714.29 M     0.45
18 "int32_t goto loop unroll 19"   2.39 sec   1004.18 M     0.76
19 "int32_t goto loop unroll 20"   2.39 sec   1004.18 M     0.76
20 "int32_t goto loop unroll 21"   2.37 sec   1012.66 M     0.75
21 "int32_t goto loop unroll 22"   2.27 sec   1057.27 M     0.72
22 "int32_t goto loop unroll 23"   2.27 sec   1057.27 M     0.72
23 "int32_t goto loop unroll 24"   2.96 sec   810.81 M     0.94
24 "int32_t goto loop unroll 25"   2.28 sec   1052.63 M     0.73
25 "int32_t goto loop unroll 26"   2.81 sec   854.09 M     0.89
26 "int32_t goto loop unroll 27"   2.14 sec   1121.50 M     0.68
27 "int32_t goto loop unroll 28"   1.94 sec   1237.11 M     0.62
28 "int32_t goto loop unroll 29"   2.36 sec   1016.95 M     0.75
29 "int32_t goto loop unroll 30"   1.97 sec   1218.27 M     0.63
30 "int32_t goto loop unroll 31"   2.54 sec   944.88 M     0.81
31 "int32_t goto loop unroll 32"   2.36 sec   1016.95 M     0.75

Total absolute time for int32_t goto loop unrolling: 69.26 sec

test               description   absolute   operations   ratio with
number                           time       per second   test0

 0  "double for loop unroll 1"   2.12 sec   283.02 M     1.00
 1  "double for loop unroll 2"   2.10 sec   285.71 M     0.99
 2  "double for loop unroll 3"   2.07 sec   289.86 M     0.98
 3  "double for loop unroll 4"   2.08 sec   288.46 M     0.98
 4  "double for loop unroll 5"   2.06 sec   291.26 M     0.97
 5  "double for loop unroll 6"   2.04 sec   294.12 M     0.96
 6  "double for loop unroll 7"   2.05 sec   292.68 M     0.97
 7  "double for loop unroll 8"   2.05 sec   292.68 M     0.97
 8  "double for loop unroll 9"   2.04 sec   294.12 M     0.96
 9 "double for loop unroll 10"   2.03 sec   295.57 M     0.96
10 "double for loop unroll 11"   2.03 sec   295.57 M     0.96
11 "double for loop unroll 12"   2.04 sec   294.12 M     0.96
12 "double for loop unroll 13"   2.03 sec   295.57 M     0.96
13 "double for loop unroll 14"   2.18 sec   275.23 M     1.03
14 "double for loop unroll 15"   2.32 sec   258.62 M     1.09
15 "double for loop unroll 16"   2.29 sec   262.01 M     1.08
16 "double for loop unroll 17"   2.18 sec   275.23 M     1.03
17 "double for loop unroll 18"   2.32 sec   258.62 M     1.09
18 "double for loop unroll 19"   2.30 sec   260.87 M     1.08
19 "double for loop unroll 20"   2.27 sec   264.32 M     1.07
20 "double for loop unroll 21"   2.27 sec   264.32 M     1.07
21 "double for loop unroll 22"   2.39 sec   251.05 M     1.13
22 "double for loop unroll 23"   2.24 sec   267.86 M     1.06
23 "double for loop unroll 24"   2.24 sec   267.86 M     1.06
24 "double for loop unroll 25"   2.38 sec   252.10 M     1.12
25 "double for loop unroll 26"   2.21 sec   271.49 M     1.04
26 "double for loop unroll 27"   2.36 sec   254.24 M     1.11
27 "double for loop unroll 28"   2.22 sec   270.27 M     1.05
28 "double for loop unroll 29"   2.35 sec   255.32 M     1.11
29 "double for loop unroll 30"   2.38 sec   252.10 M     1.12
30 "double for loop unroll 31"   2.32 sec   258.62 M     1.09
31 "double for loop unroll 32"   2.32 sec   258.62 M     1.09

Total absolute time for double for loop unrolling: 70.28 sec

test                 description   absolute   operations   ratio with
number                             time       per second   test0

 0  "double while loop unroll 1"   2.12 sec   283.02 M     1.00
 1  "double while loop unroll 2"   2.10 sec   285.71 M     0.99
 2  "double while loop unroll 3"   2.07 sec   289.86 M     0.98
 3  "double while loop unroll 4"   2.08 sec   288.46 M     0.98
 4  "double while loop unroll 5"   2.06 sec   291.26 M     0.97
 5  "double while loop unroll 6"   2.04 sec   294.12 M     0.96
 6  "double while loop unroll 7"   2.05 sec   292.68 M     0.97
 7  "double while loop unroll 8"   2.05 sec   292.68 M     0.97
 8  "double while loop unroll 9"   2.04 sec   294.12 M     0.96
 9 "double while loop unroll 10"   2.04 sec   294.12 M     0.96
10 "double while loop unroll 11"   2.24 sec   267.86 M     1.06
11 "double while loop unroll 12"   2.35 sec   255.32 M     1.11
12 "double while loop unroll 13"   2.31 sec   259.74 M     1.09
13 "double while loop unroll 14"   2.27 sec   264.32 M     1.07
14 "double while loop unroll 15"   2.32 sec   258.62 M     1.09
15 "double while loop unroll 16"   2.18 sec   275.23 M     1.03
16 "double while loop unroll 17"   2.18 sec   275.23 M     1.03
17 "double while loop unroll 18"   2.16 sec   277.78 M     1.02
18 "double while loop unroll 19"   2.30 sec   260.87 M     1.08
19 "double while loop unroll 20"   2.27 sec   264.32 M     1.07
20 "double while loop unroll 21"   2.27 sec   264.32 M     1.07
21 "double while loop unroll 22"   2.24 sec   267.86 M     1.06
22 "double while loop unroll 23"   2.24 sec   267.86 M     1.06
23 "double while loop unroll 24"   2.24 sec   267.86 M     1.06
24 "double while loop unroll 25"   2.21 sec   271.49 M     1.04
25 "double while loop unroll 26"   2.22 sec   270.27 M     1.05
26 "double while loop unroll 27"   2.35 sec   255.32 M     1.11
27 "double while loop unroll 28"   2.20 sec   272.73 M     1.04
28 "double while loop unroll 29"   2.34 sec   256.41 M     1.10
29 "double while loop unroll 30"   2.36 sec   254.24 M     1.11
30 "double while loop unroll 31"   2.35 sec   255.32 M     1.11
31 "double while loop unroll 32"   2.33 sec   257.51 M     1.10

Total absolute time for double while loop unrolling: 70.58 sec

test              description   absolute   operations   ratio with
number                          time       per second   test0

 0  "double do loop unroll 1"   2.14 sec   280.37 M     1.00
 1  "double do loop unroll 2"   2.11 sec   284.36 M     0.99
 2  "double do loop unroll 3"   2.09 sec   287.08 M     0.98
 3  "double do loop unroll 4"   2.08 sec   288.46 M     0.97
 4  "double do loop unroll 5"   2.07 sec   289.86 M     0.97
 5  "double do loop unroll 6"   2.03 sec   295.57 M     0.95
 6  "double do loop unroll 7"   2.05 sec   292.68 M     0.96
 7  "double do loop unroll 8"   2.05 sec   292.68 M     0.96
 8  "double do loop unroll 9"   2.03 sec   295.57 M     0.95
 9 "double do loop unroll 10"   2.04 sec   294.12 M     0.95
10 "double do loop unroll 11"   2.03 sec   295.57 M     0.95
11 "double do loop unroll 12"   2.04 sec   294.12 M     0.95
12 "double do loop unroll 13"   2.22 sec   270.27 M     1.04
13 "double do loop unroll 14"   2.02 sec   297.03 M     0.94
14 "double do loop unroll 15"   2.32 sec   258.62 M     1.08
15 "double do loop unroll 16"   2.18 sec   275.23 M     1.02
16 "double do loop unroll 17"   2.18 sec   275.23 M     1.02
17 "double do loop unroll 18"   2.02 sec   297.03 M     0.94
18 "double do loop unroll 19"   2.31 sec   259.74 M     1.08
19 "double do loop unroll 20"   2.27 sec   264.32 M     1.06
20 "double do loop unroll 21"   2.26 sec   265.49 M     1.06
21 "double do loop unroll 22"   2.27 sec   264.32 M     1.06
22 "double do loop unroll 23"   2.24 sec   267.86 M     1.05
23 "double do loop unroll 24"   2.24 sec   267.86 M     1.05
24 "double do loop unroll 25"   2.22 sec   270.27 M     1.04
25 "double do loop unroll 26"   2.21 sec   271.49 M     1.03
26 "double do loop unroll 27"   2.22 sec   270.27 M     1.04
27 "double do loop unroll 28"   2.21 sec   271.49 M     1.03
28 "double do loop unroll 29"   2.33 sec   257.51 M     1.09
29 "double do loop unroll 30"   2.33 sec   257.51 M     1.09
30 "double do loop unroll 31"   2.18 sec   275.23 M     1.02
31 "double do loop unroll 32"   2.33 sec   257.51 M     1.09

Total absolute time for double do loop unrolling: 69.32 sec

test                description   absolute   operations   ratio with
number                            time       per second   test0

 0  "double goto loop unroll 1"   2.13 sec   281.69 M     1.00
 1  "double goto loop unroll 2"   2.09 sec   287.08 M     0.98
 2  "double goto loop unroll 3"   2.07 sec   289.86 M     0.97
 3  "double goto loop unroll 4"   2.09 sec   287.08 M     0.98
 4  "double goto loop unroll 5"   2.08 sec   288.46 M     0.98
 5  "double goto loop unroll 6"   2.05 sec   292.68 M     0.96
 6  "double goto loop unroll 7"   2.07 sec   289.86 M     0.97
 7  "double goto loop unroll 8"   2.07 sec   289.86 M     0.97
 8  "double goto loop unroll 9"   2.03 sec   295.57 M     0.95
 9 "double goto loop unroll 10"   2.04 sec   294.12 M     0.96
10 "double goto loop unroll 11"   2.24 sec   267.86 M     1.05
11 "double goto loop unroll 12"   2.04 sec   294.12 M     0.96
12 "double goto loop unroll 13"   2.22 sec   270.27 M     1.04
13 "double goto loop unroll 14"   2.02 sec   297.03 M     0.95
14 "double goto loop unroll 15"   2.32 sec   258.62 M     1.09
15 "double goto loop unroll 16"   2.30 sec   260.87 M     1.08
16 "double goto loop unroll 17"   2.18 sec   275.23 M     1.02
17 "double goto loop unroll 18"   2.15 sec   279.07 M     1.01
18 "double goto loop unroll 19"   2.31 sec   259.74 M     1.08
19 "double goto loop unroll 20"   2.27 sec   264.32 M     1.07
20 "double goto loop unroll 21"   2.27 sec   264.32 M     1.07
21 "double goto loop unroll 22"   2.26 sec   265.49 M     1.06
22 "double goto loop unroll 23"   2.24 sec   267.86 M     1.05
23 "double goto loop unroll 24"   2.24 sec   267.86 M     1.05
24 "double goto loop unroll 25"   2.22 sec   270.27 M     1.04
25 "double goto loop unroll 26"   2.22 sec   270.27 M     1.04
26 "double goto loop unroll 27"   2.35 sec   255.32 M     1.10
27 "double goto loop unroll 28"   2.35 sec   255.32 M     1.10
28 "double goto loop unroll 29"   2.33 sec   257.51 M     1.09
29 "double goto loop unroll 30"   2.20 sec   272.73 M     1.03
30 "double goto loop unroll 31"   2.35 sec   255.32 M     1.10
31 "double goto loop unroll 32"   2.33 sec   257.51 M     1.09

Total absolute time for double goto loop unrolling: 70.13 sec
Thu Jul 28 12:33:16 PDT 2011
##END Version 1.0

[-- Attachment #4: report46.txt --]
[-- Type: text/plain, Size: 66238 bytes --]

##STARTING Version 1.0
Thu Jul 28 12:36:13 PDT 2011
##CFlags: 
##CPPFlags: -I. -O3 -static-libstdc++ -static-libgcc
##Start machine report version 1.0
##Compiler
GCC version 4.6.1
Compiled for LP64
##Target CPU
Compiled for x86 64bit
##Physical CPU
Little Endian
##Machine
##Operating System
##End machine report
./stepanov_abstraction 

test                        description   absolute   operations   ratio with
number                                    time       per second   test0

 0                     "double pointer"   5.03 sec   795.23 M     1.00
 1               "double pointer_class"   5.03 sec   795.23 M     1.00
 2         "DoubleValueWrapper pointer"   5.03 sec   795.23 M     1.00
 3   "DoubleValueWrapper pointer_class"   5.03 sec   795.23 M     1.00
 4       "DoubleValueWrapper10 pointer"   5.03 sec   795.23 M     1.00
 5 "DoubleValueWrapper10 pointer_class"   5.03 sec   795.23 M     1.00

Total absolute time for Abstraction Accumulate: 30.18 sec

Abstraction Accumulate Penalty: 1.00


test                                       description   absolute   operations   ratio with
number                                                   time       per second   test0

 0                     "insertion_sort double pointer"   0.86 sec    2.33 M     1.00
 1               "insertion_sort double pointer_class"   1.28 sec    1.56 M     1.49
 2         "insertion_sort DoubleValueWrapper pointer"   1.27 sec    1.57 M     1.48
 3   "insertion_sort DoubleValueWrapper pointer_class"   1.28 sec    1.56 M     1.49
 4       "insertion_sort DoubleValueWrapper10 pointer"   1.28 sec    1.56 M     1.49
 5 "insertion_sort DoubleValueWrapper10 pointer_class"   1.28 sec    1.56 M     1.49

Total absolute time for Abstraction Insertion Sort: 7.25 sec

Abstraction Insertion Sort Penalty: 1.49


test                                  description   absolute   operations   ratio with
number                                              time       per second   test0

 0                     "quicksort double pointer"   1.31 sec   12.21 M     1.00
 1               "quicksort double pointer_class"   1.39 sec   11.51 M     1.06
 2         "quicksort DoubleValueWrapper pointer"   1.51 sec   10.60 M     1.15
 3   "quicksort DoubleValueWrapper pointer_class"   1.52 sec   10.53 M     1.16
 4       "quicksort DoubleValueWrapper10 pointer"   1.52 sec   10.53 M     1.16
 5 "quicksort DoubleValueWrapper10 pointer_class"   1.53 sec   10.46 M     1.17

Total absolute time for Abstraction Quicksort: 8.78 sec

Abstraction Quicksort Penalty: 1.14


test                                  description   absolute   operations   ratio with
number                                              time       per second   test0

 0                     "heap_sort double pointer"   1.37 sec   11.68 M     1.00
 1               "heap_sort double pointer_class"   1.37 sec   11.68 M     1.00
 2         "heap_sort DoubleValueWrapper pointer"   1.17 sec   13.68 M     0.85
 3   "heap_sort DoubleValueWrapper pointer_class"   1.27 sec   12.60 M     0.93
 4       "heap_sort DoubleValueWrapper10 pointer"   1.20 sec   13.33 M     0.88
 5 "heap_sort DoubleValueWrapper10 pointer_class"   1.26 sec   12.70 M     0.92

Total absolute time for Abstraction Heap Sort: 7.64 sec

Abstraction Heap Sort Penalty: 0.91

./stepanov_vector 

test                            description   absolute   operations   ratio with
number                                        time       per second   test0

 0                 "double pointer verify2"   3.77 sec   795.76 M     1.00
 1                 "double vector iterator"   3.77 sec   795.76 M     1.00
 2                 "double pointer reverse"   3.77 sec   795.76 M     1.00
 3         "double vector reverse_iterator"   3.78 sec   793.65 M     1.00
 4         "double vector iterator reverse"   3.77 sec   795.76 M     1.00
 5         "double pointer reverse reverse"   3.78 sec   793.65 M     1.00
 6 "double vector reverse_iterator reverse"   3.77 sec   795.76 M     1.00
 7 "double vector iterator reverse reverse"   3.78 sec   793.65 M     1.00

Total absolute time for Vector accumulate: 30.19 sec

Vector accumulate Penalty: 1.00


test                                           description   absolute   operations   ratio with
number                                                       time       per second   test0

 0                 "insertion_sort double pointer verify2"   1.30 sec    2.31 M     1.00
 1                 "insertion_sort double vector iterator"   1.90 sec    1.58 M     1.46
 2                 "insertion_sort double pointer reverse"   1.95 sec    1.54 M     1.50
 3         "insertion_sort double vector reverse_iterator"   1.93 sec    1.55 M     1.48
 4         "insertion_sort double vector iterator reverse"   1.92 sec    1.56 M     1.48
 5         "insertion_sort double pointer reverse reverse"   1.91 sec    1.57 M     1.47
 6 "insertion_sort double vector reverse_iterator reverse"   1.91 sec    1.57 M     1.47
 7 "insertion_sort double vector iterator reverse reverse"   1.91 sec    1.57 M     1.47

Total absolute time for Vector Insertion Sort: 14.73 sec

Vector Insertion Sort Penalty: 1.48


test                                      description   absolute   operations   ratio with
number                                                  time       per second   test0

 0                 "quicksort double pointer verify2"   1.96 sec   12.24 M     1.00
 1                 "quicksort double vector iterator"   2.07 sec   11.59 M     1.06
 2                 "quicksort double pointer reverse"   2.24 sec   10.71 M     1.14
 3         "quicksort double vector reverse_iterator"   2.23 sec   10.76 M     1.14
 4         "quicksort double vector iterator reverse"   2.23 sec   10.76 M     1.14
 5         "quicksort double pointer reverse reverse"   2.17 sec   11.06 M     1.11
 6 "quicksort double vector reverse_iterator reverse"   2.14 sec   11.21 M     1.09
 7 "quicksort double vector iterator reverse reverse"   2.14 sec   11.21 M     1.09

Total absolute time for Vector Quicksort: 17.18 sec

Vector Quicksort Penalty: 1.11


test                                      description   absolute   operations   ratio with
number                                                  time       per second   test0

 0                 "heap_sort double pointer verify2"   2.09 sec   11.48 M     1.00
 1                 "heap_sort double vector iterator"   2.09 sec   11.48 M     1.00
 2                 "heap_sort double pointer reverse"   2.47 sec    9.72 M     1.18
 3         "heap_sort double vector reverse_iterator"   2.45 sec    9.80 M     1.17
 4         "heap_sort double vector iterator reverse"   2.44 sec    9.84 M     1.17
 5         "heap_sort double pointer reverse reverse"   2.10 sec   11.43 M     1.00
 6 "heap_sort double vector reverse_iterator reverse"   2.12 sec   11.32 M     1.01
 7 "heap_sort double vector iterator reverse reverse"   2.12 sec   11.32 M     1.01

Total absolute time for Vector Heap Sort: 17.88 sec

Vector Heap Sort Penalty: 1.08

./functionobjects 

test                                                description   absolute   operations   ratio with
number                                                            time       per second   test0

 0                          "qsort array with function pointer"   4.41 sec    4.54 M     1.00
 1             "quicksort function array with function pointer"   2.59 sec    7.72 M     0.59
 2             "quicksort template array with function pointer"   2.62 sec    7.63 M     0.59
 3    "quicksort template array with template function pointer"   2.57 sec    7.78 M     0.58
 4                           "sort array with function pointer"   1.40 sec   14.29 M     0.32
 5        "quicksort template array with user-supplied functor"   1.94 sec   10.31 M     0.44
 6                      "sort array with user-supplied functor"   1.40 sec   14.29 M     0.32
 7 "quicksort template array with user-supplied inline functor"   2.02 sec    9.90 M     0.46
 8               "sort array with user-supplied inline functor"   1.44 sec   13.89 M     0.33
 9             "quicksort template array with standard functor"   2.01 sec    9.95 M     0.46
10                           "sort array with standard functor"   1.45 sec   13.79 M     0.33
11            "quicksort template array with native < operator"   1.94 sec   10.31 M     0.44
12                          "sort array with native < operator"   1.43 sec   13.99 M     0.32

Total absolute time for Function Objects: 27.22 sec
./simple_types_constant_folding 

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                     "int8_t constant"   0.00 sec     inf M     nan
 1                "int8_t add constants"   0.00 sec     inf M     nan
 2           "int8_t subtract constants"   0.00 sec     inf M     nan
 3           "int8_t multiply constants"   0.00 sec     inf M     nan
 4             "int8_t divide constants"   0.00 sec     inf M     nan
 5                "int8_t mod constants"   0.00 sec     inf M     nan
 6              "int8_t equal constants"   0.00 sec     inf M     nan
 7           "int8_t notequal constants"   0.00 sec     inf M     nan
 8       "int8_t greater than constants"   0.00 sec     inf M     nan
 9          "int8_t less than constants"   0.00 sec     inf M     nan
10 "int8_t greater than equal constants"   0.00 sec     inf M     nan
11    "int8_t less than equal constants"   0.00 sec     inf M     nan
12                "int8_t and constants"   0.00 sec     inf M     nan
13                 "int8_t or constants"   0.00 sec     inf M     nan
14                "int8_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int8_t simple constant folding: 0.00 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                 "int8_t constant add"   2.84 sec   563.38 M     1.00
 1       "int8_t multiple constant adds"   2.84 sec   563.38 M     1.00
 2            "int8_t constant subtract"   2.85 sec   561.40 M     1.00
 3  "int8_t multiple constant subtracts"   2.84 sec   563.38 M     1.00
 4            "int8_t constant multiply"   3.35 sec   477.61 M     1.18
 5 "int8_t multiple constant multiplies"   3.35 sec   477.61 M     1.18
 6  "int8_t multiple constant multiply2"   2.84 sec   563.38 M     1.00
 7              "int8_t constant divide"   3.85 sec   415.58 M     1.36
 8    "int8_t multiple constant divides"   6.72 sec   238.10 M     2.37
 9    "int8_t multiple constant divide2"   2.86 sec   559.44 M     1.01
10      "int8_t multiple constant mixed"   0.98 sec   1632.65 M     0.35
11                 "int8_t constant and"   1.48 sec   1081.08 M     0.52
12        "int8_t multiple constant and"   1.44 sec   1111.11 M     0.51
13                  "int8_t constant or"   1.48 sec   1081.08 M     0.52
14         "int8_t multiple constant or"   1.47 sec   1088.44 M     0.52
15                 "int8_t constant xor"   1.43 sec   1118.88 M     0.50
16        "int8_t multiple constant xor"   1.47 sec   1088.44 M     0.52

Total absolute time for int8_t constant folding: 44.09 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "uint8_t constant"   0.00 sec     inf M     nan
 1                "uint8_t add constants"   0.00 sec     inf M     nan
 2           "uint8_t subtract constants"   0.00 sec     inf M     nan
 3           "uint8_t multiply constants"   0.00 sec     inf M     nan
 4             "uint8_t divide constants"   0.00 sec     inf M     nan
 5                "uint8_t mod constants"   0.00 sec     inf M     nan
 6              "uint8_t equal constants"   0.00 sec     inf M     nan
 7           "uint8_t notequal constants"   0.00 sec     inf M     nan
 8       "uint8_t greater than constants"   0.00 sec     inf M     nan
 9          "uint8_t less than constants"   0.00 sec     inf M     nan
10 "uint8_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint8_t less than equal constants"   0.00 sec     inf M     nan
12                "uint8_t and constants"   0.00 sec     inf M     nan
13                 "uint8_t or constants"   0.00 sec     inf M     nan
14                "uint8_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint8_t simple constant folding: 0.00 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "uint8_t constant add"   0.10 sec   16000.00 M     1.00
 1       "uint8_t multiple constant adds"   0.10 sec   16000.00 M     1.00
 2            "uint8_t constant subtract"   0.10 sec   16000.00 M     1.00
 3  "uint8_t multiple constant subtracts"   0.10 sec   16000.00 M     1.00
 4            "uint8_t constant multiply"   1.04 sec   1538.46 M     10.40
 5 "uint8_t multiple constant multiplies"   1.05 sec   1523.81 M     10.50
 6  "uint8_t multiple constant multiply2"   0.10 sec   16000.00 M     1.00
 7              "uint8_t constant divide"   3.34 sec   479.04 M     33.40
 8    "uint8_t multiple constant divides"   3.35 sec   477.61 M     33.50
 9    "uint8_t multiple constant divide2"   0.10 sec   16000.00 M     1.00
10      "uint8_t multiple constant mixed"   0.08 sec   20000.00 M     0.80
11                 "uint8_t constant and"   0.10 sec   16000.00 M     1.00
12        "uint8_t multiple constant and"   0.09 sec   17777.78 M     0.90
13                  "uint8_t constant or"   0.10 sec   16000.00 M     1.00
14         "uint8_t multiple constant or"   0.10 sec   16000.00 M     1.00
15                 "uint8_t constant xor"   0.10 sec   16000.00 M     1.00
16        "uint8_t multiple constant xor"   0.10 sec   16000.00 M     1.00

Total absolute time for uint8_t constant folding: 10.05 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int16_t constant"   0.00 sec     inf M     nan
 1                "int16_t add constants"   0.00 sec     inf M     nan
 2           "int16_t subtract constants"   0.00 sec     inf M     nan
 3           "int16_t multiply constants"   0.00 sec     inf M     nan
 4             "int16_t divide constants"   0.00 sec     inf M     nan
 5                "int16_t mod constants"   0.00 sec     inf M     nan
 6              "int16_t equal constants"   0.00 sec     inf M     nan
 7           "int16_t notequal constants"   0.00 sec     inf M     nan
 8       "int16_t greater than constants"   0.00 sec     inf M     nan
 9          "int16_t less than constants"   0.00 sec     inf M     nan
10 "int16_t greater than equal constants"   0.00 sec     inf M     nan
11    "int16_t less than equal constants"   0.00 sec     inf M     nan
12                "int16_t and constants"   0.00 sec     inf M     nan
13                 "int16_t or constants"   0.00 sec     inf M     nan
14                "int16_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int16_t simple constant folding: 0.00 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int16_t constant add"   2.84 sec   563.38 M     1.00
 1       "int16_t multiple constant adds"   2.85 sec   561.40 M     1.00
 2            "int16_t constant subtract"   2.84 sec   563.38 M     1.00
 3  "int16_t multiple constant subtracts"   2.85 sec   561.40 M     1.00
 4            "int16_t constant multiply"   3.35 sec   477.61 M     1.18
 5 "int16_t multiple constant multiplies"   3.35 sec   477.61 M     1.18
 6  "int16_t multiple constant multiply2"   2.84 sec   563.38 M     1.00
 7              "int16_t constant divide"   3.85 sec   415.58 M     1.36
 8    "int16_t multiple constant divides"   4.02 sec   398.01 M     1.42
 9    "int16_t multiple constant divide2"   2.84 sec   563.38 M     1.00
10      "int16_t multiple constant mixed"   0.97 sec   1649.48 M     0.34
11                 "int16_t constant and"   1.44 sec   1111.11 M     0.51
12        "int16_t multiple constant and"   1.46 sec   1095.89 M     0.51
13                  "int16_t constant or"   1.44 sec   1111.11 M     0.51
14         "int16_t multiple constant or"   1.47 sec   1088.44 M     0.52
15                 "int16_t constant xor"   1.44 sec   1111.11 M     0.51
16        "int16_t multiple constant xor"   1.47 sec   1088.44 M     0.52

Total absolute time for int16_t constant folding: 41.32 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint16_t constant"   0.00 sec     inf M     nan
 1                "uint16_t add constants"   0.00 sec     inf M     nan
 2           "uint16_t subtract constants"   0.00 sec     inf M     nan
 3           "uint16_t multiply constants"   0.00 sec     inf M     nan
 4             "uint16_t divide constants"   0.00 sec     inf M     nan
 5                "uint16_t mod constants"   0.00 sec     inf M     nan
 6              "uint16_t equal constants"   0.00 sec     inf M     nan
 7           "uint16_t notequal constants"   0.00 sec     inf M     nan
 8       "uint16_t greater than constants"   0.00 sec     inf M     nan
 9          "uint16_t less than constants"   0.00 sec     inf M     nan
10 "uint16_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint16_t less than equal constants"   0.00 sec     inf M     nan
12                "uint16_t and constants"   0.00 sec     inf M     nan
13                 "uint16_t or constants"   0.00 sec     inf M     nan
14                "uint16_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint16_t simple constant folding: 0.00 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint16_t constant add"   0.19 sec   8421.05 M     1.00
 1       "uint16_t multiple constant adds"   0.20 sec   8000.00 M     1.05
 2            "uint16_t constant subtract"   0.20 sec   8000.00 M     1.05
 3  "uint16_t multiple constant subtracts"   0.20 sec   8000.00 M     1.05
 4            "uint16_t constant multiply"   0.22 sec   7272.73 M     1.16
 5 "uint16_t multiple constant multiplies"   0.22 sec   7272.73 M     1.16
 6  "uint16_t multiple constant multiply2"   0.20 sec   8000.00 M     1.05
 7              "uint16_t constant divide"   1.81 sec   883.98 M     9.53
 8    "uint16_t multiple constant divides"   1.83 sec   874.32 M     9.63
 9    "uint16_t multiple constant divide2"   0.20 sec   8000.00 M     1.05
10      "uint16_t multiple constant mixed"   0.17 sec   9411.76 M     0.89
11                 "uint16_t constant and"   0.19 sec   8421.05 M     1.00
12        "uint16_t multiple constant and"   0.20 sec   8000.00 M     1.05
13                  "uint16_t constant or"   0.19 sec   8421.05 M     1.00
14         "uint16_t multiple constant or"   0.19 sec   8421.05 M     1.00
15                 "uint16_t constant xor"   0.19 sec   8421.05 M     1.00
16        "uint16_t multiple constant xor"   0.20 sec   8000.00 M     1.05

Total absolute time for uint16_t constant folding: 6.60 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int32_t constant"   0.00 sec     inf M     nan
 1                "int32_t add constants"   0.00 sec     inf M     nan
 2           "int32_t subtract constants"   0.00 sec     inf M     nan
 3           "int32_t multiply constants"   0.00 sec     inf M     nan
 4             "int32_t divide constants"   0.00 sec     inf M     nan
 5                "int32_t mod constants"   0.00 sec     inf M     nan
 6              "int32_t equal constants"   0.00 sec     inf M     nan
 7           "int32_t notequal constants"   0.00 sec     inf M     nan
 8       "int32_t greater than constants"   0.00 sec     inf M     nan
 9          "int32_t less than constants"   0.00 sec     inf M     nan
10 "int32_t greater than equal constants"   0.00 sec     inf M     nan
11    "int32_t less than equal constants"   0.00 sec     inf M     nan
12                "int32_t and constants"   0.00 sec     inf M     nan
13                 "int32_t or constants"   0.00 sec     inf M     nan
14                "int32_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int32_t simple constant folding: 0.00 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int32_t constant add"   0.39 sec   4102.56 M     1.00
 1       "int32_t multiple constant adds"   0.33 sec   4848.48 M     0.85
 2            "int32_t constant subtract"   0.39 sec   4102.56 M     1.00
 3  "int32_t multiple constant subtracts"   0.39 sec   4102.56 M     1.00
 4            "int32_t constant multiply"   1.35 sec   1185.19 M     3.46
 5 "int32_t multiple constant multiplies"   1.41 sec   1134.75 M     3.62
 6  "int32_t multiple constant multiply2"   0.39 sec   4102.56 M     1.00
 7              "int32_t constant divide"   3.03 sec   528.05 M     7.77
 8    "int32_t multiple constant divides"   3.33 sec   480.48 M     8.54
 9    "int32_t multiple constant divide2"   0.34 sec   4705.88 M     0.87
10      "int32_t multiple constant mixed"   0.26 sec   6153.85 M     0.67
11                 "int32_t constant and"   0.38 sec   4210.53 M     0.97
12        "int32_t multiple constant and"   0.34 sec   4705.88 M     0.87
13                  "int32_t constant or"   0.39 sec   4102.56 M     1.00
14         "int32_t multiple constant or"   0.34 sec   4705.88 M     0.87
15                 "int32_t constant xor"   0.34 sec   4705.88 M     0.87
16        "int32_t multiple constant xor"   0.35 sec   4571.43 M     0.90

Total absolute time for int32_t constant folding: 13.75 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint32_t constant"   0.00 sec     inf M     nan
 1                "uint32_t add constants"   0.00 sec     inf M     nan
 2           "uint32_t subtract constants"   0.00 sec     inf M     nan
 3           "uint32_t multiply constants"   0.00 sec     inf M     nan
 4             "uint32_t divide constants"   0.00 sec     inf M     nan
 5                "uint32_t mod constants"   0.00 sec     inf M     nan
 6              "uint32_t equal constants"   0.00 sec     inf M     nan
 7           "uint32_t notequal constants"   0.00 sec     inf M     nan
 8       "uint32_t greater than constants"   0.00 sec     inf M     nan
 9          "uint32_t less than constants"   0.00 sec     inf M     nan
10 "uint32_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint32_t less than equal constants"   0.00 sec     inf M     nan
12                "uint32_t and constants"   0.00 sec     inf M     nan
13                 "uint32_t or constants"   0.00 sec     inf M     nan
14                "uint32_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint32_t simple constant folding: 0.00 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint32_t constant add"   0.34 sec   4705.88 M     1.00
 1       "uint32_t multiple constant adds"   0.34 sec   4705.88 M     1.00
 2            "uint32_t constant subtract"   0.34 sec   4705.88 M     1.00
 3  "uint32_t multiple constant subtracts"   0.34 sec   4705.88 M     1.00
 4            "uint32_t constant multiply"   1.35 sec   1185.19 M     3.97
 5 "uint32_t multiple constant multiplies"   1.35 sec   1185.19 M     3.97
 6  "uint32_t multiple constant multiply2"   0.33 sec   4848.48 M     0.97
 7              "uint32_t constant divide"   2.64 sec   606.06 M     7.76
 8    "uint32_t multiple constant divides"   2.63 sec   608.37 M     7.74
 9    "uint32_t multiple constant divide2"   0.34 sec   4705.88 M     1.00
10      "uint32_t multiple constant mixed"   0.27 sec   5925.93 M     0.79
11                 "uint32_t constant and"   0.34 sec   4705.88 M     1.00
12        "uint32_t multiple constant and"   0.34 sec   4705.88 M     1.00
13                  "uint32_t constant or"   0.33 sec   4848.48 M     0.97
14         "uint32_t multiple constant or"   0.34 sec   4705.88 M     1.00
15                 "uint32_t constant xor"   0.34 sec   4705.88 M     1.00
16        "uint32_t multiple constant xor"   0.34 sec   4705.88 M     1.00

Total absolute time for uint32_t constant folding: 12.30 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int64_t constant"   0.00 sec     inf M     nan
 1                "int64_t add constants"   0.00 sec     inf M     nan
 2           "int64_t subtract constants"   0.00 sec     inf M     nan
 3           "int64_t multiply constants"   0.00 sec     inf M     nan
 4             "int64_t divide constants"   0.00 sec     inf M     nan
 5                "int64_t mod constants"   0.00 sec     inf M     nan
 6              "int64_t equal constants"   0.00 sec     inf M     nan
 7           "int64_t notequal constants"   0.00 sec     inf M     nan
 8       "int64_t greater than constants"   0.00 sec     inf M     nan
 9          "int64_t less than constants"   0.00 sec     inf M     nan
10 "int64_t greater than equal constants"   0.00 sec     inf M     nan
11    "int64_t less than equal constants"   0.00 sec     inf M     nan
12                "int64_t and constants"   0.00 sec     inf M     nan
13                 "int64_t or constants"   0.00 sec     inf M     nan
14                "int64_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int64_t simple constant folding: 0.00 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int64_t constant add"   1.05 sec   1523.81 M     1.00
 1       "int64_t multiple constant adds"   1.06 sec   1509.43 M     1.01
 2            "int64_t constant subtract"   1.05 sec   1523.81 M     1.00
 3  "int64_t multiple constant subtracts"   1.06 sec   1509.43 M     1.01
 4            "int64_t constant multiply"   2.72 sec   588.24 M     2.59
 5 "int64_t multiple constant multiplies"   2.73 sec   586.08 M     2.60
 6  "int64_t multiple constant multiply2"   1.05 sec   1523.81 M     1.00
 7              "int64_t constant divide"   2.94 sec   544.22 M     2.80
 8    "int64_t multiple constant divides"   3.29 sec   486.32 M     3.13
 9    "int64_t multiple constant divide2"   1.05 sec   1523.81 M     1.00
10      "int64_t multiple constant mixed"   0.80 sec   2000.00 M     0.76
11                 "int64_t constant and"   0.97 sec   1649.48 M     0.92
12        "int64_t multiple constant and"   0.96 sec   1666.67 M     0.91
13                  "int64_t constant or"   0.97 sec   1649.48 M     0.92
14         "int64_t multiple constant or"   0.96 sec   1666.67 M     0.91
15                 "int64_t constant xor"   0.97 sec   1649.48 M     0.92
16        "int64_t multiple constant xor"   0.96 sec   1666.67 M     0.91

Total absolute time for int64_t constant folding: 24.59 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint64_t constant"   0.00 sec     inf M     nan
 1                "uint64_t add constants"   0.00 sec     inf M     nan
 2           "uint64_t subtract constants"   0.00 sec     inf M     nan
 3           "uint64_t multiply constants"   0.00 sec     inf M     nan
 4             "uint64_t divide constants"   0.00 sec     inf M     nan
 5                "uint64_t mod constants"   0.00 sec     inf M     nan
 6              "uint64_t equal constants"   0.00 sec     inf M     nan
 7           "uint64_t notequal constants"   0.00 sec     inf M     nan
 8       "uint64_t greater than constants"   0.00 sec     inf M     nan
 9          "uint64_t less than constants"   0.00 sec     inf M     nan
10 "uint64_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint64_t less than equal constants"   0.00 sec     inf M     nan
12                "uint64_t and constants"   0.00 sec     inf M     nan
13                 "uint64_t or constants"   0.00 sec     inf M     nan
14                "uint64_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint64_t simple constant folding: 0.00 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint64_t constant add"   1.06 sec   1509.43 M     1.00
 1       "uint64_t multiple constant adds"   1.06 sec   1509.43 M     1.00
 2            "uint64_t constant subtract"   1.05 sec   1523.81 M     0.99
 3  "uint64_t multiple constant subtracts"   1.06 sec   1509.43 M     1.00
 4            "uint64_t constant multiply"   2.55 sec   627.45 M     2.41
 5 "uint64_t multiple constant multiplies"   2.55 sec   627.45 M     2.41
 6  "uint64_t multiple constant multiply2"   1.06 sec   1509.43 M     1.00
 7              "uint64_t constant divide"   2.68 sec   597.01 M     2.53
 8    "uint64_t multiple constant divides"   2.69 sec   594.80 M     2.54
 9    "uint64_t multiple constant divide2"   1.05 sec   1523.81 M     0.99
10      "uint64_t multiple constant mixed"   0.80 sec   2000.00 M     0.75
11                 "uint64_t constant and"   0.97 sec   1649.48 M     0.92
12        "uint64_t multiple constant and"   0.96 sec   1666.67 M     0.91
13                  "uint64_t constant or"   0.97 sec   1649.48 M     0.92
14         "uint64_t multiple constant or"   0.96 sec   1666.67 M     0.91
15                 "uint64_t constant xor"   0.97 sec   1649.48 M     0.92
16        "uint64_t multiple constant xor"   0.97 sec   1649.48 M     0.92

Total absolute time for uint64_t constant folding: 23.41 sec

test              description   absolute   operations   ratio with
number                          time       per second   test0

 0           "float constant"  20.15 sec   794.04 M     1.00
 1      "float add constants"  20.10 sec   796.02 M     1.00
 2 "float subtract constants"  20.10 sec   796.02 M     1.00
 3 "float multiply constants"  20.08 sec   796.81 M     1.00
 4   "float divide constants"  20.16 sec   793.65 M     1.00

Total absolute time for float simple constant folding: 100.59 sec

test                        description   absolute   operations   ratio with
number                                    time       per second   test0

 0                 "float constant add"   2.03 sec   788.18 M     1.00
 1       "float multiple constant adds"   3.35 sec   477.61 M     1.65
 2            "float constant subtract"   2.01 sec   796.02 M     0.99
 3  "float multiple constant subtracts"   3.35 sec   477.61 M     1.65
 4            "float constant multiply"   2.01 sec   796.02 M     0.99
 5 "float multiple constant multiplies"   2.21 sec   723.98 M     1.09
 6  "float multiple constant multiply2"   2.01 sec   796.02 M     0.99
 7              "float constant divide"  11.42 sec   140.11 M     5.63
 8    "float multiple constant divides"  22.78 sec   70.24 M     11.22
 9    "float multiple constant divide2"   2.01 sec   796.02 M     0.99
10      "float multiple constant mixed"   2.06 sec   776.70 M     1.01

Total absolute time for float constant folding: 55.24 sec

test               description   absolute   operations   ratio with
number                           time       per second   test0

 0           "double constant"  20.11 sec   795.62 M     1.00
 1      "double add constants"  20.14 sec   794.44 M     1.00
 2 "double subtract constants"  20.08 sec   796.81 M     1.00
 3 "double multiply constants"  20.11 sec   795.62 M     1.00
 4   "double divide constants"  20.13 sec   794.83 M     1.00

Total absolute time for double simple constant folding: 100.57 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                 "double constant add"   2.03 sec   788.18 M     1.00
 1       "double multiple constant adds"   3.35 sec   477.61 M     1.65
 2            "double constant subtract"   2.03 sec   788.18 M     1.00
 3  "double multiple constant subtracts"   3.35 sec   477.61 M     1.65
 4            "double constant multiply"   2.01 sec   796.02 M     0.99
 5 "double multiple constant multiplies"   2.34 sec   683.76 M     1.15
 6  "double multiple constant multiply2"   2.02 sec   792.08 M     1.00
 7              "double constant divide"  20.91 sec   76.52 M     10.30
 8    "double multiple constant divides"  41.53 sec   38.53 M     20.46
 9    "double multiple constant divide2"   2.03 sec   788.18 M     1.00
10      "double multiple constant mixed"   2.11 sec   758.29 M     1.04

Total absolute time for double constant folding: 83.71 sec
./simple_types_loop_invariant 

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                  "int8_t variable add"   3.03 sec   528.05 M     1.00
 1          "int8_t variable add hoisted"   0.96 sec   1666.67 M     0.32
 2        "int8_t multiple variable adds"   3.01 sec   531.56 M     0.99
 3             "int8_t variable subtract"   1.57 sec   1019.11 M     0.52
 4   "int8_t multiple variable subtracts"   6.02 sec   265.78 M     1.99
 5             "int8_t variable multiply"   3.36 sec   476.19 M     1.11
 6  "int8_t multiple variable multiplies"   3.01 sec   531.56 M     0.99
 7 "int8_t multiple variable multiplies2"   3.02 sec   529.80 M     1.00
 8               "int8_t variable divide"   8.47 sec   188.90 M     2.80
 9     "int8_t multiple variable divides"  32.12 sec   49.81 M     10.60
10    "int8_t multiple variable divides2"   3.01 sec   531.56 M     0.99
11       "int8_t multiple variable mixed"   3.02 sec   529.80 M     1.00
12                  "int8_t variable and"   3.35 sec   477.61 M     1.11
13         "int8_t multiple variable and"   3.38 sec   473.37 M     1.12
14                   "int8_t variable or"   3.37 sec   474.78 M     1.11
15          "int8_t multiple variable or"   3.36 sec   476.19 M     1.11
16                  "int8_t variable xor"   3.35 sec   477.61 M     1.11
17         "int8_t multiple variable xor"   3.34 sec   479.04 M     1.10

Total absolute time for int8_t loop invariant: 90.75 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                  "uint8_t variable add"   0.10 sec   16000.00 M     1.00
 1          "uint8_t variable add hoisted"   0.09 sec   17777.78 M     0.90
 2        "uint8_t multiple variable adds"   1.35 sec   1185.19 M     13.50
 3             "uint8_t variable subtract"   0.10 sec   16000.00 M     1.00
 4   "uint8_t multiple variable subtracts"   0.15 sec   10666.67 M     1.50
 5             "uint8_t variable multiply"   1.03 sec   1553.40 M     10.30
 6  "uint8_t multiple variable multiplies"   1.04 sec   1538.46 M     10.40
 7 "uint8_t multiple variable multiplies2"   0.10 sec   16000.00 M     1.00
 8               "uint8_t variable divide"   8.04 sec   199.00 M     80.40
 9     "uint8_t multiple variable divides"  32.13 sec   49.80 M     321.30
10    "uint8_t multiple variable divides2"   0.10 sec   16000.00 M     1.00
11       "uint8_t multiple variable mixed"   1.34 sec   1194.03 M     13.40
12                  "uint8_t variable and"   0.10 sec   16000.00 M     1.00
13         "uint8_t multiple variable and"   0.10 sec   16000.00 M     1.00
14                   "uint8_t variable or"   0.10 sec   16000.00 M     1.00
15          "uint8_t multiple variable or"   0.09 sec   17777.78 M     0.90
16                  "uint8_t variable xor"   0.10 sec   16000.00 M     1.00
17         "uint8_t multiple variable xor"   0.10 sec   16000.00 M     1.00

Total absolute time for uint8_t loop invariant: 46.16 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                  "int16_t variable add"   3.01 sec   531.56 M     1.00
 1          "int16_t variable add hoisted"   1.01 sec   1584.16 M     0.34
 2        "int16_t multiple variable adds"   3.01 sec   531.56 M     1.00
 3             "int16_t variable subtract"   1.52 sec   1052.63 M     0.50
 4   "int16_t multiple variable subtracts"   6.36 sec   251.57 M     2.11
 5             "int16_t variable multiply"   3.03 sec   528.05 M     1.01
 6  "int16_t multiple variable multiplies"   3.04 sec   526.32 M     1.01
 7 "int16_t multiple variable multiplies2"   3.01 sec   531.56 M     1.00
 8               "int16_t variable divide"   8.46 sec   189.13 M     2.81
 9     "int16_t multiple variable divides"  32.20 sec   49.69 M     10.70
10    "int16_t multiple variable divides2"   3.02 sec   529.80 M     1.00
11       "int16_t multiple variable mixed"   3.01 sec   531.56 M     1.00
12                  "int16_t variable and"   3.35 sec   477.61 M     1.11
13         "int16_t multiple variable and"   3.01 sec   531.56 M     1.00
14                   "int16_t variable or"   3.35 sec   477.61 M     1.11
15          "int16_t multiple variable or"   3.02 sec   529.80 M     1.00
16                  "int16_t variable xor"   3.34 sec   479.04 M     1.11
17         "int16_t multiple variable xor"   3.02 sec   529.80 M     1.00

Total absolute time for int16_t loop invariant: 89.77 sec

test                            description   absolute   operations   ratio with
number                                        time       per second   test0

 0                  "uint16_t variable add"   0.19 sec   8421.05 M     1.00
 1          "uint16_t variable add hoisted"   0.17 sec   9411.76 M     0.89
 2        "uint16_t multiple variable adds"   3.02 sec   529.80 M     15.89
 3             "uint16_t variable subtract"   0.20 sec   8000.00 M     1.05
 4   "uint16_t multiple variable subtracts"   0.30 sec   5333.33 M     1.58
 5             "uint16_t variable multiply"   0.22 sec   7272.73 M     1.16
 6  "uint16_t multiple variable multiplies"   0.22 sec   7272.73 M     1.16
 7 "uint16_t multiple variable multiplies2"   0.19 sec   8421.05 M     1.00
 8               "uint16_t variable divide"   8.26 sec   193.70 M     43.47
 9     "uint16_t multiple variable divides"  32.18 sec   49.72 M     169.37
10    "uint16_t multiple variable divides2"   0.19 sec   8421.05 M     1.00
11       "uint16_t multiple variable mixed"   3.02 sec   529.80 M     15.89
12                  "uint16_t variable and"   0.19 sec   8421.05 M     1.00
13         "uint16_t multiple variable and"   0.20 sec   8000.00 M     1.05
14                   "uint16_t variable or"   0.19 sec   8421.05 M     1.00
15          "uint16_t multiple variable or"   0.19 sec   8421.05 M     1.00
16                  "uint16_t variable xor"   0.20 sec   8000.00 M     1.05
17         "uint16_t multiple variable xor"   0.19 sec   8421.05 M     1.00

Total absolute time for uint16_t loop invariant: 49.32 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                  "int32_t variable add"   0.39 sec   4102.56 M     1.00
 1          "int32_t variable add hoisted"   0.34 sec   4705.88 M     0.87
 2        "int32_t multiple variable adds"   0.59 sec   2711.86 M     1.51
 3             "int32_t variable subtract"   0.41 sec   3902.44 M     1.05
 4   "int32_t multiple variable subtracts"   0.59 sec   2711.86 M     1.51
 5             "int32_t variable multiply"   1.45 sec   1103.45 M     3.72
 6  "int32_t multiple variable multiplies"   6.48 sec   246.91 M     16.62
 7 "int32_t multiple variable multiplies2"   0.39 sec   4102.56 M     1.00
 8               "int32_t variable divide"   8.48 sec   188.68 M     21.74
 9     "int32_t multiple variable divides"  32.18 sec   49.72 M     82.51
10    "int32_t multiple variable divides2"   0.39 sec   4102.56 M     1.00
11       "int32_t multiple variable mixed"   0.43 sec   3720.93 M     1.10
12                  "int32_t variable and"   0.38 sec   4210.53 M     0.97
13         "int32_t multiple variable and"   0.39 sec   4102.56 M     1.00
14                   "int32_t variable or"   0.39 sec   4102.56 M     1.00
15          "int32_t multiple variable or"   0.38 sec   4210.53 M     0.97
16                  "int32_t variable xor"   0.39 sec   4102.56 M     1.00
17         "int32_t multiple variable xor"   0.38 sec   4210.53 M     0.97

Total absolute time for int32_t loop invariant: 54.43 sec

test                            description   absolute   operations   ratio with
number                                        time       per second   test0

 0                  "uint32_t variable add"   0.40 sec   4000.00 M     1.00
 1          "uint32_t variable add hoisted"   0.34 sec   4705.88 M     0.85
 2        "uint32_t multiple variable adds"   1.44 sec   1111.11 M     3.60
 3             "uint32_t variable subtract"   0.41 sec   3902.44 M     1.02
 4   "uint32_t multiple variable subtracts"   0.59 sec   2711.86 M     1.47
 5             "uint32_t variable multiply"   1.46 sec   1095.89 M     3.65
 6  "uint32_t multiple variable multiplies"   1.44 sec   1111.11 M     3.60
 7 "uint32_t multiple variable multiplies2"   0.39 sec   4102.56 M     0.97
 8               "uint32_t variable divide"   8.03 sec   199.25 M     20.07
 9     "uint32_t multiple variable divides"  32.37 sec   49.43 M     80.92
10    "uint32_t multiple variable divides2"   0.39 sec   4102.56 M     0.97
11       "uint32_t multiple variable mixed"   1.48 sec   1081.08 M     3.70
12                  "uint32_t variable and"   0.34 sec   4705.88 M     0.85
13         "uint32_t multiple variable and"   0.34 sec   4705.88 M     0.85
14                   "uint32_t variable or"   0.34 sec   4705.88 M     0.85
15          "uint32_t multiple variable or"   0.34 sec   4705.88 M     0.85
16                  "uint32_t variable xor"   0.34 sec   4705.88 M     0.85
17         "uint32_t multiple variable xor"   0.34 sec   4705.88 M     0.85

Total absolute time for uint32_t loop invariant: 50.78 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                  "int64_t variable add"   1.07 sec   1495.33 M     1.00
 1          "int64_t variable add hoisted"   0.80 sec   2000.00 M     0.75
 2        "int64_t multiple variable adds"   2.02 sec   792.08 M     1.89
 3             "int64_t variable subtract"   1.38 sec   1159.42 M     1.29
 4   "int64_t multiple variable subtracts"   2.01 sec   796.02 M     1.88
 5             "int64_t variable multiply"   2.65 sec   603.77 M     2.48
 6  "int64_t multiple variable multiplies"  11.37 sec   140.72 M     10.63
 7 "int64_t multiple variable multiplies2"   1.05 sec   1523.81 M     0.98
 8               "int64_t variable divide"  21.85 sec   73.23 M     20.42
 9     "int64_t multiple variable divides"  100.13 sec   15.98 M     93.58
10    "int64_t multiple variable divides2"   1.05 sec   1523.81 M     0.98
11       "int64_t multiple variable mixed"   1.36 sec   1176.47 M     1.27
12                  "int64_t variable and"   0.97 sec   1649.48 M     0.91
13         "int64_t multiple variable and"   0.97 sec   1649.48 M     0.91
14                   "int64_t variable or"   0.96 sec   1666.67 M     0.90
15          "int64_t multiple variable or"   0.98 sec   1632.65 M     0.92
16                  "int64_t variable xor"   0.97 sec   1649.48 M     0.91
17         "int64_t multiple variable xor"   0.96 sec   1666.67 M     0.90

Total absolute time for int64_t loop invariant: 152.55 sec

test                            description   absolute   operations   ratio with
number                                        time       per second   test0

 0                  "uint64_t variable add"   1.06 sec   1509.43 M     1.00
 1          "uint64_t variable add hoisted"   0.81 sec   1975.31 M     0.76
 2        "uint64_t multiple variable adds"   1.49 sec   1073.83 M     1.41
 3             "uint64_t variable subtract"   1.38 sec   1159.42 M     1.30
 4   "uint64_t multiple variable subtracts"   2.02 sec   792.08 M     1.91
 5             "uint64_t variable multiply"   2.69 sec   594.80 M     2.54
 6  "uint64_t multiple variable multiplies"   2.67 sec   599.25 M     2.52
 7 "uint64_t multiple variable multiplies2"   1.05 sec   1523.81 M     0.99
 8               "uint64_t variable divide"  12.88 sec   124.22 M     12.15
 9     "uint64_t multiple variable divides"  63.52 sec   25.19 M     59.92
10    "uint64_t multiple variable divides2"   1.06 sec   1509.43 M     1.00
11       "uint64_t multiple variable mixed"   1.49 sec   1073.83 M     1.41
12                  "uint64_t variable and"   0.97 sec   1649.48 M     0.92
13         "uint64_t multiple variable and"   0.96 sec   1666.67 M     0.91
14                   "uint64_t variable or"   0.97 sec   1649.48 M     0.92
15          "uint64_t multiple variable or"   0.97 sec   1649.48 M     0.92
16                  "uint64_t variable xor"   0.97 sec   1649.48 M     0.92
17         "uint64_t multiple variable xor"   0.96 sec   1666.67 M     0.91

Total absolute time for uint64_t loop invariant: 97.92 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                  "float variable add"   2.01 sec   796.02 M     1.00
 1          "float variable add hoisted"   2.01 sec   796.02 M     1.00
 2        "float multiple variable adds"   3.35 sec   477.61 M     1.67
 3             "float variable subtract"   2.01 sec   796.02 M     1.00
 4   "float multiple variable subtracts"   3.37 sec   474.78 M     1.68
 5             "float variable multiply"   2.02 sec   792.08 M     1.00
 6  "float multiple variable multiplies"   2.71 sec   590.41 M     1.35
 7 "float multiple variable multiplies2"   2.02 sec   792.08 M     1.00
 8               "float variable divide"   3.36 sec   476.19 M     1.67
 9     "float multiple variable divides"  29.47 sec   54.29 M     14.66
10    "float multiple variable divides2"   2.01 sec   796.02 M     1.00
11       "float multiple variable mixed"   2.06 sec   776.70 M     1.02

Total absolute time for float loop invariant: 56.40 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                  "double variable add"   2.05 sec   780.49 M     1.00
 1          "double variable add hoisted"   2.01 sec   796.02 M     0.98
 2        "double multiple variable adds"   3.35 sec   477.61 M     1.63
 3             "double variable subtract"   2.07 sec   772.95 M     1.01
 4   "double multiple variable subtracts"   3.35 sec   477.61 M     1.63
 5             "double variable multiply"   2.01 sec   796.02 M     0.98
 6  "double multiple variable multiplies"   2.69 sec   594.80 M     1.31
 7 "double multiple variable multiplies2"   2.03 sec   788.18 M     0.99
 8               "double variable divide"   3.35 sec   477.61 M     1.63
 9     "double multiple variable divides"  48.29 sec   33.13 M     23.56
10    "double multiple variable divides2"   2.03 sec   788.18 M     0.99
11       "double multiple variable mixed"   2.11 sec   758.29 M     1.03

Total absolute time for double loop invariant: 75.34 sec
./loop_unroll 

test                description   absolute   operations   ratio with
number                            time       per second   test0

 0  "int32_t for loop unroll 1"   7.09 sec   338.50 M     1.00
 1  "int32_t for loop unroll 2"   2.05 sec   1170.73 M     0.29
 2  "int32_t for loop unroll 3"   3.46 sec   693.64 M     0.49
 3  "int32_t for loop unroll 4"   3.69 sec   650.41 M     0.52
 4  "int32_t for loop unroll 5"   3.25 sec   738.46 M     0.46
 5  "int32_t for loop unroll 6"   2.92 sec   821.92 M     0.41
 6  "int32_t for loop unroll 7"   3.64 sec   659.34 M     0.51
 7  "int32_t for loop unroll 8"   3.49 sec   687.68 M     0.49
 8  "int32_t for loop unroll 9"   3.35 sec   716.42 M     0.47
 9 "int32_t for loop unroll 10"   4.15 sec   578.31 M     0.59
10 "int32_t for loop unroll 11"   3.94 sec   609.14 M     0.56
11 "int32_t for loop unroll 12"   3.79 sec   633.25 M     0.53
12 "int32_t for loop unroll 13"   3.63 sec   661.16 M     0.51
13 "int32_t for loop unroll 14"   3.52 sec   681.82 M     0.50
14 "int32_t for loop unroll 15"   3.91 sec   613.81 M     0.55
15 "int32_t for loop unroll 16"   3.66 sec   655.74 M     0.52
16 "int32_t for loop unroll 17"   3.74 sec   641.71 M     0.53
17 "int32_t for loop unroll 18"   3.62 sec   662.98 M     0.51
18 "int32_t for loop unroll 19"   3.46 sec   693.64 M     0.49
19 "int32_t for loop unroll 20"   3.77 sec   636.60 M     0.53
20 "int32_t for loop unroll 21"   3.76 sec   638.30 M     0.53
21 "int32_t for loop unroll 22"   3.60 sec   666.67 M     0.51
22 "int32_t for loop unroll 23"   3.97 sec   604.53 M     0.56
23 "int32_t for loop unroll 24"   3.80 sec   631.58 M     0.54
24 "int32_t for loop unroll 25"   3.69 sec   650.41 M     0.52
25 "int32_t for loop unroll 26"   3.71 sec   646.90 M     0.52
26 "int32_t for loop unroll 27"   3.92 sec   612.24 M     0.55
27 "int32_t for loop unroll 28"   4.00 sec   600.00 M     0.56
28 "int32_t for loop unroll 29"   3.90 sec   615.38 M     0.55
29 "int32_t for loop unroll 30"   3.82 sec   628.27 M     0.54
30 "int32_t for loop unroll 31"   3.71 sec   646.90 M     0.52
31 "int32_t for loop unroll 32"   3.55 sec   676.06 M     0.50

Total absolute time for int32_t for loop unrolling: 119.56 sec

test                  description   absolute   operations   ratio with
number                              time       per second   test0

 0  "int32_t while loop unroll 1"   7.21 sec   332.87 M     1.00
 1  "int32_t while loop unroll 2"   2.06 sec   1165.05 M     0.29
 2  "int32_t while loop unroll 3"   3.45 sec   695.65 M     0.48
 3  "int32_t while loop unroll 4"   3.64 sec   659.34 M     0.50
 4  "int32_t while loop unroll 5"   3.27 sec   733.94 M     0.45
 5  "int32_t while loop unroll 6"   2.91 sec   824.74 M     0.40
 6  "int32_t while loop unroll 7"   3.67 sec   653.95 M     0.51
 7  "int32_t while loop unroll 8"   3.41 sec   703.81 M     0.47
 8  "int32_t while loop unroll 9"   3.33 sec   720.72 M     0.46
 9 "int32_t while loop unroll 10"   4.11 sec   583.94 M     0.57
10 "int32_t while loop unroll 11"   3.94 sec   609.14 M     0.55
11 "int32_t while loop unroll 12"   3.77 sec   636.60 M     0.52
12 "int32_t while loop unroll 13"   3.66 sec   655.74 M     0.51
13 "int32_t while loop unroll 14"   3.54 sec   677.97 M     0.49
14 "int32_t while loop unroll 15"   3.90 sec   615.38 M     0.54
15 "int32_t while loop unroll 16"   3.77 sec   636.60 M     0.52
16 "int32_t while loop unroll 17"   3.73 sec   643.43 M     0.52
17 "int32_t while loop unroll 18"   3.62 sec   662.98 M     0.50
18 "int32_t while loop unroll 19"   3.47 sec   691.64 M     0.48
19 "int32_t while loop unroll 20"   3.80 sec   631.58 M     0.53
20 "int32_t while loop unroll 21"   3.78 sec   634.92 M     0.52
21 "int32_t while loop unroll 22"   3.62 sec   662.98 M     0.50
22 "int32_t while loop unroll 23"   3.98 sec   603.02 M     0.55
23 "int32_t while loop unroll 24"   3.80 sec   631.58 M     0.53
24 "int32_t while loop unroll 25"   3.69 sec   650.41 M     0.51
25 "int32_t while loop unroll 26"   3.71 sec   646.90 M     0.51
26 "int32_t while loop unroll 27"   3.92 sec   612.24 M     0.54
27 "int32_t while loop unroll 28"   3.99 sec   601.50 M     0.55
28 "int32_t while loop unroll 29"   3.89 sec   616.97 M     0.54
29 "int32_t while loop unroll 30"   3.73 sec   643.43 M     0.52
30 "int32_t while loop unroll 31"   3.68 sec   652.17 M     0.51
31 "int32_t while loop unroll 32"   3.53 sec   679.89 M     0.49

Total absolute time for int32_t while loop unrolling: 119.58 sec

test               description   absolute   operations   ratio with
number                           time       per second   test0

 0  "int32_t do loop unroll 1"   7.10 sec   338.03 M     1.00
 1  "int32_t do loop unroll 2"   2.08 sec   1153.85 M     0.29
 2  "int32_t do loop unroll 3"   3.48 sec   689.66 M     0.49
 3  "int32_t do loop unroll 4"   3.61 sec   664.82 M     0.51
 4  "int32_t do loop unroll 5"   3.27 sec   733.94 M     0.46
 5  "int32_t do loop unroll 6"   2.94 sec   816.33 M     0.41
 6  "int32_t do loop unroll 7"   3.69 sec   650.41 M     0.52
 7  "int32_t do loop unroll 8"   3.41 sec   703.81 M     0.48
 8  "int32_t do loop unroll 9"   3.33 sec   720.72 M     0.47
 9 "int32_t do loop unroll 10"   4.15 sec   578.31 M     0.58
10 "int32_t do loop unroll 11"   4.05 sec   592.59 M     0.57
11 "int32_t do loop unroll 12"   3.86 sec   621.76 M     0.54
12 "int32_t do loop unroll 13"   3.71 sec   646.90 M     0.52
13 "int32_t do loop unroll 14"   3.56 sec   674.16 M     0.50
14 "int32_t do loop unroll 15"   3.96 sec   606.06 M     0.56
15 "int32_t do loop unroll 16"   3.77 sec   636.60 M     0.53
16 "int32_t do loop unroll 17"   3.84 sec   625.00 M     0.54
17 "int32_t do loop unroll 18"   3.63 sec   661.16 M     0.51
18 "int32_t do loop unroll 19"   3.53 sec   679.89 M     0.50
19 "int32_t do loop unroll 20"   3.77 sec   636.60 M     0.53
20 "int32_t do loop unroll 21"   3.82 sec   628.27 M     0.54
21 "int32_t do loop unroll 22"   3.68 sec   652.17 M     0.52
22 "int32_t do loop unroll 23"   3.79 sec   633.25 M     0.53
23 "int32_t do loop unroll 24"   3.81 sec   629.92 M     0.54
24 "int32_t do loop unroll 25"   3.95 sec   607.59 M     0.56
25 "int32_t do loop unroll 26"   3.93 sec   610.69 M     0.55
26 "int32_t do loop unroll 27"   3.89 sec   616.97 M     0.55
27 "int32_t do loop unroll 28"   3.93 sec   610.69 M     0.55
28 "int32_t do loop unroll 29"   3.81 sec   629.92 M     0.54
29 "int32_t do loop unroll 30"   3.69 sec   650.41 M     0.52
30 "int32_t do loop unroll 31"   3.69 sec   650.41 M     0.52
31 "int32_t do loop unroll 32"   3.52 sec   681.82 M     0.50

Total absolute time for int32_t do loop unrolling: 120.25 sec

test                 description   absolute   operations   ratio with
number                             time       per second   test0

 0  "int32_t goto loop unroll 1"   7.21 sec   332.87 M     1.00
 1  "int32_t goto loop unroll 2"   2.09 sec   1148.33 M     0.29
 2  "int32_t goto loop unroll 3"   3.47 sec   691.64 M     0.48
 3  "int32_t goto loop unroll 4"   3.63 sec   661.16 M     0.50
 4  "int32_t goto loop unroll 5"   3.26 sec   736.20 M     0.45
 5  "int32_t goto loop unroll 6"   2.94 sec   816.33 M     0.41
 6  "int32_t goto loop unroll 7"   3.67 sec   653.95 M     0.51
 7  "int32_t goto loop unroll 8"   3.35 sec   716.42 M     0.46
 8  "int32_t goto loop unroll 9"   3.32 sec   722.89 M     0.46
 9 "int32_t goto loop unroll 10"   4.12 sec   582.52 M     0.57
10 "int32_t goto loop unroll 11"   4.03 sec   595.53 M     0.56
11 "int32_t goto loop unroll 12"   3.89 sec   616.97 M     0.54
12 "int32_t goto loop unroll 13"   3.74 sec   641.71 M     0.52
13 "int32_t goto loop unroll 14"   3.56 sec   674.16 M     0.49
14 "int32_t goto loop unroll 15"   3.96 sec   606.06 M     0.55
15 "int32_t goto loop unroll 16"   3.82 sec   628.27 M     0.53
16 "int32_t goto loop unroll 17"   3.84 sec   625.00 M     0.53
17 "int32_t goto loop unroll 18"   3.63 sec   661.16 M     0.50
18 "int32_t goto loop unroll 19"   3.52 sec   681.82 M     0.49
19 "int32_t goto loop unroll 20"   3.74 sec   641.71 M     0.52
20 "int32_t goto loop unroll 21"   3.80 sec   631.58 M     0.53
21 "int32_t goto loop unroll 22"   3.66 sec   655.74 M     0.51
22 "int32_t goto loop unroll 23"   3.90 sec   615.38 M     0.54
23 "int32_t goto loop unroll 24"   3.82 sec   628.27 M     0.53
24 "int32_t goto loop unroll 25"   3.73 sec   643.43 M     0.52
25 "int32_t goto loop unroll 26"   3.70 sec   648.65 M     0.51
26 "int32_t goto loop unroll 27"   3.89 sec   616.97 M     0.54
27 "int32_t goto loop unroll 28"   3.93 sec   610.69 M     0.55
28 "int32_t goto loop unroll 29"   3.81 sec   629.92 M     0.53
29 "int32_t goto loop unroll 30"   3.70 sec   648.65 M     0.51
30 "int32_t goto loop unroll 31"   3.72 sec   645.16 M     0.52
31 "int32_t goto loop unroll 32"   3.54 sec   677.97 M     0.49

Total absolute time for int32_t goto loop unrolling: 119.99 sec

test               description   absolute   operations   ratio with
number                           time       per second   test0

 0  "double for loop unroll 1"   2.07 sec   289.86 M     1.00
 1  "double for loop unroll 2"   2.11 sec   284.36 M     1.02
 2  "double for loop unroll 3"   2.09 sec   287.08 M     1.01
 3  "double for loop unroll 4"   2.61 sec   229.89 M     1.26
 4  "double for loop unroll 5"   2.65 sec   226.42 M     1.28
 5  "double for loop unroll 6"   2.50 sec   240.00 M     1.21
 6  "double for loop unroll 7"   2.33 sec   257.51 M     1.13
 7  "double for loop unroll 8"   2.69 sec   223.05 M     1.30
 8  "double for loop unroll 9"   2.67 sec   224.72 M     1.29
 9 "double for loop unroll 10"   2.52 sec   238.10 M     1.22
10 "double for loop unroll 11"   2.45 sec   244.90 M     1.18
11 "double for loop unroll 12"   2.32 sec   258.62 M     1.12
12 "double for loop unroll 13"   2.62 sec   229.01 M     1.27
13 "double for loop unroll 14"   2.65 sec   226.42 M     1.28
14 "double for loop unroll 15"   2.61 sec   229.89 M     1.26
15 "double for loop unroll 16"   2.52 sec   238.10 M     1.22
16 "double for loop unroll 17"   2.62 sec   229.01 M     1.27
17 "double for loop unroll 18"   2.65 sec   226.42 M     1.28
18 "double for loop unroll 19"   2.57 sec   233.46 M     1.24
19 "double for loop unroll 20"   2.86 sec   209.79 M     1.38
20 "double for loop unroll 21"   2.90 sec   206.90 M     1.40
21 "double for loop unroll 22"   2.83 sec   212.01 M     1.37
22 "double for loop unroll 23"   2.72 sec   220.59 M     1.31
23 "double for loop unroll 24"   2.92 sec   205.48 M     1.41
24 "double for loop unroll 25"   2.91 sec   206.19 M     1.41
25 "double for loop unroll 26"   2.97 sec   202.02 M     1.43
26 "double for loop unroll 27"   2.97 sec   202.02 M     1.43
27 "double for loop unroll 28"   2.91 sec   206.19 M     1.41
28 "double for loop unroll 29"   2.85 sec   210.53 M     1.38
29 "double for loop unroll 30"   2.97 sec   202.02 M     1.43
30 "double for loop unroll 31"   2.99 sec   200.67 M     1.44
31 "double for loop unroll 32"   2.95 sec   203.39 M     1.43

Total absolute time for double for loop unrolling: 85.00 sec

test                 description   absolute   operations   ratio with
number                             time       per second   test0

 0  "double while loop unroll 1"   2.07 sec   289.86 M     1.00
 1  "double while loop unroll 2"   2.11 sec   284.36 M     1.02
 2  "double while loop unroll 3"   2.07 sec   289.86 M     1.00
 3  "double while loop unroll 4"   2.60 sec   230.77 M     1.26
 4  "double while loop unroll 5"   2.64 sec   227.27 M     1.28
 5  "double while loop unroll 6"   2.49 sec   240.96 M     1.20
 6  "double while loop unroll 7"   2.33 sec   257.51 M     1.13
 7  "double while loop unroll 8"   2.69 sec   223.05 M     1.30
 8  "double while loop unroll 9"   2.68 sec   223.88 M     1.29
 9 "double while loop unroll 10"   2.52 sec   238.10 M     1.22
10 "double while loop unroll 11"   2.45 sec   244.90 M     1.18
11 "double while loop unroll 12"   2.35 sec   255.32 M     1.14
12 "double while loop unroll 13"   2.62 sec   229.01 M     1.27
13 "double while loop unroll 14"   2.65 sec   226.42 M     1.28
14 "double while loop unroll 15"   2.61 sec   229.89 M     1.26
15 "double while loop unroll 16"   2.52 sec   238.10 M     1.22
16 "double while loop unroll 17"   2.62 sec   229.01 M     1.27
17 "double while loop unroll 18"   2.64 sec   227.27 M     1.28
18 "double while loop unroll 19"   2.58 sec   232.56 M     1.25
19 "double while loop unroll 20"   2.86 sec   209.79 M     1.38
20 "double while loop unroll 21"   2.90 sec   206.90 M     1.40
21 "double while loop unroll 22"   2.82 sec   212.77 M     1.36
22 "double while loop unroll 23"   2.73 sec   219.78 M     1.32
23 "double while loop unroll 24"   2.92 sec   205.48 M     1.41
24 "double while loop unroll 25"   2.91 sec   206.19 M     1.41
25 "double while loop unroll 26"   2.97 sec   202.02 M     1.43
26 "double while loop unroll 27"   2.98 sec   201.34 M     1.44
27 "double while loop unroll 28"   2.90 sec   206.90 M     1.40
28 "double while loop unroll 29"   2.87 sec   209.06 M     1.39
29 "double while loop unroll 30"   2.99 sec   200.67 M     1.44
30 "double while loop unroll 31"   3.00 sec   200.00 M     1.45
31 "double while loop unroll 32"   2.94 sec   204.08 M     1.42

Total absolute time for double while loop unrolling: 85.03 sec

test              description   absolute   operations   ratio with
number                          time       per second   test0

 0  "double do loop unroll 1"   2.05 sec   292.68 M     1.00
 1  "double do loop unroll 2"   2.09 sec   287.08 M     1.02
 2  "double do loop unroll 3"   2.07 sec   289.86 M     1.01
 3  "double do loop unroll 4"   2.59 sec   231.66 M     1.26
 4  "double do loop unroll 5"   2.65 sec   226.42 M     1.29
 5  "double do loop unroll 6"   2.46 sec   243.90 M     1.20
 6  "double do loop unroll 7"   2.33 sec   257.51 M     1.14
 7  "double do loop unroll 8"   2.63 sec   228.14 M     1.28
 8  "double do loop unroll 9"   2.68 sec   223.88 M     1.31
 9 "double do loop unroll 10"   2.52 sec   238.10 M     1.23
10 "double do loop unroll 11"   2.45 sec   244.90 M     1.20
11 "double do loop unroll 12"   2.32 sec   258.62 M     1.13
12 "double do loop unroll 13"   2.60 sec   230.77 M     1.27
13 "double do loop unroll 14"   2.64 sec   227.27 M     1.29
14 "double do loop unroll 15"   2.61 sec   229.89 M     1.27
15 "double do loop unroll 16"   2.52 sec   238.10 M     1.23
16 "double do loop unroll 17"   2.62 sec   229.01 M     1.28
17 "double do loop unroll 18"   2.65 sec   226.42 M     1.29
18 "double do loop unroll 19"   2.57 sec   233.46 M     1.25
19 "double do loop unroll 20"   2.80 sec   214.29 M     1.37
20 "double do loop unroll 21"   2.90 sec   206.90 M     1.41
21 "double do loop unroll 22"   2.82 sec   212.77 M     1.38
22 "double do loop unroll 23"   2.73 sec   219.78 M     1.33
23 "double do loop unroll 24"   2.91 sec   206.19 M     1.42
24 "double do loop unroll 25"   2.91 sec   206.19 M     1.42
25 "double do loop unroll 26"   2.94 sec   204.08 M     1.43
26 "double do loop unroll 27"   2.97 sec   202.02 M     1.45
27 "double do loop unroll 28"   2.93 sec   204.78 M     1.43
28 "double do loop unroll 29"   2.70 sec   222.22 M     1.32
29 "double do loop unroll 30"   2.94 sec   204.08 M     1.43
30 "double do loop unroll 31"   2.98 sec   201.34 M     1.45
31 "double do loop unroll 32"   2.93 sec   204.78 M     1.43

Total absolute time for double do loop unrolling: 84.51 sec

test                description   absolute   operations   ratio with
number                            time       per second   test0

 0  "double goto loop unroll 1"   2.05 sec   292.68 M     1.00
 1  "double goto loop unroll 2"   2.09 sec   287.08 M     1.02
 2  "double goto loop unroll 3"   2.07 sec   289.86 M     1.01
 3  "double goto loop unroll 4"   2.60 sec   230.77 M     1.27
 4  "double goto loop unroll 5"   2.64 sec   227.27 M     1.29
 5  "double goto loop unroll 6"   2.47 sec   242.91 M     1.20
 6  "double goto loop unroll 7"   2.33 sec   257.51 M     1.14
 7  "double goto loop unroll 8"   2.63 sec   228.14 M     1.28
 8  "double goto loop unroll 9"   2.67 sec   224.72 M     1.30
 9 "double goto loop unroll 10"   2.53 sec   237.15 M     1.23
10 "double goto loop unroll 11"   2.45 sec   244.90 M     1.20
11 "double goto loop unroll 12"   2.32 sec   258.62 M     1.13
12 "double goto loop unroll 13"   2.60 sec   230.77 M     1.27
13 "double goto loop unroll 14"   2.63 sec   228.14 M     1.28
14 "double goto loop unroll 15"   2.62 sec   229.01 M     1.28
15 "double goto loop unroll 16"   2.52 sec   238.10 M     1.23
16 "double goto loop unroll 17"   2.62 sec   229.01 M     1.28
17 "double goto loop unroll 18"   2.64 sec   227.27 M     1.29
18 "double goto loop unroll 19"   2.57 sec   233.46 M     1.25
19 "double goto loop unroll 20"   2.80 sec   214.29 M     1.37
20 "double goto loop unroll 21"   2.91 sec   206.19 M     1.42
21 "double goto loop unroll 22"   2.82 sec   212.77 M     1.38
22 "double goto loop unroll 23"   2.73 sec   219.78 M     1.33
23 "double goto loop unroll 24"   2.91 sec   206.19 M     1.42
24 "double goto loop unroll 25"   2.90 sec   206.90 M     1.41
25 "double goto loop unroll 26"   2.96 sec   202.70 M     1.44
26 "double goto loop unroll 27"   2.99 sec   200.67 M     1.46
27 "double goto loop unroll 28"   2.93 sec   204.78 M     1.43
28 "double goto loop unroll 29"   2.87 sec   209.06 M     1.40
29 "double goto loop unroll 30"   2.92 sec   205.48 M     1.42
30 "double goto loop unroll 31"   2.98 sec   201.34 M     1.45
31 "double goto loop unroll 32"   2.92 sec   205.48 M     1.42

Total absolute time for double goto loop unrolling: 84.69 sec
Thu Jul 28 13:13:53 PDT 2011
##END Version 1.0

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-07-29 18:08 Performance degradation on g++ 4.6 Oleg Smolsky
@ 2011-07-29 18:14 ` Xinliang David Li
  2011-07-29 21:08   ` Oleg Smolsky
  2011-07-30  9:24 ` Richard Guenther
  1 sibling, 1 reply; 22+ messages in thread
From: Xinliang David Li @ 2011-07-29 18:14 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: gcc

My guess is inlining differences. Try more aggressive inline
parameters to see if helps. Also try FDO to see there is any
performance difference between two versions. You will probably need to
do first level triage and file bug reports.

David


On Fri, Jul 29, 2011 at 10:56 AM, Oleg Smolsky
<oleg.smolsky@riverbed.com> wrote:
> Hi there, I have compiled and run a set of C++ benchmarks on a CentOS4/64
> box using the following compilers:
>    a) g++4.1 that is available for this distro (GCC version 4.1.2 20071124
> (Red Hat 4.1.2-42)
>    b) g++4.6 that I built (stock version 4.6.1)
>
> The machine has two Intel quad core processors in x86_64 mode (/proc/cpuinfo
> attached)
>
> Benchmarks were taken from this page:
>    http://stlab.adobe.com/performance/
>
> Results:
>    - some of these tests showed 20..30% performance degradation
>      (eg the second section in the simple_types_constant_folding test: 30s
> -> 44s)
>    - a few were quicker
>    - full reports are attached
>
> I would assume that performance of the generated code is closely monitored
> by the dev community and obvious blunders should not sneak in... However, my
> findings are reproducible with these synthetic benchmarks as well as
> production code at work. The latter shows approximately 25% degradation on
> CPU bound tests.
>
> Is there a trick to building the compiler or using a specific -mtune/-march
> flag for my CPU? I built the compiler with all the default options (it just
> has a distinct installation path):
>    ../gcc-%{version}/configure --prefix=/work/tools/gcc46
> --enable-languages=c,c++ --with-system-zlib --with-mpfr=/work/tools/mpfr24
> --with-gmp=/work/tools/gmp --with-mpc=/work/tools/mpc
> LD_LIBRARY_PATH=/work/tools/mpfr/lib24:/work/tools/gmp/lib:/work/tools/mpc/lib
>
> Are there any published benchmarks? I'd appreciate any advice or pointers.
>
> Thanks in advance,
> Oleg.
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-07-29 18:14 ` Xinliang David Li
@ 2011-07-29 21:08   ` Oleg Smolsky
  2011-07-29 21:29     ` Xinliang David Li
  0 siblings, 1 reply; 22+ messages in thread
From: Oleg Smolsky @ 2011-07-29 21:08 UTC (permalink / raw)
  To: Xinliang David Li; +Cc: gcc

Hey David, here are a couple of answers and notes:
     - I built the test suite with -O3 and cannot see anything else 
related to inlining that isn't already ON (except for -finline-limit=n 
which I do not how to use)
     http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
     - FTO looks like a very different kettle of fish, I'd prefer to 
leave it aside to limit the number of data points (at least for the 
initial investigation)
     - I've just rerun the suite with -flto and there are no significant 
differences in performance

What else is there?

Oleg.

On 2011/7/29 11:07, Xinliang David Li wrote:
> My guess is inlining differences. Try more aggressive inline
> parameters to see if helps. Also try FDO to see there is any
> performance difference between two versions. You will probably need to
> do first level triage and file bug reports.
>
> David
>
>
> On Fri, Jul 29, 2011 at 10:56 AM, Oleg Smolsky
> <oleg.smolsky@riverbed.com>  wrote:
>> Hi there, I have compiled and run a set of C++ benchmarks on a CentOS4/64
>> box using the following compilers:
>>     a) g++4.1 that is available for this distro (GCC version 4.1.2 20071124
>> (Red Hat 4.1.2-42)
>>     b) g++4.6 that I built (stock version 4.6.1)
>>
>> The machine has two Intel quad core processors in x86_64 mode (/proc/cpuinfo
>> attached)
>>
>> Benchmarks were taken from this page:
>>     http://stlab.adobe.com/performance/
>>
>> Results:
>>     - some of these tests showed 20..30% performance degradation
>>       (eg the second section in the simple_types_constant_folding test: 30s
>> ->  44s)
>>     - a few were quicker
>>     - full reports are attached
>>
>> I would assume that performance of the generated code is closely monitored
>> by the dev community and obvious blunders should not sneak in... However, my
>> findings are reproducible with these synthetic benchmarks as well as
>> production code at work. The latter shows approximately 25% degradation on
>> CPU bound tests.
>>
>> Is there a trick to building the compiler or using a specific -mtune/-march
>> flag for my CPU? I built the compiler with all the default options (it just
>> has a distinct installation path):
>>     ../gcc-%{version}/configure --prefix=/work/tools/gcc46
>> --enable-languages=c,c++ --with-system-zlib --with-mpfr=/work/tools/mpfr24
>> --with-gmp=/work/tools/gmp --with-mpc=/work/tools/mpc
>> LD_LIBRARY_PATH=/work/tools/mpfr/lib24:/work/tools/gmp/lib:/work/tools/mpc/lib
>>
>> Are there any published benchmarks? I'd appreciate any advice or pointers.
>>
>> Thanks in advance,
>> Oleg.
>>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-07-29 21:08   ` Oleg Smolsky
@ 2011-07-29 21:29     ` Xinliang David Li
  2011-08-01 18:44       ` Oleg Smolsky
  0 siblings, 1 reply; 22+ messages in thread
From: Xinliang David Li @ 2011-07-29 21:29 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: gcc

On Fri, Jul 29, 2011 at 11:57 AM, Oleg Smolsky
<oleg.smolsky@riverbed.com> wrote:
> Hey David, here are a couple of answers and notes:
>    - I built the test suite with -O3 and cannot see anything else related to
> inlining that isn't already ON (except for -finline-limit=n which I do not
> how to use)

size estimation, inline heuristics are different between two versions,
so it won't be surprising they make different decisions.

Profiling tools are your best friend here. If you don't have access to
any, the least you can do is to build the program with -pg option and
use gprof tool to find out differences.

David

>    http://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
>    - FTO looks like a very different kettle of fish, I'd prefer to leave it
> aside to limit the number of data points (at least for the initial
> investigation)
>    - I've just rerun the suite with -flto and there are no significant
> differences in performance
>
> What else is there?
>
> Oleg.
>
> On 2011/7/29 11:07, Xinliang David Li wrote:
>>
>> My guess is inlining differences. Try more aggressive inline
>> parameters to see if helps. Also try FDO to see there is any
>> performance difference between two versions. You will probably need to
>> do first level triage and file bug reports.
>>
>> David
>>
>>
>> On Fri, Jul 29, 2011 at 10:56 AM, Oleg Smolsky
>> <oleg.smolsky@riverbed.com>  wrote:
>>>
>>> Hi there, I have compiled and run a set of C++ benchmarks on a CentOS4/64
>>> box using the following compilers:
>>>    a) g++4.1 that is available for this distro (GCC version 4.1.2
>>> 20071124
>>> (Red Hat 4.1.2-42)
>>>    b) g++4.6 that I built (stock version 4.6.1)
>>>
>>> The machine has two Intel quad core processors in x86_64 mode
>>> (/proc/cpuinfo
>>> attached)
>>>
>>> Benchmarks were taken from this page:
>>>    http://stlab.adobe.com/performance/
>>>
>>> Results:
>>>    - some of these tests showed 20..30% performance degradation
>>>      (eg the second section in the simple_types_constant_folding test:
>>> 30s
>>> ->  44s)
>>>    - a few were quicker
>>>    - full reports are attached
>>>
>>> I would assume that performance of the generated code is closely
>>> monitored
>>> by the dev community and obvious blunders should not sneak in... However,
>>> my
>>> findings are reproducible with these synthetic benchmarks as well as
>>> production code at work. The latter shows approximately 25% degradation
>>> on
>>> CPU bound tests.
>>>
>>> Is there a trick to building the compiler or using a specific
>>> -mtune/-march
>>> flag for my CPU? I built the compiler with all the default options (it
>>> just
>>> has a distinct installation path):
>>>    ../gcc-%{version}/configure --prefix=/work/tools/gcc46
>>> --enable-languages=c,c++ --with-system-zlib
>>> --with-mpfr=/work/tools/mpfr24
>>> --with-gmp=/work/tools/gmp --with-mpc=/work/tools/mpc
>>>
>>> LD_LIBRARY_PATH=/work/tools/mpfr/lib24:/work/tools/gmp/lib:/work/tools/mpc/lib
>>>
>>> Are there any published benchmarks? I'd appreciate any advice or
>>> pointers.
>>>
>>> Thanks in advance,
>>> Oleg.
>>>
>
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-07-29 18:08 Performance degradation on g++ 4.6 Oleg Smolsky
  2011-07-29 18:14 ` Xinliang David Li
@ 2011-07-30  9:24 ` Richard Guenther
  1 sibling, 0 replies; 22+ messages in thread
From: Richard Guenther @ 2011-07-30  9:24 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: gcc

On Fri, Jul 29, 2011 at 7:56 PM, Oleg Smolsky <oleg.smolsky@riverbed.com> wrote:
> Hi there, I have compiled and run a set of C++ benchmarks on a CentOS4/64
> box using the following compilers:
>    a) g++4.1 that is available for this distro (GCC version 4.1.2 20071124
> (Red Hat 4.1.2-42)
>    b) g++4.6 that I built (stock version 4.6.1)
>
> The machine has two Intel quad core processors in x86_64 mode (/proc/cpuinfo
> attached)
>
> Benchmarks were taken from this page:
>    http://stlab.adobe.com/performance/
>
> Results:
>    - some of these tests showed 20..30% performance degradation
>      (eg the second section in the simple_types_constant_folding test: 30s
> -> 44s)
>    - a few were quicker
>    - full reports are attached
>
> I would assume that performance of the generated code is closely monitored
> by the dev community and obvious blunders should not sneak in... However, my
> findings are reproducible with these synthetic benchmarks as well as
> production code at work. The latter shows approximately 25% degradation on
> CPU bound tests.

We do monitor quite an extensive set of benchmarks - but as always certain kind
of applications may slip through - I'll have a look at the mentioned benchmark
and see whether it's easy to integrate with our testing at gcc.opensuse.org.

Richard.

> Is there a trick to building the compiler or using a specific -mtune/-march
> flag for my CPU? I built the compiler with all the default options (it just
> has a distinct installation path):
>    ../gcc-%{version}/configure --prefix=/work/tools/gcc46
> --enable-languages=c,c++ --with-system-zlib --with-mpfr=/work/tools/mpfr24
> --with-gmp=/work/tools/gmp --with-mpc=/work/tools/mpc
> LD_LIBRARY_PATH=/work/tools/mpfr/lib24:/work/tools/gmp/lib:/work/tools/mpc/lib
>
> Are there any published benchmarks? I'd appreciate any advice or pointers.
>
> Thanks in advance,
> Oleg.
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-07-29 21:29     ` Xinliang David Li
@ 2011-08-01 18:44       ` Oleg Smolsky
  2011-08-02  5:48         ` Xinliang David Li
                           ` (2 more replies)
  0 siblings, 3 replies; 22+ messages in thread
From: Oleg Smolsky @ 2011-08-01 18:44 UTC (permalink / raw)
  To: Xinliang David Li; +Cc: gcc

[-- Attachment #1: Type: text/plain, Size: 898 bytes --]

On 2011/7/29 14:07, Xinliang David Li wrote:
> Profiling tools are your best friend here. If you don't have access to
> any, the least you can do is to build the program with -pg option and
> use gprof tool to find out differences.
The test suite has a bunch of very basic C++ tests that are executed an 
enormous number of times. I've built one with the obvious performance 
degradation and attached the source, output and reports.

Here are some highlights:
     v4.1:    Total absolute time for int8_t constant folding: 30.42 sec
     v4.6:    Total absolute time for int8_t constant folding: 43.32 sec

Every one of the tests in this section had degraded... the first half 
more than the second. I am not sure how much further I can take this - 
the benchmarked code is very short and plain. I can post disassembly for 
one (some?) of them if anyone is willing to take a look...

Thanks,
Oleg.

[-- Attachment #2: gmon41.prof --]
[-- Type: text/plain, Size: 190903 bytes --]

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 18.80     98.57    98.57                             main
  7.21    136.37    37.80        1    37.80    37.80  void test_constant<double, custom_multiple_constant_divide<double> >(double*, int, char const*)
  3.97    157.16    20.79        1    20.79    20.79  void test_constant<float, custom_multiple_constant_divide<float> >(float*, int, char const*)
  3.60    176.05    18.88        1    18.88    18.88  void test_constant<double, custom_constant_divide<double> >(double*, int, char const*)
  3.50    194.39    18.34        1    18.34    18.34  void test_constant<double, custom_add_constants<double> >(double*, int, char const*)
  3.50    212.72    18.33        1    18.33    18.33  void test_constant<float, custom_add_constants<float> >(float*, int, char const*)
  3.49    230.99    18.27        1    18.27    18.27  void test_constant<float, custom_divide_constants<float> >(float*, int, char const*)
  3.49    249.26    18.27        1    18.27    18.27  void test_constant<double, custom_multiply_constants<double> >(double*, int, char const*)
  3.49    267.53    18.27        1    18.27    18.27  void test_constant<float, custom_sub_constants<float> >(float*, int, char const*)
  3.49    285.81    18.27        1    18.27    18.27  void test_constant<float, custom_multiply_constants<float> >(float*, int, char const*)
  3.49    304.08    18.27        1    18.27    18.27  void test_constant<double, custom_two<double> >(double*, int, char const*)
  3.49    322.35    18.27        1    18.27    18.27  void test_constant<double, custom_sub_constants<double> >(double*, int, char const*)
  3.48    340.61    18.26        1    18.26    18.26  void test_constant<double, custom_divide_constants<double> >(double*, int, char const*)
  1.99    351.03    10.42        1    10.42    10.42  void test_constant<float, custom_constant_divide<float> >(float*, int, char const*)
  0.67    354.53     3.50        1     3.50     3.50  void test_constant<int, custom_multiple_constant_divide<int> >(int*, int, char const*)
  0.65    357.96     3.43        1     3.43     3.43  void test_constant<long, custom_multiple_constant_divide<long> >(long*, int, char const*)
  0.62    361.19     3.23        1     3.23     3.23  void test_constant<int, custom_constant_divide<int> >(int*, int, char const*)
  0.61    364.40     3.21        1     3.21     3.21  void test_constant<double, custom_multiple_constant_sub<double> >(double*, int, char const*)
  0.61    367.60     3.20        1     3.20     3.20  void test_constant<double, custom_multiple_constant_add<double> >(double*, int, char const*)
  0.59    370.70     3.10        1     3.10     3.10  void test_constant<long, custom_constant_divide<long> >(long*, int, char const*)
  0.59    373.77     3.07        1     3.07     3.07  void test_constant<float, custom_multiple_constant_sub<float> >(float*, int, char const*)
  0.58    376.83     3.06        1     3.06     3.06  void test_constant<float, custom_multiple_constant_add<float> >(float*, int, char const*)
  0.50    379.46     2.63        1     2.63     2.63  void test_constant<double, custom_multiple_constant_multiply<double> >(double*, int, char const*)
  0.48    381.99     2.52        1     2.52     2.52  void test_constant<unsigned int, custom_constant_divide<unsigned int> >(unsigned int*, int, char const*)
  0.48    384.51     2.52        1     2.52     2.52  void test_constant<unsigned int, custom_multiple_constant_divide<unsigned int> >(unsigned int*, int, char const*)
  0.47    386.97     2.46        1     2.46     2.46  void test_constant<float, custom_multiple_constant_multiply<float> >(float*, int, char const*)
  0.47    389.41     2.44        1     2.44     2.44  void test_constant<unsigned long, custom_constant_divide<unsigned long> >(unsigned long*, int, char const*)
  0.46    391.84     2.43        1     2.43     2.43  void test_constant<unsigned long, custom_multiple_constant_divide<unsigned long> >(unsigned long*, int, char const*)
  0.36    393.73     1.89        1     1.89     1.89  void test_constant<double, custom_multiple_constant_multiply2<double> >(double*, int, char const*)
  0.36    395.61     1.88        1     1.88     1.88  void test_constant<double, custom_constant_add<double> >(double*, int, char const*)
  0.36    397.49     1.88        1     1.88     1.88  void test_constant<double, custom_constant_sub<double> >(double*, int, char const*)
  0.36    399.37     1.88        1     1.88     1.88  void test_constant<double, custom_multiple_constant_divide2<double> >(double*, int, char const*)
  0.35    401.22     1.85        1     1.85     1.85  void test_constant<double, custom_constant_multiply<double> >(double*, int, char const*)
  0.35    403.07     1.85        1     1.85     1.85  void test_constant<float, custom_constant_multiply<float> >(float*, int, char const*)
  0.35    404.92     1.85        1     1.85     1.85  void test_constant<long, custom_multiple_constant_multiply<long> >(long*, int, char const*)
  0.35    406.77     1.85        1     1.85     1.85  void test_constant<unsigned short, custom_multiple_constant_multiply<unsigned short> >(unsigned short*, int, char const*)
  0.35    408.62     1.85        1     1.85     1.85  void test_constant<unsigned short, custom_constant_multiply<unsigned short> >(unsigned short*, int, char const*)
  0.35    410.46     1.84        1     1.84     1.84  void test_constant<float, custom_constant_sub<float> >(float*, int, char const*)
  0.35    412.30     1.84        1     1.84     1.84  void test_constant<float, custom_multiple_constant_mixed<float> >(float*, int, char const*)
  0.35    414.14     1.84        1     1.84     1.84  void test_constant<long, custom_constant_multiply<long> >(long*, int, char const*)
  0.35    415.98     1.84        1     1.84     1.84  void test_constant<unsigned long, custom_constant_multiply<unsigned long> >(unsigned long*, int, char const*)
  0.35    417.81     1.83        1     1.83     1.83  void test_constant<float, custom_constant_add<float> >(float*, int, char const*)
  0.35    419.64     1.83        1     1.83     1.83  void test_constant<float, custom_multiple_constant_multiply2<float> >(float*, int, char const*)
  0.35    421.47     1.83        1     1.83     1.83  void test_constant<unsigned long, custom_multiple_constant_multiply<unsigned long> >(unsigned long*, int, char const*)
  0.35    423.29     1.82        1     1.82     1.82  void test_constant<float, custom_multiple_constant_divide2<float> >(float*, int, char const*)
  0.34    425.08     1.79        1     1.79     1.79  void test_constant<unsigned short, custom_multiple_constant_divide<unsigned short> >(unsigned short*, int, char const*)
  0.34    426.86     1.78        1     1.78     1.78  void test_constant<unsigned short, custom_constant_divide<unsigned short> >(unsigned short*, int, char const*)
  0.34    428.63     1.77        1     1.77     1.77  void test_constant<int, custom_constant_multiply<int> >(int*, int, char const*)
  0.34    430.40     1.77        1     1.77     1.77  void test_constant<unsigned int, custom_constant_multiply<unsigned int> >(unsigned int*, int, char const*)
  0.34    432.16     1.76        1     1.76     1.76  void test_constant<int, custom_multiple_constant_multiply<int> >(int*, int, char const*)
  0.34    433.92     1.76        1     1.76     1.76  void test_constant<unsigned int, custom_multiple_constant_multiply<unsigned int> >(unsigned int*, int, char const*)
  0.27    435.35     1.43        1     1.43     1.43  void test_constant<long, custom_constant_and<long> >(long*, int, char const*)
  0.27    436.78     1.43        1     1.43     1.43  void test_constant<long, custom_constant_xor<long> >(long*, int, char const*)
  0.27    438.21     1.43        1     1.43     1.43  void test_constant<unsigned long, custom_constant_xor<unsigned long> >(unsigned long*, int, char const*)
  0.27    439.64     1.43        1     1.43     1.43  void test_constant<unsigned long, custom_multiple_constant_divide2<unsigned long> >(unsigned long*, int, char const*)
  0.27    441.07     1.43        1     1.43     1.43  void test_constant<long, custom_constant_or<long> >(long*, int, char const*)
  0.27    442.50     1.43        1     1.43     1.43  void test_constant<long, custom_constant_add<long> >(long*, int, char const*)
  0.27    443.93     1.43        1     1.43     1.43  void test_constant<long, custom_multiple_constant_add<long> >(long*, int, char const*)
  0.27    445.36     1.43        1     1.43     1.43  void test_constant<long, custom_multiple_constant_xor<long> >(long*, int, char const*)
  0.27    446.79     1.43        1     1.43     1.43  void test_constant<long, custom_multiple_constant_divide2<long> >(long*, int, char const*)
  0.27    448.22     1.43        1     1.43     1.43  void test_constant<long, custom_multiple_constant_multiply2<long> >(long*, int, char const*)
  0.27    449.65     1.43        1     1.43     1.43  void test_constant<unsigned long, custom_constant_and<unsigned long> >(unsigned long*, int, char const*)
  0.27    451.08     1.43        1     1.43     1.43  void test_constant<unsigned long, custom_multiple_constant_or<unsigned long> >(unsigned long*, int, char const*)
  0.27    452.51     1.43        1     1.43     1.43  void test_constant<unsigned long, custom_multiple_constant_add<unsigned long> >(unsigned long*, int, char const*)
  0.27    453.94     1.43        1     1.43     1.43  void test_constant<unsigned long, custom_multiple_constant_and<unsigned long> >(unsigned long*, int, char const*)
  0.27    455.37     1.43        1     1.43     1.43  void test_constant<unsigned long, custom_multiple_constant_multiply2<unsigned long> >(unsigned long*, int, char const*)
  0.27    456.80     1.43        1     1.43     1.43  void test_constant<long, custom_multiple_constant_sub<long> >(long*, int, char const*)
  0.27    458.23     1.43        1     1.43     1.43  void test_constant<unsigned long, custom_constant_sub<unsigned long> >(unsigned long*, int, char const*)
  0.27    459.65     1.42        1     1.42     1.42  void test_constant<long, custom_constant_sub<long> >(long*, int, char const*)
  0.27    461.07     1.42        1     1.42     1.42  void test_constant<unsigned long, custom_multiple_constant_xor<unsigned long> >(unsigned long*, int, char const*)
  0.27    462.49     1.42        1     1.42     1.42  void test_constant<long, custom_multiple_constant_or<long> >(long*, int, char const*)
  0.27    463.91     1.42        1     1.42     1.42  void test_constant<long, custom_multiple_constant_and<long> >(long*, int, char const*)
  0.27    465.33     1.42        1     1.42     1.42  void test_constant<unsigned long, custom_constant_or<unsigned long> >(unsigned long*, int, char const*)
  0.27    466.75     1.42        1     1.42     1.42  void test_constant<unsigned long, custom_constant_add<unsigned long> >(unsigned long*, int, char const*)
  0.27    468.17     1.42        1     1.42     1.42  void test_constant<unsigned long, custom_multiple_constant_sub<unsigned long> >(unsigned long*, int, char const*)
  0.27    469.57     1.40        1     1.40     1.40  void test_constant<unsigned short, custom_multiple_constant_or<unsigned short> >(unsigned short*, int, char const*)
  0.27    470.97     1.40        1     1.40     1.40  void test_constant<unsigned short, custom_multiple_constant_divide2<unsigned short> >(unsigned short*, int, char const*)
  0.27    472.36     1.39        1     1.39     1.39  void test_constant<unsigned short, custom_constant_add<unsigned short> >(unsigned short*, int, char const*)
  0.27    473.75     1.39        1     1.39     1.39  void test_constant<unsigned short, custom_constant_and<unsigned short> >(unsigned short*, int, char const*)
  0.27    475.14     1.39        1     1.39     1.39  void test_constant<unsigned short, custom_constant_sub<unsigned short> >(unsigned short*, int, char const*)
  0.27    476.53     1.39        1     1.39     1.39  void test_constant<unsigned short, custom_multiple_constant_xor<unsigned short> >(unsigned short*, int, char const*)
  0.27    477.92     1.39        1     1.39     1.39  void test_constant<unsigned short, custom_constant_or<unsigned short> >(unsigned short*, int, char const*)
  0.27    479.31     1.39        1     1.39     1.39  void test_constant<unsigned short, custom_multiple_constant_and<unsigned short> >(unsigned short*, int, char const*)
  0.26    480.69     1.38        1     1.38     1.38  void test_constant<int, custom_constant_or<int> >(int*, int, char const*)
  0.26    482.07     1.38        1     1.38     1.38  void test_constant<int, custom_constant_and<int> >(int*, int, char const*)
  0.26    483.45     1.38        1     1.38     1.38  void test_constant<int, custom_constant_sub<int> >(int*, int, char const*)
  0.26    484.83     1.38        1     1.38     1.38  void test_constant<int, custom_multiple_constant_xor<int> >(int*, int, char const*)
  0.26    486.21     1.38        1     1.38     1.38  void test_constant<unsigned int, custom_constant_sub<unsigned int> >(unsigned int*, int, char const*)
  0.26    487.59     1.38        1     1.38     1.38  void test_constant<unsigned int, custom_multiple_constant_or<unsigned int> >(unsigned int*, int, char const*)
  0.26    488.97     1.38        1     1.38     1.38  void test_constant<unsigned int, custom_multiple_constant_and<unsigned int> >(unsigned int*, int, char const*)
  0.26    490.35     1.38        1     1.38     1.38  void test_constant<unsigned int, custom_multiple_constant_xor<unsigned int> >(unsigned int*, int, char const*)
  0.26    491.74     1.38        1     1.38     1.38  void test_constant<unsigned int, custom_multiple_constant_multiply2<unsigned int> >(unsigned int*, int, char const*)
  0.26    493.12     1.38        1     1.38     1.38  void test_constant<unsigned short, custom_constant_xor<unsigned short> >(unsigned short*, int, char const*)
  0.26    494.50     1.38        1     1.38     1.38  void test_constant<unsigned short, custom_multiple_constant_add<unsigned short> >(unsigned short*, int, char const*)
  0.26    495.88     1.38        1     1.38     1.38  void test_constant<unsigned short, custom_multiple_constant_sub<unsigned short> >(unsigned short*, int, char const*)
  0.26    497.26     1.38        1     1.38     1.38  void test_constant<unsigned short, custom_multiple_constant_multiply2<unsigned short> >(unsigned short*, int, char const*)
  0.26    498.64     1.38        1     1.38     1.38  void test_constant<int, custom_multiple_constant_multiply2<int> >(int*, int, char const*)
  0.26    500.01     1.37        1     1.37     1.37  void test_constant<int, custom_constant_add<int> >(int*, int, char const*)
  0.26    501.38     1.37        1     1.37     1.37  void test_constant<int, custom_constant_xor<int> >(int*, int, char const*)
  0.26    502.75     1.37        1     1.37     1.37  void test_constant<int, custom_multiple_constant_or<int> >(int*, int, char const*)
  0.26    504.12     1.37        1     1.37     1.37  void test_constant<int, custom_multiple_constant_add<int> >(int*, int, char const*)
  0.26    505.49     1.37        1     1.37     1.37  void test_constant<unsigned int, custom_constant_or<unsigned int> >(unsigned int*, int, char const*)
  0.26    506.86     1.37        1     1.37     1.37  void test_constant<unsigned int, custom_constant_add<unsigned int> >(unsigned int*, int, char const*)
  0.26    508.23     1.37        1     1.37     1.37  void test_constant<unsigned int, custom_multiple_constant_add<unsigned int> >(unsigned int*, int, char const*)
  0.26    509.60     1.37        1     1.37     1.37  void test_constant<unsigned int, custom_multiple_constant_sub<unsigned int> >(unsigned int*, int, char const*)
  0.26    510.97     1.37        1     1.37     1.37  void test_constant<unsigned int, custom_multiple_constant_divide2<unsigned int> >(unsigned int*, int, char const*)
  0.26    512.34     1.37        1     1.37     1.37  void test_constant<int, custom_multiple_constant_and<int> >(int*, int, char const*)
  0.26    513.71     1.37        1     1.37     1.37  void test_constant<int, custom_multiple_constant_sub<int> >(int*, int, char const*)
  0.26    515.08     1.37        1     1.37     1.37  void test_constant<int, custom_multiple_constant_divide2<int> >(int*, int, char const*)
  0.26    516.45     1.37        1     1.37     1.37  void test_constant<unsigned int, custom_constant_and<unsigned int> >(unsigned int*, int, char const*)
  0.26    517.82     1.37        1     1.37     1.37  void test_constant<unsigned int, custom_constant_xor<unsigned int> >(unsigned int*, int, char const*)
  0.23    519.05     1.23        1     1.23     1.23  void test_constant<unsigned short, custom_multiple_constant_mixed<unsigned short> >(unsigned short*, int, char const*)
  0.23    520.27     1.22        1     1.22     1.22  void test_constant<long, custom_multiple_constant_mixed<long> >(long*, int, char const*)
  0.23    521.49     1.22        1     1.22     1.22  void test_constant<int, custom_multiple_constant_mixed<int> >(int*, int, char const*)
  0.23    522.71     1.22        1     1.22     1.22  void test_constant<unsigned int, custom_multiple_constant_mixed<unsigned int> >(unsigned int*, int, char const*)
  0.23    523.93     1.22        1     1.22     1.22  void test_constant<unsigned long, custom_multiple_constant_mixed<unsigned long> >(unsigned long*, int, char const*)
  0.00    523.95     0.02  2000000     0.00     0.00  void check_shifted_sum<short, custom_notequal_constants<short> >(short)
  0.00    523.97     0.02   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_divide<signed char> >(signed char)
  0.00    523.98     0.01  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_or_constants<signed char> >(signed char)
  0.00    523.99     0.01  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_and_constants<signed char> >(signed char)
  0.00    524.00     0.01  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_lessthan_constants<signed char> >(signed char)
  0.00    524.01     0.01  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_multiply_constants<signed char> >(signed char)
  0.00    524.02     0.01  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_notequal_constants<signed char> >(signed char)
  0.00    524.03     0.01  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_lessthanequal_constants<signed char> >(signed char)
  0.00    524.04     0.01  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_or_constants<unsigned char> >(unsigned char)
  0.00    524.05     0.01  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_lessthanequal_constants<unsigned char> >(unsigned char)
  0.00    524.06     0.01  2000000     0.00     0.00  void check_shifted_sum<short, custom_two<short> >(short)
  0.00    524.07     0.01  2000000     0.00     0.00  void check_shifted_sum<short, custom_or_constants<short> >(short)
  0.00    524.08     0.01  2000000     0.00     0.00  void check_shifted_sum<short, custom_mod_constants<short> >(short)
  0.00    524.09     0.01  2000000     0.00     0.00  void check_shifted_sum<short, custom_lessthan_constants<short> >(short)
  0.00    524.10     0.01  2000000     0.00     0.00  void check_shifted_sum<short, custom_greaterthanequal_constants<short> >(short)
  0.00    524.11     0.01  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_mod_constants<unsigned short> >(unsigned short)
  0.00    524.12     0.01  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_lessthan_constants<unsigned short> >(unsigned short)
  0.00    524.13     0.01  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_notequal_constants<unsigned short> >(unsigned short)
  0.00    524.14     0.01  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_greaterthan_constants<unsigned short> >(unsigned short)
  0.00    524.15     0.01  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_greaterthanequal_constants<unsigned short> >(unsigned short)
  0.00    524.16     0.01   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_multiply2<signed char> >(signed char)
  0.00    524.17     0.01   200000     0.00     0.00  void check_shifted_sum<double, custom_multiple_constant_mixed<double> >(double)
  0.00    524.18     0.01   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_add<short> >(short)
  0.00    524.19     0.01        1     0.01     0.01  void test_constant<int, custom_or_constants<int> >(int*, int, char const*)
  0.00    524.20     0.01        1     0.01     0.01  void test_constant<unsigned int, custom_or_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.21     0.01        1     0.01     0.01  void test_constant<unsigned long, custom_xor_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.21     0.01  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_divide_constants<unsigned short> >(unsigned short)
  0.00    524.22     0.01  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_multiply_constants<unsigned short> >(unsigned short)
  0.00    524.22     0.01   200000     0.00     0.00  void check_shifted_sum<short, custom_constant_or<short> >(short)
  0.00    524.23     0.01   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_and<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_two<signed char> >(signed char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_mod_constants<signed char> >(signed char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_xor_constants<signed char> >(signed char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_equal_constants<signed char> >(signed char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_divide_constants<signed char> >(signed char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_greaterthan_constants<signed char> >(signed char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<signed char, custom_greaterthanequal_constants<signed char> >(signed char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<float, custom_two<float> >(float)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_two<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_add_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_and_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_mod_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_sub_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_xor_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_equal_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_divide_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_lessthan_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiply_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_notequal_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_greaterthan_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned char, custom_greaterthanequal_constants<unsigned char> >(unsigned char)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned int, custom_two<unsigned int> >(unsigned int)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<short, custom_add_constants<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<short, custom_and_constants<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<short, custom_sub_constants<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<short, custom_xor_constants<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<short, custom_equal_constants<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<short, custom_divide_constants<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<short, custom_multiply_constants<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<short, custom_greaterthan_constants<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<short, custom_lessthanequal_constants<short> >(short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_two<unsigned short> >(unsigned short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_add_constants<unsigned short> >(unsigned short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_sub_constants<unsigned short> >(unsigned short)
  0.00    524.23     0.00  2000000     0.00     0.00  void check_shifted_sum<unsigned short, custom_equal_constants<unsigned short> >(unsigned short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_constant_or<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_constant_add<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_constant_and<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_constant_sub<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_constant_xor<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_constant_divide<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_constant_multiply<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_or<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_add<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_and<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_sub<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_xor<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_mixed<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_divide2<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<signed char, custom_multiple_constant_multiply<signed char> >(signed char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_constant_or<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_constant_add<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_constant_and<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_constant_sub<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_constant_xor<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_constant_divide<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_constant_multiply<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_or<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_add<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_and<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_sub<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_xor<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_mixed<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_divide<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_divide2<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_multiply<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<unsigned char, custom_multiple_constant_multiply2<unsigned char> >(unsigned char)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_constant_add<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_constant_and<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_constant_sub<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_constant_xor<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_constant_divide<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_constant_multiply<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_or<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_sub<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_xor<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_mixed<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_divide<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_divide2<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_multiply<short> >(short)
  0.00    524.23     0.00   200000     0.00     0.00  void check_shifted_sum<short, custom_multiple_constant_multiply2<short> >(short)
  0.00    524.23     0.00      110     0.00     0.00  start_timer()
  0.00    524.23     0.00      110     0.00     0.00  record_result(double, char const*)
  0.00    524.23     0.00      110     0.00     0.00  timer()
  0.00    524.23     0.00       20     0.00     0.00  summarize(char const*, int, int, int, int)
  0.00    524.23     0.00        1     0.00     0.00  global constructors keyed to results
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_two<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_add_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_and_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_mod_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_sub_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_xor_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_equal_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_divide_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_lessthan_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_multiply_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_notequal_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_greaterthan_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_lessthanequal_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<int, custom_greaterthanequal_constants<int> >(int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_add_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_and_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_mod_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_sub_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_xor_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_equal_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_divide_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_lessthan_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_multiply_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_notequal_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_greaterthan_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_lessthanequal_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned int, custom_greaterthanequal_constants<unsigned int> >(unsigned int*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_two<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_or_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_add_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_and_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_mod_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_sub_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_xor_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_equal_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_divide_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_lessthan_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_multiply_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_notequal_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_greaterthan_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_lessthanequal_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<long, custom_greaterthanequal_constants<long> >(long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_two<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_or_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_add_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_and_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_mod_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_sub_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_equal_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_divide_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_lessthan_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_multiply_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_notequal_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_greaterthan_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_lessthanequal_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned long, custom_greaterthanequal_constants<unsigned long> >(unsigned long*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned short, custom_or_constants<unsigned short> >(unsigned short*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned short, custom_and_constants<unsigned short> >(unsigned short*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned short, custom_xor_constants<unsigned short> >(unsigned short*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  void test_constant<unsigned short, custom_lessthanequal_constants<unsigned short> >(unsigned short*, int, char const*)
  0.00    524.23     0.00        1     0.00     0.00  __static_initialization_and_destruction_0(int, int)

 %         the percentage of the total running time of the
time       program used by this function.

cumulative a running sum of the number of seconds accounted
 seconds   for by this function and those listed above it.

 self      the number of seconds accounted for by this
seconds    function alone.  This is the major sort for this
           listing.

calls      the number of times this function was invoked, if
           this function is profiled, else blank.
 
 self      the average number of milliseconds spent in this
ms/call    function per call, if this function is profiled,
	   else blank.

 total     the average number of milliseconds spent in this
ms/call    function and its descendents per call, if this 
	   function is profiled, else blank.

name       the name of the function.  This is the minor sort
           for this listing. The index shows the location of
	   the function in the gprof listing. If the index is
	   in parenthesis it shows where it would appear in
	   the gprof listing if it were to be printed.
\f
		     Call graph (explanation follows)


granularity: each sample hit covers 2 byte(s) for 0.00% of 524.23 seconds

index % time    self  children    called     name
                                                 <spontaneous>
[1]    100.0   98.57  425.66                 main [1]
               37.80    0.00       1/1           void test_constant<double, custom_multiple_constant_divide<double> >(double*, int, char const*) [2]
               20.79    0.00       1/1           void test_constant<float, custom_multiple_constant_divide<float> >(float*, int, char const*) [3]
               18.88    0.00       1/1           void test_constant<double, custom_constant_divide<double> >(double*, int, char const*) [4]
               18.34    0.00       1/1           void test_constant<double, custom_add_constants<double> >(double*, int, char const*) [5]
               18.33    0.00       1/1           void test_constant<float, custom_add_constants<float> >(float*, int, char const*) [6]
               18.27    0.00       1/1           void test_constant<float, custom_divide_constants<float> >(float*, int, char const*) [7]
               18.27    0.00       1/1           void test_constant<float, custom_sub_constants<float> >(float*, int, char const*) [9]
               18.27    0.00       1/1           void test_constant<float, custom_multiply_constants<float> >(float*, int, char const*) [10]
               18.27    0.00       1/1           void test_constant<double, custom_multiply_constants<double> >(double*, int, char const*) [8]
               18.27    0.00       1/1           void test_constant<double, custom_two<double> >(double*, int, char const*) [11]
               18.27    0.00       1/1           void test_constant<double, custom_sub_constants<double> >(double*, int, char const*) [12]
               18.26    0.00       1/1           void test_constant<double, custom_divide_constants<double> >(double*, int, char const*) [13]
               10.42    0.00       1/1           void test_constant<float, custom_constant_divide<float> >(float*, int, char const*) [14]
                3.50    0.00       1/1           void test_constant<int, custom_multiple_constant_divide<int> >(int*, int, char const*) [15]
                3.43    0.00       1/1           void test_constant<long, custom_multiple_constant_divide<long> >(long*, int, char const*) [16]
                3.23    0.00       1/1           void test_constant<int, custom_constant_divide<int> >(int*, int, char const*) [17]
                3.21    0.00       1/1           void test_constant<double, custom_multiple_constant_sub<double> >(double*, int, char const*) [18]
                3.20    0.00       1/1           void test_constant<double, custom_multiple_constant_add<double> >(double*, int, char const*) [19]
                3.10    0.00       1/1           void test_constant<long, custom_constant_divide<long> >(long*, int, char const*) [20]
                3.07    0.00       1/1           void test_constant<float, custom_multiple_constant_sub<float> >(float*, int, char const*) [21]
                3.06    0.00       1/1           void test_constant<float, custom_multiple_constant_add<float> >(float*, int, char const*) [22]
                2.63    0.00       1/1           void test_constant<double, custom_multiple_constant_multiply<double> >(double*, int, char const*) [23]
                2.52    0.00       1/1           void test_constant<unsigned int, custom_constant_divide<unsigned int> >(unsigned int*, int, char const*) [24]
                2.52    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_divide<unsigned int> >(unsigned int*, int, char const*) [25]
                2.46    0.00       1/1           void test_constant<float, custom_multiple_constant_multiply<float> >(float*, int, char const*) [26]
                2.44    0.00       1/1           void test_constant<unsigned long, custom_constant_divide<unsigned long> >(unsigned long*, int, char const*) [27]
                2.43    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_divide<unsigned long> >(unsigned long*, int, char const*) [28]
                1.89    0.00       1/1           void test_constant<double, custom_multiple_constant_multiply2<double> >(double*, int, char const*) [29]
                1.88    0.00       1/1           void test_constant<double, custom_constant_add<double> >(double*, int, char const*) [30]
                1.88    0.00       1/1           void test_constant<double, custom_constant_sub<double> >(double*, int, char const*) [31]
                1.88    0.00       1/1           void test_constant<double, custom_multiple_constant_divide2<double> >(double*, int, char const*) [32]
                1.85    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [36]
                1.85    0.00       1/1           void test_constant<long, custom_multiple_constant_multiply<long> >(long*, int, char const*) [35]
                1.85    0.00       1/1           void test_constant<float, custom_constant_multiply<float> >(float*, int, char const*) [34]
                1.85    0.00       1/1           void test_constant<double, custom_constant_multiply<double> >(double*, int, char const*) [33]
                1.85    0.00       1/1           void test_constant<unsigned short, custom_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [37]
                1.84    0.00       1/1           void test_constant<long, custom_constant_multiply<long> >(long*, int, char const*) [40]
                1.84    0.00       1/1           void test_constant<unsigned long, custom_constant_multiply<unsigned long> >(unsigned long*, int, char const*) [41]
                1.84    0.00       1/1           void test_constant<float, custom_constant_sub<float> >(float*, int, char const*) [38]
                1.84    0.00       1/1           void test_constant<float, custom_multiple_constant_mixed<float> >(float*, int, char const*) [39]
                1.83    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_multiply<unsigned long> >(unsigned long*, int, char const*) [44]
                1.83    0.00       1/1           void test_constant<float, custom_constant_add<float> >(float*, int, char const*) [42]
                1.83    0.00       1/1           void test_constant<float, custom_multiple_constant_multiply2<float> >(float*, int, char const*) [43]
                1.82    0.00       1/1           void test_constant<float, custom_multiple_constant_divide2<float> >(float*, int, char const*) [45]
                1.79    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_divide<unsigned short> >(unsigned short*, int, char const*) [46]
                1.78    0.00       1/1           void test_constant<unsigned short, custom_constant_divide<unsigned short> >(unsigned short*, int, char const*) [47]
                1.77    0.00       1/1           void test_constant<int, custom_constant_multiply<int> >(int*, int, char const*) [48]
                1.77    0.00       1/1           void test_constant<unsigned int, custom_constant_multiply<unsigned int> >(unsigned int*, int, char const*) [49]
                1.76    0.00       1/1           void test_constant<int, custom_multiple_constant_multiply<int> >(int*, int, char const*) [50]
                1.76    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_multiply<unsigned int> >(unsigned int*, int, char const*) [51]
                1.43    0.00       1/1           void test_constant<long, custom_constant_and<long> >(long*, int, char const*) [52]
                1.43    0.00       1/1           void test_constant<long, custom_constant_xor<long> >(long*, int, char const*) [53]
                1.43    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_divide2<unsigned long> >(unsigned long*, int, char const*) [55]
                1.43    0.00       1/1           void test_constant<unsigned long, custom_constant_xor<unsigned long> >(unsigned long*, int, char const*) [54]
                1.43    0.00       1/1           void test_constant<long, custom_constant_add<long> >(long*, int, char const*) [57]
                1.43    0.00       1/1           void test_constant<long, custom_multiple_constant_add<long> >(long*, int, char const*) [58]
                1.43    0.00       1/1           void test_constant<long, custom_multiple_constant_multiply2<long> >(long*, int, char const*) [61]
                1.43    0.00       1/1           void test_constant<long, custom_multiple_constant_divide2<long> >(long*, int, char const*) [60]
                1.43    0.00       1/1           void test_constant<long, custom_constant_or<long> >(long*, int, char const*) [56]
                1.43    0.00       1/1           void test_constant<long, custom_multiple_constant_xor<long> >(long*, int, char const*) [59]
                1.43    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_add<unsigned long> >(unsigned long*, int, char const*) [64]
                1.43    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_multiply2<unsigned long> >(unsigned long*, int, char const*) [66]
                1.43    0.00       1/1           void test_constant<unsigned long, custom_constant_and<unsigned long> >(unsigned long*, int, char const*) [62]
                1.43    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_and<unsigned long> >(unsigned long*, int, char const*) [65]
                1.43    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_or<unsigned long> >(unsigned long*, int, char const*) [63]
                1.43    0.00       1/1           void test_constant<long, custom_multiple_constant_sub<long> >(long*, int, char const*) [67]
                1.43    0.00       1/1           void test_constant<unsigned long, custom_constant_sub<unsigned long> >(unsigned long*, int, char const*) [68]
                1.42    0.00       1/1           void test_constant<long, custom_constant_sub<long> >(long*, int, char const*) [69]
                1.42    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_xor<unsigned long> >(unsigned long*, int, char const*) [70]
                1.42    0.00       1/1           void test_constant<long, custom_multiple_constant_and<long> >(long*, int, char const*) [72]
                1.42    0.00       1/1           void test_constant<long, custom_multiple_constant_or<long> >(long*, int, char const*) [71]
                1.42    0.00       1/1           void test_constant<unsigned long, custom_constant_add<unsigned long> >(unsigned long*, int, char const*) [74]
                1.42    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_sub<unsigned long> >(unsigned long*, int, char const*) [75]
                1.42    0.00       1/1           void test_constant<unsigned long, custom_constant_or<unsigned long> >(unsigned long*, int, char const*) [73]
                1.40    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_divide2<unsigned short> >(unsigned short*, int, char const*) [77]
                1.40    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_or<unsigned short> >(unsigned short*, int, char const*) [76]
                1.39    0.00       1/1           void test_constant<unsigned short, custom_constant_add<unsigned short> >(unsigned short*, int, char const*) [78]
                1.39    0.00       1/1           void test_constant<unsigned short, custom_constant_sub<unsigned short> >(unsigned short*, int, char const*) [80]
                1.39    0.00       1/1           void test_constant<unsigned short, custom_constant_and<unsigned short> >(unsigned short*, int, char const*) [79]
                1.39    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_xor<unsigned short> >(unsigned short*, int, char const*) [81]
                1.39    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_and<unsigned short> >(unsigned short*, int, char const*) [83]
                1.39    0.00       1/1           void test_constant<unsigned short, custom_constant_or<unsigned short> >(unsigned short*, int, char const*) [82]
                1.38    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_add<unsigned short> >(unsigned short*, int, char const*) [94]
                1.38    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_sub<unsigned short> >(unsigned short*, int, char const*) [95]
                1.38    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_multiply2<unsigned short> >(unsigned short*, int, char const*) [96]
                1.38    0.00       1/1           void test_constant<unsigned short, custom_constant_xor<unsigned short> >(unsigned short*, int, char const*) [93]
                1.38    0.00       1/1           void test_constant<int, custom_constant_sub<int> >(int*, int, char const*) [86]
                1.38    0.00       1/1           void test_constant<int, custom_constant_and<int> >(int*, int, char const*) [85]
                1.38    0.00       1/1           void test_constant<int, custom_constant_or<int> >(int*, int, char const*) [84]
                1.38    0.00       1/1           void test_constant<int, custom_multiple_constant_xor<int> >(int*, int, char const*) [87]
                1.38    0.00       1/1           void test_constant<unsigned int, custom_constant_sub<unsigned int> >(unsigned int*, int, char const*) [88]
                1.38    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_multiply2<unsigned int> >(unsigned int*, int, char const*) [92]
                1.38    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_and<unsigned int> >(unsigned int*, int, char const*) [90]
                1.38    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_or<unsigned int> >(unsigned int*, int, char const*) [89]
                1.38    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_xor<unsigned int> >(unsigned int*, int, char const*) [91]
                1.38    0.00       1/1           void test_constant<int, custom_multiple_constant_multiply2<int> >(int*, int, char const*) [97]
                1.37    0.00       1/1           void test_constant<int, custom_constant_add<int> >(int*, int, char const*) [98]
                1.37    0.00       1/1           void test_constant<int, custom_multiple_constant_add<int> >(int*, int, char const*) [101]
                1.37    0.00       1/1           void test_constant<int, custom_multiple_constant_or<int> >(int*, int, char const*) [100]
                1.37    0.00       1/1           void test_constant<int, custom_constant_xor<int> >(int*, int, char const*) [99]
                1.37    0.00       1/1           void test_constant<unsigned int, custom_constant_add<unsigned int> >(unsigned int*, int, char const*) [103]
                1.37    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_add<unsigned int> >(unsigned int*, int, char const*) [104]
                1.37    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_sub<unsigned int> >(unsigned int*, int, char const*) [105]
                1.37    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_divide2<unsigned int> >(unsigned int*, int, char const*) [106]
                1.37    0.00       1/1           void test_constant<unsigned int, custom_constant_or<unsigned int> >(unsigned int*, int, char const*) [102]
                1.37    0.00       1/1           void test_constant<int, custom_multiple_constant_sub<int> >(int*, int, char const*) [108]
                1.37    0.00       1/1           void test_constant<int, custom_multiple_constant_divide2<int> >(int*, int, char const*) [109]
                1.37    0.00       1/1           void test_constant<int, custom_multiple_constant_and<int> >(int*, int, char const*) [107]
                1.37    0.00       1/1           void test_constant<unsigned int, custom_constant_and<unsigned int> >(unsigned int*, int, char const*) [110]
                1.37    0.00       1/1           void test_constant<unsigned int, custom_constant_xor<unsigned int> >(unsigned int*, int, char const*) [111]
                1.23    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_mixed<unsigned short> >(unsigned short*, int, char const*) [112]
                1.22    0.00       1/1           void test_constant<long, custom_multiple_constant_mixed<long> >(long*, int, char const*) [113]
                1.22    0.00       1/1           void test_constant<int, custom_multiple_constant_mixed<int> >(int*, int, char const*) [114]
                1.22    0.00       1/1           void test_constant<unsigned int, custom_multiple_constant_mixed<unsigned int> >(unsigned int*, int, char const*) [115]
                1.22    0.00       1/1           void test_constant<unsigned long, custom_multiple_constant_mixed<unsigned long> >(unsigned long*, int, char const*) [116]
                0.02    0.00 2000000/2000000     void check_shifted_sum<short, custom_notequal_constants<short> >(short) [117]
                0.02    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_divide<signed char> >(signed char) [118]
                0.01    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_multiply_constants<signed char> >(signed char) [122]
                0.01    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_notequal_constants<signed char> >(signed char) [123]
                0.01    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_lessthan_constants<signed char> >(signed char) [121]
                0.01    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_lessthanequal_constants<signed char> >(signed char) [124]
                0.01    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_and_constants<signed char> >(signed char) [120]
                0.01    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_or_constants<signed char> >(signed char) [119]
                0.01    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_lessthanequal_constants<unsigned char> >(unsigned char) [126]
                0.01    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_or_constants<unsigned char> >(unsigned char) [125]
                0.01    0.00 2000000/2000000     void check_shifted_sum<short, custom_two<short> >(short) [127]
                0.01    0.00 2000000/2000000     void check_shifted_sum<short, custom_mod_constants<short> >(short) [129]
                0.01    0.00 2000000/2000000     void check_shifted_sum<short, custom_lessthan_constants<short> >(short) [130]
                0.01    0.00 2000000/2000000     void check_shifted_sum<short, custom_greaterthanequal_constants<short> >(short) [131]
                0.01    0.00 2000000/2000000     void check_shifted_sum<short, custom_or_constants<short> >(short) [128]
                0.01    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_mod_constants<unsigned short> >(unsigned short) [132]
                0.01    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_notequal_constants<unsigned short> >(unsigned short) [134]
                0.01    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_greaterthan_constants<unsigned short> >(unsigned short) [135]
                0.01    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_lessthan_constants<unsigned short> >(unsigned short) [133]
                0.01    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_greaterthanequal_constants<unsigned short> >(unsigned short) [136]
                0.01    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_multiply2<signed char> >(signed char) [137]
                0.01    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_add<short> >(short) [139]
                0.01    0.00  200000/200000      void check_shifted_sum<double, custom_multiple_constant_mixed<double> >(double) [138]
                0.01    0.00       1/1           void test_constant<int, custom_or_constants<int> >(int*, int, char const*) [140]
                0.01    0.00       1/1           void test_constant<unsigned int, custom_or_constants<unsigned int> >(unsigned int*, int, char const*) [141]
                0.01    0.00       1/1           void test_constant<unsigned long, custom_xor_constants<unsigned long> >(unsigned long*, int, char const*) [142]
                0.01    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_multiply_constants<unsigned short> >(unsigned short) [144]
                0.01    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_divide_constants<unsigned short> >(unsigned short) [143]
                0.01    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_and<short> >(short) [146]
                0.01    0.00  200000/200000      void check_shifted_sum<short, custom_constant_or<short> >(short) [145]
                0.00    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_two<signed char> >(signed char) [155]
                0.00    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_divide_constants<signed char> >(signed char) [159]
                0.00    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_mod_constants<signed char> >(signed char) [156]
                0.00    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_equal_constants<signed char> >(signed char) [158]
                0.00    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_greaterthan_constants<signed char> >(signed char) [160]
                0.00    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_greaterthanequal_constants<signed char> >(signed char) [161]
                0.00    0.00 2000000/2000000     void check_shifted_sum<signed char, custom_xor_constants<signed char> >(signed char) [157]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_two<unsigned char> >(unsigned char) [163]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_add_constants<unsigned char> >(unsigned char) [164]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_sub_constants<unsigned char> >(unsigned char) [167]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_multiply_constants<unsigned char> >(unsigned char) [172]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_divide_constants<unsigned char> >(unsigned char) [170]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_mod_constants<unsigned char> >(unsigned char) [166]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_equal_constants<unsigned char> >(unsigned char) [169]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_notequal_constants<unsigned char> >(unsigned char) [173]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_greaterthan_constants<unsigned char> >(unsigned char) [174]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_lessthan_constants<unsigned char> >(unsigned char) [171]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_greaterthanequal_constants<unsigned char> >(unsigned char) [175]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_and_constants<unsigned char> >(unsigned char) [165]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned char, custom_xor_constants<unsigned char> >(unsigned char) [168]
                0.00    0.00 2000000/2000000     void check_shifted_sum<short, custom_add_constants<short> >(short) [177]
                0.00    0.00 2000000/2000000     void check_shifted_sum<short, custom_sub_constants<short> >(short) [179]
                0.00    0.00 2000000/2000000     void check_shifted_sum<short, custom_multiply_constants<short> >(short) [183]
                0.00    0.00 2000000/2000000     void check_shifted_sum<short, custom_divide_constants<short> >(short) [182]
                0.00    0.00 2000000/2000000     void check_shifted_sum<short, custom_equal_constants<short> >(short) [181]
                0.00    0.00 2000000/2000000     void check_shifted_sum<short, custom_greaterthan_constants<short> >(short) [184]
                0.00    0.00 2000000/2000000     void check_shifted_sum<short, custom_lessthanequal_constants<short> >(short) [185]
                0.00    0.00 2000000/2000000     void check_shifted_sum<short, custom_and_constants<short> >(short) [178]
                0.00    0.00 2000000/2000000     void check_shifted_sum<short, custom_xor_constants<short> >(short) [180]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_two<unsigned short> >(unsigned short) [186]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_add_constants<unsigned short> >(unsigned short) [187]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_sub_constants<unsigned short> >(unsigned short) [188]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned short, custom_equal_constants<unsigned short> >(unsigned short) [189]
                0.00    0.00 2000000/2000000     void check_shifted_sum<unsigned int, custom_two<unsigned int> >(unsigned int) [176]
                0.00    0.00 2000000/2000000     void check_shifted_sum<float, custom_two<float> >(float) [162]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_constant_add<signed char> >(signed char) [191]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_add<signed char> >(signed char) [198]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_constant_sub<signed char> >(signed char) [193]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_sub<signed char> >(signed char) [200]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_constant_multiply<signed char> >(signed char) [196]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_multiply<signed char> >(signed char) [204]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_constant_divide<signed char> >(signed char) [195]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_divide2<signed char> >(signed char) [203]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_mixed<signed char> >(signed char) [202]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_constant_and<signed char> >(signed char) [192]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_and<signed char> >(signed char) [199]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_constant_or<signed char> >(signed char) [190]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_or<signed char> >(signed char) [197]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_constant_xor<signed char> >(signed char) [194]
                0.00    0.00  200000/200000      void check_shifted_sum<signed char, custom_multiple_constant_xor<signed char> >(signed char) [201]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_constant_add<unsigned char> >(unsigned char) [206]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_add<unsigned char> >(unsigned char) [213]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_constant_sub<unsigned char> >(unsigned char) [208]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_sub<unsigned char> >(unsigned char) [215]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_constant_multiply<unsigned char> >(unsigned char) [211]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_multiply<unsigned char> >(unsigned char) [220]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_multiply2<unsigned char> >(unsigned char) [221]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_constant_divide<unsigned char> >(unsigned char) [210]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_divide<unsigned char> >(unsigned char) [218]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_divide2<unsigned char> >(unsigned char) [219]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_mixed<unsigned char> >(unsigned char) [217]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_constant_and<unsigned char> >(unsigned char) [207]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_and<unsigned char> >(unsigned char) [214]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_constant_or<unsigned char> >(unsigned char) [205]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_or<unsigned char> >(unsigned char) [212]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_constant_xor<unsigned char> >(unsigned char) [209]
                0.00    0.00  200000/200000      void check_shifted_sum<unsigned char, custom_multiple_constant_xor<unsigned char> >(unsigned char) [216]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_constant_add<short> >(short) [222]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_constant_sub<short> >(short) [224]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_sub<short> >(short) [229]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_constant_multiply<short> >(short) [227]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_multiply<short> >(short) [234]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_multiply2<short> >(short) [235]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_constant_divide<short> >(short) [226]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_divide<short> >(short) [232]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_divide2<short> >(short) [233]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_mixed<short> >(short) [231]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_constant_and<short> >(short) [223]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_or<short> >(short) [228]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_constant_xor<short> >(short) [225]
                0.00    0.00  200000/200000      void check_shifted_sum<short, custom_multiple_constant_xor<short> >(short) [230]
                0.00    0.00     110/110         start_timer() [236]
                0.00    0.00     110/110         timer() [238]
                0.00    0.00     110/110         record_result(double, char const*) [237]
                0.00    0.00      20/20          summarize(char const*, int, int, int, int) [239]
                0.00    0.00       1/1           void test_constant<unsigned short, custom_lessthanequal_constants<unsigned short> >(unsigned short*, int, char const*) [300]
                0.00    0.00       1/1           void test_constant<unsigned short, custom_and_constants<unsigned short> >(unsigned short*, int, char const*) [298]
                0.00    0.00       1/1           void test_constant<unsigned short, custom_or_constants<unsigned short> >(unsigned short*, int, char const*) [297]
                0.00    0.00       1/1           void test_constant<unsigned short, custom_xor_constants<unsigned short> >(unsigned short*, int, char const*) [299]
                0.00    0.00       1/1           void test_constant<int, custom_two<int> >(int*, int, char const*) [241]
                0.00    0.00       1/1           void test_constant<int, custom_add_constants<int> >(int*, int, char const*) [242]
                0.00    0.00       1/1           void test_constant<int, custom_sub_constants<int> >(int*, int, char const*) [245]
                0.00    0.00       1/1           void test_constant<int, custom_multiply_constants<int> >(int*, int, char const*) [250]
                0.00    0.00       1/1           void test_constant<int, custom_divide_constants<int> >(int*, int, char const*) [248]
                0.00    0.00       1/1           void test_constant<int, custom_mod_constants<int> >(int*, int, char const*) [244]
                0.00    0.00       1/1           void test_constant<int, custom_equal_constants<int> >(int*, int, char const*) [247]
                0.00    0.00       1/1           void test_constant<int, custom_notequal_constants<int> >(int*, int, char const*) [251]
                0.00    0.00       1/1           void test_constant<int, custom_greaterthan_constants<int> >(int*, int, char const*) [252]
                0.00    0.00       1/1           void test_constant<int, custom_lessthan_constants<int> >(int*, int, char const*) [249]
                0.00    0.00       1/1           void test_constant<int, custom_greaterthanequal_constants<int> >(int*, int, char const*) [254]
                0.00    0.00       1/1           void test_constant<int, custom_lessthanequal_constants<int> >(int*, int, char const*) [253]
                0.00    0.00       1/1           void test_constant<int, custom_and_constants<int> >(int*, int, char const*) [243]
                0.00    0.00       1/1           void test_constant<int, custom_xor_constants<int> >(int*, int, char const*) [246]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_add_constants<unsigned int> >(unsigned int*, int, char const*) [255]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_sub_constants<unsigned int> >(unsigned int*, int, char const*) [258]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_multiply_constants<unsigned int> >(unsigned int*, int, char const*) [263]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_divide_constants<unsigned int> >(unsigned int*, int, char const*) [261]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_mod_constants<unsigned int> >(unsigned int*, int, char const*) [257]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_equal_constants<unsigned int> >(unsigned int*, int, char const*) [260]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_notequal_constants<unsigned int> >(unsigned int*, int, char const*) [264]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_greaterthan_constants<unsigned int> >(unsigned int*, int, char const*) [265]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_lessthan_constants<unsigned int> >(unsigned int*, int, char const*) [262]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_greaterthanequal_constants<unsigned int> >(unsigned int*, int, char const*) [267]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_lessthanequal_constants<unsigned int> >(unsigned int*, int, char const*) [266]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_and_constants<unsigned int> >(unsigned int*, int, char const*) [256]
                0.00    0.00       1/1           void test_constant<unsigned int, custom_xor_constants<unsigned int> >(unsigned int*, int, char const*) [259]
                0.00    0.00       1/1           void test_constant<long, custom_two<long> >(long*, int, char const*) [268]
                0.00    0.00       1/1           void test_constant<long, custom_add_constants<long> >(long*, int, char const*) [270]
                0.00    0.00       1/1           void test_constant<long, custom_sub_constants<long> >(long*, int, char const*) [273]
                0.00    0.00       1/1           void test_constant<long, custom_multiply_constants<long> >(long*, int, char const*) [278]
                0.00    0.00       1/1           void test_constant<long, custom_divide_constants<long> >(long*, int, char const*) [276]
                0.00    0.00       1/1           void test_constant<long, custom_mod_constants<long> >(long*, int, char const*) [272]
                0.00    0.00       1/1           void test_constant<long, custom_equal_constants<long> >(long*, int, char const*) [275]
                0.00    0.00       1/1           void test_constant<long, custom_notequal_constants<long> >(long*, int, char const*) [279]
                0.00    0.00       1/1           void test_constant<long, custom_greaterthan_constants<long> >(long*, int, char const*) [280]
                0.00    0.00       1/1           void test_constant<long, custom_lessthan_constants<long> >(long*, int, char const*) [277]
                0.00    0.00       1/1           void test_constant<long, custom_greaterthanequal_constants<long> >(long*, int, char const*) [282]
                0.00    0.00       1/1           void test_constant<long, custom_lessthanequal_constants<long> >(long*, int, char const*) [281]
                0.00    0.00       1/1           void test_constant<long, custom_and_constants<long> >(long*, int, char const*) [271]
                0.00    0.00       1/1           void test_constant<long, custom_or_constants<long> >(long*, int, char const*) [269]
                0.00    0.00       1/1           void test_constant<long, custom_xor_constants<long> >(long*, int, char const*) [274]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_two<unsigned long> >(unsigned long*, int, char const*) [283]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_add_constants<unsigned long> >(unsigned long*, int, char const*) [285]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_sub_constants<unsigned long> >(unsigned long*, int, char const*) [288]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_multiply_constants<unsigned long> >(unsigned long*, int, char const*) [292]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_divide_constants<unsigned long> >(unsigned long*, int, char const*) [290]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_mod_constants<unsigned long> >(unsigned long*, int, char const*) [287]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_equal_constants<unsigned long> >(unsigned long*, int, char const*) [289]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_notequal_constants<unsigned long> >(unsigned long*, int, char const*) [293]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_greaterthan_constants<unsigned long> >(unsigned long*, int, char const*) [294]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_lessthan_constants<unsigned long> >(unsigned long*, int, char const*) [291]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_greaterthanequal_constants<unsigned long> >(unsigned long*, int, char const*) [296]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_lessthanequal_constants<unsigned long> >(unsigned long*, int, char const*) [295]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_and_constants<unsigned long> >(unsigned long*, int, char const*) [286]
                0.00    0.00       1/1           void test_constant<unsigned long, custom_or_constants<unsigned long> >(unsigned long*, int, char const*) [284]
-----------------------------------------------
               37.80    0.00       1/1           main [1]
[2]      7.2   37.80    0.00       1         void test_constant<double, custom_multiple_constant_divide<double> >(double*, int, char const*) [2]
-----------------------------------------------
               20.79    0.00       1/1           main [1]
[3]      4.0   20.79    0.00       1         void test_constant<float, custom_multiple_constant_divide<float> >(float*, int, char const*) [3]
-----------------------------------------------
               18.88    0.00       1/1           main [1]
[4]      3.6   18.88    0.00       1         void test_constant<double, custom_constant_divide<double> >(double*, int, char const*) [4]
-----------------------------------------------
               18.34    0.00       1/1           main [1]
[5]      3.5   18.34    0.00       1         void test_constant<double, custom_add_constants<double> >(double*, int, char const*) [5]
-----------------------------------------------
               18.33    0.00       1/1           main [1]
[6]      3.5   18.33    0.00       1         void test_constant<float, custom_add_constants<float> >(float*, int, char const*) [6]
-----------------------------------------------
               18.27    0.00       1/1           main [1]
[7]      3.5   18.27    0.00       1         void test_constant<float, custom_divide_constants<float> >(float*, int, char const*) [7]
-----------------------------------------------
               18.27    0.00       1/1           main [1]
[8]      3.5   18.27    0.00       1         void test_constant<double, custom_multiply_constants<double> >(double*, int, char const*) [8]
-----------------------------------------------
               18.27    0.00       1/1           main [1]
[9]      3.5   18.27    0.00       1         void test_constant<float, custom_sub_constants<float> >(float*, int, char const*) [9]
-----------------------------------------------
               18.27    0.00       1/1           main [1]
[10]     3.5   18.27    0.00       1         void test_constant<float, custom_multiply_constants<float> >(float*, int, char const*) [10]
-----------------------------------------------
               18.27    0.00       1/1           main [1]
[11]     3.5   18.27    0.00       1         void test_constant<double, custom_two<double> >(double*, int, char const*) [11]
-----------------------------------------------
               18.27    0.00       1/1           main [1]
[12]     3.5   18.27    0.00       1         void test_constant<double, custom_sub_constants<double> >(double*, int, char const*) [12]
-----------------------------------------------
               18.26    0.00       1/1           main [1]
[13]     3.5   18.26    0.00       1         void test_constant<double, custom_divide_constants<double> >(double*, int, char const*) [13]
-----------------------------------------------
               10.42    0.00       1/1           main [1]
[14]     2.0   10.42    0.00       1         void test_constant<float, custom_constant_divide<float> >(float*, int, char const*) [14]
-----------------------------------------------
                3.50    0.00       1/1           main [1]
[15]     0.7    3.50    0.00       1         void test_constant<int, custom_multiple_constant_divide<int> >(int*, int, char const*) [15]
-----------------------------------------------
                3.43    0.00       1/1           main [1]
[16]     0.7    3.43    0.00       1         void test_constant<long, custom_multiple_constant_divide<long> >(long*, int, char const*) [16]
-----------------------------------------------
                3.23    0.00       1/1           main [1]
[17]     0.6    3.23    0.00       1         void test_constant<int, custom_constant_divide<int> >(int*, int, char const*) [17]
-----------------------------------------------
                3.21    0.00       1/1           main [1]
[18]     0.6    3.21    0.00       1         void test_constant<double, custom_multiple_constant_sub<double> >(double*, int, char const*) [18]
-----------------------------------------------
                3.20    0.00       1/1           main [1]
[19]     0.6    3.20    0.00       1         void test_constant<double, custom_multiple_constant_add<double> >(double*, int, char const*) [19]
-----------------------------------------------
                3.10    0.00       1/1           main [1]
[20]     0.6    3.10    0.00       1         void test_constant<long, custom_constant_divide<long> >(long*, int, char const*) [20]
-----------------------------------------------
                3.07    0.00       1/1           main [1]
[21]     0.6    3.07    0.00       1         void test_constant<float, custom_multiple_constant_sub<float> >(float*, int, char const*) [21]
-----------------------------------------------
                3.06    0.00       1/1           main [1]
[22]     0.6    3.06    0.00       1         void test_constant<float, custom_multiple_constant_add<float> >(float*, int, char const*) [22]
-----------------------------------------------
                2.63    0.00       1/1           main [1]
[23]     0.5    2.63    0.00       1         void test_constant<double, custom_multiple_constant_multiply<double> >(double*, int, char const*) [23]
-----------------------------------------------
                2.52    0.00       1/1           main [1]
[24]     0.5    2.52    0.00       1         void test_constant<unsigned int, custom_constant_divide<unsigned int> >(unsigned int*, int, char const*) [24]
-----------------------------------------------
                2.52    0.00       1/1           main [1]
[25]     0.5    2.52    0.00       1         void test_constant<unsigned int, custom_multiple_constant_divide<unsigned int> >(unsigned int*, int, char const*) [25]
-----------------------------------------------
                2.46    0.00       1/1           main [1]
[26]     0.5    2.46    0.00       1         void test_constant<float, custom_multiple_constant_multiply<float> >(float*, int, char const*) [26]
-----------------------------------------------
                2.44    0.00       1/1           main [1]
[27]     0.5    2.44    0.00       1         void test_constant<unsigned long, custom_constant_divide<unsigned long> >(unsigned long*, int, char const*) [27]
-----------------------------------------------
                2.43    0.00       1/1           main [1]
[28]     0.5    2.43    0.00       1         void test_constant<unsigned long, custom_multiple_constant_divide<unsigned long> >(unsigned long*, int, char const*) [28]
-----------------------------------------------
                1.89    0.00       1/1           main [1]
[29]     0.4    1.89    0.00       1         void test_constant<double, custom_multiple_constant_multiply2<double> >(double*, int, char const*) [29]
-----------------------------------------------
                1.88    0.00       1/1           main [1]
[30]     0.4    1.88    0.00       1         void test_constant<double, custom_constant_add<double> >(double*, int, char const*) [30]
-----------------------------------------------
                1.88    0.00       1/1           main [1]
[31]     0.4    1.88    0.00       1         void test_constant<double, custom_constant_sub<double> >(double*, int, char const*) [31]
-----------------------------------------------
                1.88    0.00       1/1           main [1]
[32]     0.4    1.88    0.00       1         void test_constant<double, custom_multiple_constant_divide2<double> >(double*, int, char const*) [32]
-----------------------------------------------
                1.85    0.00       1/1           main [1]
[33]     0.4    1.85    0.00       1         void test_constant<double, custom_constant_multiply<double> >(double*, int, char const*) [33]
-----------------------------------------------
                1.85    0.00       1/1           main [1]
[34]     0.4    1.85    0.00       1         void test_constant<float, custom_constant_multiply<float> >(float*, int, char const*) [34]
-----------------------------------------------
                1.85    0.00       1/1           main [1]
[35]     0.4    1.85    0.00       1         void test_constant<long, custom_multiple_constant_multiply<long> >(long*, int, char const*) [35]
-----------------------------------------------
                1.85    0.00       1/1           main [1]
[36]     0.4    1.85    0.00       1         void test_constant<unsigned short, custom_multiple_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [36]
-----------------------------------------------
                1.85    0.00       1/1           main [1]
[37]     0.4    1.85    0.00       1         void test_constant<unsigned short, custom_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [37]
-----------------------------------------------
                1.84    0.00       1/1           main [1]
[38]     0.4    1.84    0.00       1         void test_constant<float, custom_constant_sub<float> >(float*, int, char const*) [38]
-----------------------------------------------
                1.84    0.00       1/1           main [1]
[39]     0.4    1.84    0.00       1         void test_constant<float, custom_multiple_constant_mixed<float> >(float*, int, char const*) [39]
-----------------------------------------------
                1.84    0.00       1/1           main [1]
[40]     0.4    1.84    0.00       1         void test_constant<long, custom_constant_multiply<long> >(long*, int, char const*) [40]
-----------------------------------------------
                1.84    0.00       1/1           main [1]
[41]     0.4    1.84    0.00       1         void test_constant<unsigned long, custom_constant_multiply<unsigned long> >(unsigned long*, int, char const*) [41]
-----------------------------------------------
                1.83    0.00       1/1           main [1]
[42]     0.3    1.83    0.00       1         void test_constant<float, custom_constant_add<float> >(float*, int, char const*) [42]
-----------------------------------------------
                1.83    0.00       1/1           main [1]
[43]     0.3    1.83    0.00       1         void test_constant<float, custom_multiple_constant_multiply2<float> >(float*, int, char const*) [43]
-----------------------------------------------
                1.83    0.00       1/1           main [1]
[44]     0.3    1.83    0.00       1         void test_constant<unsigned long, custom_multiple_constant_multiply<unsigned long> >(unsigned long*, int, char const*) [44]
-----------------------------------------------
                1.82    0.00       1/1           main [1]
[45]     0.3    1.82    0.00       1         void test_constant<float, custom_multiple_constant_divide2<float> >(float*, int, char const*) [45]
-----------------------------------------------
                1.79    0.00       1/1           main [1]
[46]     0.3    1.79    0.00       1         void test_constant<unsigned short, custom_multiple_constant_divide<unsigned short> >(unsigned short*, int, char const*) [46]
-----------------------------------------------
                1.78    0.00       1/1           main [1]
[47]     0.3    1.78    0.00       1         void test_constant<unsigned short, custom_constant_divide<unsigned short> >(unsigned short*, int, char const*) [47]
-----------------------------------------------
                1.77    0.00       1/1           main [1]
[48]     0.3    1.77    0.00       1         void test_constant<int, custom_constant_multiply<int> >(int*, int, char const*) [48]
-----------------------------------------------
                1.77    0.00       1/1           main [1]
[49]     0.3    1.77    0.00       1         void test_constant<unsigned int, custom_constant_multiply<unsigned int> >(unsigned int*, int, char const*) [49]
-----------------------------------------------
                1.76    0.00       1/1           main [1]
[50]     0.3    1.76    0.00       1         void test_constant<int, custom_multiple_constant_multiply<int> >(int*, int, char const*) [50]
-----------------------------------------------
                1.76    0.00       1/1           main [1]
[51]     0.3    1.76    0.00       1         void test_constant<unsigned int, custom_multiple_constant_multiply<unsigned int> >(unsigned int*, int, char const*) [51]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[52]     0.3    1.43    0.00       1         void test_constant<long, custom_constant_and<long> >(long*, int, char const*) [52]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[53]     0.3    1.43    0.00       1         void test_constant<long, custom_constant_xor<long> >(long*, int, char const*) [53]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[54]     0.3    1.43    0.00       1         void test_constant<unsigned long, custom_constant_xor<unsigned long> >(unsigned long*, int, char const*) [54]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[55]     0.3    1.43    0.00       1         void test_constant<unsigned long, custom_multiple_constant_divide2<unsigned long> >(unsigned long*, int, char const*) [55]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[56]     0.3    1.43    0.00       1         void test_constant<long, custom_constant_or<long> >(long*, int, char const*) [56]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[57]     0.3    1.43    0.00       1         void test_constant<long, custom_constant_add<long> >(long*, int, char const*) [57]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[58]     0.3    1.43    0.00       1         void test_constant<long, custom_multiple_constant_add<long> >(long*, int, char const*) [58]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[59]     0.3    1.43    0.00       1         void test_constant<long, custom_multiple_constant_xor<long> >(long*, int, char const*) [59]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[60]     0.3    1.43    0.00       1         void test_constant<long, custom_multiple_constant_divide2<long> >(long*, int, char const*) [60]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[61]     0.3    1.43    0.00       1         void test_constant<long, custom_multiple_constant_multiply2<long> >(long*, int, char const*) [61]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[62]     0.3    1.43    0.00       1         void test_constant<unsigned long, custom_constant_and<unsigned long> >(unsigned long*, int, char const*) [62]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[63]     0.3    1.43    0.00       1         void test_constant<unsigned long, custom_multiple_constant_or<unsigned long> >(unsigned long*, int, char const*) [63]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[64]     0.3    1.43    0.00       1         void test_constant<unsigned long, custom_multiple_constant_add<unsigned long> >(unsigned long*, int, char const*) [64]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[65]     0.3    1.43    0.00       1         void test_constant<unsigned long, custom_multiple_constant_and<unsigned long> >(unsigned long*, int, char const*) [65]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[66]     0.3    1.43    0.00       1         void test_constant<unsigned long, custom_multiple_constant_multiply2<unsigned long> >(unsigned long*, int, char const*) [66]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[67]     0.3    1.43    0.00       1         void test_constant<long, custom_multiple_constant_sub<long> >(long*, int, char const*) [67]
-----------------------------------------------
                1.43    0.00       1/1           main [1]
[68]     0.3    1.43    0.00       1         void test_constant<unsigned long, custom_constant_sub<unsigned long> >(unsigned long*, int, char const*) [68]
-----------------------------------------------
                1.42    0.00       1/1           main [1]
[69]     0.3    1.42    0.00       1         void test_constant<long, custom_constant_sub<long> >(long*, int, char const*) [69]
-----------------------------------------------
                1.42    0.00       1/1           main [1]
[70]     0.3    1.42    0.00       1         void test_constant<unsigned long, custom_multiple_constant_xor<unsigned long> >(unsigned long*, int, char const*) [70]
-----------------------------------------------
                1.42    0.00       1/1           main [1]
[71]     0.3    1.42    0.00       1         void test_constant<long, custom_multiple_constant_or<long> >(long*, int, char const*) [71]
-----------------------------------------------
                1.42    0.00       1/1           main [1]
[72]     0.3    1.42    0.00       1         void test_constant<long, custom_multiple_constant_and<long> >(long*, int, char const*) [72]
-----------------------------------------------
                1.42    0.00       1/1           main [1]
[73]     0.3    1.42    0.00       1         void test_constant<unsigned long, custom_constant_or<unsigned long> >(unsigned long*, int, char const*) [73]
-----------------------------------------------
                1.42    0.00       1/1           main [1]
[74]     0.3    1.42    0.00       1         void test_constant<unsigned long, custom_constant_add<unsigned long> >(unsigned long*, int, char const*) [74]
-----------------------------------------------
                1.42    0.00       1/1           main [1]
[75]     0.3    1.42    0.00       1         void test_constant<unsigned long, custom_multiple_constant_sub<unsigned long> >(unsigned long*, int, char const*) [75]
-----------------------------------------------
                1.40    0.00       1/1           main [1]
[76]     0.3    1.40    0.00       1         void test_constant<unsigned short, custom_multiple_constant_or<unsigned short> >(unsigned short*, int, char const*) [76]
-----------------------------------------------
                1.40    0.00       1/1           main [1]
[77]     0.3    1.40    0.00       1         void test_constant<unsigned short, custom_multiple_constant_divide2<unsigned short> >(unsigned short*, int, char const*) [77]
-----------------------------------------------
                1.39    0.00       1/1           main [1]
[78]     0.3    1.39    0.00       1         void test_constant<unsigned short, custom_constant_add<unsigned short> >(unsigned short*, int, char const*) [78]
-----------------------------------------------
                1.39    0.00       1/1           main [1]
[79]     0.3    1.39    0.00       1         void test_constant<unsigned short, custom_constant_and<unsigned short> >(unsigned short*, int, char const*) [79]
-----------------------------------------------
                1.39    0.00       1/1           main [1]
[80]     0.3    1.39    0.00       1         void test_constant<unsigned short, custom_constant_sub<unsigned short> >(unsigned short*, int, char const*) [80]
-----------------------------------------------
                1.39    0.00       1/1           main [1]
[81]     0.3    1.39    0.00       1         void test_constant<unsigned short, custom_multiple_constant_xor<unsigned short> >(unsigned short*, int, char const*) [81]
-----------------------------------------------
                1.39    0.00       1/1           main [1]
[82]     0.3    1.39    0.00       1         void test_constant<unsigned short, custom_constant_or<unsigned short> >(unsigned short*, int, char const*) [82]
-----------------------------------------------
                1.39    0.00       1/1           main [1]
[83]     0.3    1.39    0.00       1         void test_constant<unsigned short, custom_multiple_constant_and<unsigned short> >(unsigned short*, int, char const*) [83]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[84]     0.3    1.38    0.00       1         void test_constant<int, custom_constant_or<int> >(int*, int, char const*) [84]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[85]     0.3    1.38    0.00       1         void test_constant<int, custom_constant_and<int> >(int*, int, char const*) [85]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[86]     0.3    1.38    0.00       1         void test_constant<int, custom_constant_sub<int> >(int*, int, char const*) [86]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[87]     0.3    1.38    0.00       1         void test_constant<int, custom_multiple_constant_xor<int> >(int*, int, char const*) [87]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[88]     0.3    1.38    0.00       1         void test_constant<unsigned int, custom_constant_sub<unsigned int> >(unsigned int*, int, char const*) [88]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[89]     0.3    1.38    0.00       1         void test_constant<unsigned int, custom_multiple_constant_or<unsigned int> >(unsigned int*, int, char const*) [89]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[90]     0.3    1.38    0.00       1         void test_constant<unsigned int, custom_multiple_constant_and<unsigned int> >(unsigned int*, int, char const*) [90]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[91]     0.3    1.38    0.00       1         void test_constant<unsigned int, custom_multiple_constant_xor<unsigned int> >(unsigned int*, int, char const*) [91]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[92]     0.3    1.38    0.00       1         void test_constant<unsigned int, custom_multiple_constant_multiply2<unsigned int> >(unsigned int*, int, char const*) [92]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[93]     0.3    1.38    0.00       1         void test_constant<unsigned short, custom_constant_xor<unsigned short> >(unsigned short*, int, char const*) [93]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[94]     0.3    1.38    0.00       1         void test_constant<unsigned short, custom_multiple_constant_add<unsigned short> >(unsigned short*, int, char const*) [94]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[95]     0.3    1.38    0.00       1         void test_constant<unsigned short, custom_multiple_constant_sub<unsigned short> >(unsigned short*, int, char const*) [95]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[96]     0.3    1.38    0.00       1         void test_constant<unsigned short, custom_multiple_constant_multiply2<unsigned short> >(unsigned short*, int, char const*) [96]
-----------------------------------------------
                1.38    0.00       1/1           main [1]
[97]     0.3    1.38    0.00       1         void test_constant<int, custom_multiple_constant_multiply2<int> >(int*, int, char const*) [97]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[98]     0.3    1.37    0.00       1         void test_constant<int, custom_constant_add<int> >(int*, int, char const*) [98]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[99]     0.3    1.37    0.00       1         void test_constant<int, custom_constant_xor<int> >(int*, int, char const*) [99]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[100]    0.3    1.37    0.00       1         void test_constant<int, custom_multiple_constant_or<int> >(int*, int, char const*) [100]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[101]    0.3    1.37    0.00       1         void test_constant<int, custom_multiple_constant_add<int> >(int*, int, char const*) [101]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[102]    0.3    1.37    0.00       1         void test_constant<unsigned int, custom_constant_or<unsigned int> >(unsigned int*, int, char const*) [102]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[103]    0.3    1.37    0.00       1         void test_constant<unsigned int, custom_constant_add<unsigned int> >(unsigned int*, int, char const*) [103]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[104]    0.3    1.37    0.00       1         void test_constant<unsigned int, custom_multiple_constant_add<unsigned int> >(unsigned int*, int, char const*) [104]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[105]    0.3    1.37    0.00       1         void test_constant<unsigned int, custom_multiple_constant_sub<unsigned int> >(unsigned int*, int, char const*) [105]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[106]    0.3    1.37    0.00       1         void test_constant<unsigned int, custom_multiple_constant_divide2<unsigned int> >(unsigned int*, int, char const*) [106]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[107]    0.3    1.37    0.00       1         void test_constant<int, custom_multiple_constant_and<int> >(int*, int, char const*) [107]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[108]    0.3    1.37    0.00       1         void test_constant<int, custom_multiple_constant_sub<int> >(int*, int, char const*) [108]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[109]    0.3    1.37    0.00       1         void test_constant<int, custom_multiple_constant_divide2<int> >(int*, int, char const*) [109]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[110]    0.3    1.37    0.00       1         void test_constant<unsigned int, custom_constant_and<unsigned int> >(unsigned int*, int, char const*) [110]
-----------------------------------------------
                1.37    0.00       1/1           main [1]
[111]    0.3    1.37    0.00       1         void test_constant<unsigned int, custom_constant_xor<unsigned int> >(unsigned int*, int, char const*) [111]
-----------------------------------------------
                1.23    0.00       1/1           main [1]
[112]    0.2    1.23    0.00       1         void test_constant<unsigned short, custom_multiple_constant_mixed<unsigned short> >(unsigned short*, int, char const*) [112]
-----------------------------------------------
                1.22    0.00       1/1           main [1]
[113]    0.2    1.22    0.00       1         void test_constant<long, custom_multiple_constant_mixed<long> >(long*, int, char const*) [113]
-----------------------------------------------
                1.22    0.00       1/1           main [1]
[114]    0.2    1.22    0.00       1         void test_constant<int, custom_multiple_constant_mixed<int> >(int*, int, char const*) [114]
-----------------------------------------------
                1.22    0.00       1/1           main [1]
[115]    0.2    1.22    0.00       1         void test_constant<unsigned int, custom_multiple_constant_mixed<unsigned int> >(unsigned int*, int, char const*) [115]
-----------------------------------------------
                1.22    0.00       1/1           main [1]
[116]    0.2    1.22    0.00       1         void test_constant<unsigned long, custom_multiple_constant_mixed<unsigned long> >(unsigned long*, int, char const*) [116]
-----------------------------------------------
                0.02    0.00 2000000/2000000     main [1]
[117]    0.0    0.02    0.00 2000000         void check_shifted_sum<short, custom_notequal_constants<short> >(short) [117]
-----------------------------------------------
                0.02    0.00  200000/200000      main [1]
[118]    0.0    0.02    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_divide<signed char> >(signed char) [118]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[119]    0.0    0.01    0.00 2000000         void check_shifted_sum<signed char, custom_or_constants<signed char> >(signed char) [119]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[120]    0.0    0.01    0.00 2000000         void check_shifted_sum<signed char, custom_and_constants<signed char> >(signed char) [120]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[121]    0.0    0.01    0.00 2000000         void check_shifted_sum<signed char, custom_lessthan_constants<signed char> >(signed char) [121]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[122]    0.0    0.01    0.00 2000000         void check_shifted_sum<signed char, custom_multiply_constants<signed char> >(signed char) [122]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[123]    0.0    0.01    0.00 2000000         void check_shifted_sum<signed char, custom_notequal_constants<signed char> >(signed char) [123]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[124]    0.0    0.01    0.00 2000000         void check_shifted_sum<signed char, custom_lessthanequal_constants<signed char> >(signed char) [124]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[125]    0.0    0.01    0.00 2000000         void check_shifted_sum<unsigned char, custom_or_constants<unsigned char> >(unsigned char) [125]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[126]    0.0    0.01    0.00 2000000         void check_shifted_sum<unsigned char, custom_lessthanequal_constants<unsigned char> >(unsigned char) [126]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[127]    0.0    0.01    0.00 2000000         void check_shifted_sum<short, custom_two<short> >(short) [127]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[128]    0.0    0.01    0.00 2000000         void check_shifted_sum<short, custom_or_constants<short> >(short) [128]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[129]    0.0    0.01    0.00 2000000         void check_shifted_sum<short, custom_mod_constants<short> >(short) [129]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[130]    0.0    0.01    0.00 2000000         void check_shifted_sum<short, custom_lessthan_constants<short> >(short) [130]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[131]    0.0    0.01    0.00 2000000         void check_shifted_sum<short, custom_greaterthanequal_constants<short> >(short) [131]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[132]    0.0    0.01    0.00 2000000         void check_shifted_sum<unsigned short, custom_mod_constants<unsigned short> >(unsigned short) [132]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[133]    0.0    0.01    0.00 2000000         void check_shifted_sum<unsigned short, custom_lessthan_constants<unsigned short> >(unsigned short) [133]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[134]    0.0    0.01    0.00 2000000         void check_shifted_sum<unsigned short, custom_notequal_constants<unsigned short> >(unsigned short) [134]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[135]    0.0    0.01    0.00 2000000         void check_shifted_sum<unsigned short, custom_greaterthan_constants<unsigned short> >(unsigned short) [135]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[136]    0.0    0.01    0.00 2000000         void check_shifted_sum<unsigned short, custom_greaterthanequal_constants<unsigned short> >(unsigned short) [136]
-----------------------------------------------
                0.01    0.00  200000/200000      main [1]
[137]    0.0    0.01    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_multiply2<signed char> >(signed char) [137]
-----------------------------------------------
                0.01    0.00  200000/200000      main [1]
[138]    0.0    0.01    0.00  200000         void check_shifted_sum<double, custom_multiple_constant_mixed<double> >(double) [138]
-----------------------------------------------
                0.01    0.00  200000/200000      main [1]
[139]    0.0    0.01    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_add<short> >(short) [139]
-----------------------------------------------
                0.01    0.00       1/1           main [1]
[140]    0.0    0.01    0.00       1         void test_constant<int, custom_or_constants<int> >(int*, int, char const*) [140]
-----------------------------------------------
                0.01    0.00       1/1           main [1]
[141]    0.0    0.01    0.00       1         void test_constant<unsigned int, custom_or_constants<unsigned int> >(unsigned int*, int, char const*) [141]
-----------------------------------------------
                0.01    0.00       1/1           main [1]
[142]    0.0    0.01    0.00       1         void test_constant<unsigned long, custom_xor_constants<unsigned long> >(unsigned long*, int, char const*) [142]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[143]    0.0    0.01    0.00 2000000         void check_shifted_sum<unsigned short, custom_divide_constants<unsigned short> >(unsigned short) [143]
-----------------------------------------------
                0.01    0.00 2000000/2000000     main [1]
[144]    0.0    0.01    0.00 2000000         void check_shifted_sum<unsigned short, custom_multiply_constants<unsigned short> >(unsigned short) [144]
-----------------------------------------------
                0.01    0.00  200000/200000      main [1]
[145]    0.0    0.01    0.00  200000         void check_shifted_sum<short, custom_constant_or<short> >(short) [145]
-----------------------------------------------
                0.01    0.00  200000/200000      main [1]
[146]    0.0    0.01    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_and<short> >(short) [146]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[155]    0.0    0.00    0.00 2000000         void check_shifted_sum<signed char, custom_two<signed char> >(signed char) [155]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[156]    0.0    0.00    0.00 2000000         void check_shifted_sum<signed char, custom_mod_constants<signed char> >(signed char) [156]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[157]    0.0    0.00    0.00 2000000         void check_shifted_sum<signed char, custom_xor_constants<signed char> >(signed char) [157]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[158]    0.0    0.00    0.00 2000000         void check_shifted_sum<signed char, custom_equal_constants<signed char> >(signed char) [158]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[159]    0.0    0.00    0.00 2000000         void check_shifted_sum<signed char, custom_divide_constants<signed char> >(signed char) [159]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[160]    0.0    0.00    0.00 2000000         void check_shifted_sum<signed char, custom_greaterthan_constants<signed char> >(signed char) [160]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[161]    0.0    0.00    0.00 2000000         void check_shifted_sum<signed char, custom_greaterthanequal_constants<signed char> >(signed char) [161]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[162]    0.0    0.00    0.00 2000000         void check_shifted_sum<float, custom_two<float> >(float) [162]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[163]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_two<unsigned char> >(unsigned char) [163]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[164]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_add_constants<unsigned char> >(unsigned char) [164]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[165]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_and_constants<unsigned char> >(unsigned char) [165]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[166]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_mod_constants<unsigned char> >(unsigned char) [166]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[167]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_sub_constants<unsigned char> >(unsigned char) [167]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[168]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_xor_constants<unsigned char> >(unsigned char) [168]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[169]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_equal_constants<unsigned char> >(unsigned char) [169]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[170]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_divide_constants<unsigned char> >(unsigned char) [170]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[171]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_lessthan_constants<unsigned char> >(unsigned char) [171]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[172]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_multiply_constants<unsigned char> >(unsigned char) [172]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[173]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_notequal_constants<unsigned char> >(unsigned char) [173]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[174]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_greaterthan_constants<unsigned char> >(unsigned char) [174]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[175]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned char, custom_greaterthanequal_constants<unsigned char> >(unsigned char) [175]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[176]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned int, custom_two<unsigned int> >(unsigned int) [176]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[177]    0.0    0.00    0.00 2000000         void check_shifted_sum<short, custom_add_constants<short> >(short) [177]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[178]    0.0    0.00    0.00 2000000         void check_shifted_sum<short, custom_and_constants<short> >(short) [178]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[179]    0.0    0.00    0.00 2000000         void check_shifted_sum<short, custom_sub_constants<short> >(short) [179]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[180]    0.0    0.00    0.00 2000000         void check_shifted_sum<short, custom_xor_constants<short> >(short) [180]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[181]    0.0    0.00    0.00 2000000         void check_shifted_sum<short, custom_equal_constants<short> >(short) [181]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[182]    0.0    0.00    0.00 2000000         void check_shifted_sum<short, custom_divide_constants<short> >(short) [182]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[183]    0.0    0.00    0.00 2000000         void check_shifted_sum<short, custom_multiply_constants<short> >(short) [183]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[184]    0.0    0.00    0.00 2000000         void check_shifted_sum<short, custom_greaterthan_constants<short> >(short) [184]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[185]    0.0    0.00    0.00 2000000         void check_shifted_sum<short, custom_lessthanequal_constants<short> >(short) [185]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[186]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned short, custom_two<unsigned short> >(unsigned short) [186]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[187]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned short, custom_add_constants<unsigned short> >(unsigned short) [187]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[188]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned short, custom_sub_constants<unsigned short> >(unsigned short) [188]
-----------------------------------------------
                0.00    0.00 2000000/2000000     main [1]
[189]    0.0    0.00    0.00 2000000         void check_shifted_sum<unsigned short, custom_equal_constants<unsigned short> >(unsigned short) [189]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[190]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_constant_or<signed char> >(signed char) [190]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[191]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_constant_add<signed char> >(signed char) [191]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[192]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_constant_and<signed char> >(signed char) [192]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[193]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_constant_sub<signed char> >(signed char) [193]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[194]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_constant_xor<signed char> >(signed char) [194]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[195]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_constant_divide<signed char> >(signed char) [195]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[196]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_constant_multiply<signed char> >(signed char) [196]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[197]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_or<signed char> >(signed char) [197]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[198]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_add<signed char> >(signed char) [198]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[199]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_and<signed char> >(signed char) [199]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[200]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_sub<signed char> >(signed char) [200]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[201]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_xor<signed char> >(signed char) [201]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[202]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_mixed<signed char> >(signed char) [202]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[203]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_divide2<signed char> >(signed char) [203]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[204]    0.0    0.00    0.00  200000         void check_shifted_sum<signed char, custom_multiple_constant_multiply<signed char> >(signed char) [204]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[205]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_constant_or<unsigned char> >(unsigned char) [205]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[206]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_constant_add<unsigned char> >(unsigned char) [206]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[207]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_constant_and<unsigned char> >(unsigned char) [207]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[208]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_constant_sub<unsigned char> >(unsigned char) [208]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[209]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_constant_xor<unsigned char> >(unsigned char) [209]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[210]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_constant_divide<unsigned char> >(unsigned char) [210]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[211]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_constant_multiply<unsigned char> >(unsigned char) [211]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[212]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_or<unsigned char> >(unsigned char) [212]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[213]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_add<unsigned char> >(unsigned char) [213]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[214]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_and<unsigned char> >(unsigned char) [214]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[215]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_sub<unsigned char> >(unsigned char) [215]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[216]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_xor<unsigned char> >(unsigned char) [216]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[217]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_mixed<unsigned char> >(unsigned char) [217]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[218]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_divide<unsigned char> >(unsigned char) [218]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[219]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_divide2<unsigned char> >(unsigned char) [219]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[220]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_multiply<unsigned char> >(unsigned char) [220]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[221]    0.0    0.00    0.00  200000         void check_shifted_sum<unsigned char, custom_multiple_constant_multiply2<unsigned char> >(unsigned char) [221]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[222]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_constant_add<short> >(short) [222]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[223]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_constant_and<short> >(short) [223]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[224]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_constant_sub<short> >(short) [224]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[225]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_constant_xor<short> >(short) [225]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[226]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_constant_divide<short> >(short) [226]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[227]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_constant_multiply<short> >(short) [227]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[228]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_or<short> >(short) [228]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[229]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_sub<short> >(short) [229]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[230]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_xor<short> >(short) [230]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[231]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_mixed<short> >(short) [231]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[232]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_divide<short> >(short) [232]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[233]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_divide2<short> >(short) [233]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[234]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_multiply<short> >(short) [234]
-----------------------------------------------
                0.00    0.00  200000/200000      main [1]
[235]    0.0    0.00    0.00  200000         void check_shifted_sum<short, custom_multiple_constant_multiply2<short> >(short) [235]
-----------------------------------------------
                0.00    0.00     110/110         main [1]
[236]    0.0    0.00    0.00     110         start_timer() [236]
-----------------------------------------------
                0.00    0.00     110/110         main [1]
[237]    0.0    0.00    0.00     110         record_result(double, char const*) [237]
-----------------------------------------------
                0.00    0.00     110/110         main [1]
[238]    0.0    0.00    0.00     110         timer() [238]
-----------------------------------------------
                0.00    0.00      20/20          main [1]
[239]    0.0    0.00    0.00      20         summarize(char const*, int, int, int, int) [239]
-----------------------------------------------
                0.00    0.00       1/1           __do_global_ctors_aux [303]
[240]    0.0    0.00    0.00       1         global constructors keyed to results [240]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[241]    0.0    0.00    0.00       1         void test_constant<int, custom_two<int> >(int*, int, char const*) [241]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[242]    0.0    0.00    0.00       1         void test_constant<int, custom_add_constants<int> >(int*, int, char const*) [242]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[243]    0.0    0.00    0.00       1         void test_constant<int, custom_and_constants<int> >(int*, int, char const*) [243]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[244]    0.0    0.00    0.00       1         void test_constant<int, custom_mod_constants<int> >(int*, int, char const*) [244]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[245]    0.0    0.00    0.00       1         void test_constant<int, custom_sub_constants<int> >(int*, int, char const*) [245]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[246]    0.0    0.00    0.00       1         void test_constant<int, custom_xor_constants<int> >(int*, int, char const*) [246]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[247]    0.0    0.00    0.00       1         void test_constant<int, custom_equal_constants<int> >(int*, int, char const*) [247]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[248]    0.0    0.00    0.00       1         void test_constant<int, custom_divide_constants<int> >(int*, int, char const*) [248]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[249]    0.0    0.00    0.00       1         void test_constant<int, custom_lessthan_constants<int> >(int*, int, char const*) [249]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[250]    0.0    0.00    0.00       1         void test_constant<int, custom_multiply_constants<int> >(int*, int, char const*) [250]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[251]    0.0    0.00    0.00       1         void test_constant<int, custom_notequal_constants<int> >(int*, int, char const*) [251]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[252]    0.0    0.00    0.00       1         void test_constant<int, custom_greaterthan_constants<int> >(int*, int, char const*) [252]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[253]    0.0    0.00    0.00       1         void test_constant<int, custom_lessthanequal_constants<int> >(int*, int, char const*) [253]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[254]    0.0    0.00    0.00       1         void test_constant<int, custom_greaterthanequal_constants<int> >(int*, int, char const*) [254]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[255]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_add_constants<unsigned int> >(unsigned int*, int, char const*) [255]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[256]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_and_constants<unsigned int> >(unsigned int*, int, char const*) [256]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[257]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_mod_constants<unsigned int> >(unsigned int*, int, char const*) [257]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[258]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_sub_constants<unsigned int> >(unsigned int*, int, char const*) [258]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[259]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_xor_constants<unsigned int> >(unsigned int*, int, char const*) [259]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[260]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_equal_constants<unsigned int> >(unsigned int*, int, char const*) [260]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[261]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_divide_constants<unsigned int> >(unsigned int*, int, char const*) [261]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[262]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_lessthan_constants<unsigned int> >(unsigned int*, int, char const*) [262]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[263]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_multiply_constants<unsigned int> >(unsigned int*, int, char const*) [263]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[264]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_notequal_constants<unsigned int> >(unsigned int*, int, char const*) [264]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[265]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_greaterthan_constants<unsigned int> >(unsigned int*, int, char const*) [265]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[266]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_lessthanequal_constants<unsigned int> >(unsigned int*, int, char const*) [266]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[267]    0.0    0.00    0.00       1         void test_constant<unsigned int, custom_greaterthanequal_constants<unsigned int> >(unsigned int*, int, char const*) [267]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[268]    0.0    0.00    0.00       1         void test_constant<long, custom_two<long> >(long*, int, char const*) [268]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[269]    0.0    0.00    0.00       1         void test_constant<long, custom_or_constants<long> >(long*, int, char const*) [269]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[270]    0.0    0.00    0.00       1         void test_constant<long, custom_add_constants<long> >(long*, int, char const*) [270]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[271]    0.0    0.00    0.00       1         void test_constant<long, custom_and_constants<long> >(long*, int, char const*) [271]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[272]    0.0    0.00    0.00       1         void test_constant<long, custom_mod_constants<long> >(long*, int, char const*) [272]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[273]    0.0    0.00    0.00       1         void test_constant<long, custom_sub_constants<long> >(long*, int, char const*) [273]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[274]    0.0    0.00    0.00       1         void test_constant<long, custom_xor_constants<long> >(long*, int, char const*) [274]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[275]    0.0    0.00    0.00       1         void test_constant<long, custom_equal_constants<long> >(long*, int, char const*) [275]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[276]    0.0    0.00    0.00       1         void test_constant<long, custom_divide_constants<long> >(long*, int, char const*) [276]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[277]    0.0    0.00    0.00       1         void test_constant<long, custom_lessthan_constants<long> >(long*, int, char const*) [277]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[278]    0.0    0.00    0.00       1         void test_constant<long, custom_multiply_constants<long> >(long*, int, char const*) [278]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[279]    0.0    0.00    0.00       1         void test_constant<long, custom_notequal_constants<long> >(long*, int, char const*) [279]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[280]    0.0    0.00    0.00       1         void test_constant<long, custom_greaterthan_constants<long> >(long*, int, char const*) [280]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[281]    0.0    0.00    0.00       1         void test_constant<long, custom_lessthanequal_constants<long> >(long*, int, char const*) [281]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[282]    0.0    0.00    0.00       1         void test_constant<long, custom_greaterthanequal_constants<long> >(long*, int, char const*) [282]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[283]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_two<unsigned long> >(unsigned long*, int, char const*) [283]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[284]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_or_constants<unsigned long> >(unsigned long*, int, char const*) [284]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[285]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_add_constants<unsigned long> >(unsigned long*, int, char const*) [285]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[286]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_and_constants<unsigned long> >(unsigned long*, int, char const*) [286]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[287]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_mod_constants<unsigned long> >(unsigned long*, int, char const*) [287]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[288]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_sub_constants<unsigned long> >(unsigned long*, int, char const*) [288]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[289]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_equal_constants<unsigned long> >(unsigned long*, int, char const*) [289]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[290]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_divide_constants<unsigned long> >(unsigned long*, int, char const*) [290]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[291]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_lessthan_constants<unsigned long> >(unsigned long*, int, char const*) [291]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[292]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_multiply_constants<unsigned long> >(unsigned long*, int, char const*) [292]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[293]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_notequal_constants<unsigned long> >(unsigned long*, int, char const*) [293]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[294]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_greaterthan_constants<unsigned long> >(unsigned long*, int, char const*) [294]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[295]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_lessthanequal_constants<unsigned long> >(unsigned long*, int, char const*) [295]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[296]    0.0    0.00    0.00       1         void test_constant<unsigned long, custom_greaterthanequal_constants<unsigned long> >(unsigned long*, int, char const*) [296]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[297]    0.0    0.00    0.00       1         void test_constant<unsigned short, custom_or_constants<unsigned short> >(unsigned short*, int, char const*) [297]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[298]    0.0    0.00    0.00       1         void test_constant<unsigned short, custom_and_constants<unsigned short> >(unsigned short*, int, char const*) [298]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[299]    0.0    0.00    0.00       1         void test_constant<unsigned short, custom_xor_constants<unsigned short> >(unsigned short*, int, char const*) [299]
-----------------------------------------------
                0.00    0.00       1/1           main [1]
[300]    0.0    0.00    0.00       1         void test_constant<unsigned short, custom_lessthanequal_constants<unsigned short> >(unsigned short*, int, char const*) [300]
-----------------------------------------------
                0.00    0.00       1/1           __do_global_ctors_aux [303]
[301]    0.0    0.00    0.00       1         __static_initialization_and_destruction_0(int, int) [301]
-----------------------------------------------

 This table describes the call tree of the program, and was sorted by
 the total amount of time spent in each function and its children.

 Each entry in this table consists of several lines.  The line with the
 index number at the left hand margin lists the current function.
 The lines above it list the functions that called this function,
 and the lines below it list the functions this one called.
 This line lists:
     index	A unique number given to each element of the table.
		Index numbers are sorted numerically.
		The index number is printed next to every function name so
		it is easier to look up where the function in the table.

     % time	This is the percentage of the `total' time that was spent
		in this function and its children.  Note that due to
		different viewpoints, functions excluded by options, etc,
		these numbers will NOT add up to 100%.

     self	This is the total amount of time spent in this function.

     children	This is the total amount of time propagated into this
		function by its children.

     called	This is the number of times the function was called.
		If the function called itself recursively, the number
		only includes non-recursive calls, and is followed by
		a `+' and the number of recursive calls.

     name	The name of the current function.  The index number is
		printed after it.  If the function is a member of a
		cycle, the cycle number is printed between the
		function's name and the index number.


 For the function's parents, the fields have the following meanings:

     self	This is the amount of time that was propagated directly
		from the function into this parent.

     children	This is the amount of time that was propagated from
		the function's children into this parent.

     called	This is the number of times this parent called the
		function `/' the total number of times the function
		was called.  Recursive calls to the function are not
		included in the number after the `/'.

     name	This is the name of the parent.  The parent's index
		number is printed after it.  If the parent is a
		member of a cycle, the cycle number is printed between
		the name and the index number.

 If the parents of the function cannot be determined, the word
 `<spontaneous>' is printed in the `name' field, and all the other
 fields are blank.

 For the function's children, the fields have the following meanings:

     self	This is the amount of time that was propagated directly
		from the child into the function.

     children	This is the amount of time that was propagated from the
		child's children to the function.

     called	This is the number of times the function called
		this child `/' the total number of times the child
		was called.  Recursive calls by the child are not
		listed in the number after the `/'.

     name	This is the name of the child.  The child's index
		number is printed after it.  If the child is a
		member of a cycle, the cycle number is printed
		between the name and the index number.

 If there are any cycles (circles) in the call graph, there is an
 entry for the cycle-as-a-whole.  This entry shows who called the
 cycle (as parents) and the members of the cycle (as children.)
 The `+' recursive calls entry shows the number of function calls that
 were internal to the cycle, and the calls entry for each member shows,
 for that member, how many times it was called from other members of
 the cycle.

\f
Index by function name

 [240] global constructors keyed to results (simple_types_constant_folding.cpp) [57] void test_constant<long, custom_constant_add<long> >(long*, int, char const*) [122] void check_shifted_sum<signed char, custom_multiply_constants<signed char> >(signed char)
 [236] start_timer()          [52] void test_constant<long, custom_constant_and<long> >(long*, int, char const*) [123] void check_shifted_sum<signed char, custom_notequal_constants<signed char> >(signed char)
 [237] record_result(double, char const*) [69] void test_constant<long, custom_constant_sub<long> >(long*, int, char const*) [197] void check_shifted_sum<signed char, custom_multiple_constant_or<signed char> >(signed char)
  [11] void test_constant<double, custom_two<double> >(double*, int, char const*) [53] void test_constant<long, custom_constant_xor<long> >(long*, int, char const*) [160] void check_shifted_sum<signed char, custom_greaterthan_constants<signed char> >(signed char)
  [30] void test_constant<double, custom_constant_add<double> >(double*, int, char const*) [269] void test_constant<long, custom_or_constants<long> >(long*, int, char const*) [198] void check_shifted_sum<signed char, custom_multiple_constant_add<signed char> >(signed char)
  [31] void test_constant<double, custom_constant_sub<double> >(double*, int, char const*) [270] void test_constant<long, custom_add_constants<long> >(long*, int, char const*) [199] void check_shifted_sum<signed char, custom_multiple_constant_and<signed char> >(signed char)
   [5] void test_constant<double, custom_add_constants<double> >(double*, int, char const*) [271] void test_constant<long, custom_and_constants<long> >(long*, int, char const*) [200] void check_shifted_sum<signed char, custom_multiple_constant_sub<signed char> >(signed char)
  [12] void test_constant<double, custom_sub_constants<double> >(double*, int, char const*) [272] void test_constant<long, custom_mod_constants<long> >(long*, int, char const*) [201] void check_shifted_sum<signed char, custom_multiple_constant_xor<signed char> >(signed char)
   [4] void test_constant<double, custom_constant_divide<double> >(double*, int, char const*) [273] void test_constant<long, custom_sub_constants<long> >(long*, int, char const*) [124] void check_shifted_sum<signed char, custom_lessthanequal_constants<signed char> >(signed char)
  [13] void test_constant<double, custom_divide_constants<double> >(double*, int, char const*) [274] void test_constant<long, custom_xor_constants<long> >(long*, int, char const*) [202] void check_shifted_sum<signed char, custom_multiple_constant_mixed<signed char> >(signed char)
  [33] void test_constant<double, custom_constant_multiply<double> >(double*, int, char const*) [20] void test_constant<long, custom_constant_divide<long> >(long*, int, char const*) [118] void check_shifted_sum<signed char, custom_multiple_constant_divide<signed char> >(signed char)
   [8] void test_constant<double, custom_multiply_constants<double> >(double*, int, char const*) [275] void test_constant<long, custom_equal_constants<long> >(long*, int, char const*) [203] void check_shifted_sum<signed char, custom_multiple_constant_divide2<signed char> >(signed char)
  [19] void test_constant<double, custom_multiple_constant_add<double> >(double*, int, char const*) [276] void test_constant<long, custom_divide_constants<long> >(long*, int, char const*) [161] void check_shifted_sum<signed char, custom_greaterthanequal_constants<signed char> >(signed char)
  [18] void test_constant<double, custom_multiple_constant_sub<double> >(double*, int, char const*) [40] void test_constant<long, custom_constant_multiply<long> >(long*, int, char const*) [204] void check_shifted_sum<signed char, custom_multiple_constant_multiply<signed char> >(signed char)
   [2] void test_constant<double, custom_multiple_constant_divide<double> >(double*, int, char const*) [277] void test_constant<long, custom_lessthan_constants<long> >(long*, int, char const*) [137] void check_shifted_sum<signed char, custom_multiple_constant_multiply2<signed char> >(signed char)
  [32] void test_constant<double, custom_multiple_constant_divide2<double> >(double*, int, char const*) [278] void test_constant<long, custom_multiply_constants<long> >(long*, int, char const*) [138] void check_shifted_sum<double, custom_multiple_constant_mixed<double> >(double)
  [23] void test_constant<double, custom_multiple_constant_multiply<double> >(double*, int, char const*) [279] void test_constant<long, custom_notequal_constants<long> >(long*, int, char const*) [162] void check_shifted_sum<float, custom_two<float> >(float)
  [29] void test_constant<double, custom_multiple_constant_multiply2<double> >(double*, int, char const*) [71] void test_constant<long, custom_multiple_constant_or<long> >(long*, int, char const*) [163] void check_shifted_sum<unsigned char, custom_two<unsigned char> >(unsigned char)
  [42] void test_constant<float, custom_constant_add<float> >(float*, int, char const*) [280] void test_constant<long, custom_greaterthan_constants<long> >(long*, int, char const*) [205] void check_shifted_sum<unsigned char, custom_constant_or<unsigned char> >(unsigned char)
  [38] void test_constant<float, custom_constant_sub<float> >(float*, int, char const*) [58] void test_constant<long, custom_multiple_constant_add<long> >(long*, int, char const*) [206] void check_shifted_sum<unsigned char, custom_constant_add<unsigned char> >(unsigned char)
   [6] void test_constant<float, custom_add_constants<float> >(float*, int, char const*) [72] void test_constant<long, custom_multiple_constant_and<long> >(long*, int, char const*) [207] void check_shifted_sum<unsigned char, custom_constant_and<unsigned char> >(unsigned char)
   [9] void test_constant<float, custom_sub_constants<float> >(float*, int, char const*) [67] void test_constant<long, custom_multiple_constant_sub<long> >(long*, int, char const*) [208] void check_shifted_sum<unsigned char, custom_constant_sub<unsigned char> >(unsigned char)
  [14] void test_constant<float, custom_constant_divide<float> >(float*, int, char const*) [59] void test_constant<long, custom_multiple_constant_xor<long> >(long*, int, char const*) [209] void check_shifted_sum<unsigned char, custom_constant_xor<unsigned char> >(unsigned char)
   [7] void test_constant<float, custom_divide_constants<float> >(float*, int, char const*) [281] void test_constant<long, custom_lessthanequal_constants<long> >(long*, int, char const*) [125] void check_shifted_sum<unsigned char, custom_or_constants<unsigned char> >(unsigned char)
  [34] void test_constant<float, custom_constant_multiply<float> >(float*, int, char const*) [113] void test_constant<long, custom_multiple_constant_mixed<long> >(long*, int, char const*) [164] void check_shifted_sum<unsigned char, custom_add_constants<unsigned char> >(unsigned char)
  [10] void test_constant<float, custom_multiply_constants<float> >(float*, int, char const*) [16] void test_constant<long, custom_multiple_constant_divide<long> >(long*, int, char const*) [165] void check_shifted_sum<unsigned char, custom_and_constants<unsigned char> >(unsigned char)
  [22] void test_constant<float, custom_multiple_constant_add<float> >(float*, int, char const*) [60] void test_constant<long, custom_multiple_constant_divide2<long> >(long*, int, char const*) [166] void check_shifted_sum<unsigned char, custom_mod_constants<unsigned char> >(unsigned char)
  [21] void test_constant<float, custom_multiple_constant_sub<float> >(float*, int, char const*) [282] void test_constant<long, custom_greaterthanequal_constants<long> >(long*, int, char const*) [167] void check_shifted_sum<unsigned char, custom_sub_constants<unsigned char> >(unsigned char)
  [39] void test_constant<float, custom_multiple_constant_mixed<float> >(float*, int, char const*) [35] void test_constant<long, custom_multiple_constant_multiply<long> >(long*, int, char const*) [168] void check_shifted_sum<unsigned char, custom_xor_constants<unsigned char> >(unsigned char)
   [3] void test_constant<float, custom_multiple_constant_divide<float> >(float*, int, char const*) [61] void test_constant<long, custom_multiple_constant_multiply2<long> >(long*, int, char const*) [210] void check_shifted_sum<unsigned char, custom_constant_divide<unsigned char> >(unsigned char)
  [45] void test_constant<float, custom_multiple_constant_divide2<float> >(float*, int, char const*) [283] void test_constant<unsigned long, custom_two<unsigned long> >(unsigned long*, int, char const*) [169] void check_shifted_sum<unsigned char, custom_equal_constants<unsigned char> >(unsigned char)
  [26] void test_constant<float, custom_multiple_constant_multiply<float> >(float*, int, char const*) [73] void test_constant<unsigned long, custom_constant_or<unsigned long> >(unsigned long*, int, char const*) [170] void check_shifted_sum<unsigned char, custom_divide_constants<unsigned char> >(unsigned char)
  [43] void test_constant<float, custom_multiple_constant_multiply2<float> >(float*, int, char const*) [74] void test_constant<unsigned long, custom_constant_add<unsigned long> >(unsigned long*, int, char const*) [211] void check_shifted_sum<unsigned char, custom_constant_multiply<unsigned char> >(unsigned char)
 [241] void test_constant<int, custom_two<int> >(int*, int, char const*) [62] void test_constant<unsigned long, custom_constant_and<unsigned long> >(unsigned long*, int, char const*) [171] void check_shifted_sum<unsigned char, custom_lessthan_constants<unsigned char> >(unsigned char)
  [84] void test_constant<int, custom_constant_or<int> >(int*, int, char const*) [68] void test_constant<unsigned long, custom_constant_sub<unsigned long> >(unsigned long*, int, char const*) [172] void check_shifted_sum<unsigned char, custom_multiply_constants<unsigned char> >(unsigned char)
  [98] void test_constant<int, custom_constant_add<int> >(int*, int, char const*) [54] void test_constant<unsigned long, custom_constant_xor<unsigned long> >(unsigned long*, int, char const*) [173] void check_shifted_sum<unsigned char, custom_notequal_constants<unsigned char> >(unsigned char)
  [85] void test_constant<int, custom_constant_and<int> >(int*, int, char const*) [284] void test_constant<unsigned long, custom_or_constants<unsigned long> >(unsigned long*, int, char const*) [212] void check_shifted_sum<unsigned char, custom_multiple_constant_or<unsigned char> >(unsigned char)
  [86] void test_constant<int, custom_constant_sub<int> >(int*, int, char const*) [285] void test_constant<unsigned long, custom_add_constants<unsigned long> >(unsigned long*, int, char const*) [174] void check_shifted_sum<unsigned char, custom_greaterthan_constants<unsigned char> >(unsigned char)
  [99] void test_constant<int, custom_constant_xor<int> >(int*, int, char const*) [286] void test_constant<unsigned long, custom_and_constants<unsigned long> >(unsigned long*, int, char const*) [213] void check_shifted_sum<unsigned char, custom_multiple_constant_add<unsigned char> >(unsigned char)
 [140] void test_constant<int, custom_or_constants<int> >(int*, int, char const*) [287] void test_constant<unsigned long, custom_mod_constants<unsigned long> >(unsigned long*, int, char const*) [214] void check_shifted_sum<unsigned char, custom_multiple_constant_and<unsigned char> >(unsigned char)
 [242] void test_constant<int, custom_add_constants<int> >(int*, int, char const*) [288] void test_constant<unsigned long, custom_sub_constants<unsigned long> >(unsigned long*, int, char const*) [215] void check_shifted_sum<unsigned char, custom_multiple_constant_sub<unsigned char> >(unsigned char)
 [243] void test_constant<int, custom_and_constants<int> >(int*, int, char const*) [142] void test_constant<unsigned long, custom_xor_constants<unsigned long> >(unsigned long*, int, char const*) [216] void check_shifted_sum<unsigned char, custom_multiple_constant_xor<unsigned char> >(unsigned char)
 [244] void test_constant<int, custom_mod_constants<int> >(int*, int, char const*) [27] void test_constant<unsigned long, custom_constant_divide<unsigned long> >(unsigned long*, int, char const*) [126] void check_shifted_sum<unsigned char, custom_lessthanequal_constants<unsigned char> >(unsigned char)
 [245] void test_constant<int, custom_sub_constants<int> >(int*, int, char const*) [289] void test_constant<unsigned long, custom_equal_constants<unsigned long> >(unsigned long*, int, char const*) [217] void check_shifted_sum<unsigned char, custom_multiple_constant_mixed<unsigned char> >(unsigned char)
 [246] void test_constant<int, custom_xor_constants<int> >(int*, int, char const*) [290] void test_constant<unsigned long, custom_divide_constants<unsigned long> >(unsigned long*, int, char const*) [218] void check_shifted_sum<unsigned char, custom_multiple_constant_divide<unsigned char> >(unsigned char)
  [17] void test_constant<int, custom_constant_divide<int> >(int*, int, char const*) [41] void test_constant<unsigned long, custom_constant_multiply<unsigned long> >(unsigned long*, int, char const*) [219] void check_shifted_sum<unsigned char, custom_multiple_constant_divide2<unsigned char> >(unsigned char)
 [247] void test_constant<int, custom_equal_constants<int> >(int*, int, char const*) [291] void test_constant<unsigned long, custom_lessthan_constants<unsigned long> >(unsigned long*, int, char const*) [175] void check_shifted_sum<unsigned char, custom_greaterthanequal_constants<unsigned char> >(unsigned char)
 [248] void test_constant<int, custom_divide_constants<int> >(int*, int, char const*) [292] void test_constant<unsigned long, custom_multiply_constants<unsigned long> >(unsigned long*, int, char const*) [220] void check_shifted_sum<unsigned char, custom_multiple_constant_multiply<unsigned char> >(unsigned char)
  [48] void test_constant<int, custom_constant_multiply<int> >(int*, int, char const*) [293] void test_constant<unsigned long, custom_notequal_constants<unsigned long> >(unsigned long*, int, char const*) [221] void check_shifted_sum<unsigned char, custom_multiple_constant_multiply2<unsigned char> >(unsigned char)
 [249] void test_constant<int, custom_lessthan_constants<int> >(int*, int, char const*) [63] void test_constant<unsigned long, custom_multiple_constant_or<unsigned long> >(unsigned long*, int, char const*) [176] void check_shifted_sum<unsigned int, custom_two<unsigned int> >(unsigned int)
 [250] void test_constant<int, custom_multiply_constants<int> >(int*, int, char const*) [294] void test_constant<unsigned long, custom_greaterthan_constants<unsigned long> >(unsigned long*, int, char const*) [127] void check_shifted_sum<short, custom_two<short> >(short)
 [251] void test_constant<int, custom_notequal_constants<int> >(int*, int, char const*) [64] void test_constant<unsigned long, custom_multiple_constant_add<unsigned long> >(unsigned long*, int, char const*) [145] void check_shifted_sum<short, custom_constant_or<short> >(short)
 [100] void test_constant<int, custom_multiple_constant_or<int> >(int*, int, char const*) [65] void test_constant<unsigned long, custom_multiple_constant_and<unsigned long> >(unsigned long*, int, char const*) [222] void check_shifted_sum<short, custom_constant_add<short> >(short)
 [252] void test_constant<int, custom_greaterthan_constants<int> >(int*, int, char const*) [75] void test_constant<unsigned long, custom_multiple_constant_sub<unsigned long> >(unsigned long*, int, char const*) [223] void check_shifted_sum<short, custom_constant_and<short> >(short)
 [101] void test_constant<int, custom_multiple_constant_add<int> >(int*, int, char const*) [70] void test_constant<unsigned long, custom_multiple_constant_xor<unsigned long> >(unsigned long*, int, char const*) [224] void check_shifted_sum<short, custom_constant_sub<short> >(short)
 [107] void test_constant<int, custom_multiple_constant_and<int> >(int*, int, char const*) [295] void test_constant<unsigned long, custom_lessthanequal_constants<unsigned long> >(unsigned long*, int, char const*) [225] void check_shifted_sum<short, custom_constant_xor<short> >(short)
 [108] void test_constant<int, custom_multiple_constant_sub<int> >(int*, int, char const*) [116] void test_constant<unsigned long, custom_multiple_constant_mixed<unsigned long> >(unsigned long*, int, char const*) [128] void check_shifted_sum<short, custom_or_constants<short> >(short)
  [87] void test_constant<int, custom_multiple_constant_xor<int> >(int*, int, char const*) [28] void test_constant<unsigned long, custom_multiple_constant_divide<unsigned long> >(unsigned long*, int, char const*) [177] void check_shifted_sum<short, custom_add_constants<short> >(short)
 [253] void test_constant<int, custom_lessthanequal_constants<int> >(int*, int, char const*) [55] void test_constant<unsigned long, custom_multiple_constant_divide2<unsigned long> >(unsigned long*, int, char const*) [178] void check_shifted_sum<short, custom_and_constants<short> >(short)
 [114] void test_constant<int, custom_multiple_constant_mixed<int> >(int*, int, char const*) [296] void test_constant<unsigned long, custom_greaterthanequal_constants<unsigned long> >(unsigned long*, int, char const*) [129] void check_shifted_sum<short, custom_mod_constants<short> >(short)
  [15] void test_constant<int, custom_multiple_constant_divide<int> >(int*, int, char const*) [44] void test_constant<unsigned long, custom_multiple_constant_multiply<unsigned long> >(unsigned long*, int, char const*) [179] void check_shifted_sum<short, custom_sub_constants<short> >(short)
 [109] void test_constant<int, custom_multiple_constant_divide2<int> >(int*, int, char const*) [66] void test_constant<unsigned long, custom_multiple_constant_multiply2<unsigned long> >(unsigned long*, int, char const*) [180] void check_shifted_sum<short, custom_xor_constants<short> >(short)
 [254] void test_constant<int, custom_greaterthanequal_constants<int> >(int*, int, char const*) [82] void test_constant<unsigned short, custom_constant_or<unsigned short> >(unsigned short*, int, char const*) [226] void check_shifted_sum<short, custom_constant_divide<short> >(short)
  [50] void test_constant<int, custom_multiple_constant_multiply<int> >(int*, int, char const*) [78] void test_constant<unsigned short, custom_constant_add<unsigned short> >(unsigned short*, int, char const*) [181] void check_shifted_sum<short, custom_equal_constants<short> >(short)
  [97] void test_constant<int, custom_multiple_constant_multiply2<int> >(int*, int, char const*) [79] void test_constant<unsigned short, custom_constant_and<unsigned short> >(unsigned short*, int, char const*) [182] void check_shifted_sum<short, custom_divide_constants<short> >(short)
 [102] void test_constant<unsigned int, custom_constant_or<unsigned int> >(unsigned int*, int, char const*) [80] void test_constant<unsigned short, custom_constant_sub<unsigned short> >(unsigned short*, int, char const*) [227] void check_shifted_sum<short, custom_constant_multiply<short> >(short)
 [103] void test_constant<unsigned int, custom_constant_add<unsigned int> >(unsigned int*, int, char const*) [93] void test_constant<unsigned short, custom_constant_xor<unsigned short> >(unsigned short*, int, char const*) [130] void check_shifted_sum<short, custom_lessthan_constants<short> >(short)
 [110] void test_constant<unsigned int, custom_constant_and<unsigned int> >(unsigned int*, int, char const*) [297] void test_constant<unsigned short, custom_or_constants<unsigned short> >(unsigned short*, int, char const*) [183] void check_shifted_sum<short, custom_multiply_constants<short> >(short)
  [88] void test_constant<unsigned int, custom_constant_sub<unsigned int> >(unsigned int*, int, char const*) [298] void test_constant<unsigned short, custom_and_constants<unsigned short> >(unsigned short*, int, char const*) [117] void check_shifted_sum<short, custom_notequal_constants<short> >(short)
 [111] void test_constant<unsigned int, custom_constant_xor<unsigned int> >(unsigned int*, int, char const*) [299] void test_constant<unsigned short, custom_xor_constants<unsigned short> >(unsigned short*, int, char const*) [228] void check_shifted_sum<short, custom_multiple_constant_or<short> >(short)
 [141] void test_constant<unsigned int, custom_or_constants<unsigned int> >(unsigned int*, int, char const*) [47] void test_constant<unsigned short, custom_constant_divide<unsigned short> >(unsigned short*, int, char const*) [184] void check_shifted_sum<short, custom_greaterthan_constants<short> >(short)
 [255] void test_constant<unsigned int, custom_add_constants<unsigned int> >(unsigned int*, int, char const*) [37] void test_constant<unsigned short, custom_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [139] void check_shifted_sum<short, custom_multiple_constant_add<short> >(short)
 [256] void test_constant<unsigned int, custom_and_constants<unsigned int> >(unsigned int*, int, char const*) [76] void test_constant<unsigned short, custom_multiple_constant_or<unsigned short> >(unsigned short*, int, char const*) [146] void check_shifted_sum<short, custom_multiple_constant_and<short> >(short)
 [257] void test_constant<unsigned int, custom_mod_constants<unsigned int> >(unsigned int*, int, char const*) [94] void test_constant<unsigned short, custom_multiple_constant_add<unsigned short> >(unsigned short*, int, char const*) [229] void check_shifted_sum<short, custom_multiple_constant_sub<short> >(short)
 [258] void test_constant<unsigned int, custom_sub_constants<unsigned int> >(unsigned int*, int, char const*) [83] void test_constant<unsigned short, custom_multiple_constant_and<unsigned short> >(unsigned short*, int, char const*) [230] void check_shifted_sum<short, custom_multiple_constant_xor<short> >(short)
 [259] void test_constant<unsigned int, custom_xor_constants<unsigned int> >(unsigned int*, int, char const*) [95] void test_constant<unsigned short, custom_multiple_constant_sub<unsigned short> >(unsigned short*, int, char const*) [185] void check_shifted_sum<short, custom_lessthanequal_constants<short> >(short)
  [24] void test_constant<unsigned int, custom_constant_divide<unsigned int> >(unsigned int*, int, char const*) [81] void test_constant<unsigned short, custom_multiple_constant_xor<unsigned short> >(unsigned short*, int, char const*) [231] void check_shifted_sum<short, custom_multiple_constant_mixed<short> >(short)
 [260] void test_constant<unsigned int, custom_equal_constants<unsigned int> >(unsigned int*, int, char const*) [300] void test_constant<unsigned short, custom_lessthanequal_constants<unsigned short> >(unsigned short*, int, char const*) [232] void check_shifted_sum<short, custom_multiple_constant_divide<short> >(short)
 [261] void test_constant<unsigned int, custom_divide_constants<unsigned int> >(unsigned int*, int, char const*) [112] void test_constant<unsigned short, custom_multiple_constant_mixed<unsigned short> >(unsigned short*, int, char const*) [233] void check_shifted_sum<short, custom_multiple_constant_divide2<short> >(short)
  [49] void test_constant<unsigned int, custom_constant_multiply<unsigned int> >(unsigned int*, int, char const*) [46] void test_constant<unsigned short, custom_multiple_constant_divide<unsigned short> >(unsigned short*, int, char const*) [131] void check_shifted_sum<short, custom_greaterthanequal_constants<short> >(short)
 [262] void test_constant<unsigned int, custom_lessthan_constants<unsigned int> >(unsigned int*, int, char const*) [77] void test_constant<unsigned short, custom_multiple_constant_divide2<unsigned short> >(unsigned short*, int, char const*) [234] void check_shifted_sum<short, custom_multiple_constant_multiply<short> >(short)
 [263] void test_constant<unsigned int, custom_multiply_constants<unsigned int> >(unsigned int*, int, char const*) [36] void test_constant<unsigned short, custom_multiple_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [235] void check_shifted_sum<short, custom_multiple_constant_multiply2<short> >(short)
 [264] void test_constant<unsigned int, custom_notequal_constants<unsigned int> >(unsigned int*, int, char const*) [96] void test_constant<unsigned short, custom_multiple_constant_multiply2<unsigned short> >(unsigned short*, int, char const*) [186] void check_shifted_sum<unsigned short, custom_two<unsigned short> >(unsigned short)
  [89] void test_constant<unsigned int, custom_multiple_constant_or<unsigned int> >(unsigned int*, int, char const*) [155] void check_shifted_sum<signed char, custom_two<signed char> >(signed char) [187] void check_shifted_sum<unsigned short, custom_add_constants<unsigned short> >(unsigned short)
 [265] void test_constant<unsigned int, custom_greaterthan_constants<unsigned int> >(unsigned int*, int, char const*) [190] void check_shifted_sum<signed char, custom_constant_or<signed char> >(signed char) [132] void check_shifted_sum<unsigned short, custom_mod_constants<unsigned short> >(unsigned short)
 [104] void test_constant<unsigned int, custom_multiple_constant_add<unsigned int> >(unsigned int*, int, char const*) [191] void check_shifted_sum<signed char, custom_constant_add<signed char> >(signed char) [188] void check_shifted_sum<unsigned short, custom_sub_constants<unsigned short> >(unsigned short)
  [90] void test_constant<unsigned int, custom_multiple_constant_and<unsigned int> >(unsigned int*, int, char const*) [192] void check_shifted_sum<signed char, custom_constant_and<signed char> >(signed char) [189] void check_shifted_sum<unsigned short, custom_equal_constants<unsigned short> >(unsigned short)
 [105] void test_constant<unsigned int, custom_multiple_constant_sub<unsigned int> >(unsigned int*, int, char const*) [193] void check_shifted_sum<signed char, custom_constant_sub<signed char> >(signed char) [143] void check_shifted_sum<unsigned short, custom_divide_constants<unsigned short> >(unsigned short)
  [91] void test_constant<unsigned int, custom_multiple_constant_xor<unsigned int> >(unsigned int*, int, char const*) [194] void check_shifted_sum<signed char, custom_constant_xor<signed char> >(signed char) [133] void check_shifted_sum<unsigned short, custom_lessthan_constants<unsigned short> >(unsigned short)
 [266] void test_constant<unsigned int, custom_lessthanequal_constants<unsigned int> >(unsigned int*, int, char const*) [119] void check_shifted_sum<signed char, custom_or_constants<signed char> >(signed char) [144] void check_shifted_sum<unsigned short, custom_multiply_constants<unsigned short> >(unsigned short)
 [115] void test_constant<unsigned int, custom_multiple_constant_mixed<unsigned int> >(unsigned int*, int, char const*) [120] void check_shifted_sum<signed char, custom_and_constants<signed char> >(signed char) [134] void check_shifted_sum<unsigned short, custom_notequal_constants<unsigned short> >(unsigned short)
  [25] void test_constant<unsigned int, custom_multiple_constant_divide<unsigned int> >(unsigned int*, int, char const*) [156] void check_shifted_sum<signed char, custom_mod_constants<signed char> >(signed char) [135] void check_shifted_sum<unsigned short, custom_greaterthan_constants<unsigned short> >(unsigned short)
 [106] void test_constant<unsigned int, custom_multiple_constant_divide2<unsigned int> >(unsigned int*, int, char const*) [157] void check_shifted_sum<signed char, custom_xor_constants<signed char> >(signed char) [136] void check_shifted_sum<unsigned short, custom_greaterthanequal_constants<unsigned short> >(unsigned short)
 [267] void test_constant<unsigned int, custom_greaterthanequal_constants<unsigned int> >(unsigned int*, int, char const*) [195] void check_shifted_sum<signed char, custom_constant_divide<signed char> >(signed char) [301] __static_initialization_and_destruction_0(int, int) (simple_types_constant_folding.cpp)
  [51] void test_constant<unsigned int, custom_multiple_constant_multiply<unsigned int> >(unsigned int*, int, char const*) [158] void check_shifted_sum<signed char, custom_equal_constants<signed char> >(signed char) [238] timer()
  [92] void test_constant<unsigned int, custom_multiple_constant_multiply2<unsigned int> >(unsigned int*, int, char const*) [159] void check_shifted_sum<signed char, custom_divide_constants<signed char> >(signed char) [239] summarize(char const*, int, int, int, int)
 [268] void test_constant<long, custom_two<long> >(long*, int, char const*) [196] void check_shifted_sum<signed char, custom_constant_multiply<signed char> >(signed char) [1] main
  [56] void test_constant<long, custom_constant_or<long> >(long*, int, char const*) [121] void check_shifted_sum<signed char, custom_lessthan_constants<signed char> >(signed char)

[-- Attachment #3: report41 --]
[-- Type: text/plain, Size: 25500 bytes --]

./simple_types_constant_folding 

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                     "int8_t constant"   0.07 sec   228571.43 M     1.00
 1                "int8_t add constants"   0.00 sec     inf M     0.00
 2           "int8_t subtract constants"   0.00 sec     inf M     0.00
 3           "int8_t multiply constants"   0.08 sec   200000.00 M     1.14
 4             "int8_t divide constants"   0.07 sec   228571.43 M     1.00
 5                "int8_t mod constants"   0.08 sec   200000.00 M     1.14
 6              "int8_t equal constants"   0.08 sec   200000.00 M     1.14
 7           "int8_t notequal constants"   0.07 sec   228571.43 M     1.00
 8       "int8_t greater than constants"   0.08 sec   200000.00 M     1.14
 9          "int8_t less than constants"   0.07 sec   228571.43 M     1.00
10 "int8_t greater than equal constants"   0.08 sec   200000.00 M     1.14
11    "int8_t less than equal constants"   0.08 sec   200000.00 M     1.14
12                "int8_t and constants"   0.07 sec   228571.43 M     1.00
13                 "int8_t or constants"   0.08 sec   200000.00 M     1.14
14                "int8_t xor constants"   0.07 sec   228571.43 M     1.00

Total absolute time for int8_t simple constant folding: 0.98 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                 "int8_t constant add"   1.35 sec   1185.19 M     1.00
 1       "int8_t multiple constant adds"   1.35 sec   1185.19 M     1.00
 2            "int8_t constant subtract"   1.35 sec   1185.19 M     1.00
 3  "int8_t multiple constant subtracts"   1.35 sec   1185.19 M     1.00
 4            "int8_t constant multiply"   1.69 sec   946.75 M     1.25
 5 "int8_t multiple constant multiplies"   1.68 sec   952.38 M     1.24
 6  "int8_t multiple constant multiply2"   1.35 sec   1185.19 M     1.00
 7              "int8_t constant divide"   3.86 sec   414.51 M     2.86
 8    "int8_t multiple constant divides"   6.03 sec   265.34 M     4.47
 9    "int8_t multiple constant divide2"   1.35 sec   1185.19 M     1.00
10      "int8_t multiple constant mixed"   0.97 sec   1649.48 M     0.72
11                 "int8_t constant and"   1.35 sec   1185.19 M     1.00
12        "int8_t multiple constant and"   1.35 sec   1185.19 M     1.00
13                  "int8_t constant or"   1.34 sec   1194.03 M     0.99
14         "int8_t multiple constant or"   1.35 sec   1185.19 M     1.00
15                 "int8_t constant xor"   1.35 sec   1185.19 M     1.00
16        "int8_t multiple constant xor"   1.35 sec   1185.19 M     1.00

Total absolute time for int8_t constant folding: 30.42 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "uint8_t constant"   0.07 sec   228571.43 M     1.00
 1                "uint8_t add constants"   0.07 sec   228571.43 M     1.00
 2           "uint8_t subtract constants"   0.08 sec   200000.00 M     1.14
 3           "uint8_t multiply constants"   0.07 sec   228571.43 M     1.00
 4             "uint8_t divide constants"   0.08 sec   200000.00 M     1.14
 5                "uint8_t mod constants"   0.07 sec   228571.43 M     1.00
 6              "uint8_t equal constants"   0.08 sec   200000.00 M     1.14
 7           "uint8_t notequal constants"   0.07 sec   228571.43 M     1.00
 8       "uint8_t greater than constants"   0.08 sec   200000.00 M     1.14
 9          "uint8_t less than constants"   0.07 sec   228571.43 M     1.00
10 "uint8_t greater than equal constants"   0.08 sec   200000.00 M     1.14
11    "uint8_t less than equal constants"   0.07 sec   228571.43 M     1.00
12                "uint8_t and constants"   0.08 sec   200000.00 M     1.14
13                 "uint8_t or constants"   0.07 sec   228571.43 M     1.00
14                "uint8_t xor constants"   0.08 sec   200000.00 M     1.14

Total absolute time for uint8_t simple constant folding: 1.12 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "uint8_t constant add"   1.34 sec   1194.03 M     1.00
 1       "uint8_t multiple constant adds"   1.35 sec   1185.19 M     1.01
 2            "uint8_t constant subtract"   1.35 sec   1185.19 M     1.01
 3  "uint8_t multiple constant subtracts"   1.35 sec   1185.19 M     1.01
 4            "uint8_t constant multiply"   1.68 sec   952.38 M     1.25
 5 "uint8_t multiple constant multiplies"   1.69 sec   946.75 M     1.26
 6  "uint8_t multiple constant multiply2"   1.34 sec   1194.03 M     1.00
 7              "uint8_t constant divide"   3.53 sec   453.26 M     2.63
 8    "uint8_t multiple constant divides"   3.52 sec   454.55 M     2.63
 9    "uint8_t multiple constant divide2"   1.34 sec   1194.03 M     1.00
10      "uint8_t multiple constant mixed"   0.98 sec   1632.65 M     0.73
11                 "uint8_t constant and"   1.34 sec   1194.03 M     1.00
12        "uint8_t multiple constant and"   1.35 sec   1185.19 M     1.01
13                  "uint8_t constant or"   1.35 sec   1185.19 M     1.01
14         "uint8_t multiple constant or"   1.35 sec   1185.19 M     1.01
15                 "uint8_t constant xor"   1.34 sec   1194.03 M     1.00
16        "uint8_t multiple constant xor"   1.35 sec   1185.19 M     1.01

Total absolute time for uint8_t constant folding: 27.55 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int16_t constant"   0.08 sec   200000.00 M     1.00
 1                "int16_t add constants"   0.07 sec   228571.43 M     0.88
 2           "int16_t subtract constants"   0.08 sec   200000.00 M     1.00
 3           "int16_t multiply constants"   0.07 sec   228571.43 M     0.88
 4             "int16_t divide constants"   0.08 sec   200000.00 M     1.00
 5                "int16_t mod constants"   0.08 sec   200000.00 M     1.00
 6              "int16_t equal constants"   0.07 sec   228571.43 M     0.88
 7           "int16_t notequal constants"   0.08 sec   200000.00 M     1.00
 8       "int16_t greater than constants"   0.07 sec   228571.43 M     0.88
 9          "int16_t less than constants"   0.08 sec   200000.00 M     1.00
10 "int16_t greater than equal constants"   0.07 sec   228571.43 M     0.88
11    "int16_t less than equal constants"   0.08 sec   200000.00 M     1.00
12                "int16_t and constants"   0.08 sec   200000.00 M     1.00
13                 "int16_t or constants"   0.07 sec   228571.43 M     0.88
14                "int16_t xor constants"   0.08 sec   200000.00 M     1.00

Total absolute time for int16_t simple constant folding: 1.14 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int16_t constant add"   1.35 sec   1185.19 M     1.00
 1       "int16_t multiple constant adds"   1.35 sec   1185.19 M     1.00
 2            "int16_t constant subtract"   1.34 sec   1194.03 M     0.99
 3  "int16_t multiple constant subtracts"   1.35 sec   1185.19 M     1.00
 4            "int16_t constant multiply"   1.76 sec   909.09 M     1.30
 5 "int16_t multiple constant multiplies"   1.77 sec   903.95 M     1.31
 6  "int16_t multiple constant multiply2"   1.34 sec   1194.03 M     0.99
 7              "int16_t constant divide"   3.86 sec   414.51 M     2.86
 8    "int16_t multiple constant divides"   4.03 sec   397.02 M     2.99
 9    "int16_t multiple constant divide2"   1.34 sec   1194.03 M     0.99
10      "int16_t multiple constant mixed"   0.98 sec   1632.65 M     0.73
11                 "int16_t constant and"   1.34 sec   1194.03 M     0.99
12        "int16_t multiple constant and"   1.35 sec   1185.19 M     1.00
13                  "int16_t constant or"   1.35 sec   1185.19 M     1.00
14         "int16_t multiple constant or"   1.35 sec   1185.19 M     1.00
15                 "int16_t constant xor"   1.35 sec   1185.19 M     1.00
16        "int16_t multiple constant xor"   1.35 sec   1185.19 M     1.00

Total absolute time for int16_t constant folding: 28.56 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint16_t constant"   0.07 sec   228571.43 M     1.00
 1                "uint16_t add constants"   0.08 sec   200000.00 M     1.14
 2           "uint16_t subtract constants"   0.07 sec   228571.43 M     1.00
 3           "uint16_t multiply constants"   0.08 sec   200000.00 M     1.14
 4             "uint16_t divide constants"   0.07 sec   228571.43 M     1.00
 5                "uint16_t mod constants"   0.08 sec   200000.00 M     1.14
 6              "uint16_t equal constants"   0.07 sec   228571.43 M     1.00
 7           "uint16_t notequal constants"   0.08 sec   200000.00 M     1.14
 8       "uint16_t greater than constants"   0.07 sec   228571.43 M     1.00
 9          "uint16_t less than constants"   0.08 sec   200000.00 M     1.14
10 "uint16_t greater than equal constants"   0.07 sec   228571.43 M     1.00
11    "uint16_t less than equal constants"   0.00 sec     inf M     0.00
12                "uint16_t and constants"   0.01 sec   1600000.00 M     0.14
13                 "uint16_t or constants"   0.00 sec     inf M     0.00
14                "uint16_t xor constants"   0.00 sec     inf M     0.00

Total absolute time for uint16_t simple constant folding: 0.83 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint16_t constant add"   1.52 sec   1052.63 M     1.00
 1       "uint16_t multiple constant adds"   1.53 sec   1045.75 M     1.01
 2            "uint16_t constant subtract"   1.52 sec   1052.63 M     1.00
 3  "uint16_t multiple constant subtracts"   1.52 sec   1052.63 M     1.00
 4            "uint16_t constant multiply"   2.04 sec   784.31 M     1.34
 5 "uint16_t multiple constant multiplies"   2.03 sec   788.18 M     1.34
 6  "uint16_t multiple constant multiply2"   1.52 sec   1052.63 M     1.00
 7              "uint16_t constant divide"   1.96 sec   816.33 M     1.29
 8    "uint16_t multiple constant divides"   1.97 sec   812.18 M     1.30
 9    "uint16_t multiple constant divide2"   1.53 sec   1045.75 M     1.01
10      "uint16_t multiple constant mixed"   1.35 sec   1185.19 M     0.89
11                 "uint16_t constant and"   1.54 sec   1038.96 M     1.01
12        "uint16_t multiple constant and"   1.52 sec   1052.63 M     1.00
13                  "uint16_t constant or"   1.53 sec   1045.75 M     1.01
14         "uint16_t multiple constant or"   1.54 sec   1038.96 M     1.01
15                 "uint16_t constant xor"   1.52 sec   1052.63 M     1.00
16        "uint16_t multiple constant xor"   1.53 sec   1045.75 M     1.01

Total absolute time for uint16_t constant folding: 27.67 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int32_t constant"   0.00 sec     inf M     nan
 1                "int32_t add constants"   0.00 sec     inf M     nan
 2           "int32_t subtract constants"   0.00 sec     inf M     nan
 3           "int32_t multiply constants"   0.00 sec     inf M     nan
 4             "int32_t divide constants"   0.00 sec     inf M     nan
 5                "int32_t mod constants"   0.00 sec     inf M     nan
 6              "int32_t equal constants"   0.00 sec     inf M     nan
 7           "int32_t notequal constants"   0.00 sec     inf M     nan
 8       "int32_t greater than constants"   0.00 sec     inf M     nan
 9          "int32_t less than constants"   0.00 sec     inf M     nan
10 "int32_t greater than equal constants"   0.00 sec     inf M     nan
11    "int32_t less than equal constants"   0.00 sec     inf M     nan
12                "int32_t and constants"   0.00 sec     inf M     nan
13                 "int32_t or constants"   0.01 sec   1600000.00 M     inf
14                "int32_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int32_t simple constant folding: 0.01 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int32_t constant add"   1.51 sec   1059.60 M     1.00
 1       "int32_t multiple constant adds"   1.51 sec   1059.60 M     1.00
 2            "int32_t constant subtract"   1.51 sec   1059.60 M     1.00
 3  "int32_t multiple constant subtracts"   1.51 sec   1059.60 M     1.00
 4            "int32_t constant multiply"   1.94 sec   824.74 M     1.28
 5 "int32_t multiple constant multiplies"   1.94 sec   824.74 M     1.28
 6  "int32_t multiple constant multiply2"   1.52 sec   1052.63 M     1.01
 7              "int32_t constant divide"   3.55 sec   450.70 M     2.35
 8    "int32_t multiple constant divides"   3.85 sec   415.58 M     2.55
 9    "int32_t multiple constant divide2"   1.51 sec   1059.60 M     1.00
10      "int32_t multiple constant mixed"   1.34 sec   1194.03 M     0.89
11                 "int32_t constant and"   1.51 sec   1059.60 M     1.00
12        "int32_t multiple constant and"   1.51 sec   1059.60 M     1.00
13                  "int32_t constant or"   1.52 sec   1052.63 M     1.01
14         "int32_t multiple constant or"   1.51 sec   1059.60 M     1.00
15                 "int32_t constant xor"   1.51 sec   1059.60 M     1.00
16        "int32_t multiple constant xor"   1.51 sec   1059.60 M     1.00

Total absolute time for int32_t constant folding: 30.76 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint32_t constant"   0.07 sec   228571.43 M     1.00
 1                "uint32_t add constants"   0.01 sec   1600000.00 M     0.14
 2           "uint32_t subtract constants"   0.00 sec     inf M     0.00
 3           "uint32_t multiply constants"   0.00 sec     inf M     0.00
 4             "uint32_t divide constants"   0.00 sec     inf M     0.00
 5                "uint32_t mod constants"   0.00 sec     inf M     0.00
 6              "uint32_t equal constants"   0.00 sec     inf M     0.00
 7           "uint32_t notequal constants"   0.00 sec     inf M     0.00
 8       "uint32_t greater than constants"   0.00 sec     inf M     0.00
 9          "uint32_t less than constants"   0.00 sec     inf M     0.00
10 "uint32_t greater than equal constants"   0.00 sec     inf M     0.00
11    "uint32_t less than equal constants"   0.00 sec     inf M     0.00
12                "uint32_t and constants"   0.00 sec     inf M     0.00
13                 "uint32_t or constants"   0.01 sec   1600000.00 M     0.14
14                "uint32_t xor constants"   0.00 sec     inf M     0.00

Total absolute time for uint32_t simple constant folding: 0.09 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint32_t constant add"   1.51 sec   1059.60 M     1.00
 1       "uint32_t multiple constant adds"   1.51 sec   1059.60 M     1.00
 2            "uint32_t constant subtract"   1.51 sec   1059.60 M     1.00
 3  "uint32_t multiple constant subtracts"   1.51 sec   1059.60 M     1.00
 4            "uint32_t constant multiply"   1.94 sec   824.74 M     1.28
 5 "uint32_t multiple constant multiplies"   1.94 sec   824.74 M     1.28
 6  "uint32_t multiple constant multiply2"   1.51 sec   1059.60 M     1.00
 7              "uint32_t constant divide"   2.78 sec   575.54 M     1.84
 8    "uint32_t multiple constant divides"   2.77 sec   577.62 M     1.83
 9    "uint32_t multiple constant divide2"   1.51 sec   1059.60 M     1.00
10      "uint32_t multiple constant mixed"   1.34 sec   1194.03 M     0.89
11                 "uint32_t constant and"   1.51 sec   1059.60 M     1.00
12        "uint32_t multiple constant and"   1.51 sec   1059.60 M     1.00
13                  "uint32_t constant or"   1.51 sec   1059.60 M     1.00
14         "uint32_t multiple constant or"   1.52 sec   1052.63 M     1.01
15                 "uint32_t constant xor"   1.51 sec   1059.60 M     1.00
16        "uint32_t multiple constant xor"   1.51 sec   1059.60 M     1.00

Total absolute time for uint32_t constant folding: 28.90 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int64_t constant"   0.00 sec     inf M     nan
 1                "int64_t add constants"   0.00 sec     inf M     nan
 2           "int64_t subtract constants"   0.00 sec     inf M     nan
 3           "int64_t multiply constants"   0.00 sec     inf M     nan
 4             "int64_t divide constants"   0.00 sec     inf M     nan
 5                "int64_t mod constants"   0.00 sec     inf M     nan
 6              "int64_t equal constants"   0.00 sec     inf M     nan
 7           "int64_t notequal constants"   0.00 sec     inf M     nan
 8       "int64_t greater than constants"   0.00 sec     inf M     nan
 9          "int64_t less than constants"   0.00 sec     inf M     nan
10 "int64_t greater than equal constants"   0.00 sec     inf M     nan
11    "int64_t less than equal constants"   0.00 sec     inf M     nan
12                "int64_t and constants"   0.01 sec   1600000.00 M     inf
13                 "int64_t or constants"   0.00 sec     inf M     nan
14                "int64_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int64_t simple constant folding: 0.01 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int64_t constant add"   1.57 sec   1019.11 M     1.00
 1       "int64_t multiple constant adds"   1.57 sec   1019.11 M     1.00
 2            "int64_t constant subtract"   1.56 sec   1025.64 M     0.99
 3  "int64_t multiple constant subtracts"   1.57 sec   1019.11 M     1.00
 4            "int64_t constant multiply"   2.03 sec   788.18 M     1.29
 5 "int64_t multiple constant multiplies"   2.03 sec   788.18 M     1.29
 6  "int64_t multiple constant multiply2"   1.58 sec   1012.66 M     1.01
 7              "int64_t constant divide"   3.40 sec   470.59 M     2.17
 8    "int64_t multiple constant divides"   3.78 sec   423.28 M     2.41
 9    "int64_t multiple constant divide2"   1.57 sec   1019.11 M     1.00
10      "int64_t multiple constant mixed"   1.34 sec   1194.03 M     0.85
11                 "int64_t constant and"   1.57 sec   1019.11 M     1.00
12        "int64_t multiple constant and"   1.57 sec   1019.11 M     1.00
13                  "int64_t constant or"   1.57 sec   1019.11 M     1.00
14         "int64_t multiple constant or"   1.56 sec   1025.64 M     0.99
15                 "int64_t constant xor"   1.57 sec   1019.11 M     1.00
16        "int64_t multiple constant xor"   1.57 sec   1019.11 M     1.00

Total absolute time for int64_t constant folding: 31.41 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint64_t constant"   0.00 sec     inf M     nan
 1                "uint64_t add constants"   0.00 sec     inf M     nan
 2           "uint64_t subtract constants"   0.00 sec     inf M     nan
 3           "uint64_t multiply constants"   0.00 sec     inf M     nan
 4             "uint64_t divide constants"   0.01 sec   1600000.00 M     inf
 5                "uint64_t mod constants"   0.00 sec     inf M     nan
 6              "uint64_t equal constants"   0.00 sec     inf M     nan
 7           "uint64_t notequal constants"   0.00 sec     inf M     nan
 8       "uint64_t greater than constants"   0.00 sec     inf M     nan
 9          "uint64_t less than constants"   0.00 sec     inf M     nan
10 "uint64_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint64_t less than equal constants"   0.00 sec     inf M     nan
12                "uint64_t and constants"   0.00 sec     inf M     nan
13                 "uint64_t or constants"   0.00 sec     inf M     nan
14                "uint64_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint64_t simple constant folding: 0.01 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint64_t constant add"   1.57 sec   1019.11 M     1.00
 1       "uint64_t multiple constant adds"   1.57 sec   1019.11 M     1.00
 2            "uint64_t constant subtract"   1.57 sec   1019.11 M     1.00
 3  "uint64_t multiple constant subtracts"   1.57 sec   1019.11 M     1.00
 4            "uint64_t constant multiply"   2.01 sec   796.02 M     1.28
 5 "uint64_t multiple constant multiplies"   2.02 sec   792.08 M     1.29
 6  "uint64_t multiple constant multiply2"   1.57 sec   1019.11 M     1.00
 7              "uint64_t constant divide"   2.68 sec   597.01 M     1.71
 8    "uint64_t multiple constant divides"   2.68 sec   597.01 M     1.71
 9    "uint64_t multiple constant divide2"   1.58 sec   1012.66 M     1.01
10      "uint64_t multiple constant mixed"   1.34 sec   1194.03 M     0.85
11                 "uint64_t constant and"   1.57 sec   1019.11 M     1.00
12        "uint64_t multiple constant and"   1.57 sec   1019.11 M     1.00
13                  "uint64_t constant or"   1.57 sec   1019.11 M     1.00
14         "uint64_t multiple constant or"   1.57 sec   1019.11 M     1.00
15                 "uint64_t constant xor"   1.57 sec   1019.11 M     1.00
16        "uint64_t multiple constant xor"   1.56 sec   1025.64 M     0.99

Total absolute time for uint64_t constant folding: 29.57 sec

test              description   absolute   operations   ratio with
number                          time       per second   test0

 0           "float constant"  20.17 sec   793.26 M     1.00
 1      "float add constants"  20.17 sec   793.26 M     1.00
 2 "float subtract constants"  20.09 sec   796.42 M     1.00
 3 "float multiply constants"  20.09 sec   796.42 M     1.00
 4   "float divide constants"  20.10 sec   796.02 M     1.00

Total absolute time for float simple constant folding: 100.62 sec

test                        description   absolute   operations   ratio with
number                                    time       per second   test0

 0                 "float constant add"   2.01 sec   796.02 M     1.00
 1       "float multiple constant adds"   3.36 sec   476.19 M     1.67
 2            "float constant subtract"   2.02 sec   792.08 M     1.00
 3  "float multiple constant subtracts"   3.38 sec   473.37 M     1.68
 4            "float constant multiply"   2.03 sec   788.18 M     1.01
 5 "float multiple constant multiplies"   2.71 sec   590.41 M     1.35
 6  "float multiple constant multiply2"   2.02 sec   792.08 M     1.00
 7              "float constant divide"  11.45 sec   139.74 M     5.70
 8    "float multiple constant divides"  22.86 sec   69.99 M     11.37
 9    "float multiple constant divide2"   2.01 sec   796.02 M     1.00
10      "float multiple constant mixed"   2.02 sec   792.08 M     1.00

Total absolute time for float constant folding: 55.87 sec

test               description   absolute   operations   ratio with
number                           time       per second   test0

 0           "double constant"  20.10 sec   796.02 M     1.00
 1      "double add constants"  20.17 sec   793.26 M     1.00
 2 "double subtract constants"  20.09 sec   796.42 M     1.00
 3 "double multiply constants"  20.09 sec   796.42 M     1.00
 4   "double divide constants"  20.09 sec   796.42 M     1.00

Total absolute time for double simple constant folding: 100.54 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                 "double constant add"   2.07 sec   772.95 M     1.00
 1       "double multiple constant adds"   3.52 sec   454.55 M     1.70
 2            "double constant subtract"   2.06 sec   776.70 M     1.00
 3  "double multiple constant subtracts"   3.54 sec   451.98 M     1.71
 4            "double constant multiply"   2.03 sec   788.18 M     0.98
 5 "double multiple constant multiplies"   2.89 sec   553.63 M     1.40
 6  "double multiple constant multiply2"   2.08 sec   769.23 M     1.00
 7              "double constant divide"  20.77 sec   77.03 M     10.03
 8    "double multiple constant divides"  41.57 sec   38.49 M     20.08
 9    "double multiple constant divide2"   2.06 sec   776.70 M     1.00
10      "double multiple constant mixed"   2.20 sec   727.27 M     1.06

Total absolute time for double constant folding: 84.79 sec

[-- Attachment #4: simple_types_constant_folding.cpp --]
[-- Type: text/plain, Size: 38506 bytes --]

/*
    Copyright 2007-2008 Adobe Systems Incorporated
    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
    or a copy at http://stlab.adobe.com/licenses.html )


Goal:  Test compiler optimizations related to constant folding of simple language defined types

Assumptions:

	1) the compiler will combine constant calculations into a single constant for simple types
		aka constant folding
		result = A + B			==>		result = constant
		result = A - B			==>		result = constant
		result = A * B			==>		result = constant
		result = A / B			==>		result = constant
		result = A % B			==>		result = constant	for integer types
		result = (A == B)		==>		result = constant	for integer types
		result = (A != B)		==>		result = constant	for integer types
		result = (A > B)		==>		result = constant	for integer types
		result = (A < B)		==>		result = constant	for integer types
		result = (A >= B)		==>		result = constant	for integer types
		result = (A <= B)		==>		result = constant	for integer types
		result = (A & B)		==>		result = constant	for integer types
		result = (A | B)		==>		result = constant	for integer types
		result = (A ^ B)		==>		result = constant	for integer types
		
		result = input + A + B + C + D	==>		result = input + (A+B+C+D)
		result = input - A - B - C - D	==>		result = input - (A+B+C+D)
		result = input * A * B * C * D	==>		result = input * (A*B*C*D)
		result = input + A * B * C * D	==>		result = input + (A*B*C*D)
		result = ((((input/A) /B) /C) /D)	==>	result = input / (A*B*C*D)
		result = input + (((A /B) /C) /D)	==>	result = input + (A/B/C/D)
		result = input & A & B & C & D	==>		result = input & (A&B&C&D)			for integer types
		result = input | A | B | C | D	==>		result = input | (A|B|C|D)			for integer types
		result = input ^ A ^ B ^ C ^ D	==>		result = input ^ (A^B^C^D)			for integer types


NOTE - in some cases, loop invariant code motion might move the constant calculation out of the inner loop
	making it appear that the constants were folded
		But in the constant result cases, we want the compiler to recognize the constant and move it out of the loop

*/

/******************************************************************************/

#include "benchmark_stdint.hpp"
#include <cstddef>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include "benchmark_results.h"
#include "benchmark_timer.h"

/******************************************************************************/

// this constant may need to be adjusted to give reasonable minimum times
// For best results, times should be about 1.0 seconds for the minimum test run
int base_iterations = 2000000;
int iterations = base_iterations;


// 8000 items, or between 8k and 64k of data
// this is intended to remain within the L2 cache of most common CPUs
const int SIZE 	= 8000;


// initial value for filling our arrays, may be changed from the command line
double init_value = 1.0;

/******************************************************************************/

// our global arrays of numbers to be operated upon

double dataDouble[SIZE];
float dataFloat[SIZE];

uint64_t data64unsigned[SIZE];
int64_t data64[SIZE];

uint32_t data32unsigned[SIZE];
int32_t data32[SIZE];

uint16_t data16unsigned[SIZE];
int16_t data16[SIZE];

uint8_t data8unsigned[SIZE];
int8_t data8[SIZE];

/******************************************************************************/

#include "benchmark_shared_tests.h"

/******************************************************************************/


int main(int argc, char** argv) {
	
	// output command for documentation:
	int i;
	for (i = 0; i < argc; ++i)
		printf("%s ", argv[i] );
	printf("\n");

	if (argc > 1) base_iterations = atoi(argv[1]);
	if (argc > 2) init_value = (double) atof(argv[2]);



// int8_t
	::fill(data8, data8+SIZE, int8_t(init_value));
	
	iterations = base_iterations;
	test_constant<int8_t, custom_two<int8_t> >(data8,SIZE,"int8_t constant");
	test_constant<int8_t, custom_add_constants<int8_t> >(data8,SIZE,"int8_t add constants");
	test_constant<int8_t, custom_sub_constants<int8_t> >(data8,SIZE,"int8_t subtract constants");
	test_constant<int8_t, custom_multiply_constants<int8_t> >(data8,SIZE,"int8_t multiply constants");
	test_constant<int8_t, custom_divide_constants<int8_t> >(data8,SIZE,"int8_t divide constants");
	test_constant<int8_t, custom_mod_constants<int8_t> >(data8,SIZE,"int8_t mod constants");
	test_constant<int8_t, custom_equal_constants<int8_t> >(data8,SIZE,"int8_t equal constants");
	test_constant<int8_t, custom_notequal_constants<int8_t> >(data8,SIZE,"int8_t notequal constants");
	test_constant<int8_t, custom_greaterthan_constants<int8_t> >(data8,SIZE,"int8_t greater than constants");
	test_constant<int8_t, custom_lessthan_constants<int8_t> >(data8,SIZE,"int8_t less than constants");
	test_constant<int8_t, custom_greaterthanequal_constants<int8_t> >(data8,SIZE,"int8_t greater than equal constants");
	test_constant<int8_t, custom_lessthanequal_constants<int8_t> >(data8,SIZE,"int8_t less than equal constants");
	test_constant<int8_t, custom_and_constants<int8_t> >(data8,SIZE,"int8_t and constants");
	test_constant<int8_t, custom_or_constants<int8_t> >(data8,SIZE,"int8_t or constants");
	test_constant<int8_t, custom_xor_constants<int8_t> >(data8,SIZE,"int8_t xor constants");
	
	summarize("int8_t simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );
	
	
	iterations = base_iterations / 10;
	test_constant<int8_t, custom_constant_add<int8_t> >(data8,SIZE,"int8_t constant add");
	test_constant<int8_t, custom_multiple_constant_add<int8_t> >(data8,SIZE,"int8_t multiple constant adds");

	test_constant<int8_t, custom_constant_sub<int8_t> >(data8,SIZE,"int8_t constant subtract");
	test_constant<int8_t, custom_multiple_constant_sub<int8_t> >(data8,SIZE,"int8_t multiple constant subtracts");

	test_constant<int8_t, custom_constant_multiply<int8_t> >(data8,SIZE,"int8_t constant multiply");
	test_constant<int8_t, custom_multiple_constant_multiply<int8_t> >(data8,SIZE,"int8_t multiple constant multiplies");
	test_constant<int8_t, custom_multiple_constant_multiply2<int8_t> >(data8,SIZE,"int8_t multiple constant multiply2");

	test_constant<int8_t, custom_constant_divide<int8_t> >(data8,SIZE,"int8_t constant divide");
	test_constant<int8_t, custom_multiple_constant_divide<int8_t> >(data8,SIZE,"int8_t multiple constant divides");
	test_constant<int8_t, custom_multiple_constant_divide2<int8_t> >(data8,SIZE,"int8_t multiple constant divide2");
	
	test_constant<int8_t, custom_multiple_constant_mixed<int8_t> >(data8,SIZE,"int8_t multiple constant mixed");

	test_constant<int8_t, custom_constant_and<int8_t> >(data8,SIZE,"int8_t constant and");
	test_constant<int8_t, custom_multiple_constant_and<int8_t> >(data8,SIZE,"int8_t multiple constant and");

	test_constant<int8_t, custom_constant_or<int8_t> >(data8,SIZE,"int8_t constant or");
	test_constant<int8_t, custom_multiple_constant_or<int8_t> >(data8,SIZE,"int8_t multiple constant or");

	test_constant<int8_t, custom_constant_xor<int8_t> >(data8,SIZE,"int8_t constant xor");
	test_constant<int8_t, custom_multiple_constant_xor<int8_t> >(data8,SIZE,"int8_t multiple constant xor");

	summarize("int8_t constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );


// unsigned8
	::fill(data8unsigned, data8unsigned+SIZE, uint8_t(init_value));
	
	iterations = base_iterations;
	test_constant<uint8_t, custom_two<uint8_t> >(data8unsigned,SIZE,"uint8_t constant");
	test_constant<uint8_t, custom_add_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t add constants");
	test_constant<uint8_t, custom_sub_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t subtract constants");
	test_constant<uint8_t, custom_multiply_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t multiply constants");
	test_constant<uint8_t, custom_divide_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t divide constants");
	test_constant<uint8_t, custom_mod_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t mod constants");
	test_constant<uint8_t, custom_equal_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t equal constants");
	test_constant<uint8_t, custom_notequal_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t notequal constants");
	test_constant<uint8_t, custom_greaterthan_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t greater than constants");
	test_constant<uint8_t, custom_lessthan_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t less than constants");
	test_constant<uint8_t, custom_greaterthanequal_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t greater than equal constants");
	test_constant<uint8_t, custom_lessthanequal_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t less than equal constants");
	test_constant<uint8_t, custom_and_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t and constants");
	test_constant<uint8_t, custom_or_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t or constants");
	test_constant<uint8_t, custom_xor_constants<uint8_t> >(data8unsigned,SIZE,"uint8_t xor constants");
	
	summarize("uint8_t simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );
	
	
	iterations = base_iterations / 10;
	test_constant<uint8_t, custom_constant_add<uint8_t> >(data8unsigned,SIZE,"uint8_t constant add");
	test_constant<uint8_t, custom_multiple_constant_add<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant adds");

	test_constant<uint8_t, custom_constant_sub<uint8_t> >(data8unsigned,SIZE,"uint8_t constant subtract");
	test_constant<uint8_t, custom_multiple_constant_sub<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant subtracts");

	test_constant<uint8_t, custom_constant_multiply<uint8_t> >(data8unsigned,SIZE,"uint8_t constant multiply");
	test_constant<uint8_t, custom_multiple_constant_multiply<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant multiplies");
	test_constant<uint8_t, custom_multiple_constant_multiply2<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant multiply2");

	test_constant<uint8_t, custom_constant_divide<uint8_t> >(data8unsigned,SIZE,"uint8_t constant divide");
	test_constant<uint8_t, custom_multiple_constant_divide<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant divides");
	test_constant<uint8_t, custom_multiple_constant_divide2<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant divide2");
	
	test_constant<uint8_t, custom_multiple_constant_mixed<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant mixed");

	test_constant<uint8_t, custom_constant_and<uint8_t> >(data8unsigned,SIZE,"uint8_t constant and");
	test_constant<uint8_t, custom_multiple_constant_and<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant and");

	test_constant<uint8_t, custom_constant_or<uint8_t> >(data8unsigned,SIZE,"uint8_t constant or");
	test_constant<uint8_t, custom_multiple_constant_or<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant or");

	test_constant<uint8_t, custom_constant_xor<uint8_t> >(data8unsigned,SIZE,"uint8_t constant xor");
	test_constant<uint8_t, custom_multiple_constant_xor<uint8_t> >(data8unsigned,SIZE,"uint8_t multiple constant xor");

	summarize("uint8_t constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );


// int16_t
	::fill(data16, data16+SIZE, int16_t(init_value));
	
	iterations = base_iterations;
	test_constant<int16_t, custom_two<int16_t> >(data16,SIZE,"int16_t constant");
	test_constant<int16_t, custom_add_constants<int16_t> >(data16,SIZE,"int16_t add constants");
	test_constant<int16_t, custom_sub_constants<int16_t> >(data16,SIZE,"int16_t subtract constants");
	test_constant<int16_t, custom_multiply_constants<int16_t> >(data16,SIZE,"int16_t multiply constants");
	test_constant<int16_t, custom_divide_constants<int16_t> >(data16,SIZE,"int16_t divide constants");
	test_constant<int16_t, custom_mod_constants<int16_t> >(data16,SIZE,"int16_t mod constants");
	test_constant<int16_t, custom_equal_constants<int16_t> >(data16,SIZE,"int16_t equal constants");
	test_constant<int16_t, custom_notequal_constants<int16_t> >(data16,SIZE,"int16_t notequal constants");
	test_constant<int16_t, custom_greaterthan_constants<int16_t> >(data16,SIZE,"int16_t greater than constants");
	test_constant<int16_t, custom_lessthan_constants<int16_t> >(data16,SIZE,"int16_t less than constants");
	test_constant<int16_t, custom_greaterthanequal_constants<int16_t> >(data16,SIZE,"int16_t greater than equal constants");
	test_constant<int16_t, custom_lessthanequal_constants<int16_t> >(data16,SIZE,"int16_t less than equal constants");
	test_constant<int16_t, custom_and_constants<int16_t> >(data16,SIZE,"int16_t and constants");
	test_constant<int16_t, custom_or_constants<int16_t> >(data16,SIZE,"int16_t or constants");
	test_constant<int16_t, custom_xor_constants<int16_t> >(data16,SIZE,"int16_t xor constants");
	
	summarize("int16_t simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );
	
	
	iterations = base_iterations / 10;
	test_constant<int16_t, custom_constant_add<int16_t> >(data16,SIZE,"int16_t constant add");
	test_constant<int16_t, custom_multiple_constant_add<int16_t> >(data16,SIZE,"int16_t multiple constant adds");

	test_constant<int16_t, custom_constant_sub<int16_t> >(data16,SIZE,"int16_t constant subtract");
	test_constant<int16_t, custom_multiple_constant_sub<int16_t> >(data16,SIZE,"int16_t multiple constant subtracts");

	test_constant<int16_t, custom_constant_multiply<int16_t> >(data16,SIZE,"int16_t constant multiply");
	test_constant<int16_t, custom_multiple_constant_multiply<int16_t> >(data16,SIZE,"int16_t multiple constant multiplies");
	test_constant<int16_t, custom_multiple_constant_multiply2<int16_t> >(data16,SIZE,"int16_t multiple constant multiply2");

	test_constant<int16_t, custom_constant_divide<int16_t> >(data16,SIZE,"int16_t constant divide");
	test_constant<int16_t, custom_multiple_constant_divide<int16_t> >(data16,SIZE,"int16_t multiple constant divides");
	test_constant<int16_t, custom_multiple_constant_divide2<int16_t> >(data16,SIZE,"int16_t multiple constant divide2");
	
	test_constant<int16_t, custom_multiple_constant_mixed<int16_t> >(data16,SIZE,"int16_t multiple constant mixed");

	test_constant<int16_t, custom_constant_and<int16_t> >(data16,SIZE,"int16_t constant and");
	test_constant<int16_t, custom_multiple_constant_and<int16_t> >(data16,SIZE,"int16_t multiple constant and");

	test_constant<int16_t, custom_constant_or<int16_t> >(data16,SIZE,"int16_t constant or");
	test_constant<int16_t, custom_multiple_constant_or<int16_t> >(data16,SIZE,"int16_t multiple constant or");

	test_constant<int16_t, custom_constant_xor<int16_t> >(data16,SIZE,"int16_t constant xor");
	test_constant<int16_t, custom_multiple_constant_xor<int16_t> >(data16,SIZE,"int16_t multiple constant xor");

	summarize("int16_t constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );


// unsigned16
	::fill(data16unsigned, data16unsigned+SIZE, uint16_t(init_value));
	
	iterations = base_iterations;
	test_constant<uint16_t, custom_two<uint16_t> >(data16unsigned,SIZE,"uint16_t constant");
	test_constant<uint16_t, custom_add_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t add constants");
	test_constant<uint16_t, custom_sub_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t subtract constants");
	test_constant<uint16_t, custom_multiply_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t multiply constants");
	test_constant<uint16_t, custom_divide_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t divide constants");
	test_constant<uint16_t, custom_mod_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t mod constants");
	test_constant<uint16_t, custom_equal_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t equal constants");
	test_constant<uint16_t, custom_notequal_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t notequal constants");
	test_constant<uint16_t, custom_greaterthan_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t greater than constants");
	test_constant<uint16_t, custom_lessthan_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t less than constants");
	test_constant<uint16_t, custom_greaterthanequal_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t greater than equal constants");
	test_constant<uint16_t, custom_lessthanequal_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t less than equal constants");
	test_constant<uint16_t, custom_and_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t and constants");
	test_constant<uint16_t, custom_or_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t or constants");
	test_constant<uint16_t, custom_xor_constants<uint16_t> >(data16unsigned,SIZE,"uint16_t xor constants");
	
	summarize("uint16_t simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );
	
	
	iterations = base_iterations / 10;
	test_constant<uint16_t, custom_constant_add<uint16_t> >(data16unsigned,SIZE,"uint16_t constant add");
	test_constant<uint16_t, custom_multiple_constant_add<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant adds");

	test_constant<uint16_t, custom_constant_sub<uint16_t> >(data16unsigned,SIZE,"uint16_t constant subtract");
	test_constant<uint16_t, custom_multiple_constant_sub<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant subtracts");

	test_constant<uint16_t, custom_constant_multiply<uint16_t> >(data16unsigned,SIZE,"uint16_t constant multiply");
	test_constant<uint16_t, custom_multiple_constant_multiply<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant multiplies");
	test_constant<uint16_t, custom_multiple_constant_multiply2<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant multiply2");

	test_constant<uint16_t, custom_constant_divide<uint16_t> >(data16unsigned,SIZE,"uint16_t constant divide");
	test_constant<uint16_t, custom_multiple_constant_divide<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant divides");
	test_constant<uint16_t, custom_multiple_constant_divide2<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant divide2");
	
	test_constant<uint16_t, custom_multiple_constant_mixed<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant mixed");

	test_constant<uint16_t, custom_constant_and<uint16_t> >(data16unsigned,SIZE,"uint16_t constant and");
	test_constant<uint16_t, custom_multiple_constant_and<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant and");

	test_constant<uint16_t, custom_constant_or<uint16_t> >(data16unsigned,SIZE,"uint16_t constant or");
	test_constant<uint16_t, custom_multiple_constant_or<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant or");

	test_constant<uint16_t, custom_constant_xor<uint16_t> >(data16unsigned,SIZE,"uint16_t constant xor");
	test_constant<uint16_t, custom_multiple_constant_xor<uint16_t> >(data16unsigned,SIZE,"uint16_t multiple constant xor");

	summarize("uint16_t constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );



// int32_t
	::fill(data32, data32+SIZE, int32_t(init_value));

	iterations = base_iterations;
	test_constant<int32_t, custom_two<int32_t> >(data32,SIZE,"int32_t constant");
	test_constant<int32_t, custom_add_constants<int32_t> >(data32,SIZE,"int32_t add constants");
	test_constant<int32_t, custom_sub_constants<int32_t> >(data32,SIZE,"int32_t subtract constants");
	test_constant<int32_t, custom_multiply_constants<int32_t> >(data32,SIZE,"int32_t multiply constants");
	test_constant<int32_t, custom_divide_constants<int32_t> >(data32,SIZE,"int32_t divide constants");
	test_constant<int32_t, custom_mod_constants<int32_t> >(data32,SIZE,"int32_t mod constants");
	test_constant<int32_t, custom_equal_constants<int32_t> >(data32,SIZE,"int32_t equal constants");
	test_constant<int32_t, custom_notequal_constants<int32_t> >(data32,SIZE,"int32_t notequal constants");
	test_constant<int32_t, custom_greaterthan_constants<int32_t> >(data32,SIZE,"int32_t greater than constants");
	test_constant<int32_t, custom_lessthan_constants<int32_t> >(data32,SIZE,"int32_t less than constants");
	test_constant<int32_t, custom_greaterthanequal_constants<int32_t> >(data32,SIZE,"int32_t greater than equal constants");
	test_constant<int32_t, custom_lessthanequal_constants<int32_t> >(data32,SIZE,"int32_t less than equal constants");
	test_constant<int32_t, custom_and_constants<int32_t> >(data32,SIZE,"int32_t and constants");
	test_constant<int32_t, custom_or_constants<int32_t> >(data32,SIZE,"int32_t or constants");
	test_constant<int32_t, custom_xor_constants<int32_t> >(data32,SIZE,"int32_t xor constants");
	
	summarize("int32_t simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );
	
	
	iterations = base_iterations / 10;
	test_constant<int32_t, custom_constant_add<int32_t> >(data32,SIZE,"int32_t constant add");
	test_constant<int32_t, custom_multiple_constant_add<int32_t> >(data32,SIZE,"int32_t multiple constant adds");

	test_constant<int32_t, custom_constant_sub<int32_t> >(data32,SIZE,"int32_t constant subtract");
	test_constant<int32_t, custom_multiple_constant_sub<int32_t> >(data32,SIZE,"int32_t multiple constant subtracts");

	test_constant<int32_t, custom_constant_multiply<int32_t> >(data32,SIZE,"int32_t constant multiply");
	test_constant<int32_t, custom_multiple_constant_multiply<int32_t> >(data32,SIZE,"int32_t multiple constant multiplies");
	test_constant<int32_t, custom_multiple_constant_multiply2<int32_t> >(data32,SIZE,"int32_t multiple constant multiply2");

	test_constant<int32_t, custom_constant_divide<int32_t> >(data32,SIZE,"int32_t constant divide");
	test_constant<int32_t, custom_multiple_constant_divide<int32_t> >(data32,SIZE,"int32_t multiple constant divides");
	test_constant<int32_t, custom_multiple_constant_divide2<int32_t> >(data32,SIZE,"int32_t multiple constant divide2");
	
	test_constant<int32_t, custom_multiple_constant_mixed<int32_t> >(data32,SIZE,"int32_t multiple constant mixed");

	test_constant<int32_t, custom_constant_and<int32_t> >(data32,SIZE,"int32_t constant and");
	test_constant<int32_t, custom_multiple_constant_and<int32_t> >(data32,SIZE,"int32_t multiple constant and");

	test_constant<int32_t, custom_constant_or<int32_t> >(data32,SIZE,"int32_t constant or");
	test_constant<int32_t, custom_multiple_constant_or<int32_t> >(data32,SIZE,"int32_t multiple constant or");

	test_constant<int32_t, custom_constant_xor<int32_t> >(data32,SIZE,"int32_t constant xor");
	test_constant<int32_t, custom_multiple_constant_xor<int32_t> >(data32,SIZE,"int32_t multiple constant xor");

	summarize("int32_t constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );



// unsigned32
	::fill(data32unsigned, data32unsigned+SIZE, uint32_t(init_value));

	iterations = base_iterations;
	test_constant<uint32_t, custom_two<uint32_t> >(data32unsigned,SIZE,"uint32_t constant");
	test_constant<uint32_t, custom_add_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t add constants");
	test_constant<uint32_t, custom_sub_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t subtract constants");
	test_constant<uint32_t, custom_multiply_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t multiply constants");
	test_constant<uint32_t, custom_divide_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t divide constants");
	test_constant<uint32_t, custom_mod_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t mod constants");
	test_constant<uint32_t, custom_equal_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t equal constants");
	test_constant<uint32_t, custom_notequal_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t notequal constants");
	test_constant<uint32_t, custom_greaterthan_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t greater than constants");
	test_constant<uint32_t, custom_lessthan_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t less than constants");
	test_constant<uint32_t, custom_greaterthanequal_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t greater than equal constants");
	test_constant<uint32_t, custom_lessthanequal_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t less than equal constants");
	test_constant<uint32_t, custom_and_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t and constants");
	test_constant<uint32_t, custom_or_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t or constants");
	test_constant<uint32_t, custom_xor_constants<uint32_t> >(data32unsigned,SIZE,"uint32_t xor constants");
	
	summarize("uint32_t simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );
	
	
	iterations = base_iterations / 10;
	test_constant<uint32_t, custom_constant_add<uint32_t> >(data32unsigned,SIZE,"uint32_t constant add");
	test_constant<uint32_t, custom_multiple_constant_add<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant adds");

	test_constant<uint32_t, custom_constant_sub<uint32_t> >(data32unsigned,SIZE,"uint32_t constant subtract");
	test_constant<uint32_t, custom_multiple_constant_sub<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant subtracts");

	test_constant<uint32_t, custom_constant_multiply<uint32_t> >(data32unsigned,SIZE,"uint32_t constant multiply");
	test_constant<uint32_t, custom_multiple_constant_multiply<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant multiplies");
	test_constant<uint32_t, custom_multiple_constant_multiply2<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant multiply2");

	test_constant<uint32_t, custom_constant_divide<uint32_t> >(data32unsigned,SIZE,"uint32_t constant divide");
	test_constant<uint32_t, custom_multiple_constant_divide<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant divides");
	test_constant<uint32_t, custom_multiple_constant_divide2<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant divide2");
	
	test_constant<uint32_t, custom_multiple_constant_mixed<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant mixed");

	test_constant<uint32_t, custom_constant_and<uint32_t> >(data32unsigned,SIZE,"uint32_t constant and");
	test_constant<uint32_t, custom_multiple_constant_and<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant and");

	test_constant<uint32_t, custom_constant_or<uint32_t> >(data32unsigned,SIZE,"uint32_t constant or");
	test_constant<uint32_t, custom_multiple_constant_or<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant or");

	test_constant<uint32_t, custom_constant_xor<uint32_t> >(data32unsigned,SIZE,"uint32_t constant xor");
	test_constant<uint32_t, custom_multiple_constant_xor<uint32_t> >(data32unsigned,SIZE,"uint32_t multiple constant xor");

	summarize("uint32_t constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );

	

// int64_t
	::fill(data64, data64+SIZE, int64_t(init_value));

	iterations = base_iterations;
	test_constant<int64_t, custom_two<int64_t> >(data64,SIZE,"int64_t constant");
	test_constant<int64_t, custom_add_constants<int64_t> >(data64,SIZE,"int64_t add constants");
	test_constant<int64_t, custom_sub_constants<int64_t> >(data64,SIZE,"int64_t subtract constants");
	test_constant<int64_t, custom_multiply_constants<int64_t> >(data64,SIZE,"int64_t multiply constants");
	test_constant<int64_t, custom_divide_constants<int64_t> >(data64,SIZE,"int64_t divide constants");
	test_constant<int64_t, custom_mod_constants<int64_t> >(data64,SIZE,"int64_t mod constants");
	test_constant<int64_t, custom_equal_constants<int64_t> >(data64,SIZE,"int64_t equal constants");
	test_constant<int64_t, custom_notequal_constants<int64_t> >(data64,SIZE,"int64_t notequal constants");
	test_constant<int64_t, custom_greaterthan_constants<int64_t> >(data64,SIZE,"int64_t greater than constants");
	test_constant<int64_t, custom_lessthan_constants<int64_t> >(data64,SIZE,"int64_t less than constants");
	test_constant<int64_t, custom_greaterthanequal_constants<int64_t> >(data64,SIZE,"int64_t greater than equal constants");
	test_constant<int64_t, custom_lessthanequal_constants<int64_t> >(data64,SIZE,"int64_t less than equal constants");
	test_constant<int64_t, custom_and_constants<int64_t> >(data64,SIZE,"int64_t and constants");
	test_constant<int64_t, custom_or_constants<int64_t> >(data64,SIZE,"int64_t or constants");
	test_constant<int64_t, custom_xor_constants<int64_t> >(data64,SIZE,"int64_t xor constants");
	
	summarize("int64_t simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );
	
	
	iterations = base_iterations / 10;
	test_constant<int64_t, custom_constant_add<int64_t> >(data64,SIZE,"int64_t constant add");
	test_constant<int64_t, custom_multiple_constant_add<int64_t> >(data64,SIZE,"int64_t multiple constant adds");

	test_constant<int64_t, custom_constant_sub<int64_t> >(data64,SIZE,"int64_t constant subtract");
	test_constant<int64_t, custom_multiple_constant_sub<int64_t> >(data64,SIZE,"int64_t multiple constant subtracts");

	test_constant<int64_t, custom_constant_multiply<int64_t> >(data64,SIZE,"int64_t constant multiply");
	test_constant<int64_t, custom_multiple_constant_multiply<int64_t> >(data64,SIZE,"int64_t multiple constant multiplies");
	test_constant<int64_t, custom_multiple_constant_multiply2<int64_t> >(data64,SIZE,"int64_t multiple constant multiply2");

	test_constant<int64_t, custom_constant_divide<int64_t> >(data64,SIZE,"int64_t constant divide");
	test_constant<int64_t, custom_multiple_constant_divide<int64_t> >(data64,SIZE,"int64_t multiple constant divides");
	test_constant<int64_t, custom_multiple_constant_divide2<int64_t> >(data64,SIZE,"int64_t multiple constant divide2");
	
	test_constant<int64_t, custom_multiple_constant_mixed<int64_t> >(data64,SIZE,"int64_t multiple constant mixed");

	test_constant<int64_t, custom_constant_and<int64_t> >(data64,SIZE,"int64_t constant and");
	test_constant<int64_t, custom_multiple_constant_and<int64_t> >(data64,SIZE,"int64_t multiple constant and");

	test_constant<int64_t, custom_constant_or<int64_t> >(data64,SIZE,"int64_t constant or");
	test_constant<int64_t, custom_multiple_constant_or<int64_t> >(data64,SIZE,"int64_t multiple constant or");

	test_constant<int64_t, custom_constant_xor<int64_t> >(data64,SIZE,"int64_t constant xor");
	test_constant<int64_t, custom_multiple_constant_xor<int64_t> >(data64,SIZE,"int64_t multiple constant xor");

	summarize("int64_t constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );


// unsigned64
	::fill(data64unsigned, data64unsigned+SIZE, uint64_t(init_value));
	
	iterations = base_iterations;
	test_constant<uint64_t, custom_two<uint64_t> >(data64unsigned,SIZE,"uint64_t constant");
	test_constant<uint64_t, custom_add_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t add constants");
	test_constant<uint64_t, custom_sub_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t subtract constants");
	test_constant<uint64_t, custom_multiply_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t multiply constants");
	test_constant<uint64_t, custom_divide_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t divide constants");
	test_constant<uint64_t, custom_mod_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t mod constants");
	test_constant<uint64_t, custom_equal_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t equal constants");
	test_constant<uint64_t, custom_notequal_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t notequal constants");
	test_constant<uint64_t, custom_greaterthan_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t greater than constants");
	test_constant<uint64_t, custom_lessthan_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t less than constants");
	test_constant<uint64_t, custom_greaterthanequal_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t greater than equal constants");
	test_constant<uint64_t, custom_lessthanequal_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t less than equal constants");
	test_constant<uint64_t, custom_and_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t and constants");
	test_constant<uint64_t, custom_or_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t or constants");
	test_constant<uint64_t, custom_xor_constants<uint64_t> >(data64unsigned,SIZE,"uint64_t xor constants");
	
	summarize("uint64_t simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );
	
	
	iterations = base_iterations / 10;
	test_constant<uint64_t, custom_constant_add<uint64_t> >(data64unsigned,SIZE,"uint64_t constant add");
	test_constant<uint64_t, custom_multiple_constant_add<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant adds");

	test_constant<uint64_t, custom_constant_sub<uint64_t> >(data64unsigned,SIZE,"uint64_t constant subtract");
	test_constant<uint64_t, custom_multiple_constant_sub<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant subtracts");

	test_constant<uint64_t, custom_constant_multiply<uint64_t> >(data64unsigned,SIZE,"uint64_t constant multiply");
	test_constant<uint64_t, custom_multiple_constant_multiply<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant multiplies");
	test_constant<uint64_t, custom_multiple_constant_multiply2<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant multiply2");

	test_constant<uint64_t, custom_constant_divide<uint64_t> >(data64unsigned,SIZE,"uint64_t constant divide");
	test_constant<uint64_t, custom_multiple_constant_divide<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant divides");
	test_constant<uint64_t, custom_multiple_constant_divide2<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant divide2");
	
	test_constant<uint64_t, custom_multiple_constant_mixed<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant mixed");

	test_constant<uint64_t, custom_constant_and<uint64_t> >(data64unsigned,SIZE,"uint64_t constant and");
	test_constant<uint64_t, custom_multiple_constant_and<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant and");

	test_constant<uint64_t, custom_constant_or<uint64_t> >(data64unsigned,SIZE,"uint64_t constant or");
	test_constant<uint64_t, custom_multiple_constant_or<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant or");

	test_constant<uint64_t, custom_constant_xor<uint64_t> >(data64unsigned,SIZE,"uint64_t constant xor");
	test_constant<uint64_t, custom_multiple_constant_xor<uint64_t> >(data64unsigned,SIZE,"uint64_t multiple constant xor");

	summarize("uint64_t constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );



// float
	::fill(dataFloat, dataFloat+SIZE, float(init_value));

	iterations = base_iterations;
	test_constant<float, custom_two<float> >(dataFloat,SIZE,"float constant");
	test_constant<float, custom_add_constants<float> >(dataFloat,SIZE,"float add constants");
	test_constant<float, custom_sub_constants<float> >(dataFloat,SIZE,"float subtract constants");
	test_constant<float, custom_multiply_constants<float> >(dataFloat,SIZE,"float multiply constants");
	test_constant<float, custom_divide_constants<float> >(dataFloat,SIZE,"float divide constants");
	
	summarize("float simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );
	
	
	iterations = base_iterations / 10;
	test_constant<float, custom_constant_add<float> >(dataFloat,SIZE,"float constant add");
	test_constant<float, custom_multiple_constant_add<float> >(dataFloat,SIZE,"float multiple constant adds");

	test_constant<float, custom_constant_sub<float> >(dataFloat,SIZE,"float constant subtract");
	test_constant<float, custom_multiple_constant_sub<float> >(dataFloat,SIZE,"float multiple constant subtracts");

	test_constant<float, custom_constant_multiply<float> >(dataFloat,SIZE,"float constant multiply");
	test_constant<float, custom_multiple_constant_multiply<float> >(dataFloat,SIZE,"float multiple constant multiplies");
	test_constant<float, custom_multiple_constant_multiply2<float> >(dataFloat,SIZE,"float multiple constant multiply2");

	test_constant<float, custom_constant_divide<float> >(dataFloat,SIZE,"float constant divide");
	test_constant<float, custom_multiple_constant_divide<float> >(dataFloat,SIZE,"float multiple constant divides");
	test_constant<float, custom_multiple_constant_divide2<float> >(dataFloat,SIZE,"float multiple constant divide2");
	
	test_constant<float, custom_multiple_constant_mixed<float> >(dataFloat,SIZE,"float multiple constant mixed");

	summarize("float constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );


// double
	::fill(dataDouble, dataDouble+SIZE, double(init_value));

	iterations = base_iterations;
	test_constant<double, custom_two<double> >(dataDouble,SIZE,"double constant");
	test_constant<double, custom_add_constants<double> >(dataDouble,SIZE,"double add constants");
	test_constant<double, custom_sub_constants<double> >(dataDouble,SIZE,"double subtract constants");
	test_constant<double, custom_multiply_constants<double> >(dataDouble,SIZE,"double multiply constants");
	test_constant<double, custom_divide_constants<double> >(dataDouble,SIZE,"double divide constants");
	
	summarize("double simple constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );

	
	iterations = base_iterations / 10;
	test_constant<double, custom_constant_add<double> >(dataDouble,SIZE,"double constant add");
	test_constant<double, custom_multiple_constant_add<double> >(dataDouble,SIZE,"double multiple constant adds");

	test_constant<double, custom_constant_sub<double> >(dataDouble,SIZE,"double constant subtract");
	test_constant<double, custom_multiple_constant_sub<double> >(dataDouble,SIZE,"double multiple constant subtracts");

	test_constant<double, custom_constant_multiply<double> >(dataDouble,SIZE,"double constant multiply");
	test_constant<double, custom_multiple_constant_multiply<double> >(dataDouble,SIZE,"double multiple constant multiplies");
	test_constant<double, custom_multiple_constant_multiply2<double> >(dataDouble,SIZE,"double multiple constant multiply2");

	test_constant<double, custom_constant_divide<double> >(dataDouble,SIZE,"double constant divide");
	test_constant<double, custom_multiple_constant_divide<double> >(dataDouble,SIZE,"double multiple constant divides");
	test_constant<double, custom_multiple_constant_divide2<double> >(dataDouble,SIZE,"double multiple constant divide2");
	
	test_constant<double, custom_multiple_constant_mixed<double> >(dataDouble,SIZE,"double multiple constant mixed");

	summarize("double constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );

	
	return 0;
}

// the end
/******************************************************************************/
/******************************************************************************/

[-- Attachment #5: report46 --]
[-- Type: text/plain, Size: 25184 bytes --]

./simple_types_constant_folding 

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                     "int8_t constant"   0.00 sec     inf M     nan
 1                "int8_t add constants"   0.00 sec     inf M     nan
 2           "int8_t subtract constants"   0.00 sec     inf M     nan
 3           "int8_t multiply constants"   0.00 sec     inf M     nan
 4             "int8_t divide constants"   0.00 sec     inf M     nan
 5                "int8_t mod constants"   0.00 sec     inf M     nan
 6              "int8_t equal constants"   0.00 sec     inf M     nan
 7           "int8_t notequal constants"   0.00 sec     inf M     nan
 8       "int8_t greater than constants"   0.00 sec     inf M     nan
 9          "int8_t less than constants"   0.00 sec     inf M     nan
10 "int8_t greater than equal constants"   0.00 sec     inf M     nan
11    "int8_t less than equal constants"   0.00 sec     inf M     nan
12                "int8_t and constants"   0.00 sec     inf M     nan
13                 "int8_t or constants"   0.00 sec     inf M     nan
14                "int8_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int8_t simple constant folding: 0.00 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                 "int8_t constant add"   2.84 sec   563.38 M     1.00
 1       "int8_t multiple constant adds"   2.85 sec   561.40 M     1.00
 2            "int8_t constant subtract"   2.84 sec   563.38 M     1.00
 3  "int8_t multiple constant subtracts"   2.85 sec   561.40 M     1.00
 4            "int8_t constant multiply"   3.35 sec   477.61 M     1.18
 5 "int8_t multiple constant multiplies"   3.34 sec   479.04 M     1.18
 6  "int8_t multiple constant multiply2"   2.85 sec   561.40 M     1.00
 7              "int8_t constant divide"   3.86 sec   414.51 M     1.36
 8    "int8_t multiple constant divides"   6.03 sec   265.34 M     2.12
 9    "int8_t multiple constant divide2"   2.85 sec   561.40 M     1.00
10      "int8_t multiple constant mixed"   0.97 sec   1649.48 M     0.34
11                 "int8_t constant and"   1.44 sec   1111.11 M     0.51
12        "int8_t multiple constant and"   1.44 sec   1111.11 M     0.51
13                  "int8_t constant or"   1.44 sec   1111.11 M     0.51
14         "int8_t multiple constant or"   1.44 sec   1111.11 M     0.51
15                 "int8_t constant xor"   1.46 sec   1095.89 M     0.51
16        "int8_t multiple constant xor"   1.47 sec   1088.44 M     0.52

Total absolute time for int8_t constant folding: 43.32 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "uint8_t constant"   0.00 sec     inf M     nan
 1                "uint8_t add constants"   0.00 sec     inf M     nan
 2           "uint8_t subtract constants"   0.00 sec     inf M     nan
 3           "uint8_t multiply constants"   0.00 sec     inf M     nan
 4             "uint8_t divide constants"   0.00 sec     inf M     nan
 5                "uint8_t mod constants"   0.00 sec     inf M     nan
 6              "uint8_t equal constants"   0.00 sec     inf M     nan
 7           "uint8_t notequal constants"   0.00 sec     inf M     nan
 8       "uint8_t greater than constants"   0.00 sec     inf M     nan
 9          "uint8_t less than constants"   0.00 sec     inf M     nan
10 "uint8_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint8_t less than equal constants"   0.00 sec     inf M     nan
12                "uint8_t and constants"   0.00 sec     inf M     nan
13                 "uint8_t or constants"   0.00 sec     inf M     nan
14                "uint8_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint8_t simple constant folding: 0.00 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "uint8_t constant add"   0.11 sec   14545.45 M     1.00
 1       "uint8_t multiple constant adds"   0.10 sec   16000.00 M     0.91
 2            "uint8_t constant subtract"   0.10 sec   16000.00 M     0.91
 3  "uint8_t multiple constant subtracts"   0.10 sec   16000.00 M     0.91
 4            "uint8_t constant multiply"   0.51 sec   3137.25 M     4.64
 5 "uint8_t multiple constant multiplies"   0.51 sec   3137.25 M     4.64
 6  "uint8_t multiple constant multiply2"   0.09 sec   17777.78 M     0.82
 7              "uint8_t constant divide"   3.35 sec   477.61 M     30.45
 8    "uint8_t multiple constant divides"   3.35 sec   477.61 M     30.45
 9    "uint8_t multiple constant divide2"   0.10 sec   16000.00 M     0.91
10      "uint8_t multiple constant mixed"   0.06 sec   26666.67 M     0.55
11                 "uint8_t constant and"   0.10 sec   16000.00 M     0.91
12        "uint8_t multiple constant and"   0.10 sec   16000.00 M     0.91
13                  "uint8_t constant or"   0.10 sec   16000.00 M     0.91
14         "uint8_t multiple constant or"   0.10 sec   16000.00 M     0.91
15                 "uint8_t constant xor"   0.10 sec   16000.00 M     0.91
16        "uint8_t multiple constant xor"   0.10 sec   16000.00 M     0.91

Total absolute time for uint8_t constant folding: 8.98 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int16_t constant"   0.00 sec     inf M     nan
 1                "int16_t add constants"   0.00 sec     inf M     nan
 2           "int16_t subtract constants"   0.00 sec     inf M     nan
 3           "int16_t multiply constants"   0.00 sec     inf M     nan
 4             "int16_t divide constants"   0.00 sec     inf M     nan
 5                "int16_t mod constants"   0.00 sec     inf M     nan
 6              "int16_t equal constants"   0.00 sec     inf M     nan
 7           "int16_t notequal constants"   0.00 sec     inf M     nan
 8       "int16_t greater than constants"   0.00 sec     inf M     nan
 9          "int16_t less than constants"   0.00 sec     inf M     nan
10 "int16_t greater than equal constants"   0.00 sec     inf M     nan
11    "int16_t less than equal constants"   0.00 sec     inf M     nan
12                "int16_t and constants"   0.00 sec     inf M     nan
13                 "int16_t or constants"   0.00 sec     inf M     nan
14                "int16_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int16_t simple constant folding: 0.00 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int16_t constant add"   2.85 sec   561.40 M     1.00
 1       "int16_t multiple constant adds"   2.84 sec   563.38 M     1.00
 2            "int16_t constant subtract"   2.85 sec   561.40 M     1.00
 3  "int16_t multiple constant subtracts"   2.84 sec   563.38 M     1.00
 4            "int16_t constant multiply"   3.35 sec   477.61 M     1.18
 5 "int16_t multiple constant multiplies"   3.36 sec   476.19 M     1.18
 6  "int16_t multiple constant multiply2"   2.87 sec   557.49 M     1.01
 7              "int16_t constant divide"   3.88 sec   412.37 M     1.36
 8    "int16_t multiple constant divides"   4.03 sec   397.02 M     1.41
 9    "int16_t multiple constant divide2"   2.84 sec   563.38 M     1.00
10      "int16_t multiple constant mixed"   0.97 sec   1649.48 M     0.34
11                 "int16_t constant and"   1.44 sec   1111.11 M     0.51
12        "int16_t multiple constant and"   1.44 sec   1111.11 M     0.51
13                  "int16_t constant or"   1.44 sec   1111.11 M     0.51
14         "int16_t multiple constant or"   1.44 sec   1111.11 M     0.51
15                 "int16_t constant xor"   1.43 sec   1118.88 M     0.50
16        "int16_t multiple constant xor"   1.44 sec   1111.11 M     0.51

Total absolute time for int16_t constant folding: 41.31 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint16_t constant"   0.00 sec     inf M     nan
 1                "uint16_t add constants"   0.00 sec     inf M     nan
 2           "uint16_t subtract constants"   0.00 sec     inf M     nan
 3           "uint16_t multiply constants"   0.00 sec     inf M     nan
 4             "uint16_t divide constants"   0.00 sec     inf M     nan
 5                "uint16_t mod constants"   0.00 sec     inf M     nan
 6              "uint16_t equal constants"   0.00 sec     inf M     nan
 7           "uint16_t notequal constants"   0.00 sec     inf M     nan
 8       "uint16_t greater than constants"   0.00 sec     inf M     nan
 9          "uint16_t less than constants"   0.00 sec     inf M     nan
10 "uint16_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint16_t less than equal constants"   0.00 sec     inf M     nan
12                "uint16_t and constants"   0.00 sec     inf M     nan
13                 "uint16_t or constants"   0.00 sec     inf M     nan
14                "uint16_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint16_t simple constant folding: 0.00 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint16_t constant add"   0.20 sec   8000.00 M     1.00
 1       "uint16_t multiple constant adds"   0.20 sec   8000.00 M     1.00
 2            "uint16_t constant subtract"   0.19 sec   8421.05 M     0.95
 3  "uint16_t multiple constant subtracts"   0.20 sec   8000.00 M     1.00
 4            "uint16_t constant multiply"   0.22 sec   7272.73 M     1.10
 5 "uint16_t multiple constant multiplies"   0.22 sec   7272.73 M     1.10
 6  "uint16_t multiple constant multiply2"   0.20 sec   8000.00 M     1.00
 7              "uint16_t constant divide"   1.82 sec   879.12 M     9.10
 8    "uint16_t multiple constant divides"   1.82 sec   879.12 M     9.10
 9    "uint16_t multiple constant divide2"   0.20 sec   8000.00 M     1.00
10      "uint16_t multiple constant mixed"   0.17 sec   9411.76 M     0.85
11                 "uint16_t constant and"   0.19 sec   8421.05 M     0.95
12        "uint16_t multiple constant and"   0.19 sec   8421.05 M     0.95
13                  "uint16_t constant or"   0.20 sec   8000.00 M     1.00
14         "uint16_t multiple constant or"   0.19 sec   8421.05 M     0.95
15                 "uint16_t constant xor"   0.20 sec   8000.00 M     1.00
16        "uint16_t multiple constant xor"   0.19 sec   8421.05 M     0.95

Total absolute time for uint16_t constant folding: 6.60 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int32_t constant"   0.00 sec     inf M     nan
 1                "int32_t add constants"   0.00 sec     inf M     nan
 2           "int32_t subtract constants"   0.00 sec     inf M     nan
 3           "int32_t multiply constants"   0.00 sec     inf M     nan
 4             "int32_t divide constants"   0.00 sec     inf M     nan
 5                "int32_t mod constants"   0.00 sec     inf M     nan
 6              "int32_t equal constants"   0.00 sec     inf M     nan
 7           "int32_t notequal constants"   0.00 sec     inf M     nan
 8       "int32_t greater than constants"   0.00 sec     inf M     nan
 9          "int32_t less than constants"   0.00 sec     inf M     nan
10 "int32_t greater than equal constants"   0.00 sec     inf M     nan
11    "int32_t less than equal constants"   0.00 sec     inf M     nan
12                "int32_t and constants"   0.00 sec     inf M     nan
13                 "int32_t or constants"   0.00 sec     inf M     nan
14                "int32_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int32_t simple constant folding: 0.00 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int32_t constant add"   0.39 sec   4102.56 M     1.00
 1       "int32_t multiple constant adds"   0.34 sec   4705.88 M     0.87
 2            "int32_t constant subtract"   0.38 sec   4210.53 M     0.97
 3  "int32_t multiple constant subtracts"   0.39 sec   4102.56 M     1.00
 4            "int32_t constant multiply"   1.40 sec   1142.86 M     3.59
 5 "int32_t multiple constant multiplies"   1.41 sec   1134.75 M     3.62
 6  "int32_t multiple constant multiply2"   0.39 sec   4102.56 M     1.00
 7              "int32_t constant divide"   3.03 sec   528.05 M     7.77
 8    "int32_t multiple constant divides"   3.31 sec   483.38 M     8.49
 9    "int32_t multiple constant divide2"   0.33 sec   4848.48 M     0.85
10      "int32_t multiple constant mixed"   0.26 sec   6153.85 M     0.67
11                 "int32_t constant and"   0.38 sec   4210.53 M     0.97
12        "int32_t multiple constant and"   0.34 sec   4705.88 M     0.87
13                  "int32_t constant or"   0.38 sec   4210.53 M     0.97
14         "int32_t multiple constant or"   0.34 sec   4705.88 M     0.87
15                 "int32_t constant xor"   0.34 sec   4705.88 M     0.87
16        "int32_t multiple constant xor"   0.34 sec   4705.88 M     0.87

Total absolute time for int32_t constant folding: 13.75 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint32_t constant"   0.00 sec     inf M     nan
 1                "uint32_t add constants"   0.00 sec     inf M     nan
 2           "uint32_t subtract constants"   0.00 sec     inf M     nan
 3           "uint32_t multiply constants"   0.00 sec     inf M     nan
 4             "uint32_t divide constants"   0.00 sec     inf M     nan
 5                "uint32_t mod constants"   0.00 sec     inf M     nan
 6              "uint32_t equal constants"   0.00 sec     inf M     nan
 7           "uint32_t notequal constants"   0.00 sec     inf M     nan
 8       "uint32_t greater than constants"   0.00 sec     inf M     nan
 9          "uint32_t less than constants"   0.00 sec     inf M     nan
10 "uint32_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint32_t less than equal constants"   0.00 sec     inf M     nan
12                "uint32_t and constants"   0.00 sec     inf M     nan
13                 "uint32_t or constants"   0.00 sec     inf M     nan
14                "uint32_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint32_t simple constant folding: 0.00 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint32_t constant add"   0.34 sec   4705.88 M     1.00
 1       "uint32_t multiple constant adds"   0.33 sec   4848.48 M     0.97
 2            "uint32_t constant subtract"   0.34 sec   4705.88 M     1.00
 3  "uint32_t multiple constant subtracts"   0.34 sec   4705.88 M     1.00
 4            "uint32_t constant multiply"   1.40 sec   1142.86 M     4.12
 5 "uint32_t multiple constant multiplies"   1.37 sec   1167.88 M     4.03
 6  "uint32_t multiple constant multiply2"   0.33 sec   4848.48 M     0.97
 7              "uint32_t constant divide"   2.63 sec   608.37 M     7.74
 8    "uint32_t multiple constant divides"   2.65 sec   603.77 M     7.79
 9    "uint32_t multiple constant divide2"   0.33 sec   4848.48 M     0.97
10      "uint32_t multiple constant mixed"   0.25 sec   6400.00 M     0.74
11                 "uint32_t constant and"   0.34 sec   4705.88 M     1.00
12        "uint32_t multiple constant and"   0.34 sec   4705.88 M     1.00
13                  "uint32_t constant or"   0.34 sec   4705.88 M     1.00
14         "uint32_t multiple constant or"   0.34 sec   4705.88 M     1.00
15                 "uint32_t constant xor"   0.33 sec   4848.48 M     0.97
16        "uint32_t multiple constant xor"   0.34 sec   4705.88 M     1.00

Total absolute time for uint32_t constant folding: 12.34 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                     "int64_t constant"   0.00 sec     inf M     nan
 1                "int64_t add constants"   0.00 sec     inf M     nan
 2           "int64_t subtract constants"   0.00 sec     inf M     nan
 3           "int64_t multiply constants"   0.00 sec     inf M     nan
 4             "int64_t divide constants"   0.00 sec     inf M     nan
 5                "int64_t mod constants"   0.00 sec     inf M     nan
 6              "int64_t equal constants"   0.00 sec     inf M     nan
 7           "int64_t notequal constants"   0.00 sec     inf M     nan
 8       "int64_t greater than constants"   0.00 sec     inf M     nan
 9          "int64_t less than constants"   0.00 sec     inf M     nan
10 "int64_t greater than equal constants"   0.00 sec     inf M     nan
11    "int64_t less than equal constants"   0.00 sec     inf M     nan
12                "int64_t and constants"   0.00 sec     inf M     nan
13                 "int64_t or constants"   0.00 sec     inf M     nan
14                "int64_t xor constants"   0.00 sec     inf M     nan

Total absolute time for int64_t simple constant folding: 0.00 sec

test                          description   absolute   operations   ratio with
number                                      time       per second   test0

 0                 "int64_t constant add"   1.06 sec   1509.43 M     1.00
 1       "int64_t multiple constant adds"   1.05 sec   1523.81 M     0.99
 2            "int64_t constant subtract"   1.06 sec   1509.43 M     1.00
 3  "int64_t multiple constant subtracts"   1.06 sec   1509.43 M     1.00
 4            "int64_t constant multiply"   2.55 sec   627.45 M     2.41
 5 "int64_t multiple constant multiplies"   2.55 sec   627.45 M     2.41
 6  "int64_t multiple constant multiply2"   1.06 sec   1509.43 M     1.00
 7              "int64_t constant divide"   2.93 sec   546.08 M     2.76
 8    "int64_t multiple constant divides"   3.29 sec   486.32 M     3.10
 9    "int64_t multiple constant divide2"   1.06 sec   1509.43 M     1.00
10      "int64_t multiple constant mixed"   0.79 sec   2025.32 M     0.75
11                 "int64_t constant and"   0.97 sec   1649.48 M     0.92
12        "int64_t multiple constant and"   0.97 sec   1649.48 M     0.92
13                  "int64_t constant or"   0.96 sec   1666.67 M     0.91
14         "int64_t multiple constant or"   0.96 sec   1666.67 M     0.91
15                 "int64_t constant xor"   0.98 sec   1632.65 M     0.92
16        "int64_t multiple constant xor"   0.97 sec   1649.48 M     0.92

Total absolute time for int64_t constant folding: 24.27 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                     "uint64_t constant"   0.00 sec     inf M     nan
 1                "uint64_t add constants"   0.00 sec     inf M     nan
 2           "uint64_t subtract constants"   0.00 sec     inf M     nan
 3           "uint64_t multiply constants"   0.00 sec     inf M     nan
 4             "uint64_t divide constants"   0.00 sec     inf M     nan
 5                "uint64_t mod constants"   0.00 sec     inf M     nan
 6              "uint64_t equal constants"   0.00 sec     inf M     nan
 7           "uint64_t notequal constants"   0.00 sec     inf M     nan
 8       "uint64_t greater than constants"   0.00 sec     inf M     nan
 9          "uint64_t less than constants"   0.00 sec     inf M     nan
10 "uint64_t greater than equal constants"   0.00 sec     inf M     nan
11    "uint64_t less than equal constants"   0.00 sec     inf M     nan
12                "uint64_t and constants"   0.00 sec     inf M     nan
13                 "uint64_t or constants"   0.00 sec     inf M     nan
14                "uint64_t xor constants"   0.00 sec     inf M     nan

Total absolute time for uint64_t simple constant folding: 0.00 sec

test                           description   absolute   operations   ratio with
number                                       time       per second   test0

 0                 "uint64_t constant add"   1.06 sec   1509.43 M     1.00
 1       "uint64_t multiple constant adds"   1.07 sec   1495.33 M     1.01
 2            "uint64_t constant subtract"   1.06 sec   1509.43 M     1.00
 3  "uint64_t multiple constant subtracts"   1.06 sec   1509.43 M     1.00
 4            "uint64_t constant multiply"   2.58 sec   620.16 M     2.43
 5 "uint64_t multiple constant multiplies"   2.56 sec   625.00 M     2.42
 6  "uint64_t multiple constant multiply2"   1.06 sec   1509.43 M     1.00
 7              "uint64_t constant divide"   2.68 sec   597.01 M     2.53
 8    "uint64_t multiple constant divides"   2.68 sec   597.01 M     2.53
 9    "uint64_t multiple constant divide2"   1.06 sec   1509.43 M     1.00
10      "uint64_t multiple constant mixed"   0.80 sec   2000.00 M     0.75
11                 "uint64_t constant and"   0.97 sec   1649.48 M     0.92
12        "uint64_t multiple constant and"   0.96 sec   1666.67 M     0.91
13                  "uint64_t constant or"   0.97 sec   1649.48 M     0.92
14         "uint64_t multiple constant or"   0.97 sec   1649.48 M     0.92
15                 "uint64_t constant xor"   0.96 sec   1666.67 M     0.91
16        "uint64_t multiple constant xor"   0.97 sec   1649.48 M     0.92

Total absolute time for uint64_t constant folding: 23.47 sec

test              description   absolute   operations   ratio with
number                          time       per second   test0

 0           "float constant"  20.09 sec   796.42 M     1.00
 1      "float add constants"  20.10 sec   796.02 M     1.00
 2 "float subtract constants"  20.15 sec   794.04 M     1.00
 3 "float multiply constants"  20.13 sec   794.83 M     1.00
 4   "float divide constants"  20.08 sec   796.81 M     1.00

Total absolute time for float simple constant folding: 100.55 sec

test                        description   absolute   operations   ratio with
number                                    time       per second   test0

 0                 "float constant add"   2.01 sec   796.02 M     1.00
 1       "float multiple constant adds"   3.36 sec   476.19 M     1.67
 2            "float constant subtract"   2.01 sec   796.02 M     1.00
 3  "float multiple constant subtracts"   3.35 sec   477.61 M     1.67
 4            "float constant multiply"   2.01 sec   796.02 M     1.00
 5 "float multiple constant multiplies"   2.21 sec   723.98 M     1.10
 6  "float multiple constant multiply2"   2.01 sec   796.02 M     1.00
 7              "float constant divide"  11.55 sec   138.53 M     5.75
 8    "float multiple constant divides"  22.80 sec   70.18 M     11.34
 9    "float multiple constant divide2"   2.01 sec   796.02 M     1.00
10      "float multiple constant mixed"   2.11 sec   758.29 M     1.05

Total absolute time for float constant folding: 55.43 sec

test               description   absolute   operations   ratio with
number                           time       per second   test0

 0           "double constant"  20.08 sec   796.81 M     1.00
 1      "double add constants"  20.09 sec   796.42 M     1.00
 2 "double subtract constants"  20.16 sec   793.65 M     1.00
 3 "double multiply constants"  20.08 sec   796.81 M     1.00
 4   "double divide constants"  20.08 sec   796.81 M     1.00

Total absolute time for double simple constant folding: 100.49 sec

test                         description   absolute   operations   ratio with
number                                     time       per second   test0

 0                 "double constant add"   2.03 sec   788.18 M     1.00
 1       "double multiple constant adds"   3.35 sec   477.61 M     1.65
 2            "double constant subtract"   2.03 sec   788.18 M     1.00
 3  "double multiple constant subtracts"   3.36 sec   476.19 M     1.66
 4            "double constant multiply"   2.01 sec   796.02 M     0.99
 5 "double multiple constant multiplies"   2.33 sec   686.70 M     1.15
 6  "double multiple constant multiply2"   2.03 sec   788.18 M     1.00
 7              "double constant divide"  21.01 sec   76.15 M     10.35
 8    "double multiple constant divides"  41.58 sec   38.48 M     20.48
 9    "double multiple constant divide2"   2.03 sec   788.18 M     1.00
10      "double multiple constant mixed"   2.12 sec   754.72 M     1.04

Total absolute time for double constant folding: 83.88 sec

[-- Attachment #6: gmon46.prof --]
[-- Type: text/plain, Size: 68274 bytes --]

Flat profile:

Each sample counts as 0.01 seconds.
  %   cumulative   self              self     total           
 time   seconds   seconds    calls   s/call   s/call  name    
 54.23    253.63   253.63                             main
  8.09    291.45    37.82        1    37.82    37.82  void test_constant<double, custom_multiple_constant_divide<double> >(double*, int, char const*)
  4.43    312.18    20.73        1    20.73    20.73  void test_constant<float, custom_multiple_constant_divide<float> >(float*, int, char const*)
  4.08    331.28    19.10        1    19.10    19.10  void test_constant<double, custom_constant_divide<double> >(double*, int, char const*)
  2.25    341.79    10.50        1    10.50    10.50  void test_constant<float, custom_constant_divide<float> >(float*, int, char const*)
  1.17    347.28     5.49        1     5.49     5.49  void test_constant<signed char, custom_multiple_constant_divide<signed char> >(signed char*, int, char const*)
  0.78    350.94     3.66        1     3.66     3.66  void test_constant<short, custom_multiple_constant_divide<short> >(short*, int, char const*)
  0.75    354.47     3.53        1     3.53     3.53  void test_constant<short, custom_constant_divide<short> >(short*, int, char const*)
  0.75    357.97     3.50        1     3.50     3.50  void test_constant<signed char, custom_constant_divide<signed char> >(signed char*, int, char const*)
  0.65    361.03     3.06        1     3.06     3.06  void test_constant<short, custom_multiple_constant_multiply<short> >(short*, int, char const*)
  0.65    364.08     3.05        1     3.05     3.05  void test_constant<double, custom_multiple_constant_add<double> >(double*, int, char const*)
  0.65    367.13     3.05        1     3.05     3.05  void test_constant<double, custom_multiple_constant_sub<double> >(double*, int, char const*)
  0.65    370.18     3.05        1     3.05     3.05  void test_constant<float, custom_multiple_constant_add<float> >(float*, int, char const*)
  0.65    373.23     3.05        1     3.05     3.05  void test_constant<float, custom_multiple_constant_sub<float> >(float*, int, char const*)
  0.65    376.28     3.05        1     3.05     3.05  void test_constant<unsigned char, custom_constant_divide<unsigned char> >(unsigned char*, int, char const*)
  0.65    379.32     3.04        1     3.04     3.04  void test_constant<unsigned char, custom_multiple_constant_divide<unsigned char> >(unsigned char*, int, char const*)
  0.65    382.36     3.04        1     3.04     3.04  void test_constant<short, custom_constant_multiply<short> >(short*, int, char const*)
  0.56    384.96     2.60        1     2.60     2.60  void test_constant<signed char, custom_multiple_constant_add<signed char> >(signed char*, int, char const*)
  0.56    387.56     2.60        1     2.60     2.60  void test_constant<short, custom_multiple_constant_multiply2<short> >(short*, int, char const*)
  0.55    390.15     2.59        1     2.59     2.59  void test_constant<signed char, custom_multiple_constant_sub<signed char> >(signed char*, int, char const*)
  0.55    392.74     2.59        1     2.59     2.59  void test_constant<signed char, custom_multiple_constant_multiply2<signed char> >(signed char*, int, char const*)
  0.55    395.33     2.59        1     2.59     2.59  void test_constant<short, custom_constant_add<short> >(short*, int, char const*)
  0.55    397.92     2.59        1     2.59     2.59  void test_constant<short, custom_constant_sub<short> >(short*, int, char const*)
  0.55    400.51     2.59        1     2.59     2.59  void test_constant<short, custom_multiple_constant_add<short> >(short*, int, char const*)
  0.55    403.10     2.59        1     2.59     2.59  void test_constant<short, custom_multiple_constant_sub<short> >(short*, int, char const*)
  0.55    405.69     2.59        1     2.59     2.59  void test_constant<short, custom_multiple_constant_divide2<short> >(short*, int, char const*)
  0.55    408.27     2.58        1     2.58     2.58  void test_constant<signed char, custom_constant_add<signed char> >(signed char*, int, char const*)
  0.55    410.85     2.58        1     2.58     2.58  void test_constant<signed char, custom_constant_sub<signed char> >(signed char*, int, char const*)
  0.55    413.44     2.58        1     2.58     2.58  void test_constant<signed char, custom_multiple_constant_divide2<signed char> >(signed char*, int, char const*)
  0.46    415.57     2.13        1     2.13     2.13  void test_constant<double, custom_multiple_constant_multiply<double> >(double*, int, char const*)
  0.43    417.58     2.01        1     2.01     2.01  void test_constant<float, custom_multiple_constant_multiply<float> >(float*, int, char const*)
  0.41    419.51     1.93        1     1.93     1.93  void test_constant<double, custom_multiple_constant_mixed<double> >(double*, int, char const*)
  0.41    421.42     1.91        1     1.91     1.91  void test_constant<float, custom_multiple_constant_mixed<float> >(float*, int, char const*)
  0.39    423.26     1.84        1     1.84     1.84  void test_constant<double, custom_constant_add<double> >(double*, int, char const*)
  0.39    425.10     1.84        1     1.84     1.84  void test_constant<double, custom_multiple_constant_divide2<double> >(double*, int, char const*)
  0.39    426.94     1.84        1     1.84     1.84  void test_constant<double, custom_constant_sub<double> >(double*, int, char const*)
  0.39    428.78     1.84        1     1.84     1.84  void test_constant<double, custom_multiple_constant_multiply2<double> >(double*, int, char const*)
  0.39    430.61     1.83        1     1.83     1.83  void test_constant<double, custom_constant_multiply<double> >(double*, int, char const*)
  0.39    432.44     1.83        1     1.83     1.83  void test_constant<float, custom_constant_multiply<float> >(float*, int, char const*)
  0.39    434.27     1.83        1     1.83     1.83  void test_constant<float, custom_multiple_constant_divide2<float> >(float*, int, char const*)
  0.39    436.10     1.83        1     1.83     1.83  void test_constant<float, custom_multiple_constant_multiply2<float> >(float*, int, char const*)
  0.39    437.93     1.83        1     1.83     1.83  void test_constant<float, custom_constant_add<float> >(float*, int, char const*)
  0.39    439.75     1.82        1     1.82     1.82  void test_constant<float, custom_constant_sub<float> >(float*, int, char const*)
  0.35    441.41     1.66        1     1.66     1.66  void test_constant<unsigned short, custom_constant_divide<unsigned short> >(unsigned short*, int, char const*)
  0.35    443.06     1.65        1     1.65     1.65  void test_constant<unsigned short, custom_multiple_constant_divide<unsigned short> >(unsigned short*, int, char const*)
  0.29    444.40     1.34        1     1.34     1.34  void test_constant<signed char, custom_constant_xor<signed char> >(signed char*, int, char const*)
  0.28    445.73     1.33        1     1.33     1.33  void test_constant<signed char, custom_multiple_constant_xor<signed char> >(signed char*, int, char const*)
  0.28    447.05     1.32        1     1.32     1.32  void test_constant<signed char, custom_multiple_constant_and<signed char> >(signed char*, int, char const*)
  0.28    448.36     1.31        1     1.31     1.31  void test_constant<signed char, custom_constant_or<signed char> >(signed char*, int, char const*)
  0.28    449.67     1.31        1     1.31     1.31  void test_constant<signed char, custom_constant_and<signed char> >(signed char*, int, char const*)
  0.28    450.98     1.31        1     1.31     1.31  void test_constant<short, custom_constant_or<short> >(short*, int, char const*)
  0.28    452.29     1.31        1     1.31     1.31  void test_constant<short, custom_constant_and<short> >(short*, int, char const*)
  0.28    453.60     1.31        1     1.31     1.31  void test_constant<short, custom_constant_xor<short> >(short*, int, char const*)
  0.28    454.91     1.31        1     1.31     1.31  void test_constant<short, custom_multiple_constant_or<short> >(short*, int, char const*)
  0.28    456.22     1.31        1     1.31     1.31  void test_constant<short, custom_multiple_constant_and<short> >(short*, int, char const*)
  0.28    457.53     1.31        1     1.31     1.31  void test_constant<short, custom_multiple_constant_xor<short> >(short*, int, char const*)
  0.28    458.83     1.30        1     1.30     1.30  void test_constant<signed char, custom_multiple_constant_or<signed char> >(signed char*, int, char const*)
  0.27    460.11     1.28        1     1.28     1.28  void test_constant<int, custom_multiple_constant_multiply<int> >(int*, int, char const*)
  0.19    460.99     0.88        1     0.88     0.88  void test_constant<signed char, custom_multiple_constant_mixed<signed char> >(signed char*, int, char const*)
  0.19    461.87     0.88        1     0.88     0.88  void test_constant<short, custom_multiple_constant_mixed<short> >(short*, int, char const*)
  0.08    462.23     0.36        1     0.36     0.36  void test_constant<int, custom_constant_add<int> >(int*, int, char const*)
  0.08    462.59     0.36        1     0.36     0.36  void test_constant<int, custom_multiple_constant_sub<int> >(int*, int, char const*)
  0.07    462.94     0.35        1     0.35     0.35  void test_constant<int, custom_constant_or<int> >(int*, int, char const*)
  0.07    463.29     0.35        1     0.35     0.35  void test_constant<int, custom_constant_and<int> >(int*, int, char const*)
  0.07    463.64     0.35        1     0.35     0.35  void test_constant<int, custom_constant_sub<int> >(int*, int, char const*)
  0.07    463.99     0.35        1     0.35     0.35  void test_constant<int, custom_multiple_constant_multiply2<int> >(int*, int, char const*)
  0.04    464.19     0.20        1     0.20     0.20  void test_constant<unsigned short, custom_multiple_constant_multiply<unsigned short> >(unsigned short*, int, char const*)
  0.04    464.39     0.20        1     0.20     0.20  void test_constant<unsigned short, custom_constant_multiply<unsigned short> >(unsigned short*, int, char const*)
  0.04    464.57     0.18        1     0.18     0.18  void test_constant<unsigned short, custom_constant_sub<unsigned short> >(unsigned short*, int, char const*)
  0.04    464.75     0.18        1     0.18     0.18  void test_constant<unsigned short, custom_constant_xor<unsigned short> >(unsigned short*, int, char const*)
  0.04    464.93     0.18        1     0.18     0.18  void test_constant<unsigned short, custom_multiple_constant_or<unsigned short> >(unsigned short*, int, char const*)
  0.04    465.11     0.18        1     0.18     0.18  void test_constant<unsigned short, custom_multiple_constant_add<unsigned short> >(unsigned short*, int, char const*)
  0.04    465.29     0.18        1     0.18     0.18  void test_constant<unsigned short, custom_multiple_constant_and<unsigned short> >(unsigned short*, int, char const*)
  0.04    465.47     0.18        1     0.18     0.18  void test_constant<unsigned short, custom_multiple_constant_sub<unsigned short> >(unsigned short*, int, char const*)
  0.04    465.65     0.18        1     0.18     0.18  void test_constant<unsigned short, custom_multiple_constant_divide2<unsigned short> >(unsigned short*, int, char const*)
  0.04    465.83     0.18        1     0.18     0.18  void test_constant<unsigned short, custom_multiple_constant_multiply2<unsigned short> >(unsigned short*, int, char const*)
  0.04    466.00     0.17        1     0.17     0.17  void test_constant<unsigned short, custom_constant_or<unsigned short> >(unsigned short*, int, char const*)
  0.04    466.17     0.17        1     0.17     0.17  void test_constant<unsigned short, custom_constant_add<unsigned short> >(unsigned short*, int, char const*)
  0.04    466.34     0.17        1     0.17     0.17  void test_constant<unsigned short, custom_constant_and<unsigned short> >(unsigned short*, int, char const*)
  0.04    466.51     0.17        1     0.17     0.17  void test_constant<unsigned short, custom_multiple_constant_xor<unsigned short> >(unsigned short*, int, char const*)
  0.03    466.67     0.16        1     0.16     0.16  void test_constant<unsigned short, custom_multiple_constant_mixed<unsigned short> >(unsigned short*, int, char const*)
  0.02    466.77     0.10        1     0.10     0.10  void test_constant<unsigned char, custom_multiple_constant_add<unsigned char> >(unsigned char*, int, char const*)
  0.02    466.86     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_constant_or<unsigned char> >(unsigned char*, int, char const*)
  0.02    466.95     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_constant_add<unsigned char> >(unsigned char*, int, char const*)
  0.02    467.04     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_constant_and<unsigned char> >(unsigned char*, int, char const*)
  0.02    467.13     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_constant_sub<unsigned char> >(unsigned char*, int, char const*)
  0.02    467.22     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_constant_xor<unsigned char> >(unsigned char*, int, char const*)
  0.02    467.31     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_multiple_constant_or<unsigned char> >(unsigned char*, int, char const*)
  0.02    467.40     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_multiple_constant_and<unsigned char> >(unsigned char*, int, char const*)
  0.02    467.49     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_multiple_constant_sub<unsigned char> >(unsigned char*, int, char const*)
  0.02    467.58     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_multiple_constant_xor<unsigned char> >(unsigned char*, int, char const*)
  0.02    467.67     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_multiple_constant_divide2<unsigned char> >(unsigned char*, int, char const*)
  0.02    467.76     0.09        1     0.09     0.09  void test_constant<unsigned char, custom_multiple_constant_multiply2<unsigned char> >(unsigned char*, int, char const*)
  0.00    467.76     0.00      288     0.00     0.00  record_result(double, char const*)
  0.00    467.76     0.00      196     0.00     0.00  timer()
  0.00    467.76     0.00      164     0.00     0.00  start_timer()
  0.00    467.76     0.00       20     0.00     0.00  summarize(char const*, int, int, int, int)
  0.00    467.76     0.00        1     0.00     0.00  _GLOBAL__sub_I_results

 %         the percentage of the total running time of the
time       program used by this function.

cumulative a running sum of the number of seconds accounted
 seconds   for by this function and those listed above it.

 self      the number of seconds accounted for by this
seconds    function alone.  This is the major sort for this
           listing.

calls      the number of times this function was invoked, if
           this function is profiled, else blank.
 
 self      the average number of milliseconds spent in this
ms/call    function per call, if this function is profiled,
	   else blank.

 total     the average number of milliseconds spent in this
ms/call    function and its descendents per call, if this 
	   function is profiled, else blank.

name       the name of the function.  This is the minor sort
           for this listing. The index shows the location of
	   the function in the gprof listing. If the index is
	   in parenthesis it shows where it would appear in
	   the gprof listing if it were to be printed.
\f
		     Call graph (explanation follows)


granularity: each sample hit covers 2 byte(s) for 0.00% of 467.76 seconds

index % time    self  children    called     name
                                                 <spontaneous>
[1]    100.0  253.63  214.13                 main [1]
               37.82    0.00       1/1           void test_constant<double, custom_multiple_constant_divide<double> >(double*, int, char const*) [2]
               20.73    0.00       1/1           void test_constant<float, custom_multiple_constant_divide<float> >(float*, int, char const*) [3]
               19.10    0.00       1/1           void test_constant<double, custom_constant_divide<double> >(double*, int, char const*) [4]
               10.50    0.00       1/1           void test_constant<float, custom_constant_divide<float> >(float*, int, char const*) [5]
                5.49    0.00       1/1           void test_constant<signed char, custom_multiple_constant_divide<signed char> >(signed char*, int, char const*) [6]
                3.66    0.00       1/1           void test_constant<short, custom_multiple_constant_divide<short> >(short*, int, char const*) [7]
                3.53    0.00       1/1           void test_constant<short, custom_constant_divide<short> >(short*, int, char const*) [8]
                3.50    0.00       1/1           void test_constant<signed char, custom_constant_divide<signed char> >(signed char*, int, char const*) [9]
                3.06    0.00       1/1           void test_constant<short, custom_multiple_constant_multiply<short> >(short*, int, char const*) [10]
                3.05    0.00       1/1           void test_constant<unsigned char, custom_constant_divide<unsigned char> >(unsigned char*, int, char const*) [15]
                3.05    0.00       1/1           void test_constant<float, custom_multiple_constant_add<float> >(float*, int, char const*) [13]
                3.05    0.00       1/1           void test_constant<float, custom_multiple_constant_sub<float> >(float*, int, char const*) [14]
                3.05    0.00       1/1           void test_constant<double, custom_multiple_constant_add<double> >(double*, int, char const*) [11]
                3.05    0.00       1/1           void test_constant<double, custom_multiple_constant_sub<double> >(double*, int, char const*) [12]
                3.04    0.00       1/1           void test_constant<unsigned char, custom_multiple_constant_divide<unsigned char> >(unsigned char*, int, char const*) [16]
                3.04    0.00       1/1           void test_constant<short, custom_constant_multiply<short> >(short*, int, char const*) [17]
                2.60    0.00       1/1           void test_constant<signed char, custom_multiple_constant_add<signed char> >(signed char*, int, char const*) [18]
                2.60    0.00       1/1           void test_constant<short, custom_multiple_constant_multiply2<short> >(short*, int, char const*) [19]
                2.59    0.00       1/1           void test_constant<signed char, custom_multiple_constant_sub<signed char> >(signed char*, int, char const*) [20]
                2.59    0.00       1/1           void test_constant<signed char, custom_multiple_constant_multiply2<signed char> >(signed char*, int, char const*) [21]
                2.59    0.00       1/1           void test_constant<short, custom_constant_add<short> >(short*, int, char const*) [22]
                2.59    0.00       1/1           void test_constant<short, custom_multiple_constant_add<short> >(short*, int, char const*) [24]
                2.59    0.00       1/1           void test_constant<short, custom_constant_sub<short> >(short*, int, char const*) [23]
                2.59    0.00       1/1           void test_constant<short, custom_multiple_constant_sub<short> >(short*, int, char const*) [25]
                2.59    0.00       1/1           void test_constant<short, custom_multiple_constant_divide2<short> >(short*, int, char const*) [26]
                2.58    0.00       1/1           void test_constant<signed char, custom_constant_add<signed char> >(signed char*, int, char const*) [27]
                2.58    0.00       1/1           void test_constant<signed char, custom_constant_sub<signed char> >(signed char*, int, char const*) [28]
                2.58    0.00       1/1           void test_constant<signed char, custom_multiple_constant_divide2<signed char> >(signed char*, int, char const*) [29]
                2.13    0.00       1/1           void test_constant<double, custom_multiple_constant_multiply<double> >(double*, int, char const*) [30]
                2.01    0.00       1/1           void test_constant<float, custom_multiple_constant_multiply<float> >(float*, int, char const*) [31]
                1.93    0.00       1/1           void test_constant<double, custom_multiple_constant_mixed<double> >(double*, int, char const*) [32]
                1.91    0.00       1/1           void test_constant<float, custom_multiple_constant_mixed<float> >(float*, int, char const*) [33]
                1.84    0.00       1/1           void test_constant<double, custom_constant_add<double> >(double*, int, char const*) [34]
                1.84    0.00       1/1           void test_constant<double, custom_multiple_constant_divide2<double> >(double*, int, char const*) [35]
                1.84    0.00       1/1           void test_constant<double, custom_constant_sub<double> >(double*, int, char const*) [36]
                1.84    0.00       1/1           void test_constant<double, custom_multiple_constant_multiply2<double> >(double*, int, char const*) [37]
                1.83    0.00       1/1           void test_constant<float, custom_constant_multiply<float> >(float*, int, char const*) [39]
                1.83    0.00       1/1           void test_constant<float, custom_multiple_constant_multiply2<float> >(float*, int, char const*) [41]
                1.83    0.00       1/1           void test_constant<float, custom_multiple_constant_divide2<float> >(float*, int, char const*) [40]
                1.83    0.00       1/1           void test_constant<double, custom_constant_multiply<double> >(double*, int, char const*) [38]
                1.83    0.00       1/1           void test_constant<float, custom_constant_add<float> >(float*, int, char const*) [42]
                1.82    0.00       1/1           void test_constant<float, custom_constant_sub<float> >(float*, int, char const*) [43]
                1.66    0.00       1/1           void test_constant<unsigned short, custom_constant_divide<unsigned short> >(unsigned short*, int, char const*) [44]
                1.65    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_divide<unsigned short> >(unsigned short*, int, char const*) [45]
                1.34    0.00       1/1           void test_constant<signed char, custom_constant_xor<signed char> >(signed char*, int, char const*) [46]
                1.33    0.00       1/1           void test_constant<signed char, custom_multiple_constant_xor<signed char> >(signed char*, int, char const*) [47]
                1.32    0.00       1/1           void test_constant<signed char, custom_multiple_constant_and<signed char> >(signed char*, int, char const*) [48]
                1.31    0.00       1/1           void test_constant<signed char, custom_constant_and<signed char> >(signed char*, int, char const*) [50]
                1.31    0.00       1/1           void test_constant<signed char, custom_constant_or<signed char> >(signed char*, int, char const*) [49]
                1.31    0.00       1/1           void test_constant<short, custom_constant_and<short> >(short*, int, char const*) [52]
                1.31    0.00       1/1           void test_constant<short, custom_multiple_constant_and<short> >(short*, int, char const*) [55]
                1.31    0.00       1/1           void test_constant<short, custom_constant_or<short> >(short*, int, char const*) [51]
                1.31    0.00       1/1           void test_constant<short, custom_multiple_constant_or<short> >(short*, int, char const*) [54]
                1.31    0.00       1/1           void test_constant<short, custom_constant_xor<short> >(short*, int, char const*) [53]
                1.31    0.00       1/1           void test_constant<short, custom_multiple_constant_xor<short> >(short*, int, char const*) [56]
                1.30    0.00       1/1           void test_constant<signed char, custom_multiple_constant_or<signed char> >(signed char*, int, char const*) [57]
                1.28    0.00       1/1           void test_constant<int, custom_multiple_constant_multiply<int> >(int*, int, char const*) [58]
                0.88    0.00       1/1           void test_constant<signed char, custom_multiple_constant_mixed<signed char> >(signed char*, int, char const*) [59]
                0.88    0.00       1/1           void test_constant<short, custom_multiple_constant_mixed<short> >(short*, int, char const*) [60]
                0.36    0.00       1/1           void test_constant<int, custom_constant_add<int> >(int*, int, char const*) [61]
                0.36    0.00       1/1           void test_constant<int, custom_multiple_constant_sub<int> >(int*, int, char const*) [62]
                0.35    0.00       1/1           void test_constant<int, custom_constant_sub<int> >(int*, int, char const*) [65]
                0.35    0.00       1/1           void test_constant<int, custom_multiple_constant_multiply2<int> >(int*, int, char const*) [66]
                0.35    0.00       1/1           void test_constant<int, custom_constant_and<int> >(int*, int, char const*) [64]
                0.35    0.00       1/1           void test_constant<int, custom_constant_or<int> >(int*, int, char const*) [63]
                0.20    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [67]
                0.20    0.00       1/1           void test_constant<unsigned short, custom_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [68]
                0.18    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_add<unsigned short> >(unsigned short*, int, char const*) [72]
                0.18    0.00       1/1           void test_constant<unsigned short, custom_constant_sub<unsigned short> >(unsigned short*, int, char const*) [69]
                0.18    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_sub<unsigned short> >(unsigned short*, int, char const*) [74]
                0.18    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_multiply2<unsigned short> >(unsigned short*, int, char const*) [76]
                0.18    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_divide2<unsigned short> >(unsigned short*, int, char const*) [75]
                0.18    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_and<unsigned short> >(unsigned short*, int, char const*) [73]
                0.18    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_or<unsigned short> >(unsigned short*, int, char const*) [71]
                0.18    0.00       1/1           void test_constant<unsigned short, custom_constant_xor<unsigned short> >(unsigned short*, int, char const*) [70]
                0.17    0.00       1/1           void test_constant<unsigned short, custom_constant_add<unsigned short> >(unsigned short*, int, char const*) [78]
                0.17    0.00       1/1           void test_constant<unsigned short, custom_constant_and<unsigned short> >(unsigned short*, int, char const*) [79]
                0.17    0.00       1/1           void test_constant<unsigned short, custom_constant_or<unsigned short> >(unsigned short*, int, char const*) [77]
                0.17    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_xor<unsigned short> >(unsigned short*, int, char const*) [80]
                0.16    0.00       1/1           void test_constant<unsigned short, custom_multiple_constant_mixed<unsigned short> >(unsigned short*, int, char const*) [81]
                0.10    0.00       1/1           void test_constant<unsigned char, custom_multiple_constant_add<unsigned char> >(unsigned char*, int, char const*) [82]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_constant_add<unsigned char> >(unsigned char*, int, char const*) [84]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_constant_sub<unsigned char> >(unsigned char*, int, char const*) [86]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_multiple_constant_sub<unsigned char> >(unsigned char*, int, char const*) [90]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_multiple_constant_multiply2<unsigned char> >(unsigned char*, int, char const*) [93]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_multiple_constant_divide2<unsigned char> >(unsigned char*, int, char const*) [92]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_constant_and<unsigned char> >(unsigned char*, int, char const*) [85]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_multiple_constant_and<unsigned char> >(unsigned char*, int, char const*) [89]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_constant_or<unsigned char> >(unsigned char*, int, char const*) [83]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_multiple_constant_or<unsigned char> >(unsigned char*, int, char const*) [88]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_constant_xor<unsigned char> >(unsigned char*, int, char const*) [87]
                0.09    0.00       1/1           void test_constant<unsigned char, custom_multiple_constant_xor<unsigned char> >(unsigned char*, int, char const*) [91]
                0.00    0.00     288/288         record_result(double, char const*) [100]
                0.00    0.00     196/196         timer() [101]
                0.00    0.00     164/164         start_timer() [102]
                0.00    0.00      20/20          summarize(char const*, int, int, int, int) [103]
-----------------------------------------------
               37.82    0.00       1/1           main [1]
[2]      8.1   37.82    0.00       1         void test_constant<double, custom_multiple_constant_divide<double> >(double*, int, char const*) [2]
-----------------------------------------------
               20.73    0.00       1/1           main [1]
[3]      4.4   20.73    0.00       1         void test_constant<float, custom_multiple_constant_divide<float> >(float*, int, char const*) [3]
-----------------------------------------------
               19.10    0.00       1/1           main [1]
[4]      4.1   19.10    0.00       1         void test_constant<double, custom_constant_divide<double> >(double*, int, char const*) [4]
-----------------------------------------------
               10.50    0.00       1/1           main [1]
[5]      2.2   10.50    0.00       1         void test_constant<float, custom_constant_divide<float> >(float*, int, char const*) [5]
-----------------------------------------------
                5.49    0.00       1/1           main [1]
[6]      1.2    5.49    0.00       1         void test_constant<signed char, custom_multiple_constant_divide<signed char> >(signed char*, int, char const*) [6]
-----------------------------------------------
                3.66    0.00       1/1           main [1]
[7]      0.8    3.66    0.00       1         void test_constant<short, custom_multiple_constant_divide<short> >(short*, int, char const*) [7]
-----------------------------------------------
                3.53    0.00       1/1           main [1]
[8]      0.8    3.53    0.00       1         void test_constant<short, custom_constant_divide<short> >(short*, int, char const*) [8]
-----------------------------------------------
                3.50    0.00       1/1           main [1]
[9]      0.7    3.50    0.00       1         void test_constant<signed char, custom_constant_divide<signed char> >(signed char*, int, char const*) [9]
-----------------------------------------------
                3.06    0.00       1/1           main [1]
[10]     0.7    3.06    0.00       1         void test_constant<short, custom_multiple_constant_multiply<short> >(short*, int, char const*) [10]
-----------------------------------------------
                3.05    0.00       1/1           main [1]
[11]     0.7    3.05    0.00       1         void test_constant<double, custom_multiple_constant_add<double> >(double*, int, char const*) [11]
-----------------------------------------------
                3.05    0.00       1/1           main [1]
[12]     0.7    3.05    0.00       1         void test_constant<double, custom_multiple_constant_sub<double> >(double*, int, char const*) [12]
-----------------------------------------------
                3.05    0.00       1/1           main [1]
[13]     0.7    3.05    0.00       1         void test_constant<float, custom_multiple_constant_add<float> >(float*, int, char const*) [13]
-----------------------------------------------
                3.05    0.00       1/1           main [1]
[14]     0.7    3.05    0.00       1         void test_constant<float, custom_multiple_constant_sub<float> >(float*, int, char const*) [14]
-----------------------------------------------
                3.05    0.00       1/1           main [1]
[15]     0.7    3.05    0.00       1         void test_constant<unsigned char, custom_constant_divide<unsigned char> >(unsigned char*, int, char const*) [15]
-----------------------------------------------
                3.04    0.00       1/1           main [1]
[16]     0.6    3.04    0.00       1         void test_constant<unsigned char, custom_multiple_constant_divide<unsigned char> >(unsigned char*, int, char const*) [16]
-----------------------------------------------
                3.04    0.00       1/1           main [1]
[17]     0.6    3.04    0.00       1         void test_constant<short, custom_constant_multiply<short> >(short*, int, char const*) [17]
-----------------------------------------------
                2.60    0.00       1/1           main [1]
[18]     0.6    2.60    0.00       1         void test_constant<signed char, custom_multiple_constant_add<signed char> >(signed char*, int, char const*) [18]
-----------------------------------------------
                2.60    0.00       1/1           main [1]
[19]     0.6    2.60    0.00       1         void test_constant<short, custom_multiple_constant_multiply2<short> >(short*, int, char const*) [19]
-----------------------------------------------
                2.59    0.00       1/1           main [1]
[20]     0.6    2.59    0.00       1         void test_constant<signed char, custom_multiple_constant_sub<signed char> >(signed char*, int, char const*) [20]
-----------------------------------------------
                2.59    0.00       1/1           main [1]
[21]     0.6    2.59    0.00       1         void test_constant<signed char, custom_multiple_constant_multiply2<signed char> >(signed char*, int, char const*) [21]
-----------------------------------------------
                2.59    0.00       1/1           main [1]
[22]     0.6    2.59    0.00       1         void test_constant<short, custom_constant_add<short> >(short*, int, char const*) [22]
-----------------------------------------------
                2.59    0.00       1/1           main [1]
[23]     0.6    2.59    0.00       1         void test_constant<short, custom_constant_sub<short> >(short*, int, char const*) [23]
-----------------------------------------------
                2.59    0.00       1/1           main [1]
[24]     0.6    2.59    0.00       1         void test_constant<short, custom_multiple_constant_add<short> >(short*, int, char const*) [24]
-----------------------------------------------
                2.59    0.00       1/1           main [1]
[25]     0.6    2.59    0.00       1         void test_constant<short, custom_multiple_constant_sub<short> >(short*, int, char const*) [25]
-----------------------------------------------
                2.59    0.00       1/1           main [1]
[26]     0.6    2.59    0.00       1         void test_constant<short, custom_multiple_constant_divide2<short> >(short*, int, char const*) [26]
-----------------------------------------------
                2.58    0.00       1/1           main [1]
[27]     0.6    2.58    0.00       1         void test_constant<signed char, custom_constant_add<signed char> >(signed char*, int, char const*) [27]
-----------------------------------------------
                2.58    0.00       1/1           main [1]
[28]     0.6    2.58    0.00       1         void test_constant<signed char, custom_constant_sub<signed char> >(signed char*, int, char const*) [28]
-----------------------------------------------
                2.58    0.00       1/1           main [1]
[29]     0.6    2.58    0.00       1         void test_constant<signed char, custom_multiple_constant_divide2<signed char> >(signed char*, int, char const*) [29]
-----------------------------------------------
                2.13    0.00       1/1           main [1]
[30]     0.5    2.13    0.00       1         void test_constant<double, custom_multiple_constant_multiply<double> >(double*, int, char const*) [30]
-----------------------------------------------
                2.01    0.00       1/1           main [1]
[31]     0.4    2.01    0.00       1         void test_constant<float, custom_multiple_constant_multiply<float> >(float*, int, char const*) [31]
-----------------------------------------------
                1.93    0.00       1/1           main [1]
[32]     0.4    1.93    0.00       1         void test_constant<double, custom_multiple_constant_mixed<double> >(double*, int, char const*) [32]
-----------------------------------------------
                1.91    0.00       1/1           main [1]
[33]     0.4    1.91    0.00       1         void test_constant<float, custom_multiple_constant_mixed<float> >(float*, int, char const*) [33]
-----------------------------------------------
                1.84    0.00       1/1           main [1]
[34]     0.4    1.84    0.00       1         void test_constant<double, custom_constant_add<double> >(double*, int, char const*) [34]
-----------------------------------------------
                1.84    0.00       1/1           main [1]
[35]     0.4    1.84    0.00       1         void test_constant<double, custom_multiple_constant_divide2<double> >(double*, int, char const*) [35]
-----------------------------------------------
                1.84    0.00       1/1           main [1]
[36]     0.4    1.84    0.00       1         void test_constant<double, custom_constant_sub<double> >(double*, int, char const*) [36]
-----------------------------------------------
                1.84    0.00       1/1           main [1]
[37]     0.4    1.84    0.00       1         void test_constant<double, custom_multiple_constant_multiply2<double> >(double*, int, char const*) [37]
-----------------------------------------------
                1.83    0.00       1/1           main [1]
[38]     0.4    1.83    0.00       1         void test_constant<double, custom_constant_multiply<double> >(double*, int, char const*) [38]
-----------------------------------------------
                1.83    0.00       1/1           main [1]
[39]     0.4    1.83    0.00       1         void test_constant<float, custom_constant_multiply<float> >(float*, int, char const*) [39]
-----------------------------------------------
                1.83    0.00       1/1           main [1]
[40]     0.4    1.83    0.00       1         void test_constant<float, custom_multiple_constant_divide2<float> >(float*, int, char const*) [40]
-----------------------------------------------
                1.83    0.00       1/1           main [1]
[41]     0.4    1.83    0.00       1         void test_constant<float, custom_multiple_constant_multiply2<float> >(float*, int, char const*) [41]
-----------------------------------------------
                1.83    0.00       1/1           main [1]
[42]     0.4    1.83    0.00       1         void test_constant<float, custom_constant_add<float> >(float*, int, char const*) [42]
-----------------------------------------------
                1.82    0.00       1/1           main [1]
[43]     0.4    1.82    0.00       1         void test_constant<float, custom_constant_sub<float> >(float*, int, char const*) [43]
-----------------------------------------------
                1.66    0.00       1/1           main [1]
[44]     0.4    1.66    0.00       1         void test_constant<unsigned short, custom_constant_divide<unsigned short> >(unsigned short*, int, char const*) [44]
-----------------------------------------------
                1.65    0.00       1/1           main [1]
[45]     0.4    1.65    0.00       1         void test_constant<unsigned short, custom_multiple_constant_divide<unsigned short> >(unsigned short*, int, char const*) [45]
-----------------------------------------------
                1.34    0.00       1/1           main [1]
[46]     0.3    1.34    0.00       1         void test_constant<signed char, custom_constant_xor<signed char> >(signed char*, int, char const*) [46]
-----------------------------------------------
                1.33    0.00       1/1           main [1]
[47]     0.3    1.33    0.00       1         void test_constant<signed char, custom_multiple_constant_xor<signed char> >(signed char*, int, char const*) [47]
-----------------------------------------------
                1.32    0.00       1/1           main [1]
[48]     0.3    1.32    0.00       1         void test_constant<signed char, custom_multiple_constant_and<signed char> >(signed char*, int, char const*) [48]
-----------------------------------------------
                1.31    0.00       1/1           main [1]
[49]     0.3    1.31    0.00       1         void test_constant<signed char, custom_constant_or<signed char> >(signed char*, int, char const*) [49]
-----------------------------------------------
                1.31    0.00       1/1           main [1]
[50]     0.3    1.31    0.00       1         void test_constant<signed char, custom_constant_and<signed char> >(signed char*, int, char const*) [50]
-----------------------------------------------
                1.31    0.00       1/1           main [1]
[51]     0.3    1.31    0.00       1         void test_constant<short, custom_constant_or<short> >(short*, int, char const*) [51]
-----------------------------------------------
                1.31    0.00       1/1           main [1]
[52]     0.3    1.31    0.00       1         void test_constant<short, custom_constant_and<short> >(short*, int, char const*) [52]
-----------------------------------------------
                1.31    0.00       1/1           main [1]
[53]     0.3    1.31    0.00       1         void test_constant<short, custom_constant_xor<short> >(short*, int, char const*) [53]
-----------------------------------------------
                1.31    0.00       1/1           main [1]
[54]     0.3    1.31    0.00       1         void test_constant<short, custom_multiple_constant_or<short> >(short*, int, char const*) [54]
-----------------------------------------------
                1.31    0.00       1/1           main [1]
[55]     0.3    1.31    0.00       1         void test_constant<short, custom_multiple_constant_and<short> >(short*, int, char const*) [55]
-----------------------------------------------
                1.31    0.00       1/1           main [1]
[56]     0.3    1.31    0.00       1         void test_constant<short, custom_multiple_constant_xor<short> >(short*, int, char const*) [56]
-----------------------------------------------
                1.30    0.00       1/1           main [1]
[57]     0.3    1.30    0.00       1         void test_constant<signed char, custom_multiple_constant_or<signed char> >(signed char*, int, char const*) [57]
-----------------------------------------------
                1.28    0.00       1/1           main [1]
[58]     0.3    1.28    0.00       1         void test_constant<int, custom_multiple_constant_multiply<int> >(int*, int, char const*) [58]
-----------------------------------------------
                0.88    0.00       1/1           main [1]
[59]     0.2    0.88    0.00       1         void test_constant<signed char, custom_multiple_constant_mixed<signed char> >(signed char*, int, char const*) [59]
-----------------------------------------------
                0.88    0.00       1/1           main [1]
[60]     0.2    0.88    0.00       1         void test_constant<short, custom_multiple_constant_mixed<short> >(short*, int, char const*) [60]
-----------------------------------------------
                0.36    0.00       1/1           main [1]
[61]     0.1    0.36    0.00       1         void test_constant<int, custom_constant_add<int> >(int*, int, char const*) [61]
-----------------------------------------------
                0.36    0.00       1/1           main [1]
[62]     0.1    0.36    0.00       1         void test_constant<int, custom_multiple_constant_sub<int> >(int*, int, char const*) [62]
-----------------------------------------------
                0.35    0.00       1/1           main [1]
[63]     0.1    0.35    0.00       1         void test_constant<int, custom_constant_or<int> >(int*, int, char const*) [63]
-----------------------------------------------
                0.35    0.00       1/1           main [1]
[64]     0.1    0.35    0.00       1         void test_constant<int, custom_constant_and<int> >(int*, int, char const*) [64]
-----------------------------------------------
                0.35    0.00       1/1           main [1]
[65]     0.1    0.35    0.00       1         void test_constant<int, custom_constant_sub<int> >(int*, int, char const*) [65]
-----------------------------------------------
                0.35    0.00       1/1           main [1]
[66]     0.1    0.35    0.00       1         void test_constant<int, custom_multiple_constant_multiply2<int> >(int*, int, char const*) [66]
-----------------------------------------------
                0.20    0.00       1/1           main [1]
[67]     0.0    0.20    0.00       1         void test_constant<unsigned short, custom_multiple_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [67]
-----------------------------------------------
                0.20    0.00       1/1           main [1]
[68]     0.0    0.20    0.00       1         void test_constant<unsigned short, custom_constant_multiply<unsigned short> >(unsigned short*, int, char const*) [68]
-----------------------------------------------
                0.18    0.00       1/1           main [1]
[69]     0.0    0.18    0.00       1         void test_constant<unsigned short, custom_constant_sub<unsigned short> >(unsigned short*, int, char const*) [69]
-----------------------------------------------
                0.18    0.00       1/1           main [1]
[70]     0.0    0.18    0.00       1         void test_constant<unsigned short, custom_constant_xor<unsigned short> >(unsigned short*, int, char const*) [70]
-----------------------------------------------
                0.18    0.00       1/1           main [1]
[71]     0.0    0.18    0.00       1         void test_constant<unsigned short, custom_multiple_constant_or<unsigned short> >(unsigned short*, int, char const*) [71]
-----------------------------------------------
                0.18    0.00       1/1           main [1]
[72]     0.0    0.18    0.00       1         void test_constant<unsigned short, custom_multiple_constant_add<unsigned short> >(unsigned short*, int, char const*) [72]
-----------------------------------------------
                0.18    0.00       1/1           main [1]
[73]     0.0    0.18    0.00       1         void test_constant<unsigned short, custom_multiple_constant_and<unsigned short> >(unsigned short*, int, char const*) [73]
-----------------------------------------------
                0.18    0.00       1/1           main [1]
[74]     0.0    0.18    0.00       1         void test_constant<unsigned short, custom_multiple_constant_sub<unsigned short> >(unsigned short*, int, char const*) [74]
-----------------------------------------------
                0.18    0.00       1/1           main [1]
[75]     0.0    0.18    0.00       1         void test_constant<unsigned short, custom_multiple_constant_divide2<unsigned short> >(unsigned short*, int, char const*) [75]
-----------------------------------------------
                0.18    0.00       1/1           main [1]
[76]     0.0    0.18    0.00       1         void test_constant<unsigned short, custom_multiple_constant_multiply2<unsigned short> >(unsigned short*, int, char const*) [76]
-----------------------------------------------
                0.17    0.00       1/1           main [1]
[77]     0.0    0.17    0.00       1         void test_constant<unsigned short, custom_constant_or<unsigned short> >(unsigned short*, int, char const*) [77]
-----------------------------------------------
                0.17    0.00       1/1           main [1]
[78]     0.0    0.17    0.00       1         void test_constant<unsigned short, custom_constant_add<unsigned short> >(unsigned short*, int, char const*) [78]
-----------------------------------------------
                0.17    0.00       1/1           main [1]
[79]     0.0    0.17    0.00       1         void test_constant<unsigned short, custom_constant_and<unsigned short> >(unsigned short*, int, char const*) [79]
-----------------------------------------------
                0.17    0.00       1/1           main [1]
[80]     0.0    0.17    0.00       1         void test_constant<unsigned short, custom_multiple_constant_xor<unsigned short> >(unsigned short*, int, char const*) [80]
-----------------------------------------------
                0.16    0.00       1/1           main [1]
[81]     0.0    0.16    0.00       1         void test_constant<unsigned short, custom_multiple_constant_mixed<unsigned short> >(unsigned short*, int, char const*) [81]
-----------------------------------------------
                0.10    0.00       1/1           main [1]
[82]     0.0    0.10    0.00       1         void test_constant<unsigned char, custom_multiple_constant_add<unsigned char> >(unsigned char*, int, char const*) [82]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[83]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_constant_or<unsigned char> >(unsigned char*, int, char const*) [83]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[84]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_constant_add<unsigned char> >(unsigned char*, int, char const*) [84]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[85]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_constant_and<unsigned char> >(unsigned char*, int, char const*) [85]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[86]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_constant_sub<unsigned char> >(unsigned char*, int, char const*) [86]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[87]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_constant_xor<unsigned char> >(unsigned char*, int, char const*) [87]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[88]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_multiple_constant_or<unsigned char> >(unsigned char*, int, char const*) [88]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[89]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_multiple_constant_and<unsigned char> >(unsigned char*, int, char const*) [89]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[90]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_multiple_constant_sub<unsigned char> >(unsigned char*, int, char const*) [90]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[91]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_multiple_constant_xor<unsigned char> >(unsigned char*, int, char const*) [91]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[92]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_multiple_constant_divide2<unsigned char> >(unsigned char*, int, char const*) [92]
-----------------------------------------------
                0.09    0.00       1/1           main [1]
[93]     0.0    0.09    0.00       1         void test_constant<unsigned char, custom_multiple_constant_multiply2<unsigned char> >(unsigned char*, int, char const*) [93]
-----------------------------------------------
                0.00    0.00     288/288         main [1]
[100]    0.0    0.00    0.00     288         record_result(double, char const*) [100]
-----------------------------------------------
                0.00    0.00     196/196         main [1]
[101]    0.0    0.00    0.00     196         timer() [101]
-----------------------------------------------
                0.00    0.00     164/164         main [1]
[102]    0.0    0.00    0.00     164         start_timer() [102]
-----------------------------------------------
                0.00    0.00      20/20          main [1]
[103]    0.0    0.00    0.00      20         summarize(char const*, int, int, int, int) [103]
-----------------------------------------------
                0.00    0.00       1/1           __do_global_ctors_aux [106]
[104]    0.0    0.00    0.00       1         _GLOBAL__sub_I_results [104]
-----------------------------------------------

 This table describes the call tree of the program, and was sorted by
 the total amount of time spent in each function and its children.

 Each entry in this table consists of several lines.  The line with the
 index number at the left hand margin lists the current function.
 The lines above it list the functions that called this function,
 and the lines below it list the functions this one called.
 This line lists:
     index	A unique number given to each element of the table.
		Index numbers are sorted numerically.
		The index number is printed next to every function name so
		it is easier to look up where the function in the table.

     % time	This is the percentage of the `total' time that was spent
		in this function and its children.  Note that due to
		different viewpoints, functions excluded by options, etc,
		these numbers will NOT add up to 100%.

     self	This is the total amount of time spent in this function.

     children	This is the total amount of time propagated into this
		function by its children.

     called	This is the number of times the function was called.
		If the function called itself recursively, the number
		only includes non-recursive calls, and is followed by
		a `+' and the number of recursive calls.

     name	The name of the current function.  The index number is
		printed after it.  If the function is a member of a
		cycle, the cycle number is printed between the
		function's name and the index number.


 For the function's parents, the fields have the following meanings:

     self	This is the amount of time that was propagated directly
		from the function into this parent.

     children	This is the amount of time that was propagated from
		the function's children into this parent.

     called	This is the number of times this parent called the
		function `/' the total number of times the function
		was called.  Recursive calls to the function are not
		included in the number after the `/'.

     name	This is the name of the parent.  The parent's index
		number is printed after it.  If the parent is a
		member of a cycle, the cycle number is printed between
		the name and the index number.

 If the parents of the function cannot be determined, the word
 `<spontaneous>' is printed in the `name' field, and all the other
 fields are blank.

 For the function's children, the fields have the following meanings:

     self	This is the amount of time that was propagated directly
		from the child into the function.

     children	This is the amount of time that was propagated from the
		child's children to the function.

     called	This is the number of times the function called
		this child `/' the total number of times the child
		was called.  Recursive calls by the child are not
		listed in the number after the `/'.

     name	This is the name of the child.  The child's index
		number is printed after it.  If the child is a
		member of a cycle, the cycle number is printed
		between the name and the index number.

 If there are any cycles (circles) in the call graph, there is an
 entry for the cycle-as-a-whole.  This entry shows who called the
 cycle (as parents) and the members of the cycle (as children.)
 The `+' recursive calls entry shows the number of function calls that
 were internal to the cycle, and the calls entry for each member shows,
 for that member, how many times it was called from other members of
 the cycle.

\f
Index by function name

 [104] _GLOBAL__sub_I_results (simple_types_constant_folding.cpp) [13] void test_constant<float, custom_multiple_constant_add<float> >(float*, int, char const*) [8] void test_constant<short, custom_constant_divide<short> >(short*, int, char const*)
 [102] start_timer()          [14] void test_constant<float, custom_multiple_constant_sub<float> >(float*, int, char const*) [17] void test_constant<short, custom_constant_multiply<short> >(short*, int, char const*)
 [100] record_result(double, char const*) [33] void test_constant<float, custom_multiple_constant_mixed<float> >(float*, int, char const*) [54] void test_constant<short, custom_multiple_constant_or<short> >(short*, int, char const*)
  [49] void test_constant<signed char, custom_constant_or<signed char> >(signed char*, int, char const*) [3] void test_constant<float, custom_multiple_constant_divide<float> >(float*, int, char const*) [24] void test_constant<short, custom_multiple_constant_add<short> >(short*, int, char const*)
  [27] void test_constant<signed char, custom_constant_add<signed char> >(signed char*, int, char const*) [40] void test_constant<float, custom_multiple_constant_divide2<float> >(float*, int, char const*) [55] void test_constant<short, custom_multiple_constant_and<short> >(short*, int, char const*)
  [50] void test_constant<signed char, custom_constant_and<signed char> >(signed char*, int, char const*) [31] void test_constant<float, custom_multiple_constant_multiply<float> >(float*, int, char const*) [25] void test_constant<short, custom_multiple_constant_sub<short> >(short*, int, char const*)
  [28] void test_constant<signed char, custom_constant_sub<signed char> >(signed char*, int, char const*) [41] void test_constant<float, custom_multiple_constant_multiply2<float> >(float*, int, char const*) [56] void test_constant<short, custom_multiple_constant_xor<short> >(short*, int, char const*)
  [46] void test_constant<signed char, custom_constant_xor<signed char> >(signed char*, int, char const*) [83] void test_constant<unsigned char, custom_constant_or<unsigned char> >(unsigned char*, int, char const*) [60] void test_constant<short, custom_multiple_constant_mixed<short> >(short*, int, char const*)
   [9] void test_constant<signed char, custom_constant_divide<signed char> >(signed char*, int, char const*) [84] void test_constant<unsigned char, custom_constant_add<unsigned char> >(unsigned char*, int, char const*) [7] void test_constant<short, custom_multiple_constant_divide<short> >(short*, int, char const*)
  [57] void test_constant<signed char, custom_multiple_constant_or<signed char> >(signed char*, int, char const*) [85] void test_constant<unsigned char, custom_constant_and<unsigned char> >(unsigned char*, int, char const*) [26] void test_constant<short, custom_multiple_constant_divide2<short> >(short*, int, char const*)
  [18] void test_constant<signed char, custom_multiple_constant_add<signed char> >(signed char*, int, char const*) [86] void test_constant<unsigned char, custom_constant_sub<unsigned char> >(unsigned char*, int, char const*) [10] void test_constant<short, custom_multiple_constant_multiply<short> >(short*, int, char const*)
  [48] void test_constant<signed char, custom_multiple_constant_and<signed char> >(signed char*, int, char const*) [87] void test_constant<unsigned char, custom_constant_xor<unsigned char> >(unsigned char*, int, char const*) [19] void test_constant<short, custom_multiple_constant_multiply2<short> >(short*, int, char const*)
  [20] void test_constant<signed char, custom_multiple_constant_sub<signed char> >(signed char*, int, char const*) [15] void test_constant<unsigned char, custom_constant_divide<unsigned char> >(unsigned char*, int, char const*) [77] void test_constant<unsigned short, custom_constant_or<unsigned short> >(unsigned short*, int, char const*)
  [47] void test_constant<signed char, custom_multiple_constant_xor<signed char> >(signed char*, int, char const*) [88] void test_constant<unsigned char, custom_multiple_constant_or<unsigned char> >(unsigned char*, int, char const*) [78] void test_constant<unsigned short, custom_constant_add<unsigned short> >(unsigned short*, int, char const*)
  [59] void test_constant<signed char, custom_multiple_constant_mixed<signed char> >(signed char*, int, char const*) [82] void test_constant<unsigned char, custom_multiple_constant_add<unsigned char> >(unsigned char*, int, char const*) [79] void test_constant<unsigned short, custom_constant_and<unsigned short> >(unsigned short*, int, char const*)
   [6] void test_constant<signed char, custom_multiple_constant_divide<signed char> >(signed char*, int, char const*) [89] void test_constant<unsigned char, custom_multiple_constant_and<unsigned char> >(unsigned char*, int, char const*) [69] void test_constant<unsigned short, custom_constant_sub<unsigned short> >(unsigned short*, int, char const*)
  [29] void test_constant<signed char, custom_multiple_constant_divide2<signed char> >(signed char*, int, char const*) [90] void test_constant<unsigned char, custom_multiple_constant_sub<unsigned char> >(unsigned char*, int, char const*) [70] void test_constant<unsigned short, custom_constant_xor<unsigned short> >(unsigned short*, int, char const*)
  [21] void test_constant<signed char, custom_multiple_constant_multiply2<signed char> >(signed char*, int, char const*) [91] void test_constant<unsigned char, custom_multiple_constant_xor<unsigned char> >(unsigned char*, int, char const*) [44] void test_constant<unsigned short, custom_constant_divide<unsigned short> >(unsigned short*, int, char const*)
  [34] void test_constant<double, custom_constant_add<double> >(double*, int, char const*) [16] void test_constant<unsigned char, custom_multiple_constant_divide<unsigned char> >(unsigned char*, int, char const*) [68] void test_constant<unsigned short, custom_constant_multiply<unsigned short> >(unsigned short*, int, char const*)
  [36] void test_constant<double, custom_constant_sub<double> >(double*, int, char const*) [92] void test_constant<unsigned char, custom_multiple_constant_divide2<unsigned char> >(unsigned char*, int, char const*) [71] void test_constant<unsigned short, custom_multiple_constant_or<unsigned short> >(unsigned short*, int, char const*)
   [4] void test_constant<double, custom_constant_divide<double> >(double*, int, char const*) [93] void test_constant<unsigned char, custom_multiple_constant_multiply2<unsigned char> >(unsigned char*, int, char const*) [72] void test_constant<unsigned short, custom_multiple_constant_add<unsigned short> >(unsigned short*, int, char const*)
  [38] void test_constant<double, custom_constant_multiply<double> >(double*, int, char const*) [63] void test_constant<int, custom_constant_or<int> >(int*, int, char const*) [73] void test_constant<unsigned short, custom_multiple_constant_and<unsigned short> >(unsigned short*, int, char const*)
  [11] void test_constant<double, custom_multiple_constant_add<double> >(double*, int, char const*) [61] void test_constant<int, custom_constant_add<int> >(int*, int, char const*) [74] void test_constant<unsigned short, custom_multiple_constant_sub<unsigned short> >(unsigned short*, int, char const*)
  [12] void test_constant<double, custom_multiple_constant_sub<double> >(double*, int, char const*) [64] void test_constant<int, custom_constant_and<int> >(int*, int, char const*) [80] void test_constant<unsigned short, custom_multiple_constant_xor<unsigned short> >(unsigned short*, int, char const*)
  [32] void test_constant<double, custom_multiple_constant_mixed<double> >(double*, int, char const*) [65] void test_constant<int, custom_constant_sub<int> >(int*, int, char const*) [81] void test_constant<unsigned short, custom_multiple_constant_mixed<unsigned short> >(unsigned short*, int, char const*)
   [2] void test_constant<double, custom_multiple_constant_divide<double> >(double*, int, char const*) [62] void test_constant<int, custom_multiple_constant_sub<int> >(int*, int, char const*) [45] void test_constant<unsigned short, custom_multiple_constant_divide<unsigned short> >(unsigned short*, int, char const*)
  [35] void test_constant<double, custom_multiple_constant_divide2<double> >(double*, int, char const*) [58] void test_constant<int, custom_multiple_constant_multiply<int> >(int*, int, char const*) [75] void test_constant<unsigned short, custom_multiple_constant_divide2<unsigned short> >(unsigned short*, int, char const*)
  [30] void test_constant<double, custom_multiple_constant_multiply<double> >(double*, int, char const*) [66] void test_constant<int, custom_multiple_constant_multiply2<int> >(int*, int, char const*) [67] void test_constant<unsigned short, custom_multiple_constant_multiply<unsigned short> >(unsigned short*, int, char const*)
  [37] void test_constant<double, custom_multiple_constant_multiply2<double> >(double*, int, char const*) [51] void test_constant<short, custom_constant_or<short> >(short*, int, char const*) [76] void test_constant<unsigned short, custom_multiple_constant_multiply2<unsigned short> >(unsigned short*, int, char const*)
  [42] void test_constant<float, custom_constant_add<float> >(float*, int, char const*) [22] void test_constant<short, custom_constant_add<short> >(short*, int, char const*) [101] timer()
  [43] void test_constant<float, custom_constant_sub<float> >(float*, int, char const*) [52] void test_constant<short, custom_constant_and<short> >(short*, int, char const*) [103] summarize(char const*, int, int, int, int)
   [5] void test_constant<float, custom_constant_divide<float> >(float*, int, char const*) [23] void test_constant<short, custom_constant_sub<short> >(short*, int, char const*) [1] main
  [39] void test_constant<float, custom_constant_multiply<float> >(float*, int, char const*) [53] void test_constant<short, custom_constant_xor<short> >(short*, int, char const*)

[-- Attachment #7: benchmark_shared_tests.h --]
[-- Type: text/plain, Size: 22535 bytes --]

/*
    Copyright 2007-2008 Adobe Systems Incorporated
    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
    or a copy at http://stlab.adobe.com/licenses.html )
    
    
    Source file for tests shared among several benchmarks
*/

/******************************************************************************/

template<typename T>
inline bool tolerance_equal(T &a, T &b) {
	T diff = a - b;
	return (abs(diff) < 1.0e-6);
}


template<>
inline bool tolerance_equal(int32_t &a, int32_t &b) {
	return (a == b);
}
template<>
inline bool tolerance_equal(uint32_t &a, uint32_t &b) {
	return (a == b);
}
template<>
inline bool tolerance_equal(uint64_t &a, uint64_t &b) {
	return (a == b);
}
template<>
inline bool tolerance_equal(int64_t &a, int64_t &b) {
	return (a == b);
}

template<>
inline bool tolerance_equal(double &a, double &b) {
	double diff = a - b;
	double reldiff = diff;
	if (fabs(a) > 1.0e-8)
		reldiff = diff / a;
	return (fabs(reldiff) < 1.0e-6);
}

template<>
inline bool tolerance_equal(float &a, float &b) {
	float diff = a - b;
	double reldiff = diff;
	if (fabs(a) > 1.0e-4)
		reldiff = diff / a;
	return (fabs(reldiff) < 1.0e-3);		// single precision divide test is really imprecise
}

/******************************************************************************/

template <typename T, typename Shifter>
inline void check_shifted_sum(T result) {
	T temp = (T)SIZE * Shifter::do_shift((T)init_value);
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_sum_CSE(T result) {
	T temp = (T)0.0;
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_variable_sum(T result, T var) {
	T temp = (T)SIZE * Shifter::do_shift((T)init_value, var);
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_variable_sum(T result, T var1, T var2, T var3, T var4) {
	T temp = (T)SIZE * Shifter::do_shift((T)init_value, var1, var2, var3, var4);
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_variable_sum_CSE(T result, T var) {
	T temp = (T)0.0;
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_variable_sum_CSE(T result, T var1, T var2, T var3, T var4) {
	T temp = (T)0.0;
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}


/******************************************************************************/

template <typename Iterator, typename T>
void fill(Iterator first, Iterator last, T value) {
	while (first != last) *first++ = value;
}

/******************************************************************************/

template <typename T>
	struct custom_constant_add {
	  static T do_shift(T input) { return (input + T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_add {
	  static T do_shift(T input) { return (input + T(1) + T(2) + T(3) + T(4)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_sub {
	  static T do_shift(T input) { return (input - T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_sub {
	  static T do_shift(T input) { return (input - T(1) - T(2) - T(3) - T(4)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_multiply {
	  static T do_shift(T input) { return (input * T(120)); }
	};

/******************************************************************************/

// this should result in a single multiply
template <typename T>
	struct custom_multiple_constant_multiply {
	  static T do_shift(T input) { return (input * T(2) * T(3) * T(4) * T(5)); }
	};

/******************************************************************************/

// this should result in a single add
template <typename T>
	struct custom_multiple_constant_multiply2 {
	  static T do_shift(T input) { return (input + T(2) * T(3) * T(4) * T(5)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_divide {
	  static T do_shift(T input) { return (input / T(5)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_divide {
	  static T do_shift(T input) { return ((((input / T(2) ) / T(3) ) / T(4)) / T(5)); }
	};

/******************************************************************************/

// this more likely to have constants fused than the version above
template <typename T>
	struct custom_multiple_constant_divide2 {
	  static T do_shift(T input) { return (input + (((T(120) / T(3) ) / T(4)) / T(5))); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_mixed {
	  static T do_shift(T input) { return (input + T(2) - T(3) * T(4) / T(5)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_and {
	  static T do_shift(T input) { return (input & T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_and {
	  static T do_shift(T input) { return (input & T(15) & T(30) & T(31) & T(63)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_or {
	  static T do_shift(T input) { return (input | T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_or {
	  static T do_shift(T input) { return (input | T(15) | T(30) | T(31) | T(63)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_xor {
	  static T do_shift(T input) { return (input ^ T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_xor {
	  static T do_shift(T input) { return (input ^ T(15) ^ T(30) ^ T(31) ^ T(63)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_two {
	  static T do_shift(T input) { return (T(2)); }
	};

/******************************************************************************/
	
template <typename T>
	struct custom_add_constants {
	  static T do_shift(T input) { return (T(1) + T(2)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_sub_constants {
	  static T do_shift(T input) { return (T(2) - T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiply_constants {
	  static T do_shift(T input) { return (T(2) * T(3)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_divide_constants {
	  static T do_shift(T input) { return (T(20) / T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_mod_constants {
	  static T do_shift(T input) { return (T(23) % T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_and_constants {
	  static T do_shift(T input) { return (T(23) & T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_or_constants {
	  static T do_shift(T input) { return (T(23) | T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_xor_constants {
	  static T do_shift(T input) { return (T(23) ^ T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_equal_constants {
	  static T do_shift(T input) { return (T(23) == T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_notequal_constants {
	  static T do_shift(T input) { return (T(23) != T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_greaterthan_constants {
	  static T do_shift(T input) { return (T(23) > T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_lessthan_constants {
	  static T do_shift(T input) { return (T(23) < T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_greaterthanequal_constants {
	  static T do_shift(T input) { return (T(23) >= T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_lessthanequal_constants {
	  static T do_shift(T input) { return (T(23) <= T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_add_variable {
	  static T do_shift(T input, T v1) { return (input + v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_sub_variable {
	  static T do_shift(T input, T v1) { return (input - v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiply_variable {
	  static T do_shift(T input, T v1) { return (input * v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_divide_variable {
	  static T do_shift(T input, T v1) { return (input / v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_add_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input + v1 + v2 + v3 + v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_sub_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input - v1 - v2 - v3 - v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiply_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input * v1 * v2 * v3 * v4); }
	};

/******************************************************************************/

// something more likely to be moved out of loops, and a sanity check
template <typename T>
	struct custom_multiply_multiple_variable2 {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input + v1 * v2 * v3 * v4); }
	};

/******************************************************************************/

// this can NOT have CSE and loop invariant motion applied in integer math
// and can only be optimized in float if inexact math is allowed
template <typename T>
	struct custom_divide_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return ((((input / v1 ) / v2 ) / v3) / v4); }
	};

/******************************************************************************/

// this can have CSE and loop invariant motion applied in integer math
// this should be optimizeable without inexact math
template <typename T>
	struct custom_divide_multiple_variable2 {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input + (((v1 / v2 ) / v3) / v4)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_mixed_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input + v1 - v2 * v3 / v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_variable_and {
	  static T do_shift(T input, T v1) { return (input & v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_variable_and {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input & v1 & v2 & v3 & v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_variable_or {
	  static T do_shift(T input, T v1) { return (input | v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_variable_or {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input | v1 | v2 | v3 | v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_variable_xor {
	  static T do_shift(T input, T v1) { return (input ^ v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_variable_xor {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input ^ v1 ^ v2 ^ v3 ^ v4); }
	};


/******************************************************************************/

template <typename T>
	struct custom_identity {
	  static T do_shift(T input) { return (input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_add_zero {
	  static T do_shift(T input) { return (input + T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_sub_zero {
	  static T do_shift(T input) { return (input - T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_negate {
	  static T do_shift(T input) { return (-input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_negate_twice {
	  static T do_shift(T input) { return (-(-input)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_zero_minus {
	  static T do_shift(T input) { return (T(0) - input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_times_one {
	  static T do_shift(T input) { return (input * T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_divideby_one {
	  static T do_shift(T input) { return (input / T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_algebra_mixed {
	  static T do_shift(T input) { return (-(T(0) - (((input + T(0)) - T(0)) / T(1)))) * T(1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_zero {
	  static T do_shift(T input) { return T(0); }
	};

/******************************************************************************/

template <typename T>
	struct custom_times_zero {
	  static T do_shift(T input) { return (input * T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_subtract_self {
	  static T do_shift(T input) { return (input - input); }
	};
/******************************************************************************/

template <typename T>
	struct custom_algebra_mixed_constant {
	  static T do_shift(T input) { return (input - (-(T(0) - (((input + T(0)) / T(1)) - T(0)))) * T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_cse1 {
	  static T do_shift(T v1, T v2, T v3) { return (v1 * (v2 - v3) ); }
	};

/******************************************************************************/

template <typename T>
	struct custom_and_self {
	  static T do_shift(T input) { return (input & input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_or_self {
	  static T do_shift(T input) { return (input | input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_xor_self {
	  static T do_shift(T input) { return (input ^ input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_or_zero {
	  static T do_shift(T input) { return (input | T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_xor_zero {
	  static T do_shift(T input) { return (input ^ T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_andnot_zero {
	  static T do_shift(T input) { return (input & ~ T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_and_zero {
	  static T do_shift(T input) { return (input & T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_mod_one {
	  static T do_shift(T input) { return (input % T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_equal_self {
	  static T do_shift(T input) { return (input == input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_notequal_self {
	  static T do_shift(T input) { return (input != input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_greaterthan_self {
	  static T do_shift(T input) { return (input > input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_lessthan_self {
	  static T do_shift(T input) { return (input < input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_greaterthanequal_self {
	  static T do_shift(T input) { return (input >= input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_lessthanequal_self {
	  static T do_shift(T input) { return (input <= input); }
	};

/******************************************************************************/

template <typename T, typename Shifter>
void test_constant(T* first, int count, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
    for (int n = 0; n < count; ++n) {
		result += Shifter::do_shift( first[n] );
	}
    check_shifted_sum<T, Shifter>(result);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

template <typename T, typename Shifter>
void test_variable1(T* first, int count, T v1, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
    for (int n = 0; n < count; ++n) {
		result += Shifter::do_shift( first[n], v1 );
	}
    check_shifted_variable_sum<T, Shifter>(result, v1);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

template <typename T, typename Shifter>
void test_variable4(T* first, int count, T v1, T v2, T v3, T v4, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
    for (int n = 0; n < count; ++n) {
		result += Shifter::do_shift( first[n], v1, v2, v3, v4 );
	}
    check_shifted_variable_sum<T, Shifter>(result, v1, v2, v3, v4);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

template <typename T, typename Shifter>
void test_CSE_opt(T* first, int count, T v1, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
	T temp = Shifter::do_shift( v1, first[0], first[1] );
	temp += temp;
	result += first[0] + temp;
	result -= first[1] + temp;
    for (int n = 1; n < count; ++n) {
		temp = Shifter::do_shift( v1, first[n-1], first[n] );
		temp += temp;
		result += first[n-1] + temp;
		result -= first[n] + temp;
	}
    check_shifted_variable_sum_CSE<T, Shifter>(result, v1);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

template <typename T, typename Shifter>
void test_CSE(T* first, int count, T v1, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
	result += first[0] + Shifter::do_shift( v1, first[0], first[1] ) + Shifter::do_shift( v1, first[0], first[1] );
	result -= first[1] + Shifter::do_shift( v1, first[0], first[1] ) + Shifter::do_shift( v1, first[0], first[1] );
    for (int n = 1; n < count; ++n) {
		result += first[n-1] + Shifter::do_shift( v1, first[n-1], first[n] ) + Shifter::do_shift( v1, first[n-1], first[n] );
		result -= first[n] + Shifter::do_shift( v1, first[n-1], first[n] ) + Shifter::do_shift( v1, first[n-1], first[n] );
	}
    check_shifted_variable_sum_CSE<T, Shifter>(result, v1);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-01 18:44       ` Oleg Smolsky
@ 2011-08-02  5:48         ` Xinliang David Li
  2011-08-23  1:09           ` Oleg Smolsky
  2011-08-02  9:27         ` Richard Guenther
  2011-08-03 19:12         ` Xinliang David Li
  2 siblings, 1 reply; 22+ messages in thread
From: Xinliang David Li @ 2011-08-02  5:48 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: gcc

Try isolate the int8_t constant folding testing from the rest to see
if the slow down can be reproduced with the isolated case. If the
problem disappear, it is likely due to the following inline
parameters:

large-function-insns, large-function-growth, large-unit-insns,
inline-unit-growth. For instance set

--param large-function-insns=10000
--param large-unit-insns=20000

David

On Mon, Aug 1, 2011 at 11:43 AM, Oleg Smolsky <oleg.smolsky@riverbed.com> wrote:
> On 2011/7/29 14:07, Xinliang David Li wrote:
>>
>> Profiling tools are your best friend here. If you don't have access to
>> any, the least you can do is to build the program with -pg option and
>> use gprof tool to find out differences.
>
> The test suite has a bunch of very basic C++ tests that are executed an
> enormous number of times. I've built one with the obvious performance
> degradation and attached the source, output and reports.
>
> Here are some highlights:
>    v4.1:    Total absolute time for int8_t constant folding: 30.42 sec
>    v4.6:    Total absolute time for int8_t constant folding: 43.32 sec
>
> Every one of the tests in this section had degraded... the first half more
> than the second. I am not sure how much further I can take this - the
> benchmarked code is very short and plain. I can post disassembly for one
> (some?) of them if anyone is willing to take a look...
>
> Thanks,
> Oleg.
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-01 18:44       ` Oleg Smolsky
  2011-08-02  5:48         ` Xinliang David Li
@ 2011-08-02  9:27         ` Richard Guenther
  2011-08-03 19:12         ` Xinliang David Li
  2 siblings, 0 replies; 22+ messages in thread
From: Richard Guenther @ 2011-08-02  9:27 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: Xinliang David Li, gcc

On Mon, Aug 1, 2011 at 8:43 PM, Oleg Smolsky
<oleg.smolsky@riverbed.com> wrote:
> On 2011/7/29 14:07, Xinliang David Li wrote:
>>
>> Profiling tools are your best friend here. If you don't have access to
>> any, the least you can do is to build the program with -pg option and
>> use gprof tool to find out differences.
>
> The test suite has a bunch of very basic C++ tests that are executed an
> enormous number of times. I've built one with the obvious performance
> degradation and attached the source, output and reports.
>
> Here are some highlights:
>    v4.1:    Total absolute time for int8_t constant folding: 30.42 sec
>    v4.6:    Total absolute time for int8_t constant folding: 43.32 sec
>
> Every one of the tests in this section had degraded... the first half more
> than the second. I am not sure how much further I can take this - the
> benchmarked code is very short and plain. I can post disassembly for one
> (some?) of them if anyone is willing to take a look...

I have a hard time actually seeing what expressions they try to fold
(argh, templates everywhere ...).  One thing that changed between
4.1 and 4.6 is that we can no longer re-associate freely signed integers
because of undefined overflow concerns - which is a correctness issue.
Depending on the way the tests are written the folding in 4.1 was
probably a bug.

Richard.

> Thanks,
> Oleg.
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-01 18:44       ` Oleg Smolsky
  2011-08-02  5:48         ` Xinliang David Li
  2011-08-02  9:27         ` Richard Guenther
@ 2011-08-03 19:12         ` Xinliang David Li
  2 siblings, 0 replies; 22+ messages in thread
From: Xinliang David Li @ 2011-08-03 19:12 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: gcc

Scanning through the profile data you provided -- test functions such
as test_constant<unsigned short, custom_constant_mutiply<short> ...>
completely disappeared in 4.1's profile which means they are inlined
by gcc4.1. They exist in 4.6's profile. For the unsigned short case
where neither version inlines the call, 4.6 version is much faster.

David

On Mon, Aug 1, 2011 at 11:43 AM, Oleg Smolsky <oleg.smolsky@riverbed.com> wrote:
> On 2011/7/29 14:07, Xinliang David Li wrote:
>>
>> Profiling tools are your best friend here. If you don't have access to
>> any, the least you can do is to build the program with -pg option and
>> use gprof tool to find out differences.
>
> The test suite has a bunch of very basic C++ tests that are executed an
> enormous number of times. I've built one with the obvious performance
> degradation and attached the source, output and reports.
>
> Here are some highlights:
>    v4.1:    Total absolute time for int8_t constant folding: 30.42 sec
>    v4.6:    Total absolute time for int8_t constant folding: 43.32 sec
>
> Every one of the tests in this section had degraded... the first half more
> than the second. I am not sure how much further I can take this - the
> benchmarked code is very short and plain. I can post disassembly for one
> (some?) of them if anyone is willing to take a look...
>
> Thanks,
> Oleg.
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-02  5:48         ` Xinliang David Li
@ 2011-08-23  1:09           ` Oleg Smolsky
  2011-08-23  1:34             ` Oleg Smolsky
  0 siblings, 1 reply; 22+ messages in thread
From: Oleg Smolsky @ 2011-08-23  1:09 UTC (permalink / raw)
  To: Xinliang David Li; +Cc: gcc

[-- Attachment #1: Type: text/plain, Size: 2306 bytes --]

Hey David, these two --param options made no difference to the test.

I've cut the suite down to a single test (attached), which yields the 
following results:

./simple_types_constant_folding_os (gcc 41)
     test         description   time   operations/s
      0 "int8_t constant add"   1.34 sec   1194.03 M

./simple_types_constant_folding_os (gcc 46)
     test         description   time   operations/s
      0 "int8_t constant add"   2.84 sec   563.38 M

Both compilers fully inline the templated function and the emitted code 
looks very similar. I am puzzled as to why one of these loops is 
significantly slower than the other. I've attached disassembled listings 
- perhaps someone could have a look please? (the body of the loop starts 
at 0000000000400FD for gcc41 and at 0000000000400D90 for gcc46)

Thanks,
Oleg.


On 2011/8/1 22:48, Xinliang David Li wrote:
> Try isolate the int8_t constant folding testing from the rest to see
> if the slow down can be reproduced with the isolated case. If the
> problem disappear, it is likely due to the following inline
> parameters:
>
> large-function-insns, large-function-growth, large-unit-insns,
> inline-unit-growth. For instance set
>
> --param large-function-insns=10000
> --param large-unit-insns=20000
>
> David
>
> On Mon, Aug 1, 2011 at 11:43 AM, Oleg Smolsky<oleg.smolsky@riverbed.com>  wrote:
>> On 2011/7/29 14:07, Xinliang David Li wrote:
>>> Profiling tools are your best friend here. If you don't have access to
>>> any, the least you can do is to build the program with -pg option and
>>> use gprof tool to find out differences.
>> The test suite has a bunch of very basic C++ tests that are executed an
>> enormous number of times. I've built one with the obvious performance
>> degradation and attached the source, output and reports.
>>
>> Here are some highlights:
>>     v4.1:    Total absolute time for int8_t constant folding: 30.42 sec
>>     v4.6:    Total absolute time for int8_t constant folding: 43.32 sec
>>
>> Every one of the tests in this section had degraded... the first half more
>> than the second. I am not sure how much further I can take this - the
>> benchmarked code is very short and plain. I can post disassembly for one
>> (some?) of them if anyone is willing to take a look...
>>
>> Thanks,
>> Oleg.
>>


[-- Attachment #2: benchmark_shared_tests.h --]
[-- Type: text/plain, Size: 22535 bytes --]

/*
    Copyright 2007-2008 Adobe Systems Incorporated
    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
    or a copy at http://stlab.adobe.com/licenses.html )
    
    
    Source file for tests shared among several benchmarks
*/

/******************************************************************************/

template<typename T>
inline bool tolerance_equal(T &a, T &b) {
	T diff = a - b;
	return (abs(diff) < 1.0e-6);
}


template<>
inline bool tolerance_equal(int32_t &a, int32_t &b) {
	return (a == b);
}
template<>
inline bool tolerance_equal(uint32_t &a, uint32_t &b) {
	return (a == b);
}
template<>
inline bool tolerance_equal(uint64_t &a, uint64_t &b) {
	return (a == b);
}
template<>
inline bool tolerance_equal(int64_t &a, int64_t &b) {
	return (a == b);
}

template<>
inline bool tolerance_equal(double &a, double &b) {
	double diff = a - b;
	double reldiff = diff;
	if (fabs(a) > 1.0e-8)
		reldiff = diff / a;
	return (fabs(reldiff) < 1.0e-6);
}

template<>
inline bool tolerance_equal(float &a, float &b) {
	float diff = a - b;
	double reldiff = diff;
	if (fabs(a) > 1.0e-4)
		reldiff = diff / a;
	return (fabs(reldiff) < 1.0e-3);		// single precision divide test is really imprecise
}

/******************************************************************************/

template <typename T, typename Shifter>
inline void check_shifted_sum(T result) {
	T temp = (T)SIZE * Shifter::do_shift((T)init_value);
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_sum_CSE(T result) {
	T temp = (T)0.0;
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_variable_sum(T result, T var) {
	T temp = (T)SIZE * Shifter::do_shift((T)init_value, var);
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_variable_sum(T result, T var1, T var2, T var3, T var4) {
	T temp = (T)SIZE * Shifter::do_shift((T)init_value, var1, var2, var3, var4);
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_variable_sum_CSE(T result, T var) {
	T temp = (T)0.0;
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}

template <typename T, typename Shifter>
inline void check_shifted_variable_sum_CSE(T result, T var1, T var2, T var3, T var4) {
	T temp = (T)0.0;
	if (!tolerance_equal<T>(result,temp))
		printf("test %i failed\n", current_test);
}


/******************************************************************************/

template <typename Iterator, typename T>
void fill(Iterator first, Iterator last, T value) {
	while (first != last) *first++ = value;
}

/******************************************************************************/

template <typename T>
	struct custom_constant_add {
	  static T do_shift(T input) { return (input + T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_add {
	  static T do_shift(T input) { return (input + T(1) + T(2) + T(3) + T(4)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_sub {
	  static T do_shift(T input) { return (input - T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_sub {
	  static T do_shift(T input) { return (input - T(1) - T(2) - T(3) - T(4)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_multiply {
	  static T do_shift(T input) { return (input * T(120)); }
	};

/******************************************************************************/

// this should result in a single multiply
template <typename T>
	struct custom_multiple_constant_multiply {
	  static T do_shift(T input) { return (input * T(2) * T(3) * T(4) * T(5)); }
	};

/******************************************************************************/

// this should result in a single add
template <typename T>
	struct custom_multiple_constant_multiply2 {
	  static T do_shift(T input) { return (input + T(2) * T(3) * T(4) * T(5)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_divide {
	  static T do_shift(T input) { return (input / T(5)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_divide {
	  static T do_shift(T input) { return ((((input / T(2) ) / T(3) ) / T(4)) / T(5)); }
	};

/******************************************************************************/

// this more likely to have constants fused than the version above
template <typename T>
	struct custom_multiple_constant_divide2 {
	  static T do_shift(T input) { return (input + (((T(120) / T(3) ) / T(4)) / T(5))); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_mixed {
	  static T do_shift(T input) { return (input + T(2) - T(3) * T(4) / T(5)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_and {
	  static T do_shift(T input) { return (input & T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_and {
	  static T do_shift(T input) { return (input & T(15) & T(30) & T(31) & T(63)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_or {
	  static T do_shift(T input) { return (input | T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_or {
	  static T do_shift(T input) { return (input | T(15) | T(30) | T(31) | T(63)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_constant_xor {
	  static T do_shift(T input) { return (input ^ T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_constant_xor {
	  static T do_shift(T input) { return (input ^ T(15) ^ T(30) ^ T(31) ^ T(63)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_two {
	  static T do_shift(T input) { return (T(2)); }
	};

/******************************************************************************/
	
template <typename T>
	struct custom_add_constants {
	  static T do_shift(T input) { return (T(1) + T(2)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_sub_constants {
	  static T do_shift(T input) { return (T(2) - T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiply_constants {
	  static T do_shift(T input) { return (T(2) * T(3)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_divide_constants {
	  static T do_shift(T input) { return (T(20) / T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_mod_constants {
	  static T do_shift(T input) { return (T(23) % T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_and_constants {
	  static T do_shift(T input) { return (T(23) & T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_or_constants {
	  static T do_shift(T input) { return (T(23) | T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_xor_constants {
	  static T do_shift(T input) { return (T(23) ^ T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_equal_constants {
	  static T do_shift(T input) { return (T(23) == T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_notequal_constants {
	  static T do_shift(T input) { return (T(23) != T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_greaterthan_constants {
	  static T do_shift(T input) { return (T(23) > T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_lessthan_constants {
	  static T do_shift(T input) { return (T(23) < T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_greaterthanequal_constants {
	  static T do_shift(T input) { return (T(23) >= T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_lessthanequal_constants {
	  static T do_shift(T input) { return (T(23) <= T(10)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_add_variable {
	  static T do_shift(T input, T v1) { return (input + v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_sub_variable {
	  static T do_shift(T input, T v1) { return (input - v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiply_variable {
	  static T do_shift(T input, T v1) { return (input * v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_divide_variable {
	  static T do_shift(T input, T v1) { return (input / v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_add_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input + v1 + v2 + v3 + v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_sub_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input - v1 - v2 - v3 - v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiply_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input * v1 * v2 * v3 * v4); }
	};

/******************************************************************************/

// something more likely to be moved out of loops, and a sanity check
template <typename T>
	struct custom_multiply_multiple_variable2 {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input + v1 * v2 * v3 * v4); }
	};

/******************************************************************************/

// this can NOT have CSE and loop invariant motion applied in integer math
// and can only be optimized in float if inexact math is allowed
template <typename T>
	struct custom_divide_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return ((((input / v1 ) / v2 ) / v3) / v4); }
	};

/******************************************************************************/

// this can have CSE and loop invariant motion applied in integer math
// this should be optimizeable without inexact math
template <typename T>
	struct custom_divide_multiple_variable2 {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input + (((v1 / v2 ) / v3) / v4)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_mixed_multiple_variable {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input + v1 - v2 * v3 / v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_variable_and {
	  static T do_shift(T input, T v1) { return (input & v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_variable_and {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input & v1 & v2 & v3 & v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_variable_or {
	  static T do_shift(T input, T v1) { return (input | v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_variable_or {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input | v1 | v2 | v3 | v4); }
	};

/******************************************************************************/

template <typename T>
	struct custom_variable_xor {
	  static T do_shift(T input, T v1) { return (input ^ v1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_multiple_variable_xor {
	  static T do_shift(T input, T v1, T v2, T v3, T v4) { return (input ^ v1 ^ v2 ^ v3 ^ v4); }
	};


/******************************************************************************/

template <typename T>
	struct custom_identity {
	  static T do_shift(T input) { return (input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_add_zero {
	  static T do_shift(T input) { return (input + T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_sub_zero {
	  static T do_shift(T input) { return (input - T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_negate {
	  static T do_shift(T input) { return (-input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_negate_twice {
	  static T do_shift(T input) { return (-(-input)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_zero_minus {
	  static T do_shift(T input) { return (T(0) - input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_times_one {
	  static T do_shift(T input) { return (input * T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_divideby_one {
	  static T do_shift(T input) { return (input / T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_algebra_mixed {
	  static T do_shift(T input) { return (-(T(0) - (((input + T(0)) - T(0)) / T(1)))) * T(1); }
	};

/******************************************************************************/

template <typename T>
	struct custom_zero {
	  static T do_shift(T input) { return T(0); }
	};

/******************************************************************************/

template <typename T>
	struct custom_times_zero {
	  static T do_shift(T input) { return (input * T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_subtract_self {
	  static T do_shift(T input) { return (input - input); }
	};
/******************************************************************************/

template <typename T>
	struct custom_algebra_mixed_constant {
	  static T do_shift(T input) { return (input - (-(T(0) - (((input + T(0)) / T(1)) - T(0)))) * T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_cse1 {
	  static T do_shift(T v1, T v2, T v3) { return (v1 * (v2 - v3) ); }
	};

/******************************************************************************/

template <typename T>
	struct custom_and_self {
	  static T do_shift(T input) { return (input & input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_or_self {
	  static T do_shift(T input) { return (input | input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_xor_self {
	  static T do_shift(T input) { return (input ^ input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_or_zero {
	  static T do_shift(T input) { return (input | T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_xor_zero {
	  static T do_shift(T input) { return (input ^ T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_andnot_zero {
	  static T do_shift(T input) { return (input & ~ T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_and_zero {
	  static T do_shift(T input) { return (input & T(0)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_mod_one {
	  static T do_shift(T input) { return (input % T(1)); }
	};

/******************************************************************************/

template <typename T>
	struct custom_equal_self {
	  static T do_shift(T input) { return (input == input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_notequal_self {
	  static T do_shift(T input) { return (input != input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_greaterthan_self {
	  static T do_shift(T input) { return (input > input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_lessthan_self {
	  static T do_shift(T input) { return (input < input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_greaterthanequal_self {
	  static T do_shift(T input) { return (input >= input); }
	};

/******************************************************************************/

template <typename T>
	struct custom_lessthanequal_self {
	  static T do_shift(T input) { return (input <= input); }
	};

/******************************************************************************/

template <typename T, typename Shifter>
void test_constant(T* first, int count, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
    for (int n = 0; n < count; ++n) {
		result += Shifter::do_shift( first[n] );
	}
    check_shifted_sum<T, Shifter>(result);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

template <typename T, typename Shifter>
void test_variable1(T* first, int count, T v1, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
    for (int n = 0; n < count; ++n) {
		result += Shifter::do_shift( first[n], v1 );
	}
    check_shifted_variable_sum<T, Shifter>(result, v1);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

template <typename T, typename Shifter>
void test_variable4(T* first, int count, T v1, T v2, T v3, T v4, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
    for (int n = 0; n < count; ++n) {
		result += Shifter::do_shift( first[n], v1, v2, v3, v4 );
	}
    check_shifted_variable_sum<T, Shifter>(result, v1, v2, v3, v4);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

template <typename T, typename Shifter>
void test_CSE_opt(T* first, int count, T v1, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
	T temp = Shifter::do_shift( v1, first[0], first[1] );
	temp += temp;
	result += first[0] + temp;
	result -= first[1] + temp;
    for (int n = 1; n < count; ++n) {
		temp = Shifter::do_shift( v1, first[n-1], first[n] );
		temp += temp;
		result += first[n-1] + temp;
		result -= first[n] + temp;
	}
    check_shifted_variable_sum_CSE<T, Shifter>(result, v1);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

template <typename T, typename Shifter>
void test_CSE(T* first, int count, T v1, const char *label) {
  int i;
  
  start_timer();
  
  for(i = 0; i < iterations; ++i) {
    T result = 0;
	result += first[0] + Shifter::do_shift( v1, first[0], first[1] ) + Shifter::do_shift( v1, first[0], first[1] );
	result -= first[1] + Shifter::do_shift( v1, first[0], first[1] ) + Shifter::do_shift( v1, first[0], first[1] );
    for (int n = 1; n < count; ++n) {
		result += first[n-1] + Shifter::do_shift( v1, first[n-1], first[n] ) + Shifter::do_shift( v1, first[n-1], first[n] );
		result -= first[n] + Shifter::do_shift( v1, first[n-1], first[n] ) + Shifter::do_shift( v1, first[n-1], first[n] );
	}
    check_shifted_variable_sum_CSE<T, Shifter>(result, v1);
  }
  
  record_result( timer(), label );
}

/******************************************************************************/

[-- Attachment #3: simple_types_constant_folding_os.cpp --]
[-- Type: text/plain, Size: 4257 bytes --]

/*
    Copyright 2007-2008 Adobe Systems Incorporated
    Distributed under the MIT License (see accompanying file LICENSE_1_0_0.txt
    or a copy at http://stlab.adobe.com/licenses.html )


Goal:  Test compiler optimizations related to constant folding of simple language defined types

Assumptions:

	1) the compiler will combine constant calculations into a single constant for simple types
		aka constant folding
		result = A + B			==>		result = constant
		result = A - B			==>		result = constant
		result = A * B			==>		result = constant
		result = A / B			==>		result = constant
		result = A % B			==>		result = constant	for integer types
		result = (A == B)		==>		result = constant	for integer types
		result = (A != B)		==>		result = constant	for integer types
		result = (A > B)		==>		result = constant	for integer types
		result = (A < B)		==>		result = constant	for integer types
		result = (A >= B)		==>		result = constant	for integer types
		result = (A <= B)		==>		result = constant	for integer types
		result = (A & B)		==>		result = constant	for integer types
		result = (A | B)		==>		result = constant	for integer types
		result = (A ^ B)		==>		result = constant	for integer types
		
		result = input + A + B + C + D	==>		result = input + (A+B+C+D)
		result = input - A - B - C - D	==>		result = input - (A+B+C+D)
		result = input * A * B * C * D	==>		result = input * (A*B*C*D)
		result = input + A * B * C * D	==>		result = input + (A*B*C*D)
		result = ((((input/A) /B) /C) /D)	==>	result = input / (A*B*C*D)
		result = input + (((A /B) /C) /D)	==>	result = input + (A/B/C/D)
		result = input & A & B & C & D	==>		result = input & (A&B&C&D)			for integer types
		result = input | A | B | C | D	==>		result = input | (A|B|C|D)			for integer types
		result = input ^ A ^ B ^ C ^ D	==>		result = input ^ (A^B^C^D)			for integer types


NOTE - in some cases, loop invariant code motion might move the constant calculation out of the inner loop
	making it appear that the constants were folded
		But in the constant result cases, we want the compiler to recognize the constant and move it out of the loop

*/

/******************************************************************************/

#include "benchmark_stdint.hpp"
#include <cstddef>
#include <cstdio>
#include <ctime>
#include <cstdlib>
#include <cmath>
#include "benchmark_results.h"
#include "benchmark_timer.h"

/******************************************************************************/

// this constant may need to be adjusted to give reasonable minimum times
// For best results, times should be about 1.0 seconds for the minimum test run
int base_iterations = 2000000;
int iterations = base_iterations;


// 8000 items, or between 8k and 64k of data
// this is intended to remain within the L2 cache of most common CPUs
const int SIZE 	= 8000;


// initial value for filling our arrays, may be changed from the command line
double init_value = 1.0;

/******************************************************************************/

// our global arrays of numbers to be operated upon

double dataDouble[SIZE];
float dataFloat[SIZE];

uint64_t data64unsigned[SIZE];
int64_t data64[SIZE];

uint32_t data32unsigned[SIZE];
int32_t data32[SIZE];

uint16_t data16unsigned[SIZE];
int16_t data16[SIZE];

uint8_t data8unsigned[SIZE];
int8_t data8[SIZE];

/******************************************************************************/

#include "benchmark_shared_tests.h"

/******************************************************************************/


int main(int argc, char** argv) {
	
	// output command for documentation:
	int i;
	for (i = 0; i < argc; ++i)
		printf("%s ", argv[i] );
	printf("\n");

	if (argc > 1) base_iterations = atoi(argv[1]);
	if (argc > 2) init_value = (double) atof(argv[2]);



// int8_t
	::fill(data8, data8+SIZE, int8_t(init_value));
	
	iterations = base_iterations / 10;
	test_constant<int8_t, custom_constant_add<int8_t> >(data8,SIZE,"int8_t constant add");

	summarize("int8_t constant folding", SIZE, iterations, kDontShowGMeans, kDontShowPenalty );

	return 0;
}

// the end
/******************************************************************************/
/******************************************************************************/

[-- Attachment #4: simple_types_constant_folding_os-41.lst --]
[-- Type: text/plain, Size: 9674 bytes --]

.text:0000000000400EFF ; ---------------------------------------------------------------------------
.text:0000000000400F04		       align 10h
.text:0000000000400F10
.text:0000000000400F10 ; =============== S U B R O U T I N E =======================================
.text:0000000000400F10
.text:0000000000400F10 ; Attributes: bp-based frame
.text:0000000000400F10
.text:0000000000400F10		       public main
.text:0000000000400F10 main	       proc near
.text:0000000000400F10		       push    rbp
.text:0000000000400F11		       mov     rbp, rsp
.text:0000000000400F14		       push    r14
.text:0000000000400F16		       push    r13
.text:0000000000400F18		       push    r12
.text:0000000000400F1A		       push    rbx
.text:0000000000400F1B		       call    _mcount
.text:0000000000400F20		       test    edi, edi
.text:0000000000400F22		       mov     r13d, edi
.text:0000000000400F25		       mov     r14, rsi
.text:0000000000400F28		       jle     short loc_400F4C
.text:0000000000400F2A		       mov     rbx, rsi
.text:0000000000400F2D		       xor     r12d, r12d
.text:0000000000400F30
.text:0000000000400F30 loc_400F30:			       ; CODE XREF: main+3A\x19j
.text:0000000000400F30		       mov     rsi, [rbx]
.text:0000000000400F33		       xor     eax, eax
.text:0000000000400F35		       mov     edi, offset aS  ; "%s "
.text:0000000000400F3A		       add     r12d, 1
.text:0000000000400F3E		       add     rbx, 8
.text:0000000000400F42		       call    _printf
.text:0000000000400F47		       cmp     r12d, r13d
.text:0000000000400F4A		       jnz     short loc_400F30
.text:0000000000400F4C
.text:0000000000400F4C loc_400F4C:			       ; CODE XREF: main+18\x18j
.text:0000000000400F4C		       mov     edi, 0Ah	       ; c
.text:0000000000400F51		       call    _putchar
.text:0000000000400F56		       cmp     r13d, 1
.text:0000000000400F5A		       jle     short loc_400F74
.text:0000000000400F5C		       mov     rdi, [r14+8]    ; nptr
.text:0000000000400F60		       xor     ecx, ecx	       ; group
.text:0000000000400F62		       mov     edx, 0Ah	       ; base
.text:0000000000400F67		       xor     esi, esi	       ; endptr
.text:0000000000400F69		       call    ___strtol_internal
.text:0000000000400F6E		       mov     cs:base_iterations, eax
.text:0000000000400F74
.text:0000000000400F74 loc_400F74:			       ; CODE XREF: main+4A\x18j
.text:0000000000400F74		       cmp     r13d, 2
.text:0000000000400F78		       jg      loc_40110B
.text:0000000000400F7E
.text:0000000000400F7E loc_400F7E:			       ; CODE XREF: main+210\x19j
.text:0000000000400F7E		       movsd   xmm0, cs:init_value
.text:0000000000400F86		       xor     eax, eax
.text:0000000000400F88		       cvttsd2si edx, xmm0
.text:0000000000400F8C		       db      66h, 66h, 66h
.text:0000000000400F8C		       nop
.text:0000000000400F90
.text:0000000000400F90 loc_400F90:			       ; CODE XREF: main+90\x19j
.text:0000000000400F90		       mov     ds:data8[rax], dl
.text:0000000000400F96		       add     rax, 1
.text:0000000000400F9A		       cmp     rax, 1F40h
.text:0000000000400FA0		       jnz     short loc_400F90
.text:0000000000400FA2		       mov     ecx, cs:base_iterations
.text:0000000000400FA8		       mov     edx, 66666667h
.text:0000000000400FAD		       mov     eax, ecx
.text:0000000000400FAF		       sar     ecx, 1Fh
.text:0000000000400FB2		       imul    edx
.text:0000000000400FB4		       sar     edx, 2
.text:0000000000400FB7		       sub     edx, ecx
.text:0000000000400FB9		       mov     cs:iterations, edx
.text:0000000000400FBF		       call    _clock
.text:0000000000400FC4		       mov     cs:start_time, rax
.text:0000000000400FCB		       mov     eax, cs:iterations
.text:0000000000400FD1		       test    eax, eax
.text:0000000000400FD3		       jle     short loc_40103B
.text:0000000000400FD5		       xor     ebx, ebx
.text:0000000000400FD7
.text:0000000000400FD7 loc_400FD7:			       ; CODE XREF: main+129\x19j
.text:0000000000400FD7		       xor     ecx, ecx
.text:0000000000400FD9		       xor     edx, edx
.text:0000000000400FDB		       db      66h, 66h
.text:0000000000400FDB		       nop
.text:0000000000400FDE		       db      66h
.text:0000000000400FDE		       nop
.text:0000000000400FE0
.text:0000000000400FE0 loc_400FE0:			       ; CODE XREF: main+E8\x19j
.text:0000000000400FE0		       movzx   eax, ds:data8[rdx]
.text:0000000000400FE7		       add     rdx, 1
.text:0000000000400FEB		       add     eax, 0Ah
.text:0000000000400FEE		       cmp     rdx, 1F40h
.text:0000000000400FF5		       lea     ecx, [rax+rcx]
.text:0000000000400FF8		       jnz     short loc_400FE0
.text:0000000000400FFA		       movsd   xmm0, cs:init_value
.text:0000000000401002		       movsd   xmm1, cs:qword_401260
.text:000000000040100A		       cvttsd2si eax, xmm0
.text:000000000040100E		       add     eax, 0Ah
.text:0000000000401011		       shl     eax, 6
.text:0000000000401014		       sub     cl, al
.text:0000000000401016		       movsx   eax, cl
.text:0000000000401019		       mov     edx, eax
.text:000000000040101B		       sar     edx, 1Fh
.text:000000000040101E		       xor     eax, edx
.text:0000000000401020		       sub     eax, edx
.text:0000000000401022		       cvtsi2sd	xmm0, eax
.text:0000000000401026		       ucomisd xmm1, xmm0
.text:000000000040102A		       jbe     loc_4010F4
.text:0000000000401030
.text:0000000000401030 loc_401030:			       ; CODE XREF: main+1F6\x19j
.text:0000000000401030		       add     ebx, 1
.text:0000000000401033		       cmp     cs:iterations, ebx
.text:0000000000401039		       jg      short loc_400FD7
.text:000000000040103B
.text:000000000040103B loc_40103B:			       ; CODE XREF: main+C3\x18j
.text:000000000040103B		       call    _clock
.text:0000000000401040		       mov     rdi, cs:results ; ptr
.text:0000000000401047		       mov     rbx, rax
.text:000000000040104A		       mov     cs:end_time, rax
.text:0000000000401051		       mov     r12, cs:start_time
.text:0000000000401058		       test    rdi, rdi
.text:000000000040105B		       jz      short loc_40106B
.text:000000000040105D		       mov     edx, cs:current_test
.text:0000000000401063		       cmp     edx, cs:allocated_results
.text:0000000000401069		       jl      short loc_40109C
.text:000000000040106B
.text:000000000040106B loc_40106B:			       ; CODE XREF: main+14B\x18j
.text:000000000040106B		       mov     esi, cs:allocated_results
.text:0000000000401071		       add     esi, 0Ah
.text:0000000000401074		       mov     cs:allocated_results, esi
.text:000000000040107A		       movsxd  rsi, esi
.text:000000000040107D		       shl     rsi, 4	       ; size
.text:0000000000401081		       call    _realloc
.text:0000000000401086		       test    rax, rax
.text:0000000000401089		       mov     cs:results, rax
.text:0000000000401090		       jz      loc_401125
.text:0000000000401096		       mov     edx, cs:current_test
.text:000000000040109C
.text:000000000040109C loc_40109C:			       ; CODE XREF: main+159\x18j
.text:000000000040109C		       sub     rbx, r12
.text:000000000040109F		       movsxd  rax, edx
.text:00000000004010A2		       xor     r8d, r8d
.text:00000000004010A5		       cvtsi2sd	xmm0, rbx
.text:00000000004010AA		       shl     rax, 4
.text:00000000004010AE		       add     rax, cs:results
.text:00000000004010B5		       xor     ecx, ecx
.text:00000000004010B7		       mov     esi, 1F40h
.text:00000000004010BC		       mov     edi, offset aInt8_tConstant ; "int8_t constant folding"
.text:00000000004010C1		       mov     qword ptr [rax+8], 4012BAh
.text:00000000004010C9		       divsd   xmm0, cs:qword_401258
.text:00000000004010D1		       movsd   qword ptr [rax],	xmm0
.text:00000000004010D5		       lea     eax, [rdx+1]
.text:00000000004010D8		       mov     edx, cs:iterations
.text:00000000004010DE		       mov     cs:current_test,	eax
.text:00000000004010E4		       call    _Z9summarizePKciiii ; summarize(char  const*,int,int,int,int)
.text:00000000004010E9		       pop     rbx
.text:00000000004010EA		       pop     r12
.text:00000000004010EC		       pop     r13
.text:00000000004010EE		       pop     r14
.text:00000000004010F0		       leave
.text:00000000004010F1		       xor     eax, eax
.text:00000000004010F3		       retn
.text:00000000004010F4 ; ---------------------------------------------------------------------------
.text:00000000004010F4
.text:00000000004010F4 loc_4010F4:			       ; CODE XREF: main+11A\x18j
.text:00000000004010F4		       mov     esi, cs:current_test
.text:00000000004010FA		       mov     edi, offset aTestIFailed	; "test	%i failed\n"
.text:00000000004010FF		       xor     eax, eax
.text:0000000000401101		       call    _printf
.text:0000000000401106		       jmp     loc_401030
.text:000000000040110B ; ---------------------------------------------------------------------------
.text:000000000040110B
.text:000000000040110B loc_40110B:			       ; CODE XREF: main+68\x18j
.text:000000000040110B		       mov     rdi, [r14+10h]  ; nptr
.text:000000000040110F		       xor     edx, edx	       ; group
.text:0000000000401111		       xor     esi, esi	       ; endptr
.text:0000000000401113		       call    ___strtod_internal
.text:0000000000401118		       movsd   cs:init_value, xmm0
.text:0000000000401120		       jmp     loc_400F7E
.text:0000000000401125 ; ---------------------------------------------------------------------------
.text:0000000000401125
.text:0000000000401125 loc_401125:			       ; CODE XREF: main+180\x18j
.text:0000000000401125		       mov     esi, cs:allocated_results
.text:000000000040112B		       mov     edi, offset aCouldNotAlloca ; "Could not	allocate %d results\n"
.text:0000000000401130		       call    _printf
.text:0000000000401135		       mov     edi, 0FFFFFFFFh ; status
.text:000000000040113A		       call    _exit
.text:000000000040113A main	       endp

[-- Attachment #5: simple_types_constant_folding_os-46.lst --]
[-- Type: text/plain, Size: 8177 bytes --]

.text:0000000000400C98 ; ---------------------------------------------------------------------------
.text:0000000000400C99		       align 20h
.text:0000000000400CA0
.text:0000000000400CA0 ; =============== S U B R O U T I N E =======================================
.text:0000000000400CA0
.text:0000000000400CA0
.text:0000000000400CA0		       public main
.text:0000000000400CA0 main	       proc near
.text:0000000000400CA0
.text:0000000000400CA0 var_28	       = qword ptr -28h
.text:0000000000400CA0
.text:0000000000400CA0		       push    r12
.text:0000000000400CA2		       push    rbp
.text:0000000000400CA3		       mov     rbp, rsi
.text:0000000000400CA6		       push    rbx
.text:0000000000400CA7		       mov     ebx, edi
.text:0000000000400CA9		       sub     rsp, 10h
.text:0000000000400CAD		       test    edi, edi
.text:0000000000400CAF		       jle     loc_400E3B
.text:0000000000400CB5		       xor     r12d, r12d
.text:0000000000400CB8		       db      66h, 66h, 66h
.text:0000000000400CB8		       nop
.text:0000000000400CBC		       db      66h, 66h, 66h
.text:0000000000400CBC		       nop
.text:0000000000400CC0
.text:0000000000400CC0 loc_400CC0:			       ; CODE XREF: main+38\x19j
.text:0000000000400CC0		       mov     rsi, [rbp+r12*8+0]
.text:0000000000400CC5		       xor     eax, eax
.text:0000000000400CC7		       mov     edi, offset aS  ; "%s "
.text:0000000000400CCC		       add     r12, 1
.text:0000000000400CD0		       call    _printf
.text:0000000000400CD5		       cmp     ebx, r12d
.text:0000000000400CD8		       jg      short loc_400CC0
.text:0000000000400CDA		       mov     edi, 0Ah	       ; c
.text:0000000000400CDF		       call    _putchar
.text:0000000000400CE4		       cmp     ebx, 1
.text:0000000000400CE7		       jle     short loc_400D1B
.text:0000000000400CE9		       mov     rdi, [rbp+8]    ; nptr
.text:0000000000400CED		       xor     ecx, ecx	       ; group
.text:0000000000400CEF		       xor     esi, esi	       ; endptr
.text:0000000000400CF1		       mov     edx, 0Ah	       ; base
.text:0000000000400CF6		       call    ___strtol_internal
.text:0000000000400CFB		       cmp     ebx, 2
.text:0000000000400CFE		       mov     cs:base_iterations, eax
.text:0000000000400D04		       jz      short loc_400D1B
.text:0000000000400D06		       mov     rdi, [rbp+10h]  ; nptr
.text:0000000000400D0A		       xor     edx, edx	       ; group
.text:0000000000400D0C		       xor     esi, esi	       ; endptr
.text:0000000000400D0E		       call    ___strtod_internal
.text:0000000000400D13		       movsd   cs:init_value, xmm0
.text:0000000000400D1B
.text:0000000000400D1B loc_400D1B:			       ; CODE XREF: main+47\x18j
.text:0000000000400D1B					       ; main+64\x18j ...
.text:0000000000400D1B		       movsd   xmm1, cs:init_value
.text:0000000000400D23		       mov     ecx, 1F4h
.text:0000000000400D28		       cvttsd2si eax, xmm1
.text:0000000000400D2C		       pxor    xmm1, xmm1
.text:0000000000400D30		       movd    xmm0, eax
.text:0000000000400D34		       xor     eax, eax
.text:0000000000400D36		       pshufb  xmm0, xmm1
.text:0000000000400D3B		       db      66h, 66h
.text:0000000000400D3B		       nop
.text:0000000000400D3E		       db      66h
.text:0000000000400D3E		       nop
.text:0000000000400D40
.text:0000000000400D40 loc_400D40:			       ; CODE XREF: main+B6\x19j
.text:0000000000400D40		       mov     rdx, rax
.text:0000000000400D43		       add     rax, 1
.text:0000000000400D47		       shl     rdx, 4
.text:0000000000400D4B		       cmp     rcx, rax
.text:0000000000400D4E		       movdqa  xmmword ptr [rdx+5015A0h], xmm0
.text:0000000000400D56		       ja      short loc_400D40
.text:0000000000400D58		       mov     ecx, cs:base_iterations
.text:0000000000400D5E		       mov     edx, 66666667h
.text:0000000000400D63		       xor     ebx, ebx
.text:0000000000400D65		       mov     eax, ecx
.text:0000000000400D67		       sar     ecx, 1Fh
.text:0000000000400D6A		       imul    edx
.text:0000000000400D6C		       sar     edx, 2
.text:0000000000400D6F		       sub     edx, ecx
.text:0000000000400D71		       mov     cs:iterations, edx
.text:0000000000400D77		       call    _Z11start_timerv	; start_timer(void)
.text:0000000000400D7C		       mov     ecx, cs:iterations
.text:0000000000400D82		       movsd   xmm1, cs:qword_4010E0
.text:0000000000400D8A		       test    ecx, ecx
.text:0000000000400D8C		       jle     short loc_400DE3
.text:0000000000400D8E		       db      66h
.text:0000000000400D8E		       nop
.text:0000000000400D90
.text:0000000000400D90 loc_400D90:			       ; CODE XREF: main+141\x19j
.text:0000000000400D90		       mov     edx, offset data8
.text:0000000000400D95		       xor     eax, eax
.text:0000000000400D97		       db      66h, 66h
.text:0000000000400D97		       nop
.text:0000000000400D9A		       db      66h, 66h
.text:0000000000400D9A		       nop
.text:0000000000400D9D		       db      66h, 66h
.text:0000000000400D9D		       nop
.text:0000000000400DA0
.text:0000000000400DA0 loc_400DA0:			       ; CODE XREF: main+110\x19j
.text:0000000000400DA0		       add     eax, 0Ah
.text:0000000000400DA3		       add     al, [rdx]
.text:0000000000400DA5		       add     rdx, 1
.text:0000000000400DA9		       cmp     rdx, 5034E0h
.text:0000000000400DB0		       jnz     short loc_400DA0
.text:0000000000400DB2		       movsd   xmm0, cs:init_value
.text:0000000000400DBA		       cvttsd2si edx, xmm0
.text:0000000000400DBE		       add     edx, 0Ah
.text:0000000000400DC1		       shl     edx, 6
.text:0000000000400DC4		       sub     al, dl
.text:0000000000400DC6		       movsx   eax, al
.text:0000000000400DC9		       mov     edx, eax
.text:0000000000400DCB		       sar     edx, 1Fh
.text:0000000000400DCE		       xor     eax, edx
.text:0000000000400DD0		       sub     eax, edx
.text:0000000000400DD2		       cvtsi2sd	xmm0, eax
.text:0000000000400DD6		       ucomisd xmm1, xmm0
.text:0000000000400DDA		       jbe     short loc_400E17
.text:0000000000400DDC
.text:0000000000400DDC loc_400DDC:			       ; CODE XREF: main+199\x19j
.text:0000000000400DDC		       add     ebx, 1
.text:0000000000400DDF		       cmp     ebx, ecx
.text:0000000000400DE1		       jl      short loc_400D90
.text:0000000000400DE3
.text:0000000000400DE3 loc_400DE3:			       ; CODE XREF: main+EC\x18j
.text:0000000000400DE3		       call    _Z5timerv       ; timer(void)
.text:0000000000400DE8		       mov     edi, offset aInt8_tConstant ; "int8_t constant add"
.text:0000000000400DED		       call    _Z13record_resultdPKc ; record_result(double,char  const*)
.text:0000000000400DF2		       mov     edx, cs:iterations
.text:0000000000400DF8		       xor     r8d, r8d
.text:0000000000400DFB		       xor     ecx, ecx
.text:0000000000400DFD		       mov     esi, 1F40h
.text:0000000000400E02		       mov     edi, offset aInt8_tConsta_0 ; "int8_t constant folding"
.text:0000000000400E07		       call    _Z9summarizePKciiii ; summarize(char  const*,int,int,int,int)
.text:0000000000400E0C		       add     rsp, 10h
.text:0000000000400E10		       xor     eax, eax
.text:0000000000400E12		       pop     rbx
.text:0000000000400E13		       pop     rbp
.text:0000000000400E14		       pop     r12
.text:0000000000400E16		       retn
.text:0000000000400E17 ; ---------------------------------------------------------------------------
.text:0000000000400E17
.text:0000000000400E17 loc_400E17:			       ; CODE XREF: main+13A\x18j
.text:0000000000400E17		       mov     esi, cs:current_test
.text:0000000000400E1D		       mov     edi, offset aTestIFailed	; "test	%i failed\n"
.text:0000000000400E22		       xor     eax, eax
.text:0000000000400E24		       movsd   [rsp+28h+var_28], xmm1
.text:0000000000400E29		       call    _printf
.text:0000000000400E2E		       mov     ecx, cs:iterations
.text:0000000000400E34		       movsd   xmm1, [rsp+28h+var_28]
.text:0000000000400E39		       jmp     short loc_400DDC
.text:0000000000400E3B ; ---------------------------------------------------------------------------
.text:0000000000400E3B
.text:0000000000400E3B loc_400E3B:			       ; CODE XREF: main+F\x18j
.text:0000000000400E3B		       mov     edi, 0Ah	       ; c
.text:0000000000400E40		       call    _putchar
.text:0000000000400E45		       jmp     loc_400D1B
.text:0000000000400E45 main	       endp

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-23  1:09           ` Oleg Smolsky
@ 2011-08-23  1:34             ` Oleg Smolsky
  2011-08-23  1:37               ` Andrew Pinski
  0 siblings, 1 reply; 22+ messages in thread
From: Oleg Smolsky @ 2011-08-23  1:34 UTC (permalink / raw)
  To: Xinliang David Li; +Cc: gcc

On 2011/8/22 18:09, Oleg Smolsky wrote:
> Both compilers fully inline the templated function and the emitted 
> code looks very similar. I am puzzled as to why one of these loops is 
> significantly slower than the other. I've attached disassembled 
> listings - perhaps someone could have a look please? (the body of the 
> loop starts at 0000000000400FD for gcc41 and at 0000000000400D90 for 
> gcc46)
The difference, theoretically, should be due to the inner loop:

v4.6:
.text:0000000000400DA0 loc_400DA0:
.text:0000000000400DA0                 add     eax, 0Ah
.text:0000000000400DA3                 add     al, [rdx]
.text:0000000000400DA5                 add     rdx, 1
.text:0000000000400DA9                 cmp     rdx, 5034E0h
.text:0000000000400DB0                 jnz     short loc_400DA0

v4.1:
.text:0000000000400FE0 loc_400FE0:
.text:0000000000400FE0                 movzx   eax, ds:data8[rdx]
.text:0000000000400FE7                 add     rdx, 1
.text:0000000000400FEB                 add     eax, 0Ah
.text:0000000000400FEE                 cmp     rdx, 1F40h
.text:0000000000400FF5                 lea     ecx, [rax+rcx]
.text:0000000000400FF8                 jnz     short loc_400FE0

However, I cannot see how the first version would be slow... The custom 
templated "shifter" degenerates into "add 0xa", which is the point of 
the test... Hmm...

Oleg.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-23  1:34             ` Oleg Smolsky
@ 2011-08-23  1:37               ` Andrew Pinski
  2011-08-23 17:47                 ` Oleg Smolsky
  0 siblings, 1 reply; 22+ messages in thread
From: Andrew Pinski @ 2011-08-23  1:37 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: Xinliang David Li, gcc

On Mon, Aug 22, 2011 at 6:34 PM, Oleg Smolsky <oleg.smolsky@riverbed.com> wrote:
> On 2011/8/22 18:09, Oleg Smolsky wrote:
>>
>> Both compilers fully inline the templated function and the emitted code
>> looks very similar. I am puzzled as to why one of these loops is
>> significantly slower than the other. I've attached disassembled listings -
>> perhaps someone could have a look please? (the body of the loop starts at
>> 0000000000400FD for gcc41 and at 0000000000400D90 for gcc46)
>
> The difference, theoretically, should be due to the inner loop:
>
> v4.6:
> .text:0000000000400DA0 loc_400DA0:
> .text:0000000000400DA0                 add     eax, 0Ah
> .text:0000000000400DA3                 add     al, [rdx]
> .text:0000000000400DA5                 add     rdx, 1
> .text:0000000000400DA9                 cmp     rdx, 5034E0h
> .text:0000000000400DB0                 jnz     short loc_400DA0
>
> v4.1:
> .text:0000000000400FE0 loc_400FE0:
> .text:0000000000400FE0                 movzx   eax, ds:data8[rdx]
> .text:0000000000400FE7                 add     rdx, 1
> .text:0000000000400FEB                 add     eax, 0Ah
> .text:0000000000400FEE                 cmp     rdx, 1F40h
> .text:0000000000400FF5                 lea     ecx, [rax+rcx]
> .text:0000000000400FF8                 jnz     short loc_400FE0
>
> However, I cannot see how the first version would be slow... The custom
> templated "shifter" degenerates into "add 0xa", which is the point of the
> test... Hmm...

It is slower because of the subregister depedency between eax and al.

Thanks,
Andrew Pinski

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-23  1:37               ` Andrew Pinski
@ 2011-08-23 17:47                 ` Oleg Smolsky
  2011-08-23 18:38                   ` Xinliang David Li
  0 siblings, 1 reply; 22+ messages in thread
From: Oleg Smolsky @ 2011-08-23 17:47 UTC (permalink / raw)
  To: Andrew Pinski; +Cc: Xinliang David Li, gcc

Hey Andrew,

On 2011/8/22 18:37, Andrew Pinski wrote:
> On Mon, Aug 22, 2011 at 6:34 PM, Oleg Smolsky<oleg.smolsky@riverbed.com>  wrote:
>> On 2011/8/22 18:09, Oleg Smolsky wrote:
>>> Both compilers fully inline the templated function and the emitted code
>>> looks very similar. I am puzzled as to why one of these loops is
>>> significantly slower than the other. I've attached disassembled listings -
>>> perhaps someone could have a look please? (the body of the loop starts at
>>> 0000000000400FD for gcc41 and at 0000000000400D90 for gcc46)
>> The difference, theoretically, should be due to the inner loop:
>>
>> v4.6:
>> .text:0000000000400DA0 loc_400DA0:
>> .text:0000000000400DA0                 add     eax, 0Ah
>> .text:0000000000400DA3                 add     al, [rdx]
>> .text:0000000000400DA5                 add     rdx, 1
>> .text:0000000000400DA9                 cmp     rdx, 5034E0h
>> .text:0000000000400DB0                 jnz     short loc_400DA0
>>
>> v4.1:
>> .text:0000000000400FE0 loc_400FE0:
>> .text:0000000000400FE0                 movzx   eax, ds:data8[rdx]
>> .text:0000000000400FE7                 add     rdx, 1
>> .text:0000000000400FEB                 add     eax, 0Ah
>> .text:0000000000400FEE                 cmp     rdx, 1F40h
>> .text:0000000000400FF5                 lea     ecx, [rax+rcx]
>> .text:0000000000400FF8                 jnz     short loc_400FE0
>>
>> However, I cannot see how the first version would be slow... The custom
>> templated "shifter" degenerates into "add 0xa", which is the point of the
>> test... Hmm...
> It is slower because of the subregister depedency between eax and al.
>
Hmm... it is little difficult to reason about these fragments as they 
are not equivalent in functionality. The g++4.1 version discards the 
result while the other version (correctly) accumulates. Oh, I've just 
realized that I grabbed the first iteration of the inner loop which was 
factored out (perhaps due to unrolling?) Oops, my apologies.

Here are complete loops, out of a further digested test:

g++ 4.1 (1.35 sec, 1185M ops/s):

.text:0000000000400FDB loc_400FDB:
.text:0000000000400FDB                 xor     ecx, ecx
.text:0000000000400FDD                 xor     edx, edx
.text:0000000000400FDF                 nop
.text:0000000000400FE0
.text:0000000000400FE0 loc_400FE0:
.text:0000000000400FE0                 movzx   eax, ds:data8[rdx]
.text:0000000000400FE7                 add     rdx, 1
.text:0000000000400FEB                 add     eax, 0Ah
.text:0000000000400FEE                 cmp     rdx, 1F40h
.text:0000000000400FF5                 lea     ecx, [rax+rcx]
.text:0000000000400FF8                 jnz     short loc_400FE0
.text:0000000000400FFA                 movsx   eax, cl
.text:0000000000400FFD                 add     esi, 1
.text:0000000000401000                 add     ebx, eax
.text:0000000000401002                 cmp     esi, edi
.text:0000000000401004                 jnz     short loc_400FDB

g++ 4.6 (2.86s, 563M ops/s) :

.text:0000000000400D80 loc_400D80:
.text:0000000000400D80                 mov     edx, offset data8
.text:0000000000400D85                 xor     eax, eax
.text:0000000000400D87                 db      66h, 66h
.text:0000000000400D87                 nop
.text:0000000000400D8A                 db      66h, 66h
.text:0000000000400D8A                 nop
.text:0000000000400D8D                 db      66h, 66h
.text:0000000000400D8D                 nop
.text:0000000000400D90
.text:0000000000400D90 loc_400D90:
.text:0000000000400D90                 add     eax, 0Ah
.text:0000000000400D93                 add     al, [rdx]
.text:0000000000400D95                 add     rdx, 1
.text:0000000000400D99                 cmp     rdx, 503480h
.text:0000000000400DA0                 jnz     short loc_400D90
.text:0000000000400DA2                 movsx   eax, al
.text:0000000000400DA5                 add     ecx, 1
.text:0000000000400DA8                 add     ebx, eax
.text:0000000000400DAA                 cmp     ecx, esi
.text:0000000000400DAC                 jnz     short loc_400D80

Your observation still holds - there are two sequential instructions 
that operate on the same register. So, I manually patched the 4.6 
binary's inner loop to the following:

.text:0000000000400D90                 add     al, [rdx]
.text:0000000000400D92                 add     rdx, 1
.text:0000000000400D96                 add     eax, 0Ah
.text:0000000000400D99                 cmp     rdx, 503480h
.text:0000000000400DA0                 jnz     short loc_400D90

and that made no significant difference in performance.

Is this dependency really a performance issue? BTW, the outer loop 
executes 200,000 times...

Thanks!

Oleg.

P.S. GDB disassembles the v4.6 emitted padding as:

    0x0000000000400d87 <+231>:   data32 xchg ax,ax
    0x0000000000400d8a <+234>:   data32 xchg ax,ax
    0x0000000000400d8d <+237>:   data32 xchg ax,ax

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-23 17:47                 ` Oleg Smolsky
@ 2011-08-23 18:38                   ` Xinliang David Li
  2011-08-24 19:51                     ` Oleg Smolsky
  0 siblings, 1 reply; 22+ messages in thread
From: Xinliang David Li @ 2011-08-23 18:38 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: Andrew Pinski, gcc

Partial register stall happens when there is a 32bit register read
followed by a partial register write. In your case, the stall probably
happens in the next iteration when 'add eax, 0Ah' executes, so your
manual patch does not work.  Try change

add al, [dx] into two instructions (assuming esi is available here)

movzx esi, ds:data8[dx]
add  eax, esi

David


On Tue, Aug 23, 2011 at 10:47 AM, Oleg Smolsky
<oleg.smolsky@riverbed.com> wrote:
> Hey Andrew,
>
> On 2011/8/22 18:37, Andrew Pinski wrote:
>>
>> On Mon, Aug 22, 2011 at 6:34 PM, Oleg Smolsky<oleg.smolsky@riverbed.com>
>>  wrote:
>>>
>>> On 2011/8/22 18:09, Oleg Smolsky wrote:
>>>>
>>>> Both compilers fully inline the templated function and the emitted code
>>>> looks very similar. I am puzzled as to why one of these loops is
>>>> significantly slower than the other. I've attached disassembled listings
>>>> -
>>>> perhaps someone could have a look please? (the body of the loop starts
>>>> at
>>>> 0000000000400FD for gcc41 and at 0000000000400D90 for gcc46)
>>>
>>> The difference, theoretically, should be due to the inner loop:
>>>
>>> v4.6:
>>> .text:0000000000400DA0 loc_400DA0:
>>> .text:0000000000400DA0                 add     eax, 0Ah
>>> .text:0000000000400DA3                 add     al, [rdx]
>>> .text:0000000000400DA5                 add     rdx, 1
>>> .text:0000000000400DA9                 cmp     rdx, 5034E0h
>>> .text:0000000000400DB0                 jnz     short loc_400DA0
>>>
>>> v4.1:
>>> .text:0000000000400FE0 loc_400FE0:
>>> .text:0000000000400FE0                 movzx   eax, ds:data8[rdx]
>>> .text:0000000000400FE7                 add     rdx, 1
>>> .text:0000000000400FEB                 add     eax, 0Ah
>>> .text:0000000000400FEE                 cmp     rdx, 1F40h
>>> .text:0000000000400FF5                 lea     ecx, [rax+rcx]
>>> .text:0000000000400FF8                 jnz     short loc_400FE0
>>>
>>> However, I cannot see how the first version would be slow... The custom
>>> templated "shifter" degenerates into "add 0xa", which is the point of the
>>> test... Hmm...
>>
>> It is slower because of the subregister depedency between eax and al.
>>
> Hmm... it is little difficult to reason about these fragments as they are
> not equivalent in functionality. The g++4.1 version discards the result
> while the other version (correctly) accumulates. Oh, I've just realized that
> I grabbed the first iteration of the inner loop which was factored out
> (perhaps due to unrolling?) Oops, my apologies.
>
> Here are complete loops, out of a further digested test:
>
> g++ 4.1 (1.35 sec, 1185M ops/s):
>
> .text:0000000000400FDB loc_400FDB:
> .text:0000000000400FDB                 xor     ecx, ecx
> .text:0000000000400FDD                 xor     edx, edx
> .text:0000000000400FDF                 nop
> .text:0000000000400FE0
> .text:0000000000400FE0 loc_400FE0:
> .text:0000000000400FE0                 movzx   eax, ds:data8[rdx]
> .text:0000000000400FE7                 add     rdx, 1
> .text:0000000000400FEB                 add     eax, 0Ah
> .text:0000000000400FEE                 cmp     rdx, 1F40h
> .text:0000000000400FF5                 lea     ecx, [rax+rcx]
> .text:0000000000400FF8                 jnz     short loc_400FE0
> .text:0000000000400FFA                 movsx   eax, cl
> .text:0000000000400FFD                 add     esi, 1
> .text:0000000000401000                 add     ebx, eax
> .text:0000000000401002                 cmp     esi, edi
> .text:0000000000401004                 jnz     short loc_400FDB
>
> g++ 4.6 (2.86s, 563M ops/s) :
>
> .text:0000000000400D80 loc_400D80:
> .text:0000000000400D80                 mov     edx, offset data8
> .text:0000000000400D85                 xor     eax, eax
> .text:0000000000400D87                 db      66h, 66h
> .text:0000000000400D87                 nop
> .text:0000000000400D8A                 db      66h, 66h
> .text:0000000000400D8A                 nop
> .text:0000000000400D8D                 db      66h, 66h
> .text:0000000000400D8D                 nop
> .text:0000000000400D90
> .text:0000000000400D90 loc_400D90:
> .text:0000000000400D90                 add     eax, 0Ah
> .text:0000000000400D93                 add     al, [rdx]
> .text:0000000000400D95                 add     rdx, 1
> .text:0000000000400D99                 cmp     rdx, 503480h
> .text:0000000000400DA0                 jnz     short loc_400D90
> .text:0000000000400DA2                 movsx   eax, al
> .text:0000000000400DA5                 add     ecx, 1
> .text:0000000000400DA8                 add     ebx, eax
> .text:0000000000400DAA                 cmp     ecx, esi
> .text:0000000000400DAC                 jnz     short loc_400D80
>
> Your observation still holds - there are two sequential instructions that
> operate on the same register. So, I manually patched the 4.6 binary's inner
> loop to the following:
>
> .text:0000000000400D90                 add     al, [rdx]
> .text:0000000000400D92                 add     rdx, 1
> .text:0000000000400D96                 add     eax, 0Ah
> .text:0000000000400D99                 cmp     rdx, 503480h
> .text:0000000000400DA0                 jnz     short loc_400D90
>
> and that made no significant difference in performance.
>
> Is this dependency really a performance issue? BTW, the outer loop executes
> 200,000 times...
>
> Thanks!
>
> Oleg.
>
> P.S. GDB disassembles the v4.6 emitted padding as:
>
>   0x0000000000400d87 <+231>:   data32 xchg ax,ax
>   0x0000000000400d8a <+234>:   data32 xchg ax,ax
>   0x0000000000400d8d <+237>:   data32 xchg ax,ax
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-23 18:38                   ` Xinliang David Li
@ 2011-08-24 19:51                     ` Oleg Smolsky
  2011-08-24 20:03                       ` Xinliang David Li
  0 siblings, 1 reply; 22+ messages in thread
From: Oleg Smolsky @ 2011-08-24 19:51 UTC (permalink / raw)
  To: Xinliang David Li; +Cc: Andrew Pinski, gcc

On 2011/8/23 11:38, Xinliang David Li wrote:
> Partial register stall happens when there is a 32bit register read
> followed by a partial register write. In your case, the stall probably
> happens in the next iteration when 'add eax, 0Ah' executes, so your
> manual patch does not work.  Try change
>
> add al, [dx] into two instructions (assuming esi is available here)
>
> movzx esi, ds:data8[dx]
> add  eax, esi
>
I patched the code to use  "movzx edi" but the result is a little clumsy 
as the loop is based on the virtual address rather than index. Also, the 
sequence is a bit bigger so I had to spill the patch into the preceding 
padding:

.text:0000000000400D80 loc_400D80:
.text:0000000000400D80                 mov     edx, offset data8
.text:0000000000400D85                 xor     eax, eax
.text:0000000000400D87                 nop
.text:0000000000400D88                 nop
.text:0000000000400D89                 nop
.text:0000000000400D8A                 nop
.text:0000000000400D8B                 nop
.text:0000000000400D8C
.text:0000000000400D8C loc_400D8C:
.text:0000000000400D8C                 movzx   edi, byte ptr [rdx+0]
.text:0000000000400D90                 add     eax, edi
.text:0000000000400D92                 add     eax, 0Ah
.text:0000000000400D95                 add     rdx, 1
.text:0000000000400D99                 cmp     rdx, 503480h
.text:0000000000400DA0                 jnz     short loc_400D8C
.text:0000000000400DA2                 movsx   eax, al
.text:0000000000400DA5                 add     ecx, 1
.text:0000000000400DA8                 add     ebx, eax
.text:0000000000400DAA                 cmp     ecx, esi
.text:0000000000400DAC                 jnz     short loc_400D80

The performance improved from 2.84 sec (563.38 M ops/s) to 1.51 sec 
(1059.60 M ops/s). It's close to the code emitted by g++4.1 now. Very funky!

So, this is one test out of the suite. Many of them degraded... Are you 
guys interested in looking at other ones? Or is there something to be 
fixed in the register allocation logic?

Oleg.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-24 19:51                     ` Oleg Smolsky
@ 2011-08-24 20:03                       ` Xinliang David Li
  2011-08-24 21:26                         ` Oleg Smolsky
  0 siblings, 1 reply; 22+ messages in thread
From: Xinliang David Li @ 2011-08-24 20:03 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: Andrew Pinski, gcc

On Wed, Aug 24, 2011 at 12:50 PM, Oleg Smolsky
<oleg.smolsky@riverbed.com> wrote:
> On 2011/8/23 11:38, Xinliang David Li wrote:
>>
>> Partial register stall happens when there is a 32bit register read
>> followed by a partial register write. In your case, the stall probably
>> happens in the next iteration when 'add eax, 0Ah' executes, so your
>> manual patch does not work.  Try change
>>
>> add al, [dx] into two instructions (assuming esi is available here)
>>
>> movzx esi, ds:data8[dx]
>> add  eax, esi
>>
> I patched the code to use  "movzx edi" but the result is a little clumsy as
> the loop is based on the virtual address rather than index.

my bad -- I did copy & paste without making it precise.

> Also, the
> sequence is a bit bigger so I had to spill the patch into the preceding
> padding:
>
> .text:0000000000400D80 loc_400D80:
> .text:0000000000400D80                 mov     edx, offset data8
> .text:0000000000400D85                 xor     eax, eax
> .text:0000000000400D87                 nop
> .text:0000000000400D88                 nop
> .text:0000000000400D89                 nop
> .text:0000000000400D8A                 nop
> .text:0000000000400D8B                 nop
> .text:0000000000400D8C
> .text:0000000000400D8C loc_400D8C:
> .text:0000000000400D8C                 movzx   edi, byte ptr [rdx+0]
> .text:0000000000400D90                 add     eax, edi
> .text:0000000000400D92                 add     eax, 0Ah
> .text:0000000000400D95                 add     rdx, 1
> .text:0000000000400D99                 cmp     rdx, 503480h
> .text:0000000000400DA0                 jnz     short loc_400D8C
> .text:0000000000400DA2                 movsx   eax, al
> .text:0000000000400DA5                 add     ecx, 1
> .text:0000000000400DA8                 add     ebx, eax
> .text:0000000000400DAA                 cmp     ecx, esi
> .text:0000000000400DAC                 jnz     short loc_400D80
>
> The performance improved from 2.84 sec (563.38 M ops/s) to 1.51 sec (1059.60
> M ops/s). It's close to the code emitted by g++4.1 now. Very funky!
>
> So, this is one test out of the suite. Many of them degraded... Are you guys
> interested in looking at other ones? Or is there something to be fixed in
> the register allocation logic?

File bugs --- the isolated examples like this one would be very
helpful in the bug report.

Thanks,

David


>
> Oleg.
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-24 20:03                       ` Xinliang David Li
@ 2011-08-24 21:26                         ` Oleg Smolsky
  2011-08-24 21:57                           ` Xinliang David Li
  0 siblings, 1 reply; 22+ messages in thread
From: Oleg Smolsky @ 2011-08-24 21:26 UTC (permalink / raw)
  To: Xinliang David Li; +Cc: Andrew Pinski, gcc

On 2011/8/24 13:02, Xinliang David Li wrote:
>> On 2011/8/23 11:38, Xinliang David Li wrote:
>>> Partial register stall happens when there is a 32bit register read
>>> followed by a partial register write. In your case, the stall probably
>>> happens in the next iteration when 'add eax, 0Ah' executes, so your
>>> manual patch does not work.  Try change
>>>
>>> add al, [dx] into two instructions (assuming esi is available here)
>>>
>>> movzx esi, ds:data8[dx]
>>> add  eax, esi
>>>
>> I patched the code to use  "movzx edi" but the result is a little clumsy as
>> the loop is based on the virtual address rather than index.
> my bad -- I did copy&  paste without making it precise.
No worries. The fragment did fit into the padding :)

>> So, this is one test out of the suite. Many of them degraded... Are you guys
>> interested in looking at other ones? Or is there something to be fixed in
>> the register allocation logic?
> File bugs --- the isolated examples like this one would be very 
> helpful in the bug report. 
Done:
     http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50182

Regards,
Oleg.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-24 21:26                         ` Oleg Smolsky
@ 2011-08-24 21:57                           ` Xinliang David Li
  2011-08-24 22:14                             ` Oleg Smolsky
  0 siblings, 1 reply; 22+ messages in thread
From: Xinliang David Li @ 2011-08-24 21:57 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: Andrew Pinski, gcc

Thanks.

Can you make the test case a standalone preprocessed file (using -E)?

David

On Wed, Aug 24, 2011 at 2:26 PM, Oleg Smolsky <oleg.smolsky@riverbed.com> wrote:
> On 2011/8/24 13:02, Xinliang David Li wrote:
>>>
>>> On 2011/8/23 11:38, Xinliang David Li wrote:
>>>>
>>>> Partial register stall happens when there is a 32bit register read
>>>> followed by a partial register write. In your case, the stall probably
>>>> happens in the next iteration when 'add eax, 0Ah' executes, so your
>>>> manual patch does not work.  Try change
>>>>
>>>> add al, [dx] into two instructions (assuming esi is available here)
>>>>
>>>> movzx esi, ds:data8[dx]
>>>> add  eax, esi
>>>>
>>> I patched the code to use  "movzx edi" but the result is a little clumsy
>>> as
>>> the loop is based on the virtual address rather than index.
>>
>> my bad -- I did copy&  paste without making it precise.
>
> No worries. The fragment did fit into the padding :)
>
>>> So, this is one test out of the suite. Many of them degraded... Are you
>>> guys
>>> interested in looking at other ones? Or is there something to be fixed in
>>> the register allocation logic?
>>
>> File bugs --- the isolated examples like this one would be very helpful in
>> the bug report.
>
> Done:
>    http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50182
>
> Regards,
> Oleg.
>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-24 21:57                           ` Xinliang David Li
@ 2011-08-24 22:14                             ` Oleg Smolsky
  0 siblings, 0 replies; 22+ messages in thread
From: Oleg Smolsky @ 2011-08-24 22:14 UTC (permalink / raw)
  To: Xinliang David Li; +Cc: Andrew Pinski, gcc

Sure. I've just attached it to the bug.

On 2011/8/24 14:56, Xinliang David Li wrote:
> Thanks.
>
> Can you make the test case a standalone preprocessed file (using -E)?
>
> David
>
> On Wed, Aug 24, 2011 at 2:26 PM, Oleg Smolsky<oleg.smolsky@riverbed.com>  wrote:
>> On 2011/8/24 13:02, Xinliang David Li wrote:
>>>> On 2011/8/23 11:38, Xinliang David Li wrote:
>>>>> Partial register stall happens when there is a 32bit register read
>>>>> followed by a partial register write. In your case, the stall probably
>>>>> happens in the next iteration when 'add eax, 0Ah' executes, so your
>>>>> manual patch does not work.  Try change
>>>>>
>>>>> add al, [dx] into two instructions (assuming esi is available here)
>>>>>
>>>>> movzx esi, ds:data8[dx]
>>>>> add  eax, esi
>>>>>
>>>> I patched the code to use  "movzx edi" but the result is a little clumsy
>>>> as
>>>> the loop is based on the virtual address rather than index.
>>> my bad -- I did copy&    paste without making it precise.
>> No worries. The fragment did fit into the padding :)
>>
>>>> So, this is one test out of the suite. Many of them degraded... Are you
>>>> guys
>>>> interested in looking at other ones? Or is there something to be fixed in
>>>> the register allocation logic?
>>> File bugs --- the isolated examples like this one would be very helpful in
>>> the bug report.
>> Done:
>>     http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50182
>>
>> Regards,
>> Oleg.
>>

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-08-01 18:04 ` Oleg Smolsky
@ 2011-08-01 18:14   ` Marc Glisse
  0 siblings, 0 replies; 22+ messages in thread
From: Marc Glisse @ 2011-08-01 18:14 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: Benjamin Redelings I, gcc

On Mon, 1 Aug 2011, Oleg Smolsky wrote:

> BTW, some of these tweaks increase the binary size to 99K, yet there is no 
> performance increase.

I don't see this in the thread: did you use -march=native?

-- 
Marc Glisse

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
  2011-07-30 14:57 Benjamin Redelings I
@ 2011-08-01 18:04 ` Oleg Smolsky
  2011-08-01 18:14   ` Marc Glisse
  0 siblings, 1 reply; 22+ messages in thread
From: Oleg Smolsky @ 2011-08-01 18:04 UTC (permalink / raw)
  To: Benjamin Redelings I; +Cc: gcc

Hi Benjamin,

On 2011/7/30 06:22, Benjamin Redelings I wrote:
> I had some performance degradation with 4.6 as well.
>
> However, I was able to cure it by using -finline-limit=800 or 1000 I 
> think.  However, this lead to a code size increase.  Were the old 
> higher-performance binaries larger?
Yes, the older binary for the degraded test was indeed larger: 107K vs 88K.

However, I have just re-built and re-run the test and there was no 
significant difference in performance. IE the degradation in 
"simple_types_constant_folding" test remains when building with 
-finline-limit=800 (or =1000)

> IIRC, setting finline-limit=n actually sets two params to n/2, but I 
> think you may only need to change 1 to get the old performance back.  
> --param max-inline-insns-single defaults to 450, but --param 
> max-inline-insns-auto defaults to 90.  Perhaps you can get the old 
> performance back by adjusting just one of these two parameters, or by 
> setting them to different values, instead of the same value, as would 
> be achieved by -finline-limit.
"--param max-inline-insns-auto=800" by itself does not help. The 
"--param max-inline-insns-single=800 --param max-inline-insns-auto=1000" 
combination makes no significant difference either.

BTW, some of these tweaks increase the binary size to 99K, yet there is 
no performance increase.

Oleg.

^ permalink raw reply	[flat|nested] 22+ messages in thread

* Re: Performance degradation on g++ 4.6
@ 2011-07-30 14:57 Benjamin Redelings I
  2011-08-01 18:04 ` Oleg Smolsky
  0 siblings, 1 reply; 22+ messages in thread
From: Benjamin Redelings I @ 2011-07-30 14:57 UTC (permalink / raw)
  To: Oleg Smolsky; +Cc: gcc

Hi Oleg,

I had some performance degradation with 4.6 as well.

However, I was able to cure it by using -finline-limit=800 or 1000 I 
think.  However, this lead to a code size increase.  Were the old 
higher-performance binaries larger?

IIRC, setting finline-limit=n actually sets two params to n/2, but I 
think you may only need to change 1 to get the old performance back.  
--param max-inline-insns-single defaults to 450, but --param 
max-inline-insns-auto defaults to 90.  Perhaps you can get the old 
performance back by adjusting just one of these two parameters, or by 
setting them to different values, instead of the same value, as would be 
achieved by -finline-limit.

-BenRI

^ permalink raw reply	[flat|nested] 22+ messages in thread

end of thread, other threads:[~2011-08-24 22:14 UTC | newest]

Thread overview: 22+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-07-29 18:08 Performance degradation on g++ 4.6 Oleg Smolsky
2011-07-29 18:14 ` Xinliang David Li
2011-07-29 21:08   ` Oleg Smolsky
2011-07-29 21:29     ` Xinliang David Li
2011-08-01 18:44       ` Oleg Smolsky
2011-08-02  5:48         ` Xinliang David Li
2011-08-23  1:09           ` Oleg Smolsky
2011-08-23  1:34             ` Oleg Smolsky
2011-08-23  1:37               ` Andrew Pinski
2011-08-23 17:47                 ` Oleg Smolsky
2011-08-23 18:38                   ` Xinliang David Li
2011-08-24 19:51                     ` Oleg Smolsky
2011-08-24 20:03                       ` Xinliang David Li
2011-08-24 21:26                         ` Oleg Smolsky
2011-08-24 21:57                           ` Xinliang David Li
2011-08-24 22:14                             ` Oleg Smolsky
2011-08-02  9:27         ` Richard Guenther
2011-08-03 19:12         ` Xinliang David Li
2011-07-30  9:24 ` Richard Guenther
2011-07-30 14:57 Benjamin Redelings I
2011-08-01 18:04 ` Oleg Smolsky
2011-08-01 18:14   ` Marc Glisse

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).