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

Side by Side Diff: src/arm64/lithium-codegen-arm64.cc

Issue 300893003: Refactor HType to get rid of various hacks. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fix compilation. Created 6 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 | Annotate | Revision Log
« no previous file with comments | « src/arm64/lithium-arm64.cc ('k') | src/code-stubs-hydrogen.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 "v8.h" 5 #include "v8.h"
6 6
7 #include "arm64/lithium-codegen-arm64.h" 7 #include "arm64/lithium-codegen-arm64.h"
8 #include "arm64/lithium-gap-resolver-arm64.h" 8 #include "arm64/lithium-gap-resolver-arm64.h"
9 #include "code-stubs.h" 9 #include "code-stubs.h"
10 #include "stub-cache.h" 10 #include "stub-cache.h"
(...skipping 2168 matching lines...) Expand 10 before | Expand all | Expand 10 after
2179 __ B(ne, deferred->entry()); 2179 __ B(ne, deferred->entry());
2180 } else { 2180 } else {
2181 DeoptimizeIf(ne, instr->environment()); 2181 DeoptimizeIf(ne, instr->environment());
2182 } 2182 }
2183 2183
2184 __ Bind(&success); 2184 __ Bind(&success);
2185 } 2185 }
2186 2186
2187 2187
2188 void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) { 2188 void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) {
2189 if (!instr->hydrogen()->value()->IsHeapObject()) { 2189 if (!instr->hydrogen()->value()->type().IsHeapObject()) {
2190 DeoptimizeIfSmi(ToRegister(instr->value()), instr->environment()); 2190 DeoptimizeIfSmi(ToRegister(instr->value()), instr->environment());
2191 } 2191 }
2192 } 2192 }
2193 2193
2194 2194
2195 void LCodeGen::DoCheckSmi(LCheckSmi* instr) { 2195 void LCodeGen::DoCheckSmi(LCheckSmi* instr) {
2196 Register value = ToRegister(instr->value()); 2196 Register value = ToRegister(instr->value());
2197 ASSERT(!instr->result() || ToRegister(instr->result()).Is(value)); 2197 ASSERT(!instr->result() || ToRegister(instr->result()).Is(value));
2198 DeoptimizeIfNotSmi(value, instr->environment()); 2198 DeoptimizeIfNotSmi(value, instr->environment());
2199 } 2199 }
(...skipping 782 matching lines...) Expand 10 before | Expand all | Expand 10 after
2982 if (from == FIRST_TYPE) return ls; 2982 if (from == FIRST_TYPE) return ls;
2983 UNREACHABLE(); 2983 UNREACHABLE();
2984 return eq; 2984 return eq;
2985 } 2985 }
2986 2986
2987 2987
2988 void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) { 2988 void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) {
2989 Register input = ToRegister(instr->value()); 2989 Register input = ToRegister(instr->value());
2990 Register scratch = ToRegister(instr->temp()); 2990 Register scratch = ToRegister(instr->temp());
2991 2991
2992 if (!instr->hydrogen()->value()->IsHeapObject()) { 2992 if (!instr->hydrogen()->value()->type().IsHeapObject()) {
2993 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); 2993 __ JumpIfSmi(input, instr->FalseLabel(chunk_));
2994 } 2994 }
2995 __ CompareObjectType(input, scratch, scratch, TestType(instr->hydrogen())); 2995 __ CompareObjectType(input, scratch, scratch, TestType(instr->hydrogen()));
2996 EmitBranch(instr, BranchCondition(instr->hydrogen())); 2996 EmitBranch(instr, BranchCondition(instr->hydrogen()));
2997 } 2997 }
2998 2998
2999 2999
3000 void LCodeGen::DoInnerAllocatedObject(LInnerAllocatedObject* instr) { 3000 void LCodeGen::DoInnerAllocatedObject(LInnerAllocatedObject* instr) {
3001 Register result = ToRegister(instr->result()); 3001 Register result = ToRegister(instr->result());
3002 Register base = ToRegister(instr->base_object()); 3002 Register base = ToRegister(instr->base_object());
(...skipping 233 matching lines...) Expand 10 before | Expand all | Expand 10 after
3236 3236
3237 return lt; 3237 return lt;
3238 } 3238 }
3239 3239
3240 3240
3241 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) { 3241 void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) {
3242 Register val = ToRegister(instr->value()); 3242 Register val = ToRegister(instr->value());
3243 Register scratch = ToRegister(instr->temp()); 3243 Register scratch = ToRegister(instr->temp());
3244 3244
3245 SmiCheck check_needed = 3245 SmiCheck check_needed =
3246 instr->hydrogen()->value()->IsHeapObject() 3246 instr->hydrogen()->value()->type().IsHeapObject()
3247 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 3247 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
3248 Condition true_cond = 3248 Condition true_cond =
3249 EmitIsString(val, scratch, instr->FalseLabel(chunk_), check_needed); 3249 EmitIsString(val, scratch, instr->FalseLabel(chunk_), check_needed);
3250 3250
3251 EmitBranch(instr, true_cond); 3251 EmitBranch(instr, true_cond);
3252 } 3252 }
3253 3253
3254 3254
3255 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) { 3255 void LCodeGen::DoIsSmiAndBranch(LIsSmiAndBranch* instr) {
3256 Register value = ToRegister(instr->value()); 3256 Register value = ToRegister(instr->value());
3257 STATIC_ASSERT(kSmiTag == 0); 3257 STATIC_ASSERT(kSmiTag == 0);
3258 EmitTestAndBranch(instr, eq, value, kSmiTagMask); 3258 EmitTestAndBranch(instr, eq, value, kSmiTagMask);
3259 } 3259 }
3260 3260
3261 3261
3262 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) { 3262 void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) {
3263 Register input = ToRegister(instr->value()); 3263 Register input = ToRegister(instr->value());
3264 Register temp = ToRegister(instr->temp()); 3264 Register temp = ToRegister(instr->temp());
3265 3265
3266 if (!instr->hydrogen()->value()->IsHeapObject()) { 3266 if (!instr->hydrogen()->value()->type().IsHeapObject()) {
3267 __ JumpIfSmi(input, instr->FalseLabel(chunk_)); 3267 __ JumpIfSmi(input, instr->FalseLabel(chunk_));
3268 } 3268 }
3269 __ Ldr(temp, FieldMemOperand(input, HeapObject::kMapOffset)); 3269 __ Ldr(temp, FieldMemOperand(input, HeapObject::kMapOffset));
3270 __ Ldrb(temp, FieldMemOperand(temp, Map::kBitFieldOffset)); 3270 __ Ldrb(temp, FieldMemOperand(temp, Map::kBitFieldOffset));
3271 3271
3272 EmitTestAndBranch(instr, ne, temp, 1 << Map::kIsUndetectable); 3272 EmitTestAndBranch(instr, ne, temp, 1 << Map::kIsUndetectable);
3273 } 3273 }
3274 3274
3275 3275
3276 static const char* LabelType(LLabel* label) { 3276 static const char* LabelType(LLabel* label) {
(...skipping 1806 matching lines...) Expand 10 before | Expand all | Expand 10 after
5083 DeoptimizeIfRoot(scratch, Heap::kTheHoleValueRootIndex, 5083 DeoptimizeIfRoot(scratch, Heap::kTheHoleValueRootIndex,
5084 instr->environment()); 5084 instr->environment());
5085 } else { 5085 } else {
5086 __ JumpIfNotRoot(scratch, Heap::kTheHoleValueRootIndex, &skip_assignment); 5086 __ JumpIfNotRoot(scratch, Heap::kTheHoleValueRootIndex, &skip_assignment);
5087 } 5087 }
5088 } 5088 }
5089 5089
5090 __ Str(value, target); 5090 __ Str(value, target);
5091 if (instr->hydrogen()->NeedsWriteBarrier()) { 5091 if (instr->hydrogen()->NeedsWriteBarrier()) {
5092 SmiCheck check_needed = 5092 SmiCheck check_needed =
5093 instr->hydrogen()->value()->IsHeapObject() 5093 instr->hydrogen()->value()->type().IsHeapObject()
5094 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 5094 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
5095 __ RecordWriteContextSlot(context, 5095 __ RecordWriteContextSlot(context,
5096 target.offset(), 5096 target.offset(),
5097 value, 5097 value,
5098 scratch, 5098 scratch,
5099 GetLinkRegisterState(), 5099 GetLinkRegisterState(),
5100 kSaveFPRegs, 5100 kSaveFPRegs,
5101 EMIT_REMEMBERED_SET, 5101 EMIT_REMEMBERED_SET,
5102 check_needed); 5102 check_needed);
5103 } 5103 }
(...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after
5277 representation, instr->base_offset()); 5277 representation, instr->base_offset());
5278 } 5278 }
5279 5279
5280 __ Store(value, mem_op, representation); 5280 __ Store(value, mem_op, representation);
5281 5281
5282 if (instr->hydrogen()->NeedsWriteBarrier()) { 5282 if (instr->hydrogen()->NeedsWriteBarrier()) {
5283 ASSERT(representation.IsTagged()); 5283 ASSERT(representation.IsTagged());
5284 // This assignment may cause element_addr to alias store_base. 5284 // This assignment may cause element_addr to alias store_base.
5285 Register element_addr = scratch; 5285 Register element_addr = scratch;
5286 SmiCheck check_needed = 5286 SmiCheck check_needed =
5287 instr->hydrogen()->value()->IsHeapObject() 5287 instr->hydrogen()->value()->type().IsHeapObject()
5288 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; 5288 ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
5289 // Compute address of modified element and store it into key register. 5289 // Compute address of modified element and store it into key register.
5290 __ Add(element_addr, mem_op.base(), mem_op.OffsetAsOperand()); 5290 __ Add(element_addr, mem_op.base(), mem_op.OffsetAsOperand());
5291 __ RecordWrite(elements, element_addr, value, GetLinkRegisterState(), 5291 __ RecordWrite(elements, element_addr, value, GetLinkRegisterState(),
5292 kSaveFPRegs, EMIT_REMEMBERED_SET, check_needed); 5292 kSaveFPRegs, EMIT_REMEMBERED_SET, check_needed);
5293 } 5293 }
5294 } 5294 }
5295 5295
5296 5296
5297 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) { 5297 void LCodeGen::DoStoreKeyedGeneric(LStoreKeyedGeneric* instr) {
(...skipping 714 matching lines...) Expand 10 before | Expand all | Expand 10 after
6012 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); 6012 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
6013 // Index is equal to negated out of object property index plus 1. 6013 // Index is equal to negated out of object property index plus 1.
6014 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); 6014 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2));
6015 __ Ldr(result, FieldMemOperand(result, 6015 __ Ldr(result, FieldMemOperand(result,
6016 FixedArray::kHeaderSize - kPointerSize)); 6016 FixedArray::kHeaderSize - kPointerSize));
6017 __ Bind(deferred->exit()); 6017 __ Bind(deferred->exit());
6018 __ Bind(&done); 6018 __ Bind(&done);
6019 } 6019 }
6020 6020
6021 } } // namespace v8::internal 6021 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm64/lithium-arm64.cc ('k') | src/code-stubs-hydrogen.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698