| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 5861 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5872 | 5872 |
| 5873 __ Bind(&global_object); | 5873 __ Bind(&global_object); |
| 5874 __ Ldr(result, FieldMemOperand(function, JSFunction::kContextOffset)); | 5874 __ Ldr(result, FieldMemOperand(function, JSFunction::kContextOffset)); |
| 5875 __ Ldr(result, ContextMemOperand(result, Context::GLOBAL_OBJECT_INDEX)); | 5875 __ Ldr(result, ContextMemOperand(result, Context::GLOBAL_OBJECT_INDEX)); |
| 5876 __ Ldr(result, FieldMemOperand(result, GlobalObject::kGlobalReceiverOffset)); | 5876 __ Ldr(result, FieldMemOperand(result, GlobalObject::kGlobalReceiverOffset)); |
| 5877 | 5877 |
| 5878 __ Bind(&done); | 5878 __ Bind(&done); |
| 5879 } | 5879 } |
| 5880 | 5880 |
| 5881 | 5881 |
| 5882 void LCodeGen::DoDeferredLoadMutableDouble(LLoadFieldByIndex* instr, | |
| 5883 Register result, | |
| 5884 Register object, | |
| 5885 Register index) { | |
| 5886 PushSafepointRegistersScope scope(this, Safepoint::kWithRegisters); | |
| 5887 __ Push(object); | |
| 5888 __ Push(index); | |
| 5889 __ Mov(cp, 0); | |
| 5890 __ CallRuntimeSaveDoubles(Runtime::kLoadMutableDouble); | |
| 5891 RecordSafepointWithRegisters( | |
| 5892 instr->pointer_map(), 1, Safepoint::kNoLazyDeopt); | |
| 5893 __ StoreToSafepointRegisterSlot(x0, result); | |
| 5894 } | |
| 5895 | |
| 5896 | |
| 5897 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { | 5882 void LCodeGen::DoLoadFieldByIndex(LLoadFieldByIndex* instr) { |
| 5898 class DeferredLoadMutableDouble V8_FINAL : public LDeferredCode { | |
| 5899 public: | |
| 5900 DeferredLoadMutableDouble(LCodeGen* codegen, | |
| 5901 LLoadFieldByIndex* instr, | |
| 5902 Register result, | |
| 5903 Register object, | |
| 5904 Register index) | |
| 5905 : LDeferredCode(codegen), | |
| 5906 instr_(instr), | |
| 5907 result_(result), | |
| 5908 object_(object), | |
| 5909 index_(index) { | |
| 5910 } | |
| 5911 virtual void Generate() V8_OVERRIDE { | |
| 5912 codegen()->DoDeferredLoadMutableDouble(instr_, result_, object_, index_); | |
| 5913 } | |
| 5914 virtual LInstruction* instr() V8_OVERRIDE { return instr_; } | |
| 5915 private: | |
| 5916 LLoadFieldByIndex* instr_; | |
| 5917 Register result_; | |
| 5918 Register object_; | |
| 5919 Register index_; | |
| 5920 }; | |
| 5921 Register object = ToRegister(instr->object()); | 5883 Register object = ToRegister(instr->object()); |
| 5922 Register index = ToRegister(instr->index()); | 5884 Register index = ToRegister(instr->index()); |
| 5923 Register result = ToRegister(instr->result()); | 5885 Register result = ToRegister(instr->result()); |
| 5924 | 5886 |
| 5925 __ AssertSmi(index); | 5887 __ AssertSmi(index); |
| 5926 | 5888 |
| 5927 DeferredLoadMutableDouble* deferred; | |
| 5928 deferred = new(zone()) DeferredLoadMutableDouble( | |
| 5929 this, instr, result, object, index); | |
| 5930 | |
| 5931 Label out_of_object, done; | 5889 Label out_of_object, done; |
| 5932 | |
| 5933 __ TestAndBranchIfAnySet( | |
| 5934 index, reinterpret_cast<uint64_t>(Smi::FromInt(1)), deferred->entry()); | |
| 5935 __ Mov(index, Operand(index, ASR, 1)); | |
| 5936 | |
| 5937 __ Cmp(index, Smi::FromInt(0)); | 5890 __ Cmp(index, Smi::FromInt(0)); |
| 5938 __ B(lt, &out_of_object); | 5891 __ B(lt, &out_of_object); |
| 5939 | 5892 |
| 5940 STATIC_ASSERT(kPointerSizeLog2 > kSmiTagSize); | 5893 STATIC_ASSERT(kPointerSizeLog2 > kSmiTagSize); |
| 5941 __ Add(result, object, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 5894 __ Add(result, object, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |
| 5942 __ Ldr(result, FieldMemOperand(result, JSObject::kHeaderSize)); | 5895 __ Ldr(result, FieldMemOperand(result, JSObject::kHeaderSize)); |
| 5943 | 5896 |
| 5944 __ B(&done); | 5897 __ B(&done); |
| 5945 | 5898 |
| 5946 __ Bind(&out_of_object); | 5899 __ Bind(&out_of_object); |
| 5947 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); | 5900 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); |
| 5948 // Index is equal to negated out of object property index plus 1. | 5901 // Index is equal to negated out of object property index plus 1. |
| 5949 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); | 5902 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); |
| 5950 __ Ldr(result, FieldMemOperand(result, | 5903 __ Ldr(result, FieldMemOperand(result, |
| 5951 FixedArray::kHeaderSize - kPointerSize)); | 5904 FixedArray::kHeaderSize - kPointerSize)); |
| 5952 __ Bind(deferred->exit()); | |
| 5953 __ Bind(&done); | 5905 __ Bind(&done); |
| 5954 } | 5906 } |
| 5955 | 5907 |
| 5956 } } // namespace v8::internal | 5908 } } // namespace v8::internal |
| OLD | NEW |