mustang 0.0.1 → 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.rspec +1 -0
- data/Isolate +9 -0
- data/README.md +6 -12
- data/Rakefile +30 -4
- data/TODO.md +9 -0
- data/ext/v8/extconf.rb +56 -0
- data/ext/v8/v8.cpp +37 -0
- data/ext/v8/v8_array.cpp +161 -0
- data/ext/v8/v8_array.h +17 -0
- data/ext/v8/v8_base.cpp +147 -0
- data/ext/v8/v8_base.h +23 -0
- data/ext/v8/v8_cast.cpp +151 -0
- data/ext/v8/v8_cast.h +64 -0
- data/ext/v8/v8_context.cpp +174 -0
- data/ext/v8/v8_context.h +12 -0
- data/ext/v8/v8_date.cpp +61 -0
- data/ext/v8/v8_date.h +16 -0
- data/ext/v8/v8_errors.cpp +147 -0
- data/ext/v8/v8_errors.h +19 -0
- data/ext/v8/v8_external.cpp +66 -0
- data/ext/v8/v8_external.h +16 -0
- data/ext/v8/v8_function.cpp +182 -0
- data/ext/v8/v8_function.h +14 -0
- data/ext/v8/v8_integer.cpp +70 -0
- data/ext/v8/v8_integer.h +16 -0
- data/ext/v8/v8_macros.h +30 -0
- data/ext/v8/v8_main.cpp +53 -0
- data/ext/v8/v8_main.h +13 -0
- data/ext/v8/v8_number.cpp +62 -0
- data/ext/v8/v8_number.h +16 -0
- data/ext/v8/v8_object.cpp +172 -0
- data/ext/v8/v8_object.h +17 -0
- data/ext/v8/v8_ref.cpp +72 -0
- data/ext/v8/v8_ref.h +43 -0
- data/ext/v8/v8_regexp.cpp +148 -0
- data/ext/v8/v8_regexp.h +16 -0
- data/ext/v8/v8_string.cpp +78 -0
- data/ext/v8/v8_string.h +16 -0
- data/ext/v8/v8_value.cpp +370 -0
- data/ext/v8/v8_value.h +19 -0
- data/gemspec.yml +2 -1
- data/lib/core_ext/class.rb +14 -0
- data/lib/core_ext/object.rb +12 -0
- data/lib/core_ext/symbol.rb +23 -0
- data/lib/mustang.rb +44 -0
- data/lib/mustang/context.rb +69 -0
- data/lib/mustang/errors.rb +36 -0
- data/lib/support/delegated.rb +25 -0
- data/lib/v8/array.rb +21 -0
- data/lib/v8/context.rb +13 -0
- data/lib/v8/date.rb +20 -0
- data/lib/v8/error.rb +15 -0
- data/lib/v8/external.rb +16 -0
- data/lib/v8/function.rb +11 -0
- data/lib/v8/integer.rb +16 -0
- data/lib/v8/number.rb +16 -0
- data/lib/v8/object.rb +66 -0
- data/lib/v8/regexp.rb +23 -0
- data/lib/v8/string.rb +27 -0
- data/mustang.gemspec +3 -0
- data/spec/core_ext/class_spec.rb +19 -0
- data/spec/core_ext/object_spec.rb +19 -0
- data/spec/core_ext/symbol_spec.rb +27 -0
- data/spec/fixtures/test1.js +2 -0
- data/spec/fixtures/test2.js +2 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/v8/array_spec.rb +88 -0
- data/spec/v8/cast_spec.rb +151 -0
- data/spec/v8/context_spec.rb +78 -0
- data/spec/v8/data_spec.rb +39 -0
- data/spec/v8/date_spec.rb +45 -0
- data/spec/v8/empty_spec.rb +27 -0
- data/spec/v8/errors_spec.rb +142 -0
- data/spec/v8/external_spec.rb +44 -0
- data/spec/v8/function_spec.rb +170 -0
- data/spec/v8/integer_spec.rb +41 -0
- data/spec/v8/main_spec.rb +18 -0
- data/spec/v8/null_spec.rb +27 -0
- data/spec/v8/number_spec.rb +40 -0
- data/spec/v8/object_spec.rb +79 -0
- data/spec/v8/primitive_spec.rb +9 -0
- data/spec/v8/regexp_spec.rb +65 -0
- data/spec/v8/string_spec.rb +48 -0
- data/spec/v8/undefined_spec.rb +27 -0
- data/spec/v8/value_spec.rb +215 -0
- data/vendor/v8/.gitignore +2 -0
- data/vendor/v8/AUTHORS +3 -1
- data/vendor/v8/ChangeLog +117 -0
- data/vendor/v8/SConstruct +334 -53
- data/vendor/v8/include/v8-debug.h +21 -11
- data/vendor/v8/include/v8-preparser.h +1 -1
- data/vendor/v8/include/v8-profiler.h +122 -43
- data/vendor/v8/include/v8-testing.h +5 -0
- data/vendor/v8/include/v8.h +171 -17
- data/vendor/v8/preparser/SConscript +38 -0
- data/vendor/v8/preparser/preparser-process.cc +77 -114
- data/vendor/v8/samples/shell.cc +232 -46
- data/vendor/v8/src/SConscript +29 -5
- data/vendor/v8/src/accessors.cc +70 -211
- data/vendor/v8/{test/cctest/test-mips.cc → src/allocation-inl.h} +15 -18
- data/vendor/v8/src/allocation.cc +0 -82
- data/vendor/v8/src/allocation.h +9 -42
- data/vendor/v8/src/api.cc +1645 -1156
- data/vendor/v8/src/api.h +76 -12
- data/vendor/v8/src/apiutils.h +0 -7
- data/vendor/v8/src/arguments.h +15 -4
- data/vendor/v8/src/arm/assembler-arm-inl.h +10 -9
- data/vendor/v8/src/arm/assembler-arm.cc +62 -23
- data/vendor/v8/src/arm/assembler-arm.h +76 -11
- data/vendor/v8/src/arm/builtins-arm.cc +39 -33
- data/vendor/v8/src/arm/code-stubs-arm.cc +1182 -402
- data/vendor/v8/src/arm/code-stubs-arm.h +20 -54
- data/vendor/v8/src/arm/codegen-arm.cc +159 -106
- data/vendor/v8/src/arm/codegen-arm.h +6 -6
- data/vendor/v8/src/arm/constants-arm.h +16 -1
- data/vendor/v8/src/arm/cpu-arm.cc +7 -5
- data/vendor/v8/src/arm/debug-arm.cc +6 -4
- data/vendor/v8/src/arm/deoptimizer-arm.cc +51 -14
- data/vendor/v8/src/arm/disasm-arm.cc +47 -15
- data/vendor/v8/src/arm/frames-arm.h +1 -1
- data/vendor/v8/src/arm/full-codegen-arm.cc +724 -408
- data/vendor/v8/src/arm/ic-arm.cc +90 -85
- data/vendor/v8/src/arm/lithium-arm.cc +140 -69
- data/vendor/v8/src/arm/lithium-arm.h +161 -46
- data/vendor/v8/src/arm/lithium-codegen-arm.cc +567 -297
- data/vendor/v8/src/arm/lithium-codegen-arm.h +21 -9
- data/vendor/v8/src/arm/lithium-gap-resolver-arm.cc +2 -0
- data/vendor/v8/src/arm/macro-assembler-arm.cc +457 -96
- data/vendor/v8/src/arm/macro-assembler-arm.h +115 -18
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.cc +20 -13
- data/vendor/v8/src/arm/regexp-macro-assembler-arm.h +1 -0
- data/vendor/v8/src/arm/simulator-arm.cc +184 -101
- data/vendor/v8/src/arm/simulator-arm.h +26 -21
- data/vendor/v8/src/arm/stub-cache-arm.cc +450 -467
- data/vendor/v8/src/arm/virtual-frame-arm.cc +14 -12
- data/vendor/v8/src/arm/virtual-frame-arm.h +11 -8
- data/vendor/v8/src/array.js +35 -18
- data/vendor/v8/src/assembler.cc +186 -92
- data/vendor/v8/src/assembler.h +106 -69
- data/vendor/v8/src/ast-inl.h +5 -0
- data/vendor/v8/src/ast.cc +46 -35
- data/vendor/v8/src/ast.h +107 -50
- data/vendor/v8/src/atomicops.h +2 -0
- data/vendor/v8/src/atomicops_internals_mips_gcc.h +169 -0
- data/vendor/v8/src/bootstrapper.cc +649 -399
- data/vendor/v8/src/bootstrapper.h +94 -27
- data/vendor/v8/src/builtins.cc +359 -227
- data/vendor/v8/src/builtins.h +157 -123
- data/vendor/v8/src/checks.cc +2 -2
- data/vendor/v8/src/checks.h +4 -0
- data/vendor/v8/src/code-stubs.cc +27 -17
- data/vendor/v8/src/code-stubs.h +38 -17
- data/vendor/v8/src/codegen-inl.h +5 -1
- data/vendor/v8/src/codegen.cc +27 -17
- data/vendor/v8/src/codegen.h +9 -9
- data/vendor/v8/src/compilation-cache.cc +92 -206
- data/vendor/v8/src/compilation-cache.h +205 -30
- data/vendor/v8/src/compiler.cc +107 -120
- data/vendor/v8/src/compiler.h +17 -2
- data/vendor/v8/src/contexts.cc +22 -15
- data/vendor/v8/src/contexts.h +14 -8
- data/vendor/v8/src/conversions.cc +86 -30
- data/vendor/v8/src/counters.cc +19 -4
- data/vendor/v8/src/counters.h +28 -16
- data/vendor/v8/src/cpu-profiler-inl.h +4 -3
- data/vendor/v8/src/cpu-profiler.cc +123 -72
- data/vendor/v8/src/cpu-profiler.h +33 -19
- data/vendor/v8/src/cpu.h +2 -0
- data/vendor/v8/src/d8-debug.cc +3 -3
- data/vendor/v8/src/d8-debug.h +7 -6
- data/vendor/v8/src/d8-posix.cc +2 -0
- data/vendor/v8/src/d8.cc +22 -12
- data/vendor/v8/src/d8.gyp +3 -0
- data/vendor/v8/src/d8.js +618 -0
- data/vendor/v8/src/data-flow.h +3 -3
- data/vendor/v8/src/dateparser.h +4 -2
- data/vendor/v8/src/debug-agent.cc +10 -9
- data/vendor/v8/src/debug-agent.h +9 -11
- data/vendor/v8/src/debug-debugger.js +121 -0
- data/vendor/v8/src/debug.cc +331 -227
- data/vendor/v8/src/debug.h +248 -219
- data/vendor/v8/src/deoptimizer.cc +173 -62
- data/vendor/v8/src/deoptimizer.h +119 -19
- data/vendor/v8/src/disasm.h +3 -0
- data/vendor/v8/src/disassembler.cc +10 -9
- data/vendor/v8/src/execution.cc +185 -129
- data/vendor/v8/src/execution.h +47 -78
- data/vendor/v8/src/extensions/experimental/break-iterator.cc +250 -0
- data/vendor/v8/src/extensions/experimental/break-iterator.h +89 -0
- data/vendor/v8/src/extensions/experimental/experimental.gyp +2 -0
- data/vendor/v8/src/extensions/experimental/i18n-extension.cc +22 -2
- data/vendor/v8/src/extensions/externalize-string-extension.cc +2 -2
- data/vendor/v8/src/extensions/gc-extension.cc +1 -1
- data/vendor/v8/src/factory.cc +261 -154
- data/vendor/v8/src/factory.h +162 -158
- data/vendor/v8/src/flag-definitions.h +17 -11
- data/vendor/v8/src/frame-element.cc +0 -5
- data/vendor/v8/src/frame-element.h +9 -13
- data/vendor/v8/src/frames-inl.h +7 -0
- data/vendor/v8/src/frames.cc +56 -46
- data/vendor/v8/src/frames.h +36 -25
- data/vendor/v8/src/full-codegen.cc +15 -24
- data/vendor/v8/src/full-codegen.h +13 -41
- data/vendor/v8/src/func-name-inferrer.cc +7 -6
- data/vendor/v8/src/func-name-inferrer.h +1 -1
- data/vendor/v8/src/gdb-jit.cc +1 -0
- data/vendor/v8/src/global-handles.cc +118 -56
- data/vendor/v8/src/global-handles.h +98 -40
- data/vendor/v8/src/globals.h +2 -2
- data/vendor/v8/src/handles-inl.h +106 -9
- data/vendor/v8/src/handles.cc +220 -157
- data/vendor/v8/src/handles.h +38 -59
- data/vendor/v8/src/hashmap.h +3 -3
- data/vendor/v8/src/heap-inl.h +141 -25
- data/vendor/v8/src/heap-profiler.cc +117 -63
- data/vendor/v8/src/heap-profiler.h +38 -21
- data/vendor/v8/src/heap.cc +805 -564
- data/vendor/v8/src/heap.h +640 -594
- data/vendor/v8/src/hydrogen-instructions.cc +216 -73
- data/vendor/v8/src/hydrogen-instructions.h +259 -124
- data/vendor/v8/src/hydrogen.cc +996 -1171
- data/vendor/v8/src/hydrogen.h +163 -144
- data/vendor/v8/src/ia32/assembler-ia32-inl.h +12 -11
- data/vendor/v8/src/ia32/assembler-ia32.cc +85 -39
- data/vendor/v8/src/ia32/assembler-ia32.h +82 -16
- data/vendor/v8/src/ia32/builtins-ia32.cc +64 -58
- data/vendor/v8/src/ia32/code-stubs-ia32.cc +248 -324
- data/vendor/v8/src/ia32/code-stubs-ia32.h +3 -44
- data/vendor/v8/src/ia32/codegen-ia32.cc +217 -165
- data/vendor/v8/src/ia32/codegen-ia32.h +3 -0
- data/vendor/v8/src/ia32/cpu-ia32.cc +6 -5
- data/vendor/v8/src/ia32/debug-ia32.cc +8 -5
- data/vendor/v8/src/ia32/deoptimizer-ia32.cc +124 -14
- data/vendor/v8/src/ia32/disasm-ia32.cc +85 -62
- data/vendor/v8/src/ia32/frames-ia32.h +1 -1
- data/vendor/v8/src/ia32/full-codegen-ia32.cc +348 -435
- data/vendor/v8/src/ia32/ic-ia32.cc +91 -91
- data/vendor/v8/src/ia32/lithium-codegen-ia32.cc +500 -255
- data/vendor/v8/src/ia32/lithium-codegen-ia32.h +13 -4
- data/vendor/v8/src/ia32/lithium-gap-resolver-ia32.cc +6 -0
- data/vendor/v8/src/ia32/lithium-ia32.cc +122 -45
- data/vendor/v8/src/ia32/lithium-ia32.h +128 -41
- data/vendor/v8/src/ia32/macro-assembler-ia32.cc +109 -84
- data/vendor/v8/src/ia32/macro-assembler-ia32.h +18 -9
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.cc +26 -15
- data/vendor/v8/src/ia32/regexp-macro-assembler-ia32.h +1 -0
- data/vendor/v8/src/ia32/register-allocator-ia32.cc +30 -30
- data/vendor/v8/src/ia32/simulator-ia32.h +4 -4
- data/vendor/v8/src/ia32/stub-cache-ia32.cc +383 -400
- data/vendor/v8/src/ia32/virtual-frame-ia32.cc +36 -13
- data/vendor/v8/src/ia32/virtual-frame-ia32.h +11 -5
- data/vendor/v8/src/ic-inl.h +12 -2
- data/vendor/v8/src/ic.cc +304 -221
- data/vendor/v8/src/ic.h +115 -58
- data/vendor/v8/src/interpreter-irregexp.cc +25 -21
- data/vendor/v8/src/interpreter-irregexp.h +2 -1
- data/vendor/v8/src/isolate.cc +883 -0
- data/vendor/v8/src/isolate.h +1304 -0
- data/vendor/v8/src/json.js +10 -10
- data/vendor/v8/src/jsregexp.cc +111 -80
- data/vendor/v8/src/jsregexp.h +6 -7
- data/vendor/v8/src/jump-target-heavy.cc +5 -8
- data/vendor/v8/src/jump-target-heavy.h +0 -6
- data/vendor/v8/src/jump-target-inl.h +1 -1
- data/vendor/v8/src/jump-target-light.cc +3 -3
- data/vendor/v8/src/lithium-allocator-inl.h +2 -0
- data/vendor/v8/src/lithium-allocator.cc +42 -30
- data/vendor/v8/src/lithium-allocator.h +8 -22
- data/vendor/v8/src/lithium.cc +1 -0
- data/vendor/v8/src/liveedit.cc +141 -99
- data/vendor/v8/src/liveedit.h +7 -2
- data/vendor/v8/src/liveobjectlist-inl.h +90 -0
- data/vendor/v8/src/liveobjectlist.cc +2537 -1
- data/vendor/v8/src/liveobjectlist.h +245 -35
- data/vendor/v8/src/log-utils.cc +122 -35
- data/vendor/v8/src/log-utils.h +33 -36
- data/vendor/v8/src/log.cc +299 -241
- data/vendor/v8/src/log.h +177 -110
- data/vendor/v8/src/mark-compact.cc +612 -470
- data/vendor/v8/src/mark-compact.h +153 -80
- data/vendor/v8/src/messages.cc +16 -14
- data/vendor/v8/src/messages.js +30 -7
- data/vendor/v8/src/mips/assembler-mips-inl.h +155 -35
- data/vendor/v8/src/mips/assembler-mips.cc +1093 -219
- data/vendor/v8/src/mips/assembler-mips.h +552 -153
- data/vendor/v8/src/mips/builtins-mips.cc +43 -100
- data/vendor/v8/src/mips/code-stubs-mips.cc +752 -0
- data/vendor/v8/src/mips/code-stubs-mips.h +511 -0
- data/vendor/v8/src/mips/codegen-mips-inl.h +8 -14
- data/vendor/v8/src/mips/codegen-mips.cc +672 -896
- data/vendor/v8/src/mips/codegen-mips.h +271 -69
- data/vendor/v8/src/mips/constants-mips.cc +44 -20
- data/vendor/v8/src/mips/constants-mips.h +238 -40
- data/vendor/v8/src/mips/cpu-mips.cc +20 -3
- data/vendor/v8/src/mips/debug-mips.cc +35 -7
- data/vendor/v8/src/mips/deoptimizer-mips.cc +91 -0
- data/vendor/v8/src/mips/disasm-mips.cc +329 -93
- data/vendor/v8/src/mips/frames-mips.cc +2 -50
- data/vendor/v8/src/mips/frames-mips.h +24 -9
- data/vendor/v8/src/mips/full-codegen-mips.cc +473 -23
- data/vendor/v8/src/mips/ic-mips.cc +81 -45
- data/vendor/v8/src/mips/jump-target-mips.cc +11 -106
- data/vendor/v8/src/mips/lithium-codegen-mips.h +65 -0
- data/vendor/v8/src/mips/lithium-mips.h +304 -0
- data/vendor/v8/src/mips/macro-assembler-mips.cc +2391 -390
- data/vendor/v8/src/mips/macro-assembler-mips.h +718 -121
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.cc +478 -0
- data/vendor/v8/src/mips/regexp-macro-assembler-mips.h +250 -0
- data/vendor/v8/src/mips/register-allocator-mips-inl.h +0 -3
- data/vendor/v8/src/mips/register-allocator-mips.h +3 -2
- data/vendor/v8/src/mips/simulator-mips.cc +1009 -221
- data/vendor/v8/src/mips/simulator-mips.h +119 -36
- data/vendor/v8/src/mips/stub-cache-mips.cc +331 -148
- data/vendor/v8/src/mips/{fast-codegen-mips.cc → virtual-frame-mips-inl.h} +11 -30
- data/vendor/v8/src/mips/virtual-frame-mips.cc +137 -149
- data/vendor/v8/src/mips/virtual-frame-mips.h +294 -312
- data/vendor/v8/src/mirror-debugger.js +9 -8
- data/vendor/v8/src/mksnapshot.cc +2 -2
- data/vendor/v8/src/objects-debug.cc +16 -16
- data/vendor/v8/src/objects-inl.h +421 -195
- data/vendor/v8/src/objects-printer.cc +7 -7
- data/vendor/v8/src/objects-visiting.cc +1 -1
- data/vendor/v8/src/objects-visiting.h +33 -12
- data/vendor/v8/src/objects.cc +935 -658
- data/vendor/v8/src/objects.h +234 -139
- data/vendor/v8/src/parser.cc +484 -439
- data/vendor/v8/src/parser.h +35 -14
- data/vendor/v8/src/platform-cygwin.cc +173 -107
- data/vendor/v8/src/platform-freebsd.cc +224 -72
- data/vendor/v8/src/platform-linux.cc +234 -95
- data/vendor/v8/src/platform-macos.cc +215 -82
- data/vendor/v8/src/platform-nullos.cc +9 -3
- data/vendor/v8/src/platform-openbsd.cc +22 -7
- data/vendor/v8/src/platform-posix.cc +30 -5
- data/vendor/v8/src/platform-solaris.cc +120 -38
- data/vendor/v8/src/platform-tls-mac.h +62 -0
- data/vendor/v8/src/platform-tls-win32.h +62 -0
- data/vendor/v8/src/platform-tls.h +50 -0
- data/vendor/v8/src/platform-win32.cc +195 -97
- data/vendor/v8/src/platform.h +72 -15
- data/vendor/v8/src/preparse-data.cc +2 -0
- data/vendor/v8/src/preparser-api.cc +8 -2
- data/vendor/v8/src/preparser.cc +1 -1
- data/vendor/v8/src/prettyprinter.cc +43 -52
- data/vendor/v8/src/prettyprinter.h +1 -1
- data/vendor/v8/src/profile-generator-inl.h +0 -28
- data/vendor/v8/src/profile-generator.cc +942 -685
- data/vendor/v8/src/profile-generator.h +210 -176
- data/vendor/v8/src/property.cc +6 -0
- data/vendor/v8/src/property.h +14 -3
- data/vendor/v8/src/regexp-macro-assembler-irregexp.cc +1 -1
- data/vendor/v8/src/regexp-macro-assembler.cc +28 -19
- data/vendor/v8/src/regexp-macro-assembler.h +11 -6
- data/vendor/v8/src/regexp-stack.cc +18 -10
- data/vendor/v8/src/regexp-stack.h +45 -21
- data/vendor/v8/src/regexp.js +3 -3
- data/vendor/v8/src/register-allocator-inl.h +3 -3
- data/vendor/v8/src/register-allocator.cc +1 -7
- data/vendor/v8/src/register-allocator.h +5 -15
- data/vendor/v8/src/rewriter.cc +2 -1
- data/vendor/v8/src/runtime-profiler.cc +158 -128
- data/vendor/v8/src/runtime-profiler.h +131 -15
- data/vendor/v8/src/runtime.cc +2409 -1692
- data/vendor/v8/src/runtime.h +93 -17
- data/vendor/v8/src/safepoint-table.cc +3 -0
- data/vendor/v8/src/safepoint-table.h +9 -3
- data/vendor/v8/src/scanner-base.cc +21 -28
- data/vendor/v8/src/scanner-base.h +22 -11
- data/vendor/v8/src/scanner.cc +3 -5
- data/vendor/v8/src/scanner.h +4 -2
- data/vendor/v8/src/scopeinfo.cc +11 -16
- data/vendor/v8/src/scopeinfo.h +26 -15
- data/vendor/v8/src/scopes.cc +67 -37
- data/vendor/v8/src/scopes.h +26 -12
- data/vendor/v8/src/serialize.cc +193 -154
- data/vendor/v8/src/serialize.h +41 -36
- data/vendor/v8/src/small-pointer-list.h +163 -0
- data/vendor/v8/src/snapshot-common.cc +1 -1
- data/vendor/v8/src/snapshot.h +3 -1
- data/vendor/v8/src/spaces-inl.h +30 -25
- data/vendor/v8/src/spaces.cc +263 -370
- data/vendor/v8/src/spaces.h +178 -166
- data/vendor/v8/src/string-search.cc +4 -3
- data/vendor/v8/src/string-search.h +21 -20
- data/vendor/v8/src/string-stream.cc +32 -24
- data/vendor/v8/src/string.js +7 -7
- data/vendor/v8/src/stub-cache.cc +324 -248
- data/vendor/v8/src/stub-cache.h +181 -155
- data/vendor/v8/src/token.cc +3 -3
- data/vendor/v8/src/token.h +3 -3
- data/vendor/v8/src/top.cc +218 -390
- data/vendor/v8/src/type-info.cc +98 -32
- data/vendor/v8/src/type-info.h +10 -3
- data/vendor/v8/src/unicode.cc +1 -1
- data/vendor/v8/src/unicode.h +1 -1
- data/vendor/v8/src/utils.h +3 -0
- data/vendor/v8/src/v8-counters.cc +18 -11
- data/vendor/v8/src/v8-counters.h +34 -13
- data/vendor/v8/src/v8.cc +66 -121
- data/vendor/v8/src/v8.h +7 -4
- data/vendor/v8/src/v8globals.h +18 -12
- data/vendor/v8/src/{memory.h → v8memory.h} +0 -0
- data/vendor/v8/src/v8natives.js +59 -18
- data/vendor/v8/src/v8threads.cc +127 -114
- data/vendor/v8/src/v8threads.h +42 -35
- data/vendor/v8/src/v8utils.h +2 -39
- data/vendor/v8/src/variables.h +1 -1
- data/vendor/v8/src/version.cc +26 -5
- data/vendor/v8/src/version.h +4 -0
- data/vendor/v8/src/virtual-frame-heavy-inl.h +2 -4
- data/vendor/v8/src/virtual-frame-light-inl.h +5 -4
- data/vendor/v8/src/vm-state-inl.h +21 -17
- data/vendor/v8/src/vm-state.h +7 -5
- data/vendor/v8/src/win32-headers.h +1 -0
- data/vendor/v8/src/x64/assembler-x64-inl.h +12 -11
- data/vendor/v8/src/x64/assembler-x64.cc +80 -40
- data/vendor/v8/src/x64/assembler-x64.h +67 -17
- data/vendor/v8/src/x64/builtins-x64.cc +34 -33
- data/vendor/v8/src/x64/code-stubs-x64.cc +636 -377
- data/vendor/v8/src/x64/code-stubs-x64.h +14 -48
- data/vendor/v8/src/x64/codegen-x64-inl.h +1 -1
- data/vendor/v8/src/x64/codegen-x64.cc +158 -136
- data/vendor/v8/src/x64/codegen-x64.h +4 -1
- data/vendor/v8/src/x64/cpu-x64.cc +7 -5
- data/vendor/v8/src/x64/debug-x64.cc +8 -6
- data/vendor/v8/src/x64/deoptimizer-x64.cc +195 -20
- data/vendor/v8/src/x64/disasm-x64.cc +42 -23
- data/vendor/v8/src/x64/frames-x64.cc +1 -1
- data/vendor/v8/src/x64/frames-x64.h +2 -2
- data/vendor/v8/src/x64/full-codegen-x64.cc +780 -218
- data/vendor/v8/src/x64/ic-x64.cc +77 -79
- data/vendor/v8/src/x64/jump-target-x64.cc +1 -1
- data/vendor/v8/src/x64/lithium-codegen-x64.cc +698 -181
- data/vendor/v8/src/x64/lithium-codegen-x64.h +31 -6
- data/vendor/v8/src/x64/lithium-x64.cc +136 -54
- data/vendor/v8/src/x64/lithium-x64.h +142 -51
- data/vendor/v8/src/x64/macro-assembler-x64.cc +456 -187
- data/vendor/v8/src/x64/macro-assembler-x64.h +166 -34
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.cc +44 -28
- data/vendor/v8/src/x64/regexp-macro-assembler-x64.h +8 -4
- data/vendor/v8/src/x64/register-allocator-x64-inl.h +3 -3
- data/vendor/v8/src/x64/register-allocator-x64.cc +12 -8
- data/vendor/v8/src/x64/simulator-x64.h +5 -5
- data/vendor/v8/src/x64/stub-cache-x64.cc +299 -344
- data/vendor/v8/src/x64/virtual-frame-x64.cc +37 -13
- data/vendor/v8/src/x64/virtual-frame-x64.h +13 -7
- data/vendor/v8/src/zone-inl.h +49 -3
- data/vendor/v8/src/zone.cc +42 -41
- data/vendor/v8/src/zone.h +37 -34
- data/vendor/v8/test/benchmarks/testcfg.py +100 -0
- data/vendor/v8/test/cctest/SConscript +5 -4
- data/vendor/v8/test/cctest/cctest.h +3 -2
- data/vendor/v8/test/cctest/cctest.status +6 -11
- data/vendor/v8/test/cctest/test-accessors.cc +3 -3
- data/vendor/v8/test/cctest/test-alloc.cc +39 -33
- data/vendor/v8/test/cctest/test-api.cc +1092 -205
- data/vendor/v8/test/cctest/test-assembler-arm.cc +39 -25
- data/vendor/v8/test/cctest/test-assembler-ia32.cc +36 -37
- data/vendor/v8/test/cctest/test-assembler-mips.cc +1098 -40
- data/vendor/v8/test/cctest/test-assembler-x64.cc +32 -25
- data/vendor/v8/test/cctest/test-ast.cc +1 -0
- data/vendor/v8/test/cctest/test-circular-queue.cc +8 -5
- data/vendor/v8/test/cctest/test-compiler.cc +24 -24
- data/vendor/v8/test/cctest/test-cpu-profiler.cc +140 -5
- data/vendor/v8/test/cctest/test-dataflow.cc +1 -0
- data/vendor/v8/test/cctest/test-debug.cc +136 -77
- data/vendor/v8/test/cctest/test-decls.cc +1 -1
- data/vendor/v8/test/cctest/test-deoptimization.cc +25 -24
- data/vendor/v8/test/cctest/test-disasm-arm.cc +9 -4
- data/vendor/v8/test/cctest/test-disasm-ia32.cc +10 -8
- data/vendor/v8/test/cctest/test-func-name-inference.cc +10 -4
- data/vendor/v8/test/cctest/test-heap-profiler.cc +226 -164
- data/vendor/v8/test/cctest/test-heap.cc +240 -217
- data/vendor/v8/test/cctest/test-liveedit.cc +1 -0
- data/vendor/v8/test/cctest/test-log-stack-tracer.cc +18 -20
- data/vendor/v8/test/cctest/test-log.cc +114 -108
- data/vendor/v8/test/cctest/test-macro-assembler-x64.cc +247 -177
- data/vendor/v8/test/cctest/test-mark-compact.cc +129 -90
- data/vendor/v8/test/cctest/test-parsing.cc +15 -14
- data/vendor/v8/test/cctest/test-platform-linux.cc +1 -0
- data/vendor/v8/test/cctest/test-platform-tls.cc +66 -0
- data/vendor/v8/test/cctest/test-platform-win32.cc +1 -0
- data/vendor/v8/test/cctest/test-profile-generator.cc +1 -1
- data/vendor/v8/test/cctest/test-regexp.cc +53 -41
- data/vendor/v8/test/cctest/test-reloc-info.cc +18 -11
- data/vendor/v8/test/cctest/test-serialize.cc +44 -43
- data/vendor/v8/test/cctest/test-sockets.cc +8 -3
- data/vendor/v8/test/cctest/test-spaces.cc +47 -29
- data/vendor/v8/test/cctest/test-strings.cc +20 -20
- data/vendor/v8/test/cctest/test-thread-termination.cc +8 -3
- data/vendor/v8/test/cctest/test-threads.cc +5 -3
- data/vendor/v8/test/cctest/test-utils.cc +5 -4
- data/vendor/v8/test/cctest/testcfg.py +7 -3
- data/vendor/v8/test/es5conform/es5conform.status +2 -77
- data/vendor/v8/test/es5conform/testcfg.py +1 -1
- data/vendor/v8/test/message/testcfg.py +1 -1
- data/vendor/v8/test/mjsunit/accessors-on-global-object.js +3 -3
- data/vendor/v8/test/mjsunit/array-concat.js +43 -1
- data/vendor/v8/test/mjsunit/array-join.js +25 -0
- data/vendor/v8/test/mjsunit/bitops-info.js +7 -1
- data/vendor/v8/test/mjsunit/compiler/array-length.js +2 -2
- data/vendor/v8/test/mjsunit/compiler/global-accessors.js +47 -0
- data/vendor/v8/test/mjsunit/compiler/pic.js +1 -1
- data/vendor/v8/test/mjsunit/compiler/regress-loadfield.js +65 -0
- data/vendor/v8/test/mjsunit/math-sqrt.js +5 -1
- data/vendor/v8/test/mjsunit/mjsunit.js +59 -8
- data/vendor/v8/test/mjsunit/mjsunit.status +0 -12
- data/vendor/v8/test/mjsunit/mul-exhaustive.js +129 -11
- data/vendor/v8/test/mjsunit/negate-zero.js +1 -1
- data/vendor/v8/test/mjsunit/object-freeze.js +5 -13
- data/vendor/v8/test/mjsunit/object-prevent-extensions.js +9 -50
- data/vendor/v8/test/mjsunit/object-seal.js +4 -13
- data/vendor/v8/test/mjsunit/override-eval-with-non-function.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-1145.js +54 -0
- data/vendor/v8/test/mjsunit/regress/regress-1172-bis.js +37 -0
- data/vendor/v8/test/mjsunit/regress/regress-1181.js +54 -0
- data/vendor/v8/test/mjsunit/regress/regress-1207.js +35 -0
- data/vendor/v8/test/mjsunit/regress/regress-1209.js +34 -0
- data/vendor/v8/test/mjsunit/regress/regress-1210.js +48 -0
- data/vendor/v8/test/mjsunit/regress/regress-1213.js +43 -0
- data/vendor/v8/test/mjsunit/regress/regress-1218.js +29 -0
- data/vendor/v8/test/mjsunit/regress/regress-1229.js +79 -0
- data/vendor/v8/test/mjsunit/regress/regress-1233.js +47 -0
- data/vendor/v8/test/mjsunit/regress/regress-1236.js +34 -0
- data/vendor/v8/test/mjsunit/regress/regress-1237.js +36 -0
- data/vendor/v8/test/mjsunit/regress/regress-1240.js +39 -0
- data/vendor/v8/test/mjsunit/regress/regress-1257.js +58 -0
- data/vendor/v8/test/mjsunit/regress/regress-1278.js +69 -0
- data/vendor/v8/test/mjsunit/regress/regress-create-exception.js +1 -0
- data/vendor/v8/test/mjsunit/regress/regress-lazy-deopt-reloc.js +52 -0
- data/vendor/v8/test/mjsunit/sin-cos.js +15 -10
- data/vendor/v8/test/mjsunit/smi-negative-zero.js +2 -2
- data/vendor/v8/test/mjsunit/str-to-num.js +1 -1
- data/vendor/v8/test/mjsunit/strict-mode.js +435 -0
- data/vendor/v8/test/mjsunit/testcfg.py +23 -6
- data/vendor/v8/test/mozilla/mozilla.status +0 -2
- data/vendor/v8/test/mozilla/testcfg.py +1 -1
- data/vendor/v8/test/preparser/empty.js +28 -0
- data/vendor/v8/test/preparser/functions-only.js +38 -0
- data/vendor/v8/test/preparser/non-alphanum.js +34 -0
- data/vendor/v8/test/preparser/symbols-only.js +49 -0
- data/vendor/v8/test/preparser/testcfg.py +90 -0
- data/vendor/v8/test/sputnik/testcfg.py +1 -1
- data/vendor/v8/test/test262/README +16 -0
- data/vendor/v8/test/test262/harness-adapt.js +80 -0
- data/vendor/v8/test/test262/test262.status +1506 -0
- data/vendor/v8/test/test262/testcfg.py +123 -0
- data/vendor/v8/tools/freebsd-tick-processor +10 -0
- data/vendor/v8/tools/gyp/v8.gyp +8 -33
- data/vendor/v8/tools/linux-tick-processor +5 -3
- data/vendor/v8/tools/test.py +37 -14
- data/vendor/v8/tools/tickprocessor.js +22 -8
- data/vendor/v8/tools/visual_studio/v8_base.vcproj +13 -1
- data/vendor/v8/tools/visual_studio/v8_base_arm.vcproj +5 -1
- data/vendor/v8/tools/visual_studio/v8_base_x64.vcproj +5 -1
- data/vendor/v8/tools/visual_studio/x64.vsprops +1 -0
- metadata +1495 -1341
- data/ext/extconf.rb +0 -22
- data/ext/mustang.cpp +0 -58
- data/vendor/v8/src/top.h +0 -608
@@ -58,17 +58,17 @@ TEST(0) {
|
|
58
58
|
InitializeVM();
|
59
59
|
v8::HandleScope scope;
|
60
60
|
|
61
|
-
Assembler assm(NULL, 0);
|
61
|
+
Assembler assm(Isolate::Current(), NULL, 0);
|
62
62
|
|
63
63
|
__ add(r0, r0, Operand(r1));
|
64
64
|
__ mov(pc, Operand(lr));
|
65
65
|
|
66
66
|
CodeDesc desc;
|
67
67
|
assm.GetCode(&desc);
|
68
|
-
Object* code =
|
68
|
+
Object* code = HEAP->CreateCode(
|
69
69
|
desc,
|
70
70
|
Code::ComputeFlags(Code::STUB),
|
71
|
-
Handle<Object>(
|
71
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
72
72
|
CHECK(code->IsCode());
|
73
73
|
#ifdef DEBUG
|
74
74
|
Code::cast(code)->Print();
|
@@ -84,7 +84,7 @@ TEST(1) {
|
|
84
84
|
InitializeVM();
|
85
85
|
v8::HandleScope scope;
|
86
86
|
|
87
|
-
Assembler assm(NULL, 0);
|
87
|
+
Assembler assm(Isolate::Current(), NULL, 0);
|
88
88
|
Label L, C;
|
89
89
|
|
90
90
|
__ mov(r1, Operand(r0));
|
@@ -102,10 +102,10 @@ TEST(1) {
|
|
102
102
|
|
103
103
|
CodeDesc desc;
|
104
104
|
assm.GetCode(&desc);
|
105
|
-
Object* code =
|
105
|
+
Object* code = HEAP->CreateCode(
|
106
106
|
desc,
|
107
107
|
Code::ComputeFlags(Code::STUB),
|
108
|
-
Handle<Object>(
|
108
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
109
109
|
CHECK(code->IsCode());
|
110
110
|
#ifdef DEBUG
|
111
111
|
Code::cast(code)->Print();
|
@@ -121,7 +121,7 @@ TEST(2) {
|
|
121
121
|
InitializeVM();
|
122
122
|
v8::HandleScope scope;
|
123
123
|
|
124
|
-
Assembler assm(NULL, 0);
|
124
|
+
Assembler assm(Isolate::Current(), NULL, 0);
|
125
125
|
Label L, C;
|
126
126
|
|
127
127
|
__ mov(r1, Operand(r0));
|
@@ -139,7 +139,7 @@ TEST(2) {
|
|
139
139
|
|
140
140
|
// some relocated stuff here, not executed
|
141
141
|
__ RecordComment("dead code, just testing relocations");
|
142
|
-
__ mov(r0, Operand(
|
142
|
+
__ mov(r0, Operand(FACTORY->true_value()));
|
143
143
|
__ RecordComment("dead code, just testing immediate operands");
|
144
144
|
__ mov(r0, Operand(-1));
|
145
145
|
__ mov(r0, Operand(0xFF000000));
|
@@ -148,10 +148,10 @@ TEST(2) {
|
|
148
148
|
|
149
149
|
CodeDesc desc;
|
150
150
|
assm.GetCode(&desc);
|
151
|
-
Object* code =
|
151
|
+
Object* code = HEAP->CreateCode(
|
152
152
|
desc,
|
153
153
|
Code::ComputeFlags(Code::STUB),
|
154
|
-
Handle<Object>(
|
154
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
155
155
|
CHECK(code->IsCode());
|
156
156
|
#ifdef DEBUG
|
157
157
|
Code::cast(code)->Print();
|
@@ -174,7 +174,7 @@ TEST(3) {
|
|
174
174
|
} T;
|
175
175
|
T t;
|
176
176
|
|
177
|
-
Assembler assm(NULL, 0);
|
177
|
+
Assembler assm(Isolate::Current(), NULL, 0);
|
178
178
|
Label L, C;
|
179
179
|
|
180
180
|
__ mov(ip, Operand(sp));
|
@@ -196,10 +196,10 @@ TEST(3) {
|
|
196
196
|
|
197
197
|
CodeDesc desc;
|
198
198
|
assm.GetCode(&desc);
|
199
|
-
Object* code =
|
199
|
+
Object* code = HEAP->CreateCode(
|
200
200
|
desc,
|
201
201
|
Code::ComputeFlags(Code::STUB),
|
202
|
-
Handle<Object>(
|
202
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
203
203
|
CHECK(code->IsCode());
|
204
204
|
#ifdef DEBUG
|
205
205
|
Code::cast(code)->Print();
|
@@ -232,6 +232,8 @@ TEST(4) {
|
|
232
232
|
double g;
|
233
233
|
double h;
|
234
234
|
int i;
|
235
|
+
double m;
|
236
|
+
double n;
|
235
237
|
float x;
|
236
238
|
float y;
|
237
239
|
} T;
|
@@ -239,7 +241,7 @@ TEST(4) {
|
|
239
241
|
|
240
242
|
// Create a function that accepts &t, and loads, manipulates, and stores
|
241
243
|
// the doubles and floats.
|
242
|
-
Assembler assm(NULL, 0);
|
244
|
+
Assembler assm(Isolate::Current(), NULL, 0);
|
243
245
|
Label L, C;
|
244
246
|
|
245
247
|
|
@@ -297,14 +299,22 @@ TEST(4) {
|
|
297
299
|
__ vabs(d0, d2);
|
298
300
|
__ vstr(d0, r4, OFFSET_OF(T, h));
|
299
301
|
|
302
|
+
// Test vneg.
|
303
|
+
__ vldr(d1, r4, OFFSET_OF(T, m));
|
304
|
+
__ vneg(d0, d1);
|
305
|
+
__ vstr(d0, r4, OFFSET_OF(T, m));
|
306
|
+
__ vldr(d1, r4, OFFSET_OF(T, n));
|
307
|
+
__ vneg(d0, d1);
|
308
|
+
__ vstr(d0, r4, OFFSET_OF(T, n));
|
309
|
+
|
300
310
|
__ ldm(ia_w, sp, r4.bit() | fp.bit() | pc.bit());
|
301
311
|
|
302
312
|
CodeDesc desc;
|
303
313
|
assm.GetCode(&desc);
|
304
|
-
Object* code =
|
314
|
+
Object* code = HEAP->CreateCode(
|
305
315
|
desc,
|
306
316
|
Code::ComputeFlags(Code::STUB),
|
307
|
-
Handle<Object>(
|
317
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
308
318
|
CHECK(code->IsCode());
|
309
319
|
#ifdef DEBUG
|
310
320
|
Code::cast(code)->Print();
|
@@ -319,12 +329,16 @@ TEST(4) {
|
|
319
329
|
t.g = -2718.2818;
|
320
330
|
t.h = 31415926.5;
|
321
331
|
t.i = 0;
|
332
|
+
t.m = -2718.2818;
|
333
|
+
t.n = 123.456;
|
322
334
|
t.x = 4.5;
|
323
335
|
t.y = 9.0;
|
324
336
|
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
325
337
|
USE(dummy);
|
326
338
|
CHECK_EQ(4.5, t.y);
|
327
339
|
CHECK_EQ(9.0, t.x);
|
340
|
+
CHECK_EQ(-123.456, t.n);
|
341
|
+
CHECK_EQ(2718.2818, t.m);
|
328
342
|
CHECK_EQ(2, t.i);
|
329
343
|
CHECK_EQ(2718.2818, t.g);
|
330
344
|
CHECK_EQ(31415926.5, t.h);
|
@@ -343,7 +357,7 @@ TEST(5) {
|
|
343
357
|
InitializeVM();
|
344
358
|
v8::HandleScope scope;
|
345
359
|
|
346
|
-
Assembler assm(NULL, 0);
|
360
|
+
Assembler assm(Isolate::Current(), NULL, 0);
|
347
361
|
|
348
362
|
if (CpuFeatures::IsSupported(ARMv7)) {
|
349
363
|
CpuFeatures::Scope scope(ARMv7);
|
@@ -357,10 +371,10 @@ TEST(5) {
|
|
357
371
|
|
358
372
|
CodeDesc desc;
|
359
373
|
assm.GetCode(&desc);
|
360
|
-
Object* code =
|
374
|
+
Object* code = HEAP->CreateCode(
|
361
375
|
desc,
|
362
376
|
Code::ComputeFlags(Code::STUB),
|
363
|
-
Handle<Object>(
|
377
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
364
378
|
CHECK(code->IsCode());
|
365
379
|
#ifdef DEBUG
|
366
380
|
Code::cast(code)->Print();
|
@@ -379,7 +393,7 @@ TEST(6) {
|
|
379
393
|
InitializeVM();
|
380
394
|
v8::HandleScope scope;
|
381
395
|
|
382
|
-
Assembler assm(NULL, 0);
|
396
|
+
Assembler assm(Isolate::Current(), NULL, 0);
|
383
397
|
|
384
398
|
if (CpuFeatures::IsSupported(ARMv7)) {
|
385
399
|
CpuFeatures::Scope scope(ARMv7);
|
@@ -392,10 +406,10 @@ TEST(6) {
|
|
392
406
|
|
393
407
|
CodeDesc desc;
|
394
408
|
assm.GetCode(&desc);
|
395
|
-
Object* code =
|
409
|
+
Object* code = HEAP->CreateCode(
|
396
410
|
desc,
|
397
411
|
Code::ComputeFlags(Code::STUB),
|
398
|
-
Handle<Object>(
|
412
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
399
413
|
CHECK(code->IsCode());
|
400
414
|
#ifdef DEBUG
|
401
415
|
Code::cast(code)->Print();
|
@@ -422,7 +436,7 @@ static void TestRoundingMode(VCVTTypes types,
|
|
422
436
|
InitializeVM();
|
423
437
|
v8::HandleScope scope;
|
424
438
|
|
425
|
-
Assembler assm(NULL, 0);
|
439
|
+
Assembler assm(Isolate::Current(), NULL, 0);
|
426
440
|
|
427
441
|
if (CpuFeatures::IsSupported(VFP3)) {
|
428
442
|
CpuFeatures::Scope scope(VFP3);
|
@@ -468,10 +482,10 @@ static void TestRoundingMode(VCVTTypes types,
|
|
468
482
|
|
469
483
|
CodeDesc desc;
|
470
484
|
assm.GetCode(&desc);
|
471
|
-
Object* code =
|
485
|
+
Object* code = HEAP->CreateCode(
|
472
486
|
desc,
|
473
487
|
Code::ComputeFlags(Code::STUB),
|
474
|
-
Handle<Object>(
|
488
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
475
489
|
CHECK(code->IsCode());
|
476
490
|
#ifdef DEBUG
|
477
491
|
Code::cast(code)->Print();
|
@@ -61,7 +61,7 @@ TEST(AssemblerIa320) {
|
|
61
61
|
v8::HandleScope scope;
|
62
62
|
|
63
63
|
v8::internal::byte buffer[256];
|
64
|
-
Assembler assm(buffer, sizeof buffer);
|
64
|
+
Assembler assm(Isolate::Current(), buffer, sizeof buffer);
|
65
65
|
|
66
66
|
__ mov(eax, Operand(esp, 4));
|
67
67
|
__ add(eax, Operand(esp, 8));
|
@@ -69,10 +69,10 @@ TEST(AssemblerIa320) {
|
|
69
69
|
|
70
70
|
CodeDesc desc;
|
71
71
|
assm.GetCode(&desc);
|
72
|
-
Object* code =
|
73
|
-
|
74
|
-
|
75
|
-
ToObjectChecked();
|
72
|
+
Object* code = HEAP->CreateCode(
|
73
|
+
desc,
|
74
|
+
Code::ComputeFlags(Code::STUB),
|
75
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
76
76
|
CHECK(code->IsCode());
|
77
77
|
#ifdef OBJECT_PRINT
|
78
78
|
Code::cast(code)->Print();
|
@@ -89,7 +89,7 @@ TEST(AssemblerIa321) {
|
|
89
89
|
v8::HandleScope scope;
|
90
90
|
|
91
91
|
v8::internal::byte buffer[256];
|
92
|
-
Assembler assm(buffer, sizeof buffer);
|
92
|
+
Assembler assm(Isolate::Current(), buffer, sizeof buffer);
|
93
93
|
Label L, C;
|
94
94
|
|
95
95
|
__ mov(edx, Operand(esp, 4));
|
@@ -107,10 +107,10 @@ TEST(AssemblerIa321) {
|
|
107
107
|
|
108
108
|
CodeDesc desc;
|
109
109
|
assm.GetCode(&desc);
|
110
|
-
Object* code =
|
111
|
-
|
112
|
-
|
113
|
-
ToObjectChecked();
|
110
|
+
Object* code = HEAP->CreateCode(
|
111
|
+
desc,
|
112
|
+
Code::ComputeFlags(Code::STUB),
|
113
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
114
114
|
CHECK(code->IsCode());
|
115
115
|
#ifdef OBJECT_PRINT
|
116
116
|
Code::cast(code)->Print();
|
@@ -127,7 +127,7 @@ TEST(AssemblerIa322) {
|
|
127
127
|
v8::HandleScope scope;
|
128
128
|
|
129
129
|
v8::internal::byte buffer[256];
|
130
|
-
Assembler assm(buffer, sizeof buffer);
|
130
|
+
Assembler assm(Isolate::Current(), buffer, sizeof buffer);
|
131
131
|
Label L, C;
|
132
132
|
|
133
133
|
__ mov(edx, Operand(esp, 4));
|
@@ -144,16 +144,15 @@ TEST(AssemblerIa322) {
|
|
144
144
|
__ ret(0);
|
145
145
|
|
146
146
|
// some relocated stuff here, not executed
|
147
|
-
__ mov(eax,
|
147
|
+
__ mov(eax, FACTORY->true_value());
|
148
148
|
__ jmp(NULL, RelocInfo::RUNTIME_ENTRY);
|
149
149
|
|
150
150
|
CodeDesc desc;
|
151
151
|
assm.GetCode(&desc);
|
152
|
-
Object* code =
|
152
|
+
Object* code = HEAP->CreateCode(
|
153
153
|
desc,
|
154
154
|
Code::ComputeFlags(Code::STUB),
|
155
|
-
Handle<Object>(
|
156
|
-
|
155
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
157
156
|
CHECK(code->IsCode());
|
158
157
|
#ifdef OBJECT_PRINT
|
159
158
|
Code::cast(code)->Print();
|
@@ -168,13 +167,13 @@ TEST(AssemblerIa322) {
|
|
168
167
|
typedef int (*F3)(float x);
|
169
168
|
|
170
169
|
TEST(AssemblerIa323) {
|
170
|
+
InitializeVM();
|
171
171
|
if (!CpuFeatures::IsSupported(SSE2)) return;
|
172
172
|
|
173
|
-
InitializeVM();
|
174
173
|
v8::HandleScope scope;
|
175
174
|
|
176
175
|
v8::internal::byte buffer[256];
|
177
|
-
Assembler assm(buffer, sizeof buffer);
|
176
|
+
Assembler assm(Isolate::Current(), buffer, sizeof buffer);
|
178
177
|
|
179
178
|
CHECK(CpuFeatures::IsSupported(SSE2));
|
180
179
|
{ CpuFeatures::Scope fscope(SSE2);
|
@@ -184,10 +183,10 @@ TEST(AssemblerIa323) {
|
|
184
183
|
|
185
184
|
CodeDesc desc;
|
186
185
|
assm.GetCode(&desc);
|
187
|
-
Code* code = Code::cast(
|
186
|
+
Code* code = Code::cast(HEAP->CreateCode(
|
188
187
|
desc,
|
189
188
|
Code::ComputeFlags(Code::STUB),
|
190
|
-
Handle<Object>(
|
189
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
|
191
190
|
// don't print the code - our disassembler can't handle cvttss2si
|
192
191
|
// instead print bytes
|
193
192
|
Disassembler::Dump(stdout,
|
@@ -203,13 +202,13 @@ TEST(AssemblerIa323) {
|
|
203
202
|
typedef int (*F4)(double x);
|
204
203
|
|
205
204
|
TEST(AssemblerIa324) {
|
205
|
+
InitializeVM();
|
206
206
|
if (!CpuFeatures::IsSupported(SSE2)) return;
|
207
207
|
|
208
|
-
InitializeVM();
|
209
208
|
v8::HandleScope scope;
|
210
209
|
|
211
210
|
v8::internal::byte buffer[256];
|
212
|
-
Assembler assm(buffer, sizeof buffer);
|
211
|
+
Assembler assm(Isolate::Current(), buffer, sizeof buffer);
|
213
212
|
|
214
213
|
CHECK(CpuFeatures::IsSupported(SSE2));
|
215
214
|
CpuFeatures::Scope fscope(SSE2);
|
@@ -218,10 +217,10 @@ TEST(AssemblerIa324) {
|
|
218
217
|
|
219
218
|
CodeDesc desc;
|
220
219
|
assm.GetCode(&desc);
|
221
|
-
Code* code = Code::cast(
|
220
|
+
Code* code = Code::cast(HEAP->CreateCode(
|
222
221
|
desc,
|
223
222
|
Code::ComputeFlags(Code::STUB),
|
224
|
-
Handle<Object>(
|
223
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
|
225
224
|
// don't print the code - our disassembler can't handle cvttsd2si
|
226
225
|
// instead print bytes
|
227
226
|
Disassembler::Dump(stdout,
|
@@ -240,17 +239,17 @@ TEST(AssemblerIa325) {
|
|
240
239
|
v8::HandleScope scope;
|
241
240
|
|
242
241
|
v8::internal::byte buffer[256];
|
243
|
-
Assembler assm(buffer, sizeof buffer);
|
242
|
+
Assembler assm(Isolate::Current(), buffer, sizeof buffer);
|
244
243
|
|
245
244
|
__ mov(eax, Operand(reinterpret_cast<intptr_t>(&baz), RelocInfo::NONE));
|
246
245
|
__ ret(0);
|
247
246
|
|
248
247
|
CodeDesc desc;
|
249
248
|
assm.GetCode(&desc);
|
250
|
-
Code* code = Code::cast(
|
249
|
+
Code* code = Code::cast(HEAP->CreateCode(
|
251
250
|
desc,
|
252
251
|
Code::ComputeFlags(Code::STUB),
|
253
|
-
Handle<Object>(
|
252
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
|
254
253
|
F0 f = FUNCTION_CAST<F0>(code->entry());
|
255
254
|
int res = f();
|
256
255
|
CHECK_EQ(42, res);
|
@@ -260,14 +259,14 @@ TEST(AssemblerIa325) {
|
|
260
259
|
typedef double (*F5)(double x, double y);
|
261
260
|
|
262
261
|
TEST(AssemblerIa326) {
|
262
|
+
InitializeVM();
|
263
263
|
if (!CpuFeatures::IsSupported(SSE2)) return;
|
264
264
|
|
265
|
-
InitializeVM();
|
266
265
|
v8::HandleScope scope;
|
267
266
|
CHECK(CpuFeatures::IsSupported(SSE2));
|
268
267
|
CpuFeatures::Scope fscope(SSE2);
|
269
268
|
v8::internal::byte buffer[256];
|
270
|
-
Assembler assm(buffer, sizeof buffer);
|
269
|
+
Assembler assm(Isolate::Current(), buffer, sizeof buffer);
|
271
270
|
|
272
271
|
__ movdbl(xmm0, Operand(esp, 1 * kPointerSize));
|
273
272
|
__ movdbl(xmm1, Operand(esp, 3 * kPointerSize));
|
@@ -284,10 +283,10 @@ TEST(AssemblerIa326) {
|
|
284
283
|
|
285
284
|
CodeDesc desc;
|
286
285
|
assm.GetCode(&desc);
|
287
|
-
Code* code = Code::cast(
|
286
|
+
Code* code = Code::cast(HEAP->CreateCode(
|
288
287
|
desc,
|
289
288
|
Code::ComputeFlags(Code::STUB),
|
290
|
-
Handle<Object>(
|
289
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
|
291
290
|
#ifdef DEBUG
|
292
291
|
::printf("\n---\n");
|
293
292
|
// don't print the code - our disassembler can't handle SSE instructions
|
@@ -306,14 +305,14 @@ TEST(AssemblerIa326) {
|
|
306
305
|
typedef double (*F6)(int x);
|
307
306
|
|
308
307
|
TEST(AssemblerIa328) {
|
308
|
+
InitializeVM();
|
309
309
|
if (!CpuFeatures::IsSupported(SSE2)) return;
|
310
310
|
|
311
|
-
InitializeVM();
|
312
311
|
v8::HandleScope scope;
|
313
312
|
CHECK(CpuFeatures::IsSupported(SSE2));
|
314
313
|
CpuFeatures::Scope fscope(SSE2);
|
315
314
|
v8::internal::byte buffer[256];
|
316
|
-
Assembler assm(buffer, sizeof buffer);
|
315
|
+
Assembler assm(Isolate::Current(), buffer, sizeof buffer);
|
317
316
|
__ mov(eax, Operand(esp, 4));
|
318
317
|
__ cvtsi2sd(xmm0, Operand(eax));
|
319
318
|
// Copy xmm0 to st(0) using eight bytes of stack.
|
@@ -324,10 +323,10 @@ TEST(AssemblerIa328) {
|
|
324
323
|
__ ret(0);
|
325
324
|
CodeDesc desc;
|
326
325
|
assm.GetCode(&desc);
|
327
|
-
Code* code = Code::cast(
|
326
|
+
Code* code = Code::cast(HEAP->CreateCode(
|
328
327
|
desc,
|
329
328
|
Code::ComputeFlags(Code::STUB),
|
330
|
-
Handle<Object>(
|
329
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
|
331
330
|
CHECK(code->IsCode());
|
332
331
|
#ifdef OBJECT_PRINT
|
333
332
|
Code::cast(code)->Print();
|
@@ -346,7 +345,7 @@ TEST(AssemblerIa329) {
|
|
346
345
|
InitializeVM();
|
347
346
|
v8::HandleScope scope;
|
348
347
|
v8::internal::byte buffer[256];
|
349
|
-
MacroAssembler assm(buffer, sizeof buffer);
|
348
|
+
MacroAssembler assm(Isolate::Current(), buffer, sizeof buffer);
|
350
349
|
enum { kEqual = 0, kGreater = 1, kLess = 2, kNaN = 3, kUndefined = 4 };
|
351
350
|
Label equal_l, less_l, greater_l, nan_l;
|
352
351
|
__ fld_d(Operand(esp, 3 * kPointerSize));
|
@@ -379,10 +378,10 @@ TEST(AssemblerIa329) {
|
|
379
378
|
|
380
379
|
CodeDesc desc;
|
381
380
|
assm.GetCode(&desc);
|
382
|
-
Code* code = Code::cast(
|
381
|
+
Code* code = Code::cast(HEAP->CreateCode(
|
383
382
|
desc,
|
384
383
|
Code::ComputeFlags(Code::STUB),
|
385
|
-
Handle<Object>(
|
384
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked());
|
386
385
|
CHECK(code->IsCode());
|
387
386
|
#ifdef OBJECT_PRINT
|
388
387
|
Code::cast(code)->Print();
|
@@ -59,6 +59,7 @@ static void InitializeVM() {
|
|
59
59
|
|
60
60
|
#define __ assm.
|
61
61
|
|
62
|
+
|
62
63
|
TEST(MIPS0) {
|
63
64
|
InitializeVM();
|
64
65
|
v8::HandleScope scope;
|
@@ -72,14 +73,11 @@ TEST(MIPS0) {
|
|
72
73
|
|
73
74
|
CodeDesc desc;
|
74
75
|
assm.GetCode(&desc);
|
75
|
-
Object* code =
|
76
|
-
|
77
|
-
|
78
|
-
|
76
|
+
Object* code = HEAP->CreateCode(
|
77
|
+
desc,
|
78
|
+
Code::ComputeFlags(Code::STUB),
|
79
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
79
80
|
CHECK(code->IsCode());
|
80
|
-
#ifdef DEBUG
|
81
|
-
Code::cast(code)->Print();
|
82
|
-
#endif
|
83
81
|
F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry());
|
84
82
|
int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
|
85
83
|
::printf("f() = %d\n", res);
|
@@ -100,12 +98,12 @@ TEST(MIPS1) {
|
|
100
98
|
__ nop();
|
101
99
|
|
102
100
|
__ bind(&L);
|
103
|
-
__
|
101
|
+
__ addu(v0, v0, a1);
|
104
102
|
__ addiu(a1, a1, -1);
|
105
103
|
|
106
104
|
__ bind(&C);
|
107
105
|
__ xori(v1, a1, 0);
|
108
|
-
__ Branch(
|
106
|
+
__ Branch(&L, ne, v1, Operand(0));
|
109
107
|
__ nop();
|
110
108
|
|
111
109
|
__ jr(ra);
|
@@ -113,14 +111,11 @@ TEST(MIPS1) {
|
|
113
111
|
|
114
112
|
CodeDesc desc;
|
115
113
|
assm.GetCode(&desc);
|
116
|
-
Object* code =
|
117
|
-
|
118
|
-
|
119
|
-
|
114
|
+
Object* code = HEAP->CreateCode(
|
115
|
+
desc,
|
116
|
+
Code::ComputeFlags(Code::STUB),
|
117
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
120
118
|
CHECK(code->IsCode());
|
121
|
-
#ifdef DEBUG
|
122
|
-
Code::cast(code)->Print();
|
123
|
-
#endif
|
124
119
|
F1 f = FUNCTION_CAST<F1>(Code::cast(code)->entry());
|
125
120
|
int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 50, 0, 0, 0, 0));
|
126
121
|
::printf("f() = %d\n", res);
|
@@ -166,62 +161,81 @@ TEST(MIPS2) {
|
|
166
161
|
__ srav(v0, v0, t0); // 0xff234560
|
167
162
|
__ sllv(v0, v0, t0); // 0xf2345600
|
168
163
|
__ srlv(v0, v0, t0); // 0x0f234560
|
169
|
-
__ Branch(
|
164
|
+
__ Branch(&error, ne, v0, Operand(0x0f234560));
|
170
165
|
__ nop();
|
171
166
|
|
172
|
-
__
|
173
|
-
__
|
174
|
-
__ Branch(
|
167
|
+
__ addu(v0, t0, t1); // 0x00001238
|
168
|
+
__ subu(v0, v0, t0); // 0x00001234
|
169
|
+
__ Branch(&error, ne, v0, Operand(0x00001234));
|
175
170
|
__ nop();
|
176
171
|
__ addu(v1, t3, t0);
|
177
|
-
__ Branch(
|
172
|
+
__ Branch(&error, ne, v1, Operand(0x80000003));
|
178
173
|
__ nop();
|
179
174
|
__ subu(v1, t7, t0); // 0x7ffffffc
|
180
|
-
__ Branch(
|
175
|
+
__ Branch(&error, ne, v1, Operand(0x7ffffffc));
|
181
176
|
__ nop();
|
182
177
|
|
183
178
|
__ and_(v0, t1, t2); // 0x00001230
|
184
179
|
__ or_(v0, v0, t1); // 0x00001234
|
185
180
|
__ xor_(v0, v0, t2); // 0x1234444c
|
186
181
|
__ nor(v0, v0, t2); // 0xedcba987
|
187
|
-
__ Branch(
|
182
|
+
__ Branch(&error, ne, v0, Operand(0xedcba983));
|
188
183
|
__ nop();
|
189
184
|
|
190
185
|
__ slt(v0, t7, t3);
|
191
|
-
__ Branch(
|
186
|
+
__ Branch(&error, ne, v0, Operand(0x1));
|
192
187
|
__ nop();
|
193
188
|
__ sltu(v0, t7, t3);
|
194
|
-
__ Branch(
|
189
|
+
__ Branch(&error, ne, v0, Operand(0x0));
|
195
190
|
__ nop();
|
196
191
|
// End of SPECIAL class.
|
197
192
|
|
198
|
-
__
|
199
|
-
__
|
193
|
+
__ addiu(v0, zero_reg, 0x7421); // 0x00007421
|
194
|
+
__ addiu(v0, v0, -0x1); // 0x00007420
|
200
195
|
__ addiu(v0, v0, -0x20); // 0x00007400
|
201
|
-
__ Branch(
|
196
|
+
__ Branch(&error, ne, v0, Operand(0x00007400));
|
202
197
|
__ nop();
|
203
198
|
__ addiu(v1, t3, 0x1); // 0x80000000
|
204
|
-
__ Branch(
|
199
|
+
__ Branch(&error, ne, v1, Operand(0x80000000));
|
205
200
|
__ nop();
|
206
201
|
|
207
202
|
__ slti(v0, t1, 0x00002000); // 0x1
|
208
203
|
__ slti(v0, v0, 0xffff8000); // 0x0
|
209
|
-
__ Branch(
|
204
|
+
__ Branch(&error, ne, v0, Operand(0x0));
|
210
205
|
__ nop();
|
211
206
|
__ sltiu(v0, t1, 0x00002000); // 0x1
|
212
207
|
__ sltiu(v0, v0, 0x00008000); // 0x1
|
213
|
-
__ Branch(
|
208
|
+
__ Branch(&error, ne, v0, Operand(0x1));
|
214
209
|
__ nop();
|
215
210
|
|
216
211
|
__ andi(v0, t1, 0xf0f0); // 0x00001030
|
217
212
|
__ ori(v0, v0, 0x8a00); // 0x00009a30
|
218
213
|
__ xori(v0, v0, 0x83cc); // 0x000019fc
|
219
|
-
__ Branch(
|
214
|
+
__ Branch(&error, ne, v0, Operand(0x000019fc));
|
220
215
|
__ nop();
|
221
216
|
__ lui(v1, 0x8123); // 0x81230000
|
222
|
-
__ Branch(
|
217
|
+
__ Branch(&error, ne, v1, Operand(0x81230000));
|
223
218
|
__ nop();
|
224
219
|
|
220
|
+
// Bit twiddling instructions & conditional moves.
|
221
|
+
// Uses t0-t7 as set above.
|
222
|
+
__ clz(v0, t0); // 29
|
223
|
+
__ clz(v1, t1); // 19
|
224
|
+
__ addu(v0, v0, v1); // 48
|
225
|
+
__ clz(v1, t2); // 3
|
226
|
+
__ addu(v0, v0, v1); // 51
|
227
|
+
__ clz(v1, t7); // 0
|
228
|
+
__ addu(v0, v0, v1); // 51
|
229
|
+
__ Branch(&error, ne, v0, Operand(51));
|
230
|
+
__ movn(a0, t3, t0); // Move a0<-t3 (t0 is NOT 0).
|
231
|
+
__ Ins(a0, t1, 12, 8); // 0x7ff34fff
|
232
|
+
__ Branch(&error, ne, a0, Operand(0x7ff34fff));
|
233
|
+
__ movz(a0, t6, t7); // a0 not updated (t7 is NOT 0).
|
234
|
+
__ Ext(a1, a0, 8, 12); // 0x34f
|
235
|
+
__ Branch(&error, ne, a1, Operand(0x34f));
|
236
|
+
__ movz(a0, t6, v1); // a0<-t6, v0 is 0, from 8 instr back.
|
237
|
+
__ Branch(&error, ne, a0, Operand(t6));
|
238
|
+
|
225
239
|
// Everything was correctly executed. Load the expected result.
|
226
240
|
__ li(v0, 0x31415926);
|
227
241
|
__ b(&exit);
|
@@ -229,6 +243,7 @@ TEST(MIPS2) {
|
|
229
243
|
|
230
244
|
__ bind(&error);
|
231
245
|
// Got an error. Return a wrong result.
|
246
|
+
__ li(v0, 666);
|
232
247
|
|
233
248
|
__ bind(&exit);
|
234
249
|
__ jr(ra);
|
@@ -236,18 +251,1061 @@ TEST(MIPS2) {
|
|
236
251
|
|
237
252
|
CodeDesc desc;
|
238
253
|
assm.GetCode(&desc);
|
239
|
-
Object* code =
|
240
|
-
|
241
|
-
|
242
|
-
|
254
|
+
Object* code = HEAP->CreateCode(
|
255
|
+
desc,
|
256
|
+
Code::ComputeFlags(Code::STUB),
|
257
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
243
258
|
CHECK(code->IsCode());
|
244
|
-
#ifdef DEBUG
|
245
|
-
Code::cast(code)->Print();
|
246
|
-
#endif
|
247
259
|
F2 f = FUNCTION_CAST<F2>(Code::cast(code)->entry());
|
248
260
|
int res = reinterpret_cast<int>(CALL_GENERATED_CODE(f, 0xab0, 0xc, 0, 0, 0));
|
249
261
|
::printf("f() = %d\n", res);
|
250
262
|
CHECK_EQ(0x31415926, res);
|
251
263
|
}
|
252
264
|
|
265
|
+
|
266
|
+
TEST(MIPS3) {
|
267
|
+
// Test floating point instructions.
|
268
|
+
InitializeVM();
|
269
|
+
v8::HandleScope scope;
|
270
|
+
|
271
|
+
typedef struct {
|
272
|
+
double a;
|
273
|
+
double b;
|
274
|
+
double c;
|
275
|
+
double d;
|
276
|
+
double e;
|
277
|
+
double f;
|
278
|
+
double g;
|
279
|
+
} T;
|
280
|
+
T t;
|
281
|
+
|
282
|
+
// Create a function that accepts &t, and loads, manipulates, and stores
|
283
|
+
// the doubles t.a ... t.f.
|
284
|
+
MacroAssembler assm(NULL, 0);
|
285
|
+
Label L, C;
|
286
|
+
|
287
|
+
if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
|
288
|
+
CpuFeatures::Scope scope(FPU);
|
289
|
+
|
290
|
+
__ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
|
291
|
+
__ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
|
292
|
+
__ add_d(f8, f4, f6);
|
293
|
+
__ sdc1(f8, MemOperand(a0, OFFSET_OF(T, c)) ); // c = a + b.
|
294
|
+
|
295
|
+
__ mov_d(f10, f8); // c
|
296
|
+
__ neg_d(f12, f6); // -b
|
297
|
+
__ sub_d(f10, f10, f12);
|
298
|
+
__ sdc1(f10, MemOperand(a0, OFFSET_OF(T, d)) ); // d = c - (-b).
|
299
|
+
|
300
|
+
__ sdc1(f4, MemOperand(a0, OFFSET_OF(T, b)) ); // b = a.
|
301
|
+
|
302
|
+
__ li(t0, 120);
|
303
|
+
__ mtc1(t0, f14);
|
304
|
+
__ cvt_d_w(f14, f14); // f14 = 120.0.
|
305
|
+
__ mul_d(f10, f10, f14);
|
306
|
+
__ sdc1(f10, MemOperand(a0, OFFSET_OF(T, e)) ); // e = d * 120 = 1.8066e16.
|
307
|
+
|
308
|
+
__ div_d(f12, f10, f4);
|
309
|
+
__ sdc1(f12, MemOperand(a0, OFFSET_OF(T, f)) ); // f = e / a = 120.44.
|
310
|
+
|
311
|
+
__ sqrt_d(f14, f12);
|
312
|
+
__ sdc1(f14, MemOperand(a0, OFFSET_OF(T, g)) );
|
313
|
+
// g = sqrt(f) = 10.97451593465515908537
|
314
|
+
|
315
|
+
__ jr(ra);
|
316
|
+
__ nop();
|
317
|
+
|
318
|
+
CodeDesc desc;
|
319
|
+
assm.GetCode(&desc);
|
320
|
+
Object* code = HEAP->CreateCode(
|
321
|
+
desc,
|
322
|
+
Code::ComputeFlags(Code::STUB),
|
323
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
324
|
+
CHECK(code->IsCode());
|
325
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
326
|
+
t.a = 1.5e14;
|
327
|
+
t.b = 2.75e11;
|
328
|
+
t.c = 0.0;
|
329
|
+
t.d = 0.0;
|
330
|
+
t.e = 0.0;
|
331
|
+
t.f = 0.0;
|
332
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
333
|
+
USE(dummy);
|
334
|
+
CHECK_EQ(1.5e14, t.a);
|
335
|
+
CHECK_EQ(1.5e14, t.b);
|
336
|
+
CHECK_EQ(1.50275e14, t.c);
|
337
|
+
CHECK_EQ(1.50550e14, t.d);
|
338
|
+
CHECK_EQ(1.8066e16, t.e);
|
339
|
+
CHECK_EQ(120.44, t.f);
|
340
|
+
CHECK_EQ(10.97451593465515908537, t.g);
|
341
|
+
}
|
342
|
+
}
|
343
|
+
|
344
|
+
|
345
|
+
TEST(MIPS4) {
|
346
|
+
// Test moves between floating point and integer registers.
|
347
|
+
InitializeVM();
|
348
|
+
v8::HandleScope scope;
|
349
|
+
|
350
|
+
typedef struct {
|
351
|
+
double a;
|
352
|
+
double b;
|
353
|
+
double c;
|
354
|
+
} T;
|
355
|
+
T t;
|
356
|
+
|
357
|
+
Assembler assm(NULL, 0);
|
358
|
+
Label L, C;
|
359
|
+
|
360
|
+
if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
|
361
|
+
CpuFeatures::Scope scope(FPU);
|
362
|
+
|
363
|
+
__ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
|
364
|
+
__ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
|
365
|
+
|
366
|
+
// Swap f4 and f6, by using four integer registers, t0-t3.
|
367
|
+
__ mfc1(t0, f4);
|
368
|
+
__ mfc1(t1, f5);
|
369
|
+
__ mfc1(t2, f6);
|
370
|
+
__ mfc1(t3, f7);
|
371
|
+
|
372
|
+
__ mtc1(t0, f6);
|
373
|
+
__ mtc1(t1, f7);
|
374
|
+
__ mtc1(t2, f4);
|
375
|
+
__ mtc1(t3, f5);
|
376
|
+
|
377
|
+
// Store the swapped f4 and f5 back to memory.
|
378
|
+
__ sdc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
|
379
|
+
__ sdc1(f6, MemOperand(a0, OFFSET_OF(T, c)) );
|
380
|
+
|
381
|
+
__ jr(ra);
|
382
|
+
__ nop();
|
383
|
+
|
384
|
+
CodeDesc desc;
|
385
|
+
assm.GetCode(&desc);
|
386
|
+
Object* code = HEAP->CreateCode(
|
387
|
+
desc,
|
388
|
+
Code::ComputeFlags(Code::STUB),
|
389
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
390
|
+
CHECK(code->IsCode());
|
391
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
392
|
+
t.a = 1.5e22;
|
393
|
+
t.b = 2.75e11;
|
394
|
+
t.c = 17.17;
|
395
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
396
|
+
USE(dummy);
|
397
|
+
|
398
|
+
CHECK_EQ(2.75e11, t.a);
|
399
|
+
CHECK_EQ(2.75e11, t.b);
|
400
|
+
CHECK_EQ(1.5e22, t.c);
|
401
|
+
}
|
402
|
+
}
|
403
|
+
|
404
|
+
|
405
|
+
TEST(MIPS5) {
|
406
|
+
// Test conversions between doubles and integers.
|
407
|
+
InitializeVM();
|
408
|
+
v8::HandleScope scope;
|
409
|
+
|
410
|
+
typedef struct {
|
411
|
+
double a;
|
412
|
+
double b;
|
413
|
+
int i;
|
414
|
+
int j;
|
415
|
+
} T;
|
416
|
+
T t;
|
417
|
+
|
418
|
+
Assembler assm(NULL, 0);
|
419
|
+
Label L, C;
|
420
|
+
|
421
|
+
if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
|
422
|
+
CpuFeatures::Scope scope(FPU);
|
423
|
+
|
424
|
+
// Load all structure elements to registers.
|
425
|
+
__ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
|
426
|
+
__ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
|
427
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, i)) );
|
428
|
+
__ lw(t1, MemOperand(a0, OFFSET_OF(T, j)) );
|
429
|
+
|
430
|
+
// Convert double in f4 to int in element i.
|
431
|
+
__ cvt_w_d(f8, f4);
|
432
|
+
__ mfc1(t2, f8);
|
433
|
+
__ sw(t2, MemOperand(a0, OFFSET_OF(T, i)) );
|
434
|
+
|
435
|
+
// Convert double in f6 to int in element j.
|
436
|
+
__ cvt_w_d(f10, f6);
|
437
|
+
__ mfc1(t3, f10);
|
438
|
+
__ sw(t3, MemOperand(a0, OFFSET_OF(T, j)) );
|
439
|
+
|
440
|
+
// Convert int in original i (t0) to double in a.
|
441
|
+
__ mtc1(t0, f12);
|
442
|
+
__ cvt_d_w(f0, f12);
|
443
|
+
__ sdc1(f0, MemOperand(a0, OFFSET_OF(T, a)) );
|
444
|
+
|
445
|
+
// Convert int in original j (t1) to double in b.
|
446
|
+
__ mtc1(t1, f14);
|
447
|
+
__ cvt_d_w(f2, f14);
|
448
|
+
__ sdc1(f2, MemOperand(a0, OFFSET_OF(T, b)) );
|
449
|
+
|
450
|
+
__ jr(ra);
|
451
|
+
__ nop();
|
452
|
+
|
453
|
+
CodeDesc desc;
|
454
|
+
assm.GetCode(&desc);
|
455
|
+
Object* code = HEAP->CreateCode(
|
456
|
+
desc,
|
457
|
+
Code::ComputeFlags(Code::STUB),
|
458
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
459
|
+
CHECK(code->IsCode());
|
460
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
461
|
+
t.a = 1.5e4;
|
462
|
+
t.b = 2.75e8;
|
463
|
+
t.i = 12345678;
|
464
|
+
t.j = -100000;
|
465
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
466
|
+
USE(dummy);
|
467
|
+
|
468
|
+
CHECK_EQ(12345678.0, t.a);
|
469
|
+
CHECK_EQ(-100000.0, t.b);
|
470
|
+
CHECK_EQ(15000, t.i);
|
471
|
+
CHECK_EQ(275000000, t.j);
|
472
|
+
}
|
473
|
+
}
|
474
|
+
|
475
|
+
|
476
|
+
TEST(MIPS6) {
|
477
|
+
// Test simple memory loads and stores.
|
478
|
+
InitializeVM();
|
479
|
+
v8::HandleScope scope;
|
480
|
+
|
481
|
+
typedef struct {
|
482
|
+
uint32_t ui;
|
483
|
+
int32_t si;
|
484
|
+
int32_t r1;
|
485
|
+
int32_t r2;
|
486
|
+
int32_t r3;
|
487
|
+
int32_t r4;
|
488
|
+
int32_t r5;
|
489
|
+
int32_t r6;
|
490
|
+
} T;
|
491
|
+
T t;
|
492
|
+
|
493
|
+
Assembler assm(NULL, 0);
|
494
|
+
Label L, C;
|
495
|
+
|
496
|
+
// Basic word load/store.
|
497
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, ui)) );
|
498
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, r1)) );
|
499
|
+
|
500
|
+
// lh with positive data.
|
501
|
+
__ lh(t1, MemOperand(a0, OFFSET_OF(T, ui)) );
|
502
|
+
__ sw(t1, MemOperand(a0, OFFSET_OF(T, r2)) );
|
503
|
+
|
504
|
+
// lh with negative data.
|
505
|
+
__ lh(t2, MemOperand(a0, OFFSET_OF(T, si)) );
|
506
|
+
__ sw(t2, MemOperand(a0, OFFSET_OF(T, r3)) );
|
507
|
+
|
508
|
+
// lhu with negative data.
|
509
|
+
__ lhu(t3, MemOperand(a0, OFFSET_OF(T, si)) );
|
510
|
+
__ sw(t3, MemOperand(a0, OFFSET_OF(T, r4)) );
|
511
|
+
|
512
|
+
// lb with negative data.
|
513
|
+
__ lb(t4, MemOperand(a0, OFFSET_OF(T, si)) );
|
514
|
+
__ sw(t4, MemOperand(a0, OFFSET_OF(T, r5)) );
|
515
|
+
|
516
|
+
// sh writes only 1/2 of word.
|
517
|
+
__ lui(t5, 0x3333);
|
518
|
+
__ ori(t5, t5, 0x3333);
|
519
|
+
__ sw(t5, MemOperand(a0, OFFSET_OF(T, r6)) );
|
520
|
+
__ lhu(t5, MemOperand(a0, OFFSET_OF(T, si)) );
|
521
|
+
__ sh(t5, MemOperand(a0, OFFSET_OF(T, r6)) );
|
522
|
+
|
523
|
+
__ jr(ra);
|
524
|
+
__ nop();
|
525
|
+
|
526
|
+
CodeDesc desc;
|
527
|
+
assm.GetCode(&desc);
|
528
|
+
Object* code = HEAP->CreateCode(
|
529
|
+
desc,
|
530
|
+
Code::ComputeFlags(Code::STUB),
|
531
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
532
|
+
CHECK(code->IsCode());
|
533
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
534
|
+
t.ui = 0x11223344;
|
535
|
+
t.si = 0x99aabbcc;
|
536
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
537
|
+
USE(dummy);
|
538
|
+
|
539
|
+
CHECK_EQ(0x11223344, t.r1);
|
540
|
+
CHECK_EQ(0x3344, t.r2);
|
541
|
+
CHECK_EQ(0xffffbbcc, t.r3);
|
542
|
+
CHECK_EQ(0x0000bbcc, t.r4);
|
543
|
+
CHECK_EQ(0xffffffcc, t.r5);
|
544
|
+
CHECK_EQ(0x3333bbcc, t.r6);
|
545
|
+
}
|
546
|
+
|
547
|
+
|
548
|
+
TEST(MIPS7) {
|
549
|
+
// Test floating point compare and branch instructions.
|
550
|
+
InitializeVM();
|
551
|
+
v8::HandleScope scope;
|
552
|
+
|
553
|
+
typedef struct {
|
554
|
+
double a;
|
555
|
+
double b;
|
556
|
+
double c;
|
557
|
+
double d;
|
558
|
+
double e;
|
559
|
+
double f;
|
560
|
+
int32_t result;
|
561
|
+
} T;
|
562
|
+
T t;
|
563
|
+
|
564
|
+
// Create a function that accepts &t, and loads, manipulates, and stores
|
565
|
+
// the doubles t.a ... t.f.
|
566
|
+
MacroAssembler assm(NULL, 0);
|
567
|
+
Label neither_is_nan, less_than, outa_here;
|
568
|
+
|
569
|
+
if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
|
570
|
+
CpuFeatures::Scope scope(FPU);
|
571
|
+
|
572
|
+
__ ldc1(f4, MemOperand(a0, OFFSET_OF(T, a)) );
|
573
|
+
__ ldc1(f6, MemOperand(a0, OFFSET_OF(T, b)) );
|
574
|
+
__ c(UN, D, f4, f6);
|
575
|
+
__ bc1f(&neither_is_nan);
|
576
|
+
__ nop();
|
577
|
+
__ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
|
578
|
+
__ Branch(&outa_here);
|
579
|
+
|
580
|
+
__ bind(&neither_is_nan);
|
581
|
+
|
582
|
+
__ c(OLT, D, f6, f4, 2);
|
583
|
+
__ bc1t(&less_than, 2);
|
584
|
+
__ nop();
|
585
|
+
__ sw(zero_reg, MemOperand(a0, OFFSET_OF(T, result)) );
|
586
|
+
__ Branch(&outa_here);
|
587
|
+
|
588
|
+
__ bind(&less_than);
|
589
|
+
__ Addu(t0, zero_reg, Operand(1));
|
590
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, result)) ); // Set true.
|
591
|
+
|
592
|
+
|
593
|
+
// This test-case should have additional tests.
|
594
|
+
|
595
|
+
__ bind(&outa_here);
|
596
|
+
|
597
|
+
__ jr(ra);
|
598
|
+
__ nop();
|
599
|
+
|
600
|
+
CodeDesc desc;
|
601
|
+
assm.GetCode(&desc);
|
602
|
+
Object* code = HEAP->CreateCode(
|
603
|
+
desc,
|
604
|
+
Code::ComputeFlags(Code::STUB),
|
605
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
606
|
+
CHECK(code->IsCode());
|
607
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
608
|
+
t.a = 1.5e14;
|
609
|
+
t.b = 2.75e11;
|
610
|
+
t.c = 2.0;
|
611
|
+
t.d = -4.0;
|
612
|
+
t.e = 0.0;
|
613
|
+
t.f = 0.0;
|
614
|
+
t.result = 0;
|
615
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
616
|
+
USE(dummy);
|
617
|
+
CHECK_EQ(1.5e14, t.a);
|
618
|
+
CHECK_EQ(2.75e11, t.b);
|
619
|
+
CHECK_EQ(1, t.result);
|
620
|
+
}
|
621
|
+
}
|
622
|
+
|
623
|
+
|
624
|
+
TEST(MIPS8) {
|
625
|
+
// Test ROTR and ROTRV instructions.
|
626
|
+
InitializeVM();
|
627
|
+
v8::HandleScope scope;
|
628
|
+
|
629
|
+
typedef struct {
|
630
|
+
int32_t input;
|
631
|
+
int32_t result_rotr_4;
|
632
|
+
int32_t result_rotr_8;
|
633
|
+
int32_t result_rotr_12;
|
634
|
+
int32_t result_rotr_16;
|
635
|
+
int32_t result_rotr_20;
|
636
|
+
int32_t result_rotr_24;
|
637
|
+
int32_t result_rotr_28;
|
638
|
+
int32_t result_rotrv_4;
|
639
|
+
int32_t result_rotrv_8;
|
640
|
+
int32_t result_rotrv_12;
|
641
|
+
int32_t result_rotrv_16;
|
642
|
+
int32_t result_rotrv_20;
|
643
|
+
int32_t result_rotrv_24;
|
644
|
+
int32_t result_rotrv_28;
|
645
|
+
} T;
|
646
|
+
T t;
|
647
|
+
|
648
|
+
MacroAssembler assm(NULL, 0);
|
649
|
+
|
650
|
+
// Basic word load.
|
651
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, input)) );
|
652
|
+
|
653
|
+
// ROTR instruction (called through the Ror macro).
|
654
|
+
__ Ror(t1, t0, 0x0004);
|
655
|
+
__ Ror(t2, t0, 0x0008);
|
656
|
+
__ Ror(t3, t0, 0x000c);
|
657
|
+
__ Ror(t4, t0, 0x0010);
|
658
|
+
__ Ror(t5, t0, 0x0014);
|
659
|
+
__ Ror(t6, t0, 0x0018);
|
660
|
+
__ Ror(t7, t0, 0x001c);
|
661
|
+
|
662
|
+
// Basic word store.
|
663
|
+
__ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotr_4)) );
|
664
|
+
__ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotr_8)) );
|
665
|
+
__ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotr_12)) );
|
666
|
+
__ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotr_16)) );
|
667
|
+
__ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotr_20)) );
|
668
|
+
__ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotr_24)) );
|
669
|
+
__ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotr_28)) );
|
670
|
+
|
671
|
+
// ROTRV instruction (called through the Ror macro).
|
672
|
+
__ li(t7, 0x0004);
|
673
|
+
__ Ror(t1, t0, t7);
|
674
|
+
__ li(t7, 0x0008);
|
675
|
+
__ Ror(t2, t0, t7);
|
676
|
+
__ li(t7, 0x000C);
|
677
|
+
__ Ror(t3, t0, t7);
|
678
|
+
__ li(t7, 0x0010);
|
679
|
+
__ Ror(t4, t0, t7);
|
680
|
+
__ li(t7, 0x0014);
|
681
|
+
__ Ror(t5, t0, t7);
|
682
|
+
__ li(t7, 0x0018);
|
683
|
+
__ Ror(t6, t0, t7);
|
684
|
+
__ li(t7, 0x001C);
|
685
|
+
__ Ror(t7, t0, t7);
|
686
|
+
|
687
|
+
// Basic word store.
|
688
|
+
__ sw(t1, MemOperand(a0, OFFSET_OF(T, result_rotrv_4)) );
|
689
|
+
__ sw(t2, MemOperand(a0, OFFSET_OF(T, result_rotrv_8)) );
|
690
|
+
__ sw(t3, MemOperand(a0, OFFSET_OF(T, result_rotrv_12)) );
|
691
|
+
__ sw(t4, MemOperand(a0, OFFSET_OF(T, result_rotrv_16)) );
|
692
|
+
__ sw(t5, MemOperand(a0, OFFSET_OF(T, result_rotrv_20)) );
|
693
|
+
__ sw(t6, MemOperand(a0, OFFSET_OF(T, result_rotrv_24)) );
|
694
|
+
__ sw(t7, MemOperand(a0, OFFSET_OF(T, result_rotrv_28)) );
|
695
|
+
|
696
|
+
__ jr(ra);
|
697
|
+
__ nop();
|
698
|
+
|
699
|
+
CodeDesc desc;
|
700
|
+
assm.GetCode(&desc);
|
701
|
+
Object* code = HEAP->CreateCode(
|
702
|
+
desc,
|
703
|
+
Code::ComputeFlags(Code::STUB),
|
704
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
705
|
+
CHECK(code->IsCode());
|
706
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
707
|
+
t.input = 0x12345678;
|
708
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0x0, 0, 0, 0);
|
709
|
+
USE(dummy);
|
710
|
+
CHECK_EQ(0x81234567, t.result_rotr_4);
|
711
|
+
CHECK_EQ(0x78123456, t.result_rotr_8);
|
712
|
+
CHECK_EQ(0x67812345, t.result_rotr_12);
|
713
|
+
CHECK_EQ(0x56781234, t.result_rotr_16);
|
714
|
+
CHECK_EQ(0x45678123, t.result_rotr_20);
|
715
|
+
CHECK_EQ(0x34567812, t.result_rotr_24);
|
716
|
+
CHECK_EQ(0x23456781, t.result_rotr_28);
|
717
|
+
|
718
|
+
CHECK_EQ(0x81234567, t.result_rotrv_4);
|
719
|
+
CHECK_EQ(0x78123456, t.result_rotrv_8);
|
720
|
+
CHECK_EQ(0x67812345, t.result_rotrv_12);
|
721
|
+
CHECK_EQ(0x56781234, t.result_rotrv_16);
|
722
|
+
CHECK_EQ(0x45678123, t.result_rotrv_20);
|
723
|
+
CHECK_EQ(0x34567812, t.result_rotrv_24);
|
724
|
+
CHECK_EQ(0x23456781, t.result_rotrv_28);
|
725
|
+
}
|
726
|
+
|
727
|
+
|
728
|
+
TEST(MIPS9) {
|
729
|
+
// Test BRANCH improvements.
|
730
|
+
InitializeVM();
|
731
|
+
v8::HandleScope scope;
|
732
|
+
|
733
|
+
MacroAssembler assm(NULL, 0);
|
734
|
+
Label exit, exit2, exit3;
|
735
|
+
|
736
|
+
__ Branch(&exit, ge, a0, Operand(0x00000000));
|
737
|
+
__ Branch(&exit2, ge, a0, Operand(0x00001FFF));
|
738
|
+
__ Branch(&exit3, ge, a0, Operand(0x0001FFFF));
|
739
|
+
|
740
|
+
__ bind(&exit);
|
741
|
+
__ bind(&exit2);
|
742
|
+
__ bind(&exit3);
|
743
|
+
__ jr(ra);
|
744
|
+
__ nop();
|
745
|
+
|
746
|
+
CodeDesc desc;
|
747
|
+
assm.GetCode(&desc);
|
748
|
+
Object* code = HEAP->CreateCode(
|
749
|
+
desc,
|
750
|
+
Code::ComputeFlags(Code::STUB),
|
751
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
752
|
+
CHECK(code->IsCode());
|
753
|
+
}
|
754
|
+
|
755
|
+
|
756
|
+
TEST(MIPS10) {
|
757
|
+
// Test conversions between doubles and long integers.
|
758
|
+
// Test hos the long ints map to FP regs pairs.
|
759
|
+
InitializeVM();
|
760
|
+
v8::HandleScope scope;
|
761
|
+
|
762
|
+
typedef struct {
|
763
|
+
double a;
|
764
|
+
double b;
|
765
|
+
int32_t dbl_mant;
|
766
|
+
int32_t dbl_exp;
|
767
|
+
int32_t long_hi;
|
768
|
+
int32_t long_lo;
|
769
|
+
int32_t b_long_hi;
|
770
|
+
int32_t b_long_lo;
|
771
|
+
} T;
|
772
|
+
T t;
|
773
|
+
|
774
|
+
Assembler assm(NULL, 0);
|
775
|
+
Label L, C;
|
776
|
+
|
777
|
+
if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
|
778
|
+
CpuFeatures::Scope scope(FPU);
|
779
|
+
|
780
|
+
// Load all structure elements to registers.
|
781
|
+
__ ldc1(f0, MemOperand(a0, OFFSET_OF(T, a)));
|
782
|
+
|
783
|
+
// Save the raw bits of the double.
|
784
|
+
__ mfc1(t0, f0);
|
785
|
+
__ mfc1(t1, f1);
|
786
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, dbl_mant)));
|
787
|
+
__ sw(t1, MemOperand(a0, OFFSET_OF(T, dbl_exp)));
|
788
|
+
|
789
|
+
// Convert double in f0 to long, save hi/lo parts.
|
790
|
+
__ cvt_l_d(f0, f0);
|
791
|
+
__ mfc1(t0, f0); // f0 has LS 32 bits of long.
|
792
|
+
__ mfc1(t1, f1); // f1 has MS 32 bits of long.
|
793
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, long_lo)));
|
794
|
+
__ sw(t1, MemOperand(a0, OFFSET_OF(T, long_hi)));
|
795
|
+
|
796
|
+
// Convert the b long integers to double b.
|
797
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, b_long_lo)));
|
798
|
+
__ lw(t1, MemOperand(a0, OFFSET_OF(T, b_long_hi)));
|
799
|
+
__ mtc1(t0, f8); // f8 has LS 32-bits.
|
800
|
+
__ mtc1(t1, f9); // f9 has MS 32-bits.
|
801
|
+
__ cvt_d_l(f10, f8);
|
802
|
+
__ sdc1(f10, MemOperand(a0, OFFSET_OF(T, b)));
|
803
|
+
|
804
|
+
__ jr(ra);
|
805
|
+
__ nop();
|
806
|
+
|
807
|
+
CodeDesc desc;
|
808
|
+
assm.GetCode(&desc);
|
809
|
+
Object* code = HEAP->CreateCode(
|
810
|
+
desc,
|
811
|
+
Code::ComputeFlags(Code::STUB),
|
812
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
813
|
+
CHECK(code->IsCode());
|
814
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
815
|
+
t.a = 2.147483647e9; // 0x7fffffff -> 0x41DFFFFFFFC00000 as double.
|
816
|
+
t.b_long_hi = 0x000000ff; // 0xFF00FF00FF -> 0x426FE01FE01FE000 as double.
|
817
|
+
t.b_long_lo = 0x00ff00ff;
|
818
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
819
|
+
USE(dummy);
|
820
|
+
|
821
|
+
CHECK_EQ(0x41DFFFFF, t.dbl_exp);
|
822
|
+
CHECK_EQ(0xFFC00000, t.dbl_mant);
|
823
|
+
CHECK_EQ(0, t.long_hi);
|
824
|
+
CHECK_EQ(0x7fffffff, t.long_lo);
|
825
|
+
// 0xFF00FF00FF -> 1.095233372415e12.
|
826
|
+
CHECK_EQ(1.095233372415e12, t.b);
|
827
|
+
}
|
828
|
+
}
|
829
|
+
|
830
|
+
|
831
|
+
TEST(MIPS11) {
|
832
|
+
// Test LWL, LWR, SWL and SWR instructions.
|
833
|
+
InitializeVM();
|
834
|
+
v8::HandleScope scope;
|
835
|
+
|
836
|
+
typedef struct {
|
837
|
+
int32_t reg_init;
|
838
|
+
int32_t mem_init;
|
839
|
+
int32_t lwl_0;
|
840
|
+
int32_t lwl_1;
|
841
|
+
int32_t lwl_2;
|
842
|
+
int32_t lwl_3;
|
843
|
+
int32_t lwr_0;
|
844
|
+
int32_t lwr_1;
|
845
|
+
int32_t lwr_2;
|
846
|
+
int32_t lwr_3;
|
847
|
+
int32_t swl_0;
|
848
|
+
int32_t swl_1;
|
849
|
+
int32_t swl_2;
|
850
|
+
int32_t swl_3;
|
851
|
+
int32_t swr_0;
|
852
|
+
int32_t swr_1;
|
853
|
+
int32_t swr_2;
|
854
|
+
int32_t swr_3;
|
855
|
+
} T;
|
856
|
+
T t;
|
857
|
+
|
858
|
+
Assembler assm(NULL, 0);
|
859
|
+
|
860
|
+
// Test all combinations of LWL and vAddr.
|
861
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
862
|
+
__ lwl(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
863
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, lwl_0)) );
|
864
|
+
|
865
|
+
__ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
866
|
+
__ lwl(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) );
|
867
|
+
__ sw(t1, MemOperand(a0, OFFSET_OF(T, lwl_1)) );
|
868
|
+
|
869
|
+
__ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
870
|
+
__ lwl(t2, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) );
|
871
|
+
__ sw(t2, MemOperand(a0, OFFSET_OF(T, lwl_2)) );
|
872
|
+
|
873
|
+
__ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
874
|
+
__ lwl(t3, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) );
|
875
|
+
__ sw(t3, MemOperand(a0, OFFSET_OF(T, lwl_3)) );
|
876
|
+
|
877
|
+
// Test all combinations of LWR and vAddr.
|
878
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
879
|
+
__ lwr(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
880
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, lwr_0)) );
|
881
|
+
|
882
|
+
__ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
883
|
+
__ lwr(t1, MemOperand(a0, OFFSET_OF(T, mem_init) + 1) );
|
884
|
+
__ sw(t1, MemOperand(a0, OFFSET_OF(T, lwr_1)) );
|
885
|
+
|
886
|
+
__ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
887
|
+
__ lwr(t2, MemOperand(a0, OFFSET_OF(T, mem_init) + 2) );
|
888
|
+
__ sw(t2, MemOperand(a0, OFFSET_OF(T, lwr_2)) );
|
889
|
+
|
890
|
+
__ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
891
|
+
__ lwr(t3, MemOperand(a0, OFFSET_OF(T, mem_init) + 3) );
|
892
|
+
__ sw(t3, MemOperand(a0, OFFSET_OF(T, lwr_3)) );
|
893
|
+
|
894
|
+
// Test all combinations of SWL and vAddr.
|
895
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
896
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, swl_0)) );
|
897
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
898
|
+
__ swl(t0, MemOperand(a0, OFFSET_OF(T, swl_0)) );
|
899
|
+
|
900
|
+
__ lw(t1, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
901
|
+
__ sw(t1, MemOperand(a0, OFFSET_OF(T, swl_1)) );
|
902
|
+
__ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
903
|
+
__ swl(t1, MemOperand(a0, OFFSET_OF(T, swl_1) + 1) );
|
904
|
+
|
905
|
+
__ lw(t2, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
906
|
+
__ sw(t2, MemOperand(a0, OFFSET_OF(T, swl_2)) );
|
907
|
+
__ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
908
|
+
__ swl(t2, MemOperand(a0, OFFSET_OF(T, swl_2) + 2) );
|
909
|
+
|
910
|
+
__ lw(t3, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
911
|
+
__ sw(t3, MemOperand(a0, OFFSET_OF(T, swl_3)) );
|
912
|
+
__ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
913
|
+
__ swl(t3, MemOperand(a0, OFFSET_OF(T, swl_3) + 3) );
|
914
|
+
|
915
|
+
// Test all combinations of SWR and vAddr.
|
916
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
917
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, swr_0)) );
|
918
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
919
|
+
__ swr(t0, MemOperand(a0, OFFSET_OF(T, swr_0)) );
|
920
|
+
|
921
|
+
__ lw(t1, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
922
|
+
__ sw(t1, MemOperand(a0, OFFSET_OF(T, swr_1)) );
|
923
|
+
__ lw(t1, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
924
|
+
__ swr(t1, MemOperand(a0, OFFSET_OF(T, swr_1) + 1) );
|
925
|
+
|
926
|
+
__ lw(t2, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
927
|
+
__ sw(t2, MemOperand(a0, OFFSET_OF(T, swr_2)) );
|
928
|
+
__ lw(t2, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
929
|
+
__ swr(t2, MemOperand(a0, OFFSET_OF(T, swr_2) + 2) );
|
930
|
+
|
931
|
+
__ lw(t3, MemOperand(a0, OFFSET_OF(T, mem_init)) );
|
932
|
+
__ sw(t3, MemOperand(a0, OFFSET_OF(T, swr_3)) );
|
933
|
+
__ lw(t3, MemOperand(a0, OFFSET_OF(T, reg_init)) );
|
934
|
+
__ swr(t3, MemOperand(a0, OFFSET_OF(T, swr_3) + 3) );
|
935
|
+
|
936
|
+
__ jr(ra);
|
937
|
+
__ nop();
|
938
|
+
|
939
|
+
CodeDesc desc;
|
940
|
+
assm.GetCode(&desc);
|
941
|
+
Object* code = HEAP->CreateCode(
|
942
|
+
desc,
|
943
|
+
Code::ComputeFlags(Code::STUB),
|
944
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
945
|
+
CHECK(code->IsCode());
|
946
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
947
|
+
t.reg_init = 0xaabbccdd;
|
948
|
+
t.mem_init = 0x11223344;
|
949
|
+
|
950
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
951
|
+
USE(dummy);
|
952
|
+
|
953
|
+
CHECK_EQ(0x44bbccdd, t.lwl_0);
|
954
|
+
CHECK_EQ(0x3344ccdd, t.lwl_1);
|
955
|
+
CHECK_EQ(0x223344dd, t.lwl_2);
|
956
|
+
CHECK_EQ(0x11223344, t.lwl_3);
|
957
|
+
|
958
|
+
CHECK_EQ(0x11223344, t.lwr_0);
|
959
|
+
CHECK_EQ(0xaa112233, t.lwr_1);
|
960
|
+
CHECK_EQ(0xaabb1122, t.lwr_2);
|
961
|
+
CHECK_EQ(0xaabbcc11, t.lwr_3);
|
962
|
+
|
963
|
+
CHECK_EQ(0x112233aa, t.swl_0);
|
964
|
+
CHECK_EQ(0x1122aabb, t.swl_1);
|
965
|
+
CHECK_EQ(0x11aabbcc, t.swl_2);
|
966
|
+
CHECK_EQ(0xaabbccdd, t.swl_3);
|
967
|
+
|
968
|
+
CHECK_EQ(0xaabbccdd, t.swr_0);
|
969
|
+
CHECK_EQ(0xbbccdd44, t.swr_1);
|
970
|
+
CHECK_EQ(0xccdd3344, t.swr_2);
|
971
|
+
CHECK_EQ(0xdd223344, t.swr_3);
|
972
|
+
}
|
973
|
+
|
974
|
+
|
975
|
+
TEST(MIPS12) {
|
976
|
+
InitializeVM();
|
977
|
+
v8::HandleScope scope;
|
978
|
+
|
979
|
+
typedef struct {
|
980
|
+
int32_t x;
|
981
|
+
int32_t y;
|
982
|
+
int32_t y1;
|
983
|
+
int32_t y2;
|
984
|
+
int32_t y3;
|
985
|
+
int32_t y4;
|
986
|
+
} T;
|
987
|
+
T t;
|
988
|
+
|
989
|
+
MacroAssembler assm(NULL, 0);
|
990
|
+
|
991
|
+
__ mov(t6, fp); // Save frame pointer.
|
992
|
+
__ mov(fp, a0); // Access struct T by fp.
|
993
|
+
__ lw(t0, MemOperand(a0, OFFSET_OF(T, y)) );
|
994
|
+
__ lw(t3, MemOperand(a0, OFFSET_OF(T, y4)) );
|
995
|
+
|
996
|
+
__ addu(t1, t0, t3);
|
997
|
+
__ subu(t4, t0, t3);
|
998
|
+
__ nop();
|
999
|
+
__ Push(t0); // These instructions disappear after opt.
|
1000
|
+
__ Pop();
|
1001
|
+
__ addu(t0, t0, t0);
|
1002
|
+
__ nop();
|
1003
|
+
__ Pop(); // These instructions disappear after opt.
|
1004
|
+
__ Push(t3);
|
1005
|
+
__ nop();
|
1006
|
+
__ Push(t3); // These instructions disappear after opt.
|
1007
|
+
__ Pop(t3);
|
1008
|
+
__ nop();
|
1009
|
+
__ Push(t3);
|
1010
|
+
__ Pop(t4);
|
1011
|
+
__ nop();
|
1012
|
+
__ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
|
1013
|
+
__ lw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
|
1014
|
+
__ nop();
|
1015
|
+
__ sw(t0, MemOperand(fp, OFFSET_OF(T, y)) );
|
1016
|
+
__ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) );
|
1017
|
+
__ nop();
|
1018
|
+
__ Push(t1);
|
1019
|
+
__ lw(t1, MemOperand(fp, OFFSET_OF(T, y)) );
|
1020
|
+
__ Pop(t1);
|
1021
|
+
__ nop();
|
1022
|
+
__ Push(t1);
|
1023
|
+
__ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
|
1024
|
+
__ Pop(t1);
|
1025
|
+
__ nop();
|
1026
|
+
__ Push(t1);
|
1027
|
+
__ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
|
1028
|
+
__ Pop(t2);
|
1029
|
+
__ nop();
|
1030
|
+
__ Push(t2);
|
1031
|
+
__ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
|
1032
|
+
__ Pop(t1);
|
1033
|
+
__ nop();
|
1034
|
+
__ Push(t1);
|
1035
|
+
__ lw(t2, MemOperand(fp, OFFSET_OF(T, y)) );
|
1036
|
+
__ Pop(t3);
|
1037
|
+
__ nop();
|
1038
|
+
|
1039
|
+
__ mov(fp, t6);
|
1040
|
+
__ jr(ra);
|
1041
|
+
__ nop();
|
1042
|
+
|
1043
|
+
CodeDesc desc;
|
1044
|
+
assm.GetCode(&desc);
|
1045
|
+
Object* code = HEAP->CreateCode(
|
1046
|
+
desc,
|
1047
|
+
Code::ComputeFlags(Code::STUB),
|
1048
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
1049
|
+
CHECK(code->IsCode());
|
1050
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
1051
|
+
t.x = 1;
|
1052
|
+
t.y = 2;
|
1053
|
+
t.y1 = 3;
|
1054
|
+
t.y2 = 4;
|
1055
|
+
t.y3 = 0XBABA;
|
1056
|
+
t.y4 = 0xDEDA;
|
1057
|
+
|
1058
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
1059
|
+
USE(dummy);
|
1060
|
+
|
1061
|
+
CHECK_EQ(3, t.y1);
|
1062
|
+
}
|
1063
|
+
|
1064
|
+
|
1065
|
+
TEST(MIPS13) {
|
1066
|
+
// Test Cvt_d_uw and Trunc_uw_d macros.
|
1067
|
+
InitializeVM();
|
1068
|
+
v8::HandleScope scope;
|
1069
|
+
|
1070
|
+
typedef struct {
|
1071
|
+
double cvt_big_out;
|
1072
|
+
double cvt_small_out;
|
1073
|
+
uint32_t trunc_big_out;
|
1074
|
+
uint32_t trunc_small_out;
|
1075
|
+
uint32_t cvt_big_in;
|
1076
|
+
uint32_t cvt_small_in;
|
1077
|
+
} T;
|
1078
|
+
T t;
|
1079
|
+
|
1080
|
+
MacroAssembler assm(NULL, 0);
|
1081
|
+
|
1082
|
+
if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
|
1083
|
+
CpuFeatures::Scope scope(FPU);
|
1084
|
+
|
1085
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_small_in)));
|
1086
|
+
__ Cvt_d_uw(f10, t0);
|
1087
|
+
__ sdc1(f10, MemOperand(a0, OFFSET_OF(T, cvt_small_out)));
|
1088
|
+
|
1089
|
+
__ Trunc_uw_d(f10, f10);
|
1090
|
+
__ swc1(f10, MemOperand(a0, OFFSET_OF(T, trunc_small_out)));
|
1091
|
+
|
1092
|
+
__ sw(t0, MemOperand(a0, OFFSET_OF(T, cvt_big_in)));
|
1093
|
+
__ Cvt_d_uw(f8, t0);
|
1094
|
+
__ sdc1(f8, MemOperand(a0, OFFSET_OF(T, cvt_big_out)));
|
1095
|
+
|
1096
|
+
__ Trunc_uw_d(f8, f8);
|
1097
|
+
__ swc1(f8, MemOperand(a0, OFFSET_OF(T, trunc_big_out)));
|
1098
|
+
|
1099
|
+
__ jr(ra);
|
1100
|
+
__ nop();
|
1101
|
+
|
1102
|
+
CodeDesc desc;
|
1103
|
+
assm.GetCode(&desc);
|
1104
|
+
Object* code = HEAP->CreateCode(
|
1105
|
+
desc,
|
1106
|
+
Code::ComputeFlags(Code::STUB),
|
1107
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
1108
|
+
CHECK(code->IsCode());
|
1109
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
1110
|
+
|
1111
|
+
t.cvt_big_in = 0xFFFFFFFF;
|
1112
|
+
t.cvt_small_in = 333;
|
1113
|
+
|
1114
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
1115
|
+
USE(dummy);
|
1116
|
+
|
1117
|
+
CHECK_EQ(t.cvt_big_out, static_cast<double>(t.cvt_big_in));
|
1118
|
+
CHECK_EQ(t.cvt_small_out, static_cast<double>(t.cvt_small_in));
|
1119
|
+
|
1120
|
+
CHECK_EQ(static_cast<int>(t.trunc_big_out), static_cast<int>(t.cvt_big_in));
|
1121
|
+
CHECK_EQ(static_cast<int>(t.trunc_small_out),
|
1122
|
+
static_cast<int>(t.cvt_small_in));
|
1123
|
+
}
|
1124
|
+
}
|
1125
|
+
|
1126
|
+
|
1127
|
+
TEST(MIPS14) {
|
1128
|
+
// Test round, floor, ceil, trunc, cvt.
|
1129
|
+
InitializeVM();
|
1130
|
+
v8::HandleScope scope;
|
1131
|
+
|
1132
|
+
#define ROUND_STRUCT_ELEMENT(x) \
|
1133
|
+
int32_t x##_up_out; \
|
1134
|
+
int32_t x##_down_out; \
|
1135
|
+
int32_t neg_##x##_up_out; \
|
1136
|
+
int32_t neg_##x##_down_out; \
|
1137
|
+
int32_t x##_err1_out; \
|
1138
|
+
int32_t x##_err2_out; \
|
1139
|
+
int32_t x##_err3_out; \
|
1140
|
+
int32_t x##_err4_out; \
|
1141
|
+
int32_t x##_invalid_result;
|
1142
|
+
|
1143
|
+
typedef struct {
|
1144
|
+
double round_up_in;
|
1145
|
+
double round_down_in;
|
1146
|
+
double neg_round_up_in;
|
1147
|
+
double neg_round_down_in;
|
1148
|
+
double err1_in;
|
1149
|
+
double err2_in;
|
1150
|
+
double err3_in;
|
1151
|
+
double err4_in;
|
1152
|
+
|
1153
|
+
ROUND_STRUCT_ELEMENT(round)
|
1154
|
+
ROUND_STRUCT_ELEMENT(floor)
|
1155
|
+
ROUND_STRUCT_ELEMENT(ceil)
|
1156
|
+
ROUND_STRUCT_ELEMENT(trunc)
|
1157
|
+
ROUND_STRUCT_ELEMENT(cvt)
|
1158
|
+
} T;
|
1159
|
+
T t;
|
1160
|
+
|
1161
|
+
#undef ROUND_STRUCT_ELEMENT
|
1162
|
+
|
1163
|
+
MacroAssembler assm(NULL, 0);
|
1164
|
+
|
1165
|
+
if (Isolate::Current()->cpu_features()->IsSupported(FPU)) {
|
1166
|
+
CpuFeatures::Scope scope(FPU);
|
1167
|
+
|
1168
|
+
// Save FCSR.
|
1169
|
+
__ cfc1(a1, FCSR);
|
1170
|
+
// Disable FPU exceptions.
|
1171
|
+
__ ctc1(zero_reg, FCSR);
|
1172
|
+
#define RUN_ROUND_TEST(x) \
|
1173
|
+
__ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_up_in))); \
|
1174
|
+
__ x##_w_d(f0, f0); \
|
1175
|
+
__ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_up_out))); \
|
1176
|
+
\
|
1177
|
+
__ ldc1(f0, MemOperand(a0, OFFSET_OF(T, round_down_in))); \
|
1178
|
+
__ x##_w_d(f0, f0); \
|
1179
|
+
__ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_down_out))); \
|
1180
|
+
\
|
1181
|
+
__ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_up_in))); \
|
1182
|
+
__ x##_w_d(f0, f0); \
|
1183
|
+
__ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_up_out))); \
|
1184
|
+
\
|
1185
|
+
__ ldc1(f0, MemOperand(a0, OFFSET_OF(T, neg_round_down_in))); \
|
1186
|
+
__ x##_w_d(f0, f0); \
|
1187
|
+
__ swc1(f0, MemOperand(a0, OFFSET_OF(T, neg_##x##_down_out))); \
|
1188
|
+
\
|
1189
|
+
__ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err1_in))); \
|
1190
|
+
__ ctc1(zero_reg, FCSR); \
|
1191
|
+
__ x##_w_d(f0, f0); \
|
1192
|
+
__ cfc1(a2, FCSR); \
|
1193
|
+
__ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err1_out))); \
|
1194
|
+
\
|
1195
|
+
__ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err2_in))); \
|
1196
|
+
__ ctc1(zero_reg, FCSR); \
|
1197
|
+
__ x##_w_d(f0, f0); \
|
1198
|
+
__ cfc1(a2, FCSR); \
|
1199
|
+
__ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err2_out))); \
|
1200
|
+
\
|
1201
|
+
__ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err3_in))); \
|
1202
|
+
__ ctc1(zero_reg, FCSR); \
|
1203
|
+
__ x##_w_d(f0, f0); \
|
1204
|
+
__ cfc1(a2, FCSR); \
|
1205
|
+
__ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err3_out))); \
|
1206
|
+
\
|
1207
|
+
__ ldc1(f0, MemOperand(a0, OFFSET_OF(T, err4_in))); \
|
1208
|
+
__ ctc1(zero_reg, FCSR); \
|
1209
|
+
__ x##_w_d(f0, f0); \
|
1210
|
+
__ cfc1(a2, FCSR); \
|
1211
|
+
__ sw(a2, MemOperand(a0, OFFSET_OF(T, x##_err4_out))); \
|
1212
|
+
__ swc1(f0, MemOperand(a0, OFFSET_OF(T, x##_invalid_result)));
|
1213
|
+
|
1214
|
+
RUN_ROUND_TEST(round)
|
1215
|
+
RUN_ROUND_TEST(floor)
|
1216
|
+
RUN_ROUND_TEST(ceil)
|
1217
|
+
RUN_ROUND_TEST(trunc)
|
1218
|
+
RUN_ROUND_TEST(cvt)
|
1219
|
+
|
1220
|
+
// Restore FCSR.
|
1221
|
+
__ ctc1(a1, FCSR);
|
1222
|
+
|
1223
|
+
#undef RUN_ROUND_TEST
|
1224
|
+
|
1225
|
+
__ jr(ra);
|
1226
|
+
__ nop();
|
1227
|
+
|
1228
|
+
CodeDesc desc;
|
1229
|
+
assm.GetCode(&desc);
|
1230
|
+
Object* code = HEAP->CreateCode(
|
1231
|
+
desc,
|
1232
|
+
Code::ComputeFlags(Code::STUB),
|
1233
|
+
Handle<Object>(HEAP->undefined_value()))->ToObjectChecked();
|
1234
|
+
CHECK(code->IsCode());
|
1235
|
+
F3 f = FUNCTION_CAST<F3>(Code::cast(code)->entry());
|
1236
|
+
|
1237
|
+
t.round_up_in = 123.51;
|
1238
|
+
t.round_down_in = 123.49;
|
1239
|
+
t.neg_round_up_in = -123.5;
|
1240
|
+
t.neg_round_down_in = -123.49;
|
1241
|
+
t.err1_in = 123.51;
|
1242
|
+
t.err2_in = 1;
|
1243
|
+
t.err3_in = static_cast<double>(1) + 0xFFFFFFFF;
|
1244
|
+
t.err4_in = NAN;
|
1245
|
+
|
1246
|
+
Object* dummy = CALL_GENERATED_CODE(f, &t, 0, 0, 0, 0);
|
1247
|
+
USE(dummy);
|
1248
|
+
|
1249
|
+
#define GET_FPU_ERR(x) ((x >> 2) & (32 - 1))
|
1250
|
+
|
1251
|
+
CHECK_EQ(124, t.round_up_out);
|
1252
|
+
CHECK_EQ(123, t.round_down_out);
|
1253
|
+
CHECK_EQ(-124, t.neg_round_up_out);
|
1254
|
+
CHECK_EQ(-123, t.neg_round_down_out);
|
1255
|
+
|
1256
|
+
// Inaccurate.
|
1257
|
+
CHECK_EQ(1, GET_FPU_ERR(t.round_err1_out));
|
1258
|
+
// No error.
|
1259
|
+
CHECK_EQ(0, GET_FPU_ERR(t.round_err2_out));
|
1260
|
+
// Invalid operation.
|
1261
|
+
CHECK_EQ(16, GET_FPU_ERR(t.round_err3_out));
|
1262
|
+
CHECK_EQ(16, GET_FPU_ERR(t.round_err4_out));
|
1263
|
+
CHECK_EQ(kFPUInvalidResult, t.round_invalid_result);
|
1264
|
+
|
1265
|
+
CHECK_EQ(123, t.floor_up_out);
|
1266
|
+
CHECK_EQ(123, t.floor_down_out);
|
1267
|
+
CHECK_EQ(-124, t.neg_floor_up_out);
|
1268
|
+
CHECK_EQ(-124, t.neg_floor_down_out);
|
1269
|
+
|
1270
|
+
// Inaccurate.
|
1271
|
+
CHECK_EQ(1, GET_FPU_ERR(t.floor_err1_out));
|
1272
|
+
// No error.
|
1273
|
+
CHECK_EQ(0, GET_FPU_ERR(t.floor_err2_out));
|
1274
|
+
// Invalid operation.
|
1275
|
+
CHECK_EQ(16, GET_FPU_ERR(t.floor_err3_out));
|
1276
|
+
CHECK_EQ(16, GET_FPU_ERR(t.floor_err4_out));
|
1277
|
+
CHECK_EQ(kFPUInvalidResult, t.floor_invalid_result);
|
1278
|
+
|
1279
|
+
CHECK_EQ(124, t.ceil_up_out);
|
1280
|
+
CHECK_EQ(124, t.ceil_down_out);
|
1281
|
+
CHECK_EQ(-123, t.neg_ceil_up_out);
|
1282
|
+
CHECK_EQ(-123, t.neg_ceil_down_out);
|
1283
|
+
|
1284
|
+
// Inaccurate.
|
1285
|
+
CHECK_EQ(1, GET_FPU_ERR(t.ceil_err1_out));
|
1286
|
+
// No error.
|
1287
|
+
CHECK_EQ(0, GET_FPU_ERR(t.ceil_err2_out));
|
1288
|
+
// Invalid operation.
|
1289
|
+
CHECK_EQ(16, GET_FPU_ERR(t.ceil_err3_out));
|
1290
|
+
CHECK_EQ(16, GET_FPU_ERR(t.ceil_err4_out));
|
1291
|
+
CHECK_EQ(kFPUInvalidResult, t.ceil_invalid_result);
|
1292
|
+
|
1293
|
+
// In rounding mode 0 cvt should behave like round.
|
1294
|
+
CHECK_EQ(t.round_up_out, t.cvt_up_out);
|
1295
|
+
CHECK_EQ(t.round_down_out, t.cvt_down_out);
|
1296
|
+
CHECK_EQ(t.neg_round_up_out, t.neg_cvt_up_out);
|
1297
|
+
CHECK_EQ(t.neg_round_down_out, t.neg_cvt_down_out);
|
1298
|
+
|
1299
|
+
// Inaccurate.
|
1300
|
+
CHECK_EQ(1, GET_FPU_ERR(t.cvt_err1_out));
|
1301
|
+
// No error.
|
1302
|
+
CHECK_EQ(0, GET_FPU_ERR(t.cvt_err2_out));
|
1303
|
+
// Invalid operation.
|
1304
|
+
CHECK_EQ(16, GET_FPU_ERR(t.cvt_err3_out));
|
1305
|
+
CHECK_EQ(16, GET_FPU_ERR(t.cvt_err4_out));
|
1306
|
+
CHECK_EQ(kFPUInvalidResult, t.cvt_invalid_result);
|
1307
|
+
}
|
1308
|
+
}
|
1309
|
+
|
1310
|
+
|
253
1311
|
#undef __
|