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

Side by Side Diff: runtime/vm/intrinsifier_x64.cc

Issue 10450006: Implement some intrinsics on x64, fix a bug in ia32 intrinciscs (must return false if there is a fa… (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 8 years, 7 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 | « runtime/vm/intrinsifier_ia32.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, 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_X64. 5 #include "vm/globals.h" // Needed here to get TARGET_ARCH_X64.
6 #if defined(TARGET_ARCH_X64) 6 #if defined(TARGET_ARCH_X64)
7 7
8 #include "vm/intrinsifier.h" 8 #include "vm/intrinsifier.h"
9 9
10 #include "vm/assembler.h"
11 #include "vm/instructions.h"
12
10 namespace dart { 13 namespace dart {
14
15 DECLARE_FLAG(bool, enable_type_checks);
16
17 // When entering intrinsics code:
18 // RBX: IC Data
19 // R10: Arguments descriptor
20 // TOS: Return address
21
22 #define __ assembler->
23
11 bool Intrinsifier::ObjectArray_Allocate(Assembler* assembler) { 24 bool Intrinsifier::ObjectArray_Allocate(Assembler* assembler) {
12 return false; 25 return false;
13 } 26 }
14 27
15 28
16 bool Intrinsifier::Array_getLength(Assembler* assembler) { 29 bool Intrinsifier::Array_getLength(Assembler* assembler) {
17 return false; 30 __ movq(RAX, Address(RSP, + 1 * kWordSize));
31 __ movq(RAX, FieldAddress(RAX, Array::length_offset()));
32 __ ret();
33 return true;
18 } 34 }
19 35
20 36
21 bool Intrinsifier::ImmutableArray_getLength(Assembler* assembler) { 37 bool Intrinsifier::ImmutableArray_getLength(Assembler* assembler) {
22 return false; 38 return Array_getLength(assembler);
23 } 39 }
24 40
25 41
26 bool Intrinsifier::Array_getIndexed(Assembler* assembler) { 42 bool Intrinsifier::Array_getIndexed(Assembler* assembler) {
27 return false; 43 return false;
28 } 44 }
29 45
30 46
31 bool Intrinsifier::ImmutableArray_getIndexed(Assembler* assembler) { 47 bool Intrinsifier::ImmutableArray_getIndexed(Assembler* assembler) {
32 return false; 48 return Array_getIndexed(assembler);
33 } 49 }
34 50
35 51
36 bool Intrinsifier::Array_setIndexed(Assembler* assembler) { 52 bool Intrinsifier::Array_setIndexed(Assembler* assembler) {
37 return false; 53 return false;
38 } 54 }
39 55
40 56
41 bool Intrinsifier::GArray_Allocate(Assembler* assembler) { 57 bool Intrinsifier::GArray_Allocate(Assembler* assembler) {
42 return false; 58 return false;
43 } 59 }
44 60
45 61
62 // Get length of growable object array.
63 // On stack: growable array (+1), return-address (+0).
46 bool Intrinsifier::GrowableArray_getLength(Assembler* assembler) { 64 bool Intrinsifier::GrowableArray_getLength(Assembler* assembler) {
47 return false; 65 __ movq(RAX, Address(RSP, + 1 * kWordSize));
66 __ movq(RAX, FieldAddress(RAX, GrowableObjectArray::length_offset()));
67 __ ret();
68 return true;
48 } 69 }
49 70
50 71
51 bool Intrinsifier::GrowableArray_getCapacity(Assembler* assembler) { 72 bool Intrinsifier::GrowableArray_getCapacity(Assembler* assembler) {
52 return false; 73 __ movq(RAX, Address(RSP, + 1 * kWordSize));
74 __ movq(RAX, FieldAddress(RAX, GrowableObjectArray::data_offset()));
75 __ movq(RAX, FieldAddress(RAX, Array::length_offset()));
76 __ ret();
77 return true;
53 } 78 }
54 79
55 80
56 bool Intrinsifier::GrowableArray_getIndexed(Assembler* assembler) { 81 bool Intrinsifier::GrowableArray_getIndexed(Assembler* assembler) {
57 return false; 82 return false;
58 } 83 }
59 84
60 85
61 bool Intrinsifier::GrowableArray_setIndexed(Assembler* assembler) { 86 bool Intrinsifier::GrowableArray_setIndexed(Assembler* assembler) {
62 return false; 87 return false;
63 } 88 }
64 89
65 90
66 bool Intrinsifier::GrowableArray_setLength(Assembler* assembler) { 91 bool Intrinsifier::GrowableArray_setLength(Assembler* assembler) {
67 return false; 92 return false;
68 } 93 }
69 94
70 95
96 // Set data of growable object array.
97 // On stack: growable array (+2), data (+1), return-address (+0).
71 bool Intrinsifier::GrowableArray_setData(Assembler* assembler) { 98 bool Intrinsifier::GrowableArray_setData(Assembler* assembler) {
72 return false; 99 if (FLAG_enable_type_checks) {
100 return false;
101 }
102 __ movq(RAX, Address(RSP, + 2 * kWordSize));
103 __ movq(RBX, Address(RSP, + 1 * kWordSize));
104 __ movq(FieldAddress(RAX, GrowableObjectArray::data_offset()), RBX);
105 __ ret();
106 return true;
73 } 107 }
74 108
75 109
76 bool Intrinsifier::Integer_addFromInteger(Assembler* assembler) { 110 bool Intrinsifier::Integer_addFromInteger(Assembler* assembler) {
77 return false; 111 return false;
78 } 112 }
79 113
80 114
81 bool Intrinsifier::Integer_add(Assembler* assembler) { 115 bool Intrinsifier::Integer_add(Assembler* assembler) {
82 return false; 116 return false;
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after
218 return false; 252 return false;
219 } 253 }
220 254
221 255
222 bool Intrinsifier::Double_lessEqualThan(Assembler* assembler) { 256 bool Intrinsifier::Double_lessEqualThan(Assembler* assembler) {
223 return false; 257 return false;
224 } 258 }
225 259
226 260
227 bool Intrinsifier::Double_toDouble(Assembler* assembler) { 261 bool Intrinsifier::Double_toDouble(Assembler* assembler) {
228 return false; 262 __ movq(RAX, Address(RSP, + 1 * kWordSize));
263 __ ret();
264 // Generate enough code to satisfy patchability constraint.
265 intptr_t offset = __ CodeSize();
266 __ nop(JumpPattern::InstructionLength() - offset);
267 return true;
229 } 268 }
230 269
231 bool Intrinsifier::Double_add(Assembler* assembler) { 270 bool Intrinsifier::Double_add(Assembler* assembler) {
232 return false; 271 return false;
233 } 272 }
234 273
235 274
236 bool Intrinsifier::Double_mul(Assembler* assembler) { 275 bool Intrinsifier::Double_mul(Assembler* assembler) {
237 return false; 276 return false;
238 } 277 }
(...skipping 13 matching lines...) Expand all
252 return false; 291 return false;
253 } 292 }
254 293
255 294
256 bool Intrinsifier::Double_fromInteger(Assembler* assembler) { 295 bool Intrinsifier::Double_fromInteger(Assembler* assembler) {
257 return false; 296 return false;
258 } 297 }
259 298
260 299
261 bool Intrinsifier::Double_isNaN(Assembler* assembler) { 300 bool Intrinsifier::Double_isNaN(Assembler* assembler) {
262 return false; 301 const Bool& bool_true = Bool::ZoneHandle(Bool::True());
302 const Bool& bool_false = Bool::ZoneHandle(Bool::False());
303 Label is_true;
304 __ movq(RAX, Address(RSP, +1 * kWordSize));
305 __ movsd(XMM0, FieldAddress(RAX, Double::value_offset()));
306 __ comisd(XMM0, XMM0);
307 __ j(PARITY_EVEN, &is_true, Assembler::kNearJump); // NaN -> true;
308 __ LoadObject(RAX, bool_false);
309 __ ret();
310 __ Bind(&is_true);
311 __ LoadObject(RAX, bool_true);
312 __ ret();
313 return true; // Method is complete, no slow case.
263 } 314 }
264 315
265 316
266 bool Intrinsifier::Double_isNegative(Assembler* assembler) { 317 bool Intrinsifier::Double_isNegative(Assembler* assembler) {
267 return false; 318 return false;
268 } 319 }
269 320
270 321
271 bool Intrinsifier::Math_sqrt(Assembler* assembler) { 322 bool Intrinsifier::Math_sqrt(Assembler* assembler) {
272 return false; 323 return false;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
310 361
311 bool Intrinsifier::String_hashCode(Assembler* assembler) { 362 bool Intrinsifier::String_hashCode(Assembler* assembler) {
312 return false; 363 return false;
313 } 364 }
314 365
315 366
316 bool Intrinsifier::String_isEmpty(Assembler* assembler) { 367 bool Intrinsifier::String_isEmpty(Assembler* assembler) {
317 return false; 368 return false;
318 } 369 }
319 370
371 #undef __
372
320 } // namespace dart 373 } // namespace dart
321 374
322 #endif // defined TARGET_ARCH_X64 375 #endif // defined TARGET_ARCH_X64
OLDNEW
« no previous file with comments | « runtime/vm/intrinsifier_ia32.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698