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/globals.h" // Needed here to get TARGET_ARCH_ARM. | 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_ARM. |
6 #if defined(TARGET_ARCH_ARM) | 6 #if defined(TARGET_ARCH_ARM) |
7 | 7 |
8 #include "vm/intrinsifier.h" | 8 #include "vm/intrinsifier.h" |
9 | 9 |
10 #include "vm/assembler.h" | 10 #include "vm/assembler.h" |
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
169 __ tst(R2, Operand(kSmiTagMask)); \ | 169 __ tst(R2, Operand(kSmiTagMask)); \ |
170 __ b(&fall_through, NE); \ | 170 __ b(&fall_through, NE); \ |
171 __ CompareImmediate(R2, 0); \ | 171 __ CompareImmediate(R2, 0); \ |
172 __ b(&fall_through, LT); \ | 172 __ b(&fall_through, LT); \ |
173 __ SmiUntag(R2); \ | 173 __ SmiUntag(R2); \ |
174 /* Check for maximum allowed length. */ \ | 174 /* Check for maximum allowed length. */ \ |
175 /* R2: untagged array length. */ \ | 175 /* R2: untagged array length. */ \ |
176 __ CompareImmediate(R2, max_len); \ | 176 __ CompareImmediate(R2, max_len); \ |
177 __ b(&fall_through, GT); \ | 177 __ b(&fall_through, GT); \ |
178 __ mov(R2, Operand(R2, LSL, scale_shift)); \ | 178 __ mov(R2, Operand(R2, LSL, scale_shift)); \ |
179 const intptr_t fixed_size_plus_alignment_padding = \ | 179 const intptr_t fixed_size = sizeof(Raw##type_name) + kObjectAlignment - 1; \ |
180 sizeof(Raw##type_name) + kObjectAlignment - 1; \ | 180 __ AddImmediate(R2, fixed_size); \ |
181 __ AddImmediate(R2, fixed_size_plus_alignment_padding); \ | |
182 __ bic(R2, R2, Operand(kObjectAlignment - 1)); \ | 181 __ bic(R2, R2, Operand(kObjectAlignment - 1)); \ |
183 Heap::Space space = Heap::kNew; \ | 182 Heap::Space space = Heap::kNew; \ |
184 __ ldr(R3, Address(THR, Thread::heap_offset())); \ | 183 __ ldr(R3, Address(THR, Thread::heap_offset())); \ |
185 __ ldr(R0, Address(R3, Heap::TopOffset(space))); \ | 184 __ ldr(R0, Address(R3, Heap::TopOffset(space))); \ |
186 \ | 185 \ |
187 /* R2: allocation size. */ \ | 186 /* R2: allocation size. */ \ |
188 __ adds(R1, R0, Operand(R2)); \ | 187 __ adds(R1, R0, Operand(R2)); \ |
189 __ b(&fall_through, CS); /* Fail on unsigned overflow. */ \ | 188 __ b(&fall_through, CS); /* Fail on unsigned overflow. */ \ |
190 \ | 189 \ |
191 /* Check if the allocation fits into the remaining space. */ \ | 190 /* Check if the allocation fits into the remaining space. */ \ |
(...skipping 1799 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1991 // Returns new string as tagged pointer in R0. | 1990 // Returns new string as tagged pointer in R0. |
1992 static void TryAllocateOnebyteString(Assembler* assembler, | 1991 static void TryAllocateOnebyteString(Assembler* assembler, |
1993 Label* ok, | 1992 Label* ok, |
1994 Label* failure) { | 1993 Label* failure) { |
1995 const Register length_reg = R2; | 1994 const Register length_reg = R2; |
1996 Label fail; | 1995 Label fail; |
1997 NOT_IN_PRODUCT(__ MaybeTraceAllocation(kOneByteStringCid, R0, failure)); | 1996 NOT_IN_PRODUCT(__ MaybeTraceAllocation(kOneByteStringCid, R0, failure)); |
1998 __ mov(R8, Operand(length_reg)); // Save the length register. | 1997 __ mov(R8, Operand(length_reg)); // Save the length register. |
1999 // TODO(koda): Protect against negative length and overflow here. | 1998 // TODO(koda): Protect against negative length and overflow here. |
2000 __ SmiUntag(length_reg); | 1999 __ SmiUntag(length_reg); |
2001 const intptr_t fixed_size_plus_alignment_padding = | 2000 const intptr_t fixed_size = sizeof(RawString) + kObjectAlignment - 1; |
2002 sizeof(RawString) + kObjectAlignment - 1; | 2001 __ AddImmediate(length_reg, fixed_size); |
2003 __ AddImmediate(length_reg, fixed_size_plus_alignment_padding); | |
2004 __ bic(length_reg, length_reg, Operand(kObjectAlignment - 1)); | 2002 __ bic(length_reg, length_reg, Operand(kObjectAlignment - 1)); |
2005 | 2003 |
2006 const intptr_t cid = kOneByteStringCid; | 2004 const intptr_t cid = kOneByteStringCid; |
2007 Heap::Space space = Heap::kNew; | 2005 Heap::Space space = Heap::kNew; |
2008 __ ldr(R3, Address(THR, Thread::heap_offset())); | 2006 __ ldr(R3, Address(THR, Thread::heap_offset())); |
2009 __ ldr(R0, Address(R3, Heap::TopOffset(space))); | 2007 __ ldr(R0, Address(R3, Heap::TopOffset(space))); |
2010 | 2008 |
2011 // length_reg: allocation size. | 2009 // length_reg: allocation size. |
2012 __ adds(R1, R0, Operand(length_reg)); | 2010 __ adds(R1, R0, Operand(length_reg)); |
2013 __ b(&fail, CS); // Fail on unsigned overflow. | 2011 __ b(&fail, CS); // Fail on unsigned overflow. |
(...skipping 298 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2312 | 2310 |
2313 void Intrinsifier::SetAsyncThreadStackTrace(Assembler* assembler) { | 2311 void Intrinsifier::SetAsyncThreadStackTrace(Assembler* assembler) { |
2314 __ ldr(R0, Address(THR, Thread::async_stack_trace_offset())); | 2312 __ ldr(R0, Address(THR, Thread::async_stack_trace_offset())); |
2315 __ LoadObject(R0, Object::null_object()); | 2313 __ LoadObject(R0, Object::null_object()); |
2316 __ Ret(); | 2314 __ Ret(); |
2317 } | 2315 } |
2318 | 2316 |
2319 } // namespace dart | 2317 } // namespace dart |
2320 | 2318 |
2321 #endif // defined TARGET_ARCH_ARM | 2319 #endif // defined TARGET_ARCH_ARM |
OLD | NEW |