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

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

Issue 15899010: Implement a few more features on ARM. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 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
OLDNEW
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 1213 matching lines...) Expand 10 before | Expand all | Expand 10 after
1224 1224
1225 1225
1226 bool Intrinsifier::Double_div(Assembler* assembler) { 1226 bool Intrinsifier::Double_div(Assembler* assembler) {
1227 return DoubleArithmeticOperations(assembler, Token::kDIV); 1227 return DoubleArithmeticOperations(assembler, Token::kDIV);
1228 } 1228 }
1229 1229
1230 1230
1231 // Left is double right is integer (Bigint, Mint or Smi) 1231 // Left is double right is integer (Bigint, Mint or Smi)
1232 bool Intrinsifier::Double_mulFromInteger(Assembler* assembler) { 1232 bool Intrinsifier::Double_mulFromInteger(Assembler* assembler) {
1233 Label fall_through; 1233 Label fall_through;
1234 __ Untested("Intrinsifier::Double_mulFromInteger");
1235 // Only Smi-s allowed. 1234 // Only Smi-s allowed.
1236 __ ldr(R0, Address(SP, 0 * kWordSize)); 1235 __ ldr(R0, Address(SP, 0 * kWordSize));
1237 __ tst(R0, ShifterOperand(kSmiTagMask)); 1236 __ tst(R0, ShifterOperand(kSmiTagMask));
1238 __ b(&fall_through, NE); 1237 __ b(&fall_through, NE);
1239 // Is Smi. 1238 // Is Smi.
1240 __ SmiUntag(R0); 1239 __ SmiUntag(R0);
1241 __ vmovsr(S0, R0); 1240 __ vmovsr(S0, R0);
1242 __ vcvtdi(D1, S0); 1241 __ vcvtdi(D1, S0);
1243 __ ldr(R0, Address(SP, 1 * kWordSize)); 1242 __ ldr(R0, Address(SP, 1 * kWordSize));
1244 __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag); 1243 __ LoadDFromOffset(D0, R0, Double::value_offset() - kHeapObjectTag);
1245 __ vldrd(D0, Address(R0));
1246 __ vmuld(D0, D0, D1); 1244 __ vmuld(D0, D0, D1);
1247 const Class& double_class = Class::Handle( 1245 const Class& double_class = Class::Handle(
1248 Isolate::Current()->object_store()->double_class()); 1246 Isolate::Current()->object_store()->double_class());
1249 __ TryAllocate(double_class, &fall_through, R0); // Result register. 1247 __ TryAllocate(double_class, &fall_through, R0); // Result register.
1250 __ AddImmediate(R1, R0, Double::value_offset() - kHeapObjectTag); 1248 __ StoreDToOffset(D0, R1, Double::value_offset() - kHeapObjectTag);
1251 __ vstrd(D0, Address(R1));
1252 __ Ret(); 1249 __ Ret();
1253 __ Bind(&fall_through); 1250 __ Bind(&fall_through);
1254 return false; 1251 return false;
1255 } 1252 }
1256 1253
1257 1254
1258 bool Intrinsifier::Double_fromInteger(Assembler* assembler) { 1255 bool Intrinsifier::Double_fromInteger(Assembler* assembler) {
1259 Label fall_through; 1256 Label fall_through;
1260 1257
1261 __ ldr(R0, Address(SP, 0 * kWordSize)); 1258 __ ldr(R0, Address(SP, 0 * kWordSize));
1262 __ tst(R0, ShifterOperand(kSmiTagMask)); 1259 __ tst(R0, ShifterOperand(kSmiTagMask));
1263 __ b(&fall_through, NE); 1260 __ b(&fall_through, NE);
1264 // Is Smi. 1261 // Is Smi.
1265 __ SmiUntag(R0); 1262 __ SmiUntag(R0);
1266 __ vmovsr(S0, R0); 1263 __ vmovsr(S0, R0);
1267 __ vcvtdi(D0, S0); 1264 __ vcvtdi(D0, S0);
1268 const Class& double_class = Class::Handle( 1265 const Class& double_class = Class::Handle(
1269 Isolate::Current()->object_store()->double_class()); 1266 Isolate::Current()->object_store()->double_class());
1270 __ TryAllocate(double_class, &fall_through, R0); // Result register. 1267 __ TryAllocate(double_class, &fall_through, R0); // Result register.
1271 __ AddImmediate(R1, R0, Double::value_offset() - kHeapObjectTag); 1268 __ AddImmediate(R1, R0, Double::value_offset() - kHeapObjectTag);
1272 __ vstrd(D0, Address(R1)); 1269 __ vstrd(D0, Address(R1));
1273 __ Ret(); 1270 __ Ret();
1274 __ Bind(&fall_through); 1271 __ Bind(&fall_through);
1275 return false; 1272 return false;
1276 } 1273 }
1277 1274
1278 1275
1279 bool Intrinsifier::Double_getIsNaN(Assembler* assembler) { 1276 bool Intrinsifier::Double_getIsNaN(Assembler* assembler) {
1280 Label is_true; 1277 Label is_true;
1281 __ Untested("Intrinsifier::Double_getIsNaN");
1282 __ ldr(R0, Address(SP, 0 * kWordSize)); 1278 __ ldr(R0, Address(SP, 0 * kWordSize));
1283 __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag); 1279 __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
1284 __ vldrd(D0, Address(R0)); 1280 __ vldrd(D0, Address(R0));
1285 __ vcmpd(D0, D0); 1281 __ vcmpd(D0, D0);
1286 __ vmstat(); 1282 __ vmstat();
1287 __ LoadObject(R0, Bool::False(), VS); 1283 __ LoadObject(R0, Bool::False(), VC);
1288 __ LoadObject(R0, Bool::True(), VC); 1284 __ LoadObject(R0, Bool::True(), VS);
1289 __ Ret(); 1285 __ Ret();
1290 return true; 1286 return true;
1291 } 1287 }
1292 1288
1293 1289
1294 bool Intrinsifier::Double_getIsNegative(Assembler* assembler) { 1290 bool Intrinsifier::Double_getIsNegative(Assembler* assembler) {
1295 Label is_false, is_true, is_zero; 1291 Label is_false, is_true, is_zero;
1296 __ Untested("Intrinsifier::Double_getIsNegative"); 1292 __ Untested("Intrinsifier::Double_getIsNegative");
1297 __ ldr(R0, Address(SP, 0 * kWordSize)); 1293 __ ldr(R0, Address(SP, 0 * kWordSize));
1298 __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag); 1294 __ AddImmediate(R0, Double::value_offset() - kHeapObjectTag);
(...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after
1701 __ Bind(&ok); 1697 __ Bind(&ok);
1702 __ Ret(); 1698 __ Ret();
1703 1699
1704 __ Bind(&fall_through); 1700 __ Bind(&fall_through);
1705 return false; 1701 return false;
1706 } 1702 }
1707 1703
1708 } // namespace dart 1704 } // namespace dart
1709 1705
1710 #endif // defined TARGET_ARCH_ARM 1706 #endif // defined TARGET_ARCH_ARM
OLDNEW
« runtime/vm/intermediate_language_arm.cc ('K') | « runtime/vm/intermediate_language_arm.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698