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 |