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

Side by Side Diff: src/deoptimizer.cc

Issue 2031873002: [deoptimizer] Support float registers and slots. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Fix compile. Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/deoptimizer.h ('k') | src/objects.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/deoptimizer.h" 5 #include "src/deoptimizer.h"
6 6
7 #include "src/accessors.h" 7 #include "src/accessors.h"
8 #include "src/ast/prettyprinter.h" 8 #include "src/ast/prettyprinter.h"
9 #include "src/codegen.h" 9 #include "src/codegen.h"
10 #include "src/disasm.h" 10 #include "src/disasm.h"
(...skipping 2433 matching lines...) Expand 10 before | Expand all | Expand 10 after
2444 buffer_->Add(UINT32_REGISTER, zone()); 2444 buffer_->Add(UINT32_REGISTER, zone());
2445 buffer_->Add(reg.code(), zone()); 2445 buffer_->Add(reg.code(), zone());
2446 } 2446 }
2447 2447
2448 2448
2449 void Translation::StoreBoolRegister(Register reg) { 2449 void Translation::StoreBoolRegister(Register reg) {
2450 buffer_->Add(BOOL_REGISTER, zone()); 2450 buffer_->Add(BOOL_REGISTER, zone());
2451 buffer_->Add(reg.code(), zone()); 2451 buffer_->Add(reg.code(), zone());
2452 } 2452 }
2453 2453
2454 void Translation::StoreFloatRegister(FloatRegister reg) {
2455 buffer_->Add(FLOAT_REGISTER, zone());
2456 buffer_->Add(reg.code(), zone());
2457 }
2454 2458
2455 void Translation::StoreDoubleRegister(DoubleRegister reg) { 2459 void Translation::StoreDoubleRegister(DoubleRegister reg) {
2456 buffer_->Add(DOUBLE_REGISTER, zone()); 2460 buffer_->Add(DOUBLE_REGISTER, zone());
2457 buffer_->Add(reg.code(), zone()); 2461 buffer_->Add(reg.code(), zone());
2458 } 2462 }
2459 2463
2460 2464
2461 void Translation::StoreStackSlot(int index) { 2465 void Translation::StoreStackSlot(int index) {
2462 buffer_->Add(STACK_SLOT, zone()); 2466 buffer_->Add(STACK_SLOT, zone());
2463 buffer_->Add(index, zone()); 2467 buffer_->Add(index, zone());
(...skipping 10 matching lines...) Expand all
2474 buffer_->Add(UINT32_STACK_SLOT, zone()); 2478 buffer_->Add(UINT32_STACK_SLOT, zone());
2475 buffer_->Add(index, zone()); 2479 buffer_->Add(index, zone());
2476 } 2480 }
2477 2481
2478 2482
2479 void Translation::StoreBoolStackSlot(int index) { 2483 void Translation::StoreBoolStackSlot(int index) {
2480 buffer_->Add(BOOL_STACK_SLOT, zone()); 2484 buffer_->Add(BOOL_STACK_SLOT, zone());
2481 buffer_->Add(index, zone()); 2485 buffer_->Add(index, zone());
2482 } 2486 }
2483 2487
2488 void Translation::StoreFloatStackSlot(int index) {
2489 buffer_->Add(FLOAT_STACK_SLOT, zone());
2490 buffer_->Add(index, zone());
2491 }
2484 2492
2485 void Translation::StoreDoubleStackSlot(int index) { 2493 void Translation::StoreDoubleStackSlot(int index) {
2486 buffer_->Add(DOUBLE_STACK_SLOT, zone()); 2494 buffer_->Add(DOUBLE_STACK_SLOT, zone());
2487 buffer_->Add(index, zone()); 2495 buffer_->Add(index, zone());
2488 } 2496 }
2489 2497
2490 2498
2491 void Translation::StoreLiteral(int literal_id) { 2499 void Translation::StoreLiteral(int literal_id) {
2492 buffer_->Add(LITERAL, zone()); 2500 buffer_->Add(LITERAL, zone());
2493 buffer_->Add(literal_id, zone()); 2501 buffer_->Add(literal_id, zone());
(...skipping 20 matching lines...) Expand all
2514 switch (opcode) { 2522 switch (opcode) {
2515 case GETTER_STUB_FRAME: 2523 case GETTER_STUB_FRAME:
2516 case SETTER_STUB_FRAME: 2524 case SETTER_STUB_FRAME:
2517 case DUPLICATED_OBJECT: 2525 case DUPLICATED_OBJECT:
2518 case ARGUMENTS_OBJECT: 2526 case ARGUMENTS_OBJECT:
2519 case CAPTURED_OBJECT: 2527 case CAPTURED_OBJECT:
2520 case REGISTER: 2528 case REGISTER:
2521 case INT32_REGISTER: 2529 case INT32_REGISTER:
2522 case UINT32_REGISTER: 2530 case UINT32_REGISTER:
2523 case BOOL_REGISTER: 2531 case BOOL_REGISTER:
2532 case FLOAT_REGISTER:
2524 case DOUBLE_REGISTER: 2533 case DOUBLE_REGISTER:
2525 case STACK_SLOT: 2534 case STACK_SLOT:
2526 case INT32_STACK_SLOT: 2535 case INT32_STACK_SLOT:
2527 case UINT32_STACK_SLOT: 2536 case UINT32_STACK_SLOT:
2528 case BOOL_STACK_SLOT: 2537 case BOOL_STACK_SLOT:
2538 case FLOAT_STACK_SLOT:
2529 case DOUBLE_STACK_SLOT: 2539 case DOUBLE_STACK_SLOT:
2530 case LITERAL: 2540 case LITERAL:
2531 case COMPILED_STUB_FRAME: 2541 case COMPILED_STUB_FRAME:
2532 case TAIL_CALLER_FRAME: 2542 case TAIL_CALLER_FRAME:
2533 return 1; 2543 return 1;
2534 case BEGIN: 2544 case BEGIN:
2535 case ARGUMENTS_ADAPTOR_FRAME: 2545 case ARGUMENTS_ADAPTOR_FRAME:
2536 case CONSTRUCT_STUB_FRAME: 2546 case CONSTRUCT_STUB_FRAME:
2537 return 2; 2547 return 2;
2538 case JS_FRAME: 2548 case JS_FRAME:
(...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after
2809 // static 2819 // static
2810 TranslatedValue TranslatedValue::NewDuplicateObject(TranslatedState* container, 2820 TranslatedValue TranslatedValue::NewDuplicateObject(TranslatedState* container,
2811 int id) { 2821 int id) {
2812 TranslatedValue slot(container, kDuplicatedObject); 2822 TranslatedValue slot(container, kDuplicatedObject);
2813 slot.materialization_info_ = {id, -1}; 2823 slot.materialization_info_ = {id, -1};
2814 return slot; 2824 return slot;
2815 } 2825 }
2816 2826
2817 2827
2818 // static 2828 // static
2829 TranslatedValue TranslatedValue::NewFloat(TranslatedState* container,
2830 float value) {
2831 TranslatedValue slot(container, kFloat);
2832 slot.float_value_ = value;
2833 return slot;
2834 }
2835
2836 // static
2819 TranslatedValue TranslatedValue::NewDouble(TranslatedState* container, 2837 TranslatedValue TranslatedValue::NewDouble(TranslatedState* container,
2820 double value) { 2838 double value) {
2821 TranslatedValue slot(container, kDouble); 2839 TranslatedValue slot(container, kDouble);
2822 slot.double_value_ = value; 2840 slot.double_value_ = value;
2823 return slot; 2841 return slot;
2824 } 2842 }
2825 2843
2826 2844
2827 // static 2845 // static
2828 TranslatedValue TranslatedValue::NewInt32(TranslatedState* container, 2846 TranslatedValue TranslatedValue::NewInt32(TranslatedState* container,
(...skipping 50 matching lines...) Expand 10 before | Expand all | Expand 10 after
2879 DCHECK_EQ(kInt32, kind()); 2897 DCHECK_EQ(kInt32, kind());
2880 return int32_value_; 2898 return int32_value_;
2881 } 2899 }
2882 2900
2883 2901
2884 uint32_t TranslatedValue::uint32_value() const { 2902 uint32_t TranslatedValue::uint32_value() const {
2885 DCHECK(kind() == kUInt32 || kind() == kBoolBit); 2903 DCHECK(kind() == kUInt32 || kind() == kBoolBit);
2886 return uint32_value_; 2904 return uint32_value_;
2887 } 2905 }
2888 2906
2907 float TranslatedValue::float_value() const {
2908 DCHECK_EQ(kFloat, kind());
2909 return float_value_;
2910 }
2889 2911
2890 double TranslatedValue::double_value() const { 2912 double TranslatedValue::double_value() const {
2891 DCHECK_EQ(kDouble, kind()); 2913 DCHECK_EQ(kDouble, kind());
2892 return double_value_; 2914 return double_value_;
2893 } 2915 }
2894 2916
2895 2917
2896 int TranslatedValue::object_length() const { 2918 int TranslatedValue::object_length() const {
2897 DCHECK(kind() == kArgumentsObject || kind() == kCapturedObject); 2919 DCHECK(kind() == kArgumentsObject || kind() == kCapturedObject);
2898 return materialization_info_.length_; 2920 return materialization_info_.length_;
(...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after
2957 Handle<Object> result; 2979 Handle<Object> result;
2958 // If we already have a value, then get it. 2980 // If we already have a value, then get it.
2959 if (value_.ToHandle(&result)) return result; 2981 if (value_.ToHandle(&result)) return result;
2960 2982
2961 // Otherwise we have to materialize. 2983 // Otherwise we have to materialize.
2962 switch (kind()) { 2984 switch (kind()) {
2963 case TranslatedValue::kTagged: 2985 case TranslatedValue::kTagged:
2964 case TranslatedValue::kInt32: 2986 case TranslatedValue::kInt32:
2965 case TranslatedValue::kUInt32: 2987 case TranslatedValue::kUInt32:
2966 case TranslatedValue::kBoolBit: 2988 case TranslatedValue::kBoolBit:
2989 case TranslatedValue::kFloat:
2967 case TranslatedValue::kDouble: { 2990 case TranslatedValue::kDouble: {
2968 MaterializeSimple(); 2991 MaterializeSimple();
2969 return value_.ToHandleChecked(); 2992 return value_.ToHandleChecked();
2970 } 2993 }
2971 2994
2972 case TranslatedValue::kArgumentsObject: 2995 case TranslatedValue::kArgumentsObject:
2973 case TranslatedValue::kCapturedObject: 2996 case TranslatedValue::kCapturedObject:
2974 case TranslatedValue::kDuplicatedObject: 2997 case TranslatedValue::kDuplicatedObject:
2975 return container_->MaterializeObjectAt(object_index()); 2998 return container_->MaterializeObjectAt(object_index());
2976 2999
(...skipping 21 matching lines...) Expand all
2998 switch (kind()) { 3021 switch (kind()) {
2999 case kInt32: { 3022 case kInt32: {
3000 value_ = Handle<Object>(isolate()->factory()->NewNumber(int32_value())); 3023 value_ = Handle<Object>(isolate()->factory()->NewNumber(int32_value()));
3001 return; 3024 return;
3002 } 3025 }
3003 3026
3004 case kUInt32: 3027 case kUInt32:
3005 value_ = Handle<Object>(isolate()->factory()->NewNumber(uint32_value())); 3028 value_ = Handle<Object>(isolate()->factory()->NewNumber(uint32_value()));
3006 return; 3029 return;
3007 3030
3031 case kFloat:
3032 value_ = Handle<Object>(isolate()->factory()->NewNumber(float_value()));
3033 return;
3034
3008 case kDouble: 3035 case kDouble:
3009 value_ = Handle<Object>(isolate()->factory()->NewNumber(double_value())); 3036 value_ = Handle<Object>(isolate()->factory()->NewNumber(double_value()));
3010 return; 3037 return;
3011 3038
3012 case kCapturedObject: 3039 case kCapturedObject:
3013 case kDuplicatedObject: 3040 case kDuplicatedObject:
3014 case kArgumentsObject: 3041 case kArgumentsObject:
3015 case kInvalid: 3042 case kInvalid:
3016 case kTagged: 3043 case kTagged:
3017 case kBoolBit: 3044 case kBoolBit:
(...skipping 256 matching lines...) Expand 10 before | Expand all | Expand 10 after
3274 } 3301 }
3275 3302
3276 case Translation::BEGIN: 3303 case Translation::BEGIN:
3277 case Translation::DUPLICATED_OBJECT: 3304 case Translation::DUPLICATED_OBJECT:
3278 case Translation::ARGUMENTS_OBJECT: 3305 case Translation::ARGUMENTS_OBJECT:
3279 case Translation::CAPTURED_OBJECT: 3306 case Translation::CAPTURED_OBJECT:
3280 case Translation::REGISTER: 3307 case Translation::REGISTER:
3281 case Translation::INT32_REGISTER: 3308 case Translation::INT32_REGISTER:
3282 case Translation::UINT32_REGISTER: 3309 case Translation::UINT32_REGISTER:
3283 case Translation::BOOL_REGISTER: 3310 case Translation::BOOL_REGISTER:
3311 case Translation::FLOAT_REGISTER:
3284 case Translation::DOUBLE_REGISTER: 3312 case Translation::DOUBLE_REGISTER:
3285 case Translation::STACK_SLOT: 3313 case Translation::STACK_SLOT:
3286 case Translation::INT32_STACK_SLOT: 3314 case Translation::INT32_STACK_SLOT:
3287 case Translation::UINT32_STACK_SLOT: 3315 case Translation::UINT32_STACK_SLOT:
3288 case Translation::BOOL_STACK_SLOT: 3316 case Translation::BOOL_STACK_SLOT:
3317 case Translation::FLOAT_STACK_SLOT:
3289 case Translation::DOUBLE_STACK_SLOT: 3318 case Translation::DOUBLE_STACK_SLOT:
3290 case Translation::LITERAL: 3319 case Translation::LITERAL:
3291 break; 3320 break;
3292 } 3321 }
3293 FATAL("We should never get here - unexpected deopt info."); 3322 FATAL("We should never get here - unexpected deopt info.");
3294 return TranslatedFrame::InvalidFrame(); 3323 return TranslatedFrame::InvalidFrame();
3295 } 3324 }
3296 3325
3297 3326
3298 // static 3327 // static
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after
3405 int input_reg = iterator->Next(); 3434 int input_reg = iterator->Next();
3406 if (registers == nullptr) return TranslatedValue::NewInvalid(this); 3435 if (registers == nullptr) return TranslatedValue::NewInvalid(this);
3407 intptr_t value = registers->GetRegister(input_reg); 3436 intptr_t value = registers->GetRegister(input_reg);
3408 if (trace_file != nullptr) { 3437 if (trace_file != nullptr) {
3409 PrintF(trace_file, "%" V8PRIdPTR " ; %s (bool)", value, 3438 PrintF(trace_file, "%" V8PRIdPTR " ; %s (bool)", value,
3410 converter.NameOfCPURegister(input_reg)); 3439 converter.NameOfCPURegister(input_reg));
3411 } 3440 }
3412 return TranslatedValue::NewBool(this, static_cast<uint32_t>(value)); 3441 return TranslatedValue::NewBool(this, static_cast<uint32_t>(value));
3413 } 3442 }
3414 3443
3444 case Translation::FLOAT_REGISTER: {
3445 int input_reg = iterator->Next();
3446 if (registers == nullptr) return TranslatedValue::NewInvalid(this);
3447 float value = registers->GetFloatRegister(input_reg);
3448 if (trace_file != nullptr) {
3449 PrintF(trace_file, "%e ; %s (float)", value,
3450 FloatRegister::from_code(input_reg).ToString());
3451 }
3452 return TranslatedValue::NewFloat(this, value);
3453 }
3454
3415 case Translation::DOUBLE_REGISTER: { 3455 case Translation::DOUBLE_REGISTER: {
3416 int input_reg = iterator->Next(); 3456 int input_reg = iterator->Next();
3417 if (registers == nullptr) return TranslatedValue::NewInvalid(this); 3457 if (registers == nullptr) return TranslatedValue::NewInvalid(this);
3418 double value = registers->GetDoubleRegister(input_reg); 3458 double value = registers->GetDoubleRegister(input_reg);
3419 if (trace_file != nullptr) { 3459 if (trace_file != nullptr) {
3420 PrintF(trace_file, "%e ; %s (bool)", value, 3460 PrintF(trace_file, "%e ; %s (double)", value,
3421 DoubleRegister::from_code(input_reg).ToString()); 3461 DoubleRegister::from_code(input_reg).ToString());
3422 } 3462 }
3423 return TranslatedValue::NewDouble(this, value); 3463 return TranslatedValue::NewDouble(this, value);
3424 } 3464 }
3425 3465
3426 case Translation::STACK_SLOT: { 3466 case Translation::STACK_SLOT: {
3427 int slot_offset = 3467 int slot_offset =
3428 OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next()); 3468 OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next());
3429 intptr_t value = *(reinterpret_cast<intptr_t*>(fp + slot_offset)); 3469 intptr_t value = *(reinterpret_cast<intptr_t*>(fp + slot_offset));
3430 if (trace_file != nullptr) { 3470 if (trace_file != nullptr) {
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
3462 int slot_offset = 3502 int slot_offset =
3463 OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next()); 3503 OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next());
3464 uint32_t value = GetUInt32Slot(fp, slot_offset); 3504 uint32_t value = GetUInt32Slot(fp, slot_offset);
3465 if (trace_file != nullptr) { 3505 if (trace_file != nullptr) {
3466 PrintF(trace_file, "%u ; (bool) [fp %c %d] ", value, 3506 PrintF(trace_file, "%u ; (bool) [fp %c %d] ", value,
3467 slot_offset < 0 ? '-' : '+', std::abs(slot_offset)); 3507 slot_offset < 0 ? '-' : '+', std::abs(slot_offset));
3468 } 3508 }
3469 return TranslatedValue::NewBool(this, value); 3509 return TranslatedValue::NewBool(this, value);
3470 } 3510 }
3471 3511
3512 case Translation::FLOAT_STACK_SLOT: {
3513 int slot_offset =
3514 OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next());
3515 float value = ReadFloatValue(fp + slot_offset);
3516 if (trace_file != nullptr) {
3517 PrintF(trace_file, "%e ; (float) [fp %c %d] ", value,
3518 slot_offset < 0 ? '-' : '+', std::abs(slot_offset));
3519 }
3520 return TranslatedValue::NewFloat(this, value);
3521 }
3522
3472 case Translation::DOUBLE_STACK_SLOT: { 3523 case Translation::DOUBLE_STACK_SLOT: {
3473 int slot_offset = 3524 int slot_offset =
3474 OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next()); 3525 OptimizedFrame::StackSlotOffsetRelativeToFp(iterator->Next());
3475 double value = ReadDoubleValue(fp + slot_offset); 3526 double value = ReadDoubleValue(fp + slot_offset);
3476 if (trace_file != nullptr) { 3527 if (trace_file != nullptr) {
3477 PrintF(trace_file, "%e ; (double) [fp %c %d] ", value, 3528 PrintF(trace_file, "%e ; (double) [fp %c %d] ", value,
3478 slot_offset < 0 ? '-' : '+', std::abs(slot_offset)); 3529 slot_offset < 0 ? '-' : '+', std::abs(slot_offset));
3479 } 3530 }
3480 return TranslatedValue::NewDouble(this, value); 3531 return TranslatedValue::NewDouble(this, value);
3481 } 3532 }
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
3609 CHECK(static_cast<size_t>(*value_index) < frame->values_.size()); 3660 CHECK(static_cast<size_t>(*value_index) < frame->values_.size());
3610 3661
3611 TranslatedValue* slot = &(frame->values_[*value_index]); 3662 TranslatedValue* slot = &(frame->values_[*value_index]);
3612 (*value_index)++; 3663 (*value_index)++;
3613 3664
3614 switch (slot->kind()) { 3665 switch (slot->kind()) {
3615 case TranslatedValue::kTagged: 3666 case TranslatedValue::kTagged:
3616 case TranslatedValue::kInt32: 3667 case TranslatedValue::kInt32:
3617 case TranslatedValue::kUInt32: 3668 case TranslatedValue::kUInt32:
3618 case TranslatedValue::kBoolBit: 3669 case TranslatedValue::kBoolBit:
3670 case TranslatedValue::kFloat:
3619 case TranslatedValue::kDouble: { 3671 case TranslatedValue::kDouble: {
3620 slot->MaterializeSimple(); 3672 slot->MaterializeSimple();
3621 Handle<Object> value = slot->GetValue(); 3673 Handle<Object> value = slot->GetValue();
3622 if (value->IsMutableHeapNumber()) { 3674 if (value->IsMutableHeapNumber()) {
3623 HeapNumber::cast(*value)->set_map(isolate()->heap()->heap_number_map()); 3675 HeapNumber::cast(*value)->set_map(isolate()->heap()->heap_number_map());
3624 } 3676 }
3625 return value; 3677 return value;
3626 } 3678 }
3627 3679
3628 case TranslatedValue::kArgumentsObject: { 3680 case TranslatedValue::kArgumentsObject: {
(...skipping 333 matching lines...) Expand 10 before | Expand all | Expand 10 after
3962 CHECK(value_info->IsMaterializedObject()); 4014 CHECK(value_info->IsMaterializedObject());
3963 4015
3964 value_info->value_ = 4016 value_info->value_ =
3965 Handle<Object>(previously_materialized_objects->get(i), isolate_); 4017 Handle<Object>(previously_materialized_objects->get(i), isolate_);
3966 } 4018 }
3967 } 4019 }
3968 } 4020 }
3969 4021
3970 } // namespace internal 4022 } // namespace internal
3971 } // namespace v8 4023 } // namespace v8
OLDNEW
« no previous file with comments | « src/deoptimizer.h ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698