| OLD | NEW | 
|     1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file |     1 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file | 
|     2 // for details. All rights reserved. Use of this source code is governed by a |     2 // for details. All rights reserved. Use of this source code is governed by a | 
|     3 // BSD-style license that can be found in the LICENSE file. |     3 // BSD-style license that can be found in the LICENSE file. | 
|     4  |     4  | 
|     5 #include "vm/intermediate_language.h" |     5 #include "vm/intermediate_language.h" | 
|     6  |     6  | 
|     7 #include "vm/bit_vector.h" |     7 #include "vm/bit_vector.h" | 
|     8 #include "vm/cpu.h" |     8 #include "vm/cpu.h" | 
|     9 #include "vm/dart_entry.h" |     9 #include "vm/dart_entry.h" | 
|    10 #include "vm/flow_graph_allocator.h" |    10 #include "vm/flow_graph_allocator.h" | 
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|   184     return true; |   184     return true; | 
|   185   } |   185   } | 
|   186   return false; |   186   return false; | 
|   187 } |   187 } | 
|   188  |   188  | 
|   189  |   189  | 
|   190 intptr_t CheckClassInstr::ComputeCidMask() const { |   190 intptr_t CheckClassInstr::ComputeCidMask() const { | 
|   191   ASSERT(IsDenseSwitch()); |   191   ASSERT(IsDenseSwitch()); | 
|   192   intptr_t mask = 0; |   192   intptr_t mask = 0; | 
|   193   for (intptr_t i = 0; i < cids_.length(); ++i) { |   193   for (intptr_t i = 0; i < cids_.length(); ++i) { | 
|   194     mask |= 1 << (cids_[i] - cids_[0]); |   194     mask |= static_cast<intptr_t>(1) << (cids_[i] - cids_[0]); | 
|   195   } |   195   } | 
|   196   return mask; |   196   return mask; | 
|   197 } |   197 } | 
|   198  |   198  | 
|   199  |   199  | 
|   200 bool CheckClassInstr::IsDenseMask(intptr_t mask) { |   200 bool CheckClassInstr::IsDenseMask(intptr_t mask) { | 
|   201   // Returns true if the mask is a continuos sequence of ones in its binary |   201   // Returns true if the mask is a continuos sequence of ones in its binary | 
|   202   // representation (i.e. no holes) |   202   // representation (i.e. no holes) | 
|   203   return mask == -1 || Utils::IsPowerOfTwo(mask + 1); |   203   return mask == -1 || Utils::IsPowerOfTwo(mask + 1); | 
|   204 } |   204 } | 
| (...skipping 2420 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  2625 } |  2625 } | 
|  2626  |  2626  | 
|  2627  |  2627  | 
|  2628 void MaterializeObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { |  2628 void MaterializeObjectInstr::EmitNativeCode(FlowGraphCompiler* compiler) { | 
|  2629   UNREACHABLE(); |  2629   UNREACHABLE(); | 
|  2630 } |  2630 } | 
|  2631  |  2631  | 
|  2632  |  2632  | 
|  2633 // This function should be kept in sync with |  2633 // This function should be kept in sync with | 
|  2634 // FlowGraphCompiler::SlowPathEnvironmentFor(). |  2634 // FlowGraphCompiler::SlowPathEnvironmentFor(). | 
|  2635 void MaterializeObjectInstr::RemapRegisters(intptr_t* fpu_reg_slots, |  2635 void MaterializeObjectInstr::RemapRegisters(intptr_t* cpu_reg_slots, | 
|  2636                                             intptr_t* cpu_reg_slots) { |  2636                                             intptr_t* fpu_reg_slots) { | 
|  2637   if (registers_remapped_) { |  2637   if (registers_remapped_) { | 
|  2638     return; |  2638     return; | 
|  2639   } |  2639   } | 
|  2640   registers_remapped_ = true; |  2640   registers_remapped_ = true; | 
|  2641  |  2641  | 
|  2642   for (intptr_t i = 0; i < InputCount(); i++) { |  2642   for (intptr_t i = 0; i < InputCount(); i++) { | 
|  2643     Location loc = LocationAt(i); |  2643     locations_[i] = LocationAt(i).RemapForSlowPath( | 
|  2644     if (loc.IsRegister()) { |  2644         InputAt(i)->definition(), cpu_reg_slots, fpu_reg_slots); | 
|  2645       intptr_t index = cpu_reg_slots[loc.reg()]; |  | 
|  2646       ASSERT(index >= 0); |  | 
|  2647       locations_[i] = Location::StackSlot(index); |  | 
|  2648     } else if (loc.IsFpuRegister()) { |  | 
|  2649       intptr_t index = fpu_reg_slots[loc.fpu_reg()]; |  | 
|  2650       ASSERT(index >= 0); |  | 
|  2651       Value* value = InputAt(i); |  | 
|  2652       switch (value->definition()->representation()) { |  | 
|  2653         case kUnboxedDouble: |  | 
|  2654           locations_[i] = Location::DoubleStackSlot(index); |  | 
|  2655           break; |  | 
|  2656         case kUnboxedFloat32x4: |  | 
|  2657         case kUnboxedInt32x4: |  | 
|  2658         case kUnboxedFloat64x2: |  | 
|  2659           locations_[i] = Location::QuadStackSlot(index); |  | 
|  2660           break; |  | 
|  2661         default: |  | 
|  2662           UNREACHABLE(); |  | 
|  2663       } |  | 
|  2664     } else if (loc.IsPairLocation()) { |  | 
|  2665       UNREACHABLE(); |  | 
|  2666     } else if (loc.IsInvalid() && |  | 
|  2667                InputAt(i)->definition()->IsMaterializeObject()) { |  | 
|  2668       InputAt(i)->definition()->AsMaterializeObject()->RemapRegisters( |  | 
|  2669           fpu_reg_slots, cpu_reg_slots); |  | 
|  2670     } |  | 
|  2671   } |  2645   } | 
|  2672 } |  2646 } | 
|  2673  |  2647  | 
|  2674  |  2648  | 
|  2675 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate, |  2649 LocationSummary* CurrentContextInstr::MakeLocationSummary(Isolate* isolate, | 
|  2676                                                           bool opt) const { |  2650                                                           bool opt) const { | 
|  2677   // Only appears in initial definitions, never in normal code. |  2651   // Only appears in initial definitions, never in normal code. | 
|  2678   UNREACHABLE(); |  2652   UNREACHABLE(); | 
|  2679   return NULL; |  2653   return NULL; | 
|  2680 } |  2654 } | 
| (...skipping 688 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
|  3369     case Token::kTRUNCDIV: return 0; |  3343     case Token::kTRUNCDIV: return 0; | 
|  3370     case Token::kMOD: return 1; |  3344     case Token::kMOD: return 1; | 
|  3371     default: UNIMPLEMENTED(); return -1; |  3345     default: UNIMPLEMENTED(); return -1; | 
|  3372   } |  3346   } | 
|  3373 } |  3347 } | 
|  3374  |  3348  | 
|  3375  |  3349  | 
|  3376 #undef __ |  3350 #undef __ | 
|  3377  |  3351  | 
|  3378 }  // namespace dart |  3352 }  // namespace dart | 
| OLD | NEW |