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

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

Issue 19400003: Adds the vtbl ARM SIMD instruction. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 7 years, 5 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" 5 #include "vm/globals.h"
6 #if defined(TARGET_ARCH_ARM) 6 #if defined(TARGET_ARCH_ARM)
7 7
8 #include "vm/assembler.h" 8 #include "vm/assembler.h"
9 #include "vm/simulator.h" 9 #include "vm/simulator.h"
10 #include "vm/runtime_entry.h" 10 #include "vm/runtime_entry.h"
(...skipping 1201 matching lines...) Expand 10 before | Expand all | Expand 10 after
1212 void Assembler::vmstat(Condition cond) { // VMRS APSR_nzcv, FPSCR 1212 void Assembler::vmstat(Condition cond) { // VMRS APSR_nzcv, FPSCR
1213 ASSERT(cond != kNoCondition); 1213 ASSERT(cond != kNoCondition);
1214 int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) | 1214 int32_t encoding = (static_cast<int32_t>(cond) << kConditionShift) |
1215 B27 | B26 | B25 | B23 | B22 | B21 | B20 | B16 | 1215 B27 | B26 | B25 | B23 | B22 | B21 | B20 | B16 |
1216 (static_cast<int32_t>(PC)*B12) | 1216 (static_cast<int32_t>(PC)*B12) |
1217 B11 | B9 | B4; 1217 B11 | B9 | B4;
1218 Emit(encoding); 1218 Emit(encoding);
1219 } 1219 }
1220 1220
1221 1221
1222 static inline int ShiftOfOperandSize(OperandSize size) {
1223 switch (size) {
1224 case kByte:
1225 case kUnsignedByte:
1226 return 0;
1227 case kHalfword:
1228 case kUnsignedHalfword:
1229 return 1;
1230 case kWord:
1231 case kUnsignedWord:
1232 return 2;
1233 case kWordPair:
1234 return 3;
1235 case kSWord:
1236 case kDWord:
1237 return 0;
1238 default:
1239 UNREACHABLE();
1240 break;
1241 }
1242
1243 UNREACHABLE();
1244 return -1;
1245 }
1246
1247
1222 void Assembler::EmitSIMDqqq(int32_t opcode, OperandSize size, 1248 void Assembler::EmitSIMDqqq(int32_t opcode, OperandSize size,
1223 QRegister qd, QRegister qn, QRegister qm) { 1249 QRegister qd, QRegister qn, QRegister qm) {
1224 int sz = 0; 1250 int sz = ShiftOfOperandSize(size);
1225 switch (size) {
1226 case kByte:
1227 case kUnsignedByte:
1228 sz = 0;
1229 break;
1230 case kHalfword:
1231 case kUnsignedHalfword:
1232 sz = 1;
1233 break;
1234 case kWord:
1235 case kUnsignedWord:
1236 sz = 2;
1237 break;
1238 case kWordPair:
1239 sz = 3;
1240 break;
1241 case kSWord:
1242 case kDWord:
1243 sz = 0;
1244 break;
1245 default:
1246 UNREACHABLE();
1247 break;
1248 }
1249 int32_t encoding = 1251 int32_t encoding =
1250 (static_cast<int32_t>(kSpecialCondition) << kConditionShift) | 1252 (static_cast<int32_t>(kSpecialCondition) << kConditionShift) |
1251 B25 | B6 | 1253 B25 | B6 |
1252 opcode | ((sz & 0x3) * B20) | 1254 opcode | ((sz & 0x3) * B20) |
1253 ((static_cast<int32_t>(qd * 2) >> 4)*B22) | 1255 ((static_cast<int32_t>(qd * 2) >> 4)*B22) |
1254 ((static_cast<int32_t>(qn * 2) & 0xf)*B16) | 1256 ((static_cast<int32_t>(qn * 2) & 0xf)*B16) |
1255 ((static_cast<int32_t>(qd * 2) & 0xf)*B12) | 1257 ((static_cast<int32_t>(qd * 2) & 0xf)*B12) |
1256 ((static_cast<int32_t>(qn * 2) >> 4)*B7) | 1258 ((static_cast<int32_t>(qn * 2) >> 4)*B7) |
1257 ((static_cast<int32_t>(qm * 2) >> 4)*B5) | 1259 ((static_cast<int32_t>(qm * 2) >> 4)*B5) |
1258 (static_cast<int32_t>(qm * 2) & 0xf); 1260 (static_cast<int32_t>(qm * 2) & 0xf);
1259 Emit(encoding); 1261 Emit(encoding);
1260 } 1262 }
1261 1263
1262 1264
1265 void Assembler::EmitSIMDddd(int32_t opcode, OperandSize size,
1266 DRegister dd, DRegister dn, DRegister dm) {
1267 int sz = ShiftOfOperandSize(size);
1268 int32_t encoding =
1269 (static_cast<int32_t>(kSpecialCondition) << kConditionShift) |
1270 B25 |
1271 opcode | ((sz & 0x3) * B20) |
1272 ((static_cast<int32_t>(dd) >> 4)*B22) |
1273 ((static_cast<int32_t>(dn) & 0xf)*B16) |
1274 ((static_cast<int32_t>(dd) & 0xf)*B12) |
1275 ((static_cast<int32_t>(dn) >> 4)*B7) |
1276 ((static_cast<int32_t>(dm) >> 4)*B5) |
1277 (static_cast<int32_t>(dm) & 0xf);
1278 Emit(encoding);
1279 }
1280
1281
1263 void Assembler::vaddqi(OperandSize sz, 1282 void Assembler::vaddqi(OperandSize sz,
1264 QRegister qd, QRegister qn, QRegister qm) { 1283 QRegister qd, QRegister qn, QRegister qm) {
1265 EmitSIMDqqq(B11, sz, qd, qn, qm); 1284 EmitSIMDqqq(B11, sz, qd, qn, qm);
1266 } 1285 }
1267 1286
1268 1287
1269 void Assembler::vaddqs(QRegister qd, QRegister qn, QRegister qm) { 1288 void Assembler::vaddqs(QRegister qd, QRegister qn, QRegister qm) {
1270 EmitSIMDqqq(B11 | B10 | B8, kSWord, qd, qn, qm); 1289 EmitSIMDqqq(B11 | B10 | B8, kSWord, qd, qn, qm);
1271 } 1290 }
1272 1291
(...skipping 13 matching lines...) Expand all
1286 QRegister qd, QRegister qn, QRegister qm) { 1305 QRegister qd, QRegister qn, QRegister qm) {
1287 EmitSIMDqqq(B11 | B8 | B4, sz, qd, qn, qm); 1306 EmitSIMDqqq(B11 | B8 | B4, sz, qd, qn, qm);
1288 } 1307 }
1289 1308
1290 1309
1291 void Assembler::vmulqs(QRegister qd, QRegister qn, QRegister qm) { 1310 void Assembler::vmulqs(QRegister qd, QRegister qn, QRegister qm) {
1292 EmitSIMDqqq(B24 | B11 | B10 | B8 | B4, kSWord, qd, qn, qm); 1311 EmitSIMDqqq(B24 | B11 | B10 | B8 | B4, kSWord, qd, qn, qm);
1293 } 1312 }
1294 1313
1295 1314
1315 void Assembler::vtbl(DRegister dd, DRegister dn, int len, DRegister dm) {
1316 ASSERT((len >= 1) && (len <= 4));
1317 EmitSIMDddd(B24 | B23 | B11 | ((len - 1) * B8), kWordPair, dd, dn, dm);
1318 }
1319
1320
1296 void Assembler::svc(uint32_t imm24, Condition cond) { 1321 void Assembler::svc(uint32_t imm24, Condition cond) {
1297 ASSERT(cond != kNoCondition); 1322 ASSERT(cond != kNoCondition);
1298 ASSERT(imm24 < (1 << 24)); 1323 ASSERT(imm24 < (1 << 24));
1299 int32_t encoding = (cond << kConditionShift) | B27 | B26 | B25 | B24 | imm24; 1324 int32_t encoding = (cond << kConditionShift) | B27 | B26 | B25 | B24 | imm24;
1300 Emit(encoding); 1325 Emit(encoding);
1301 } 1326 }
1302 1327
1303 1328
1304 void Assembler::bkpt(uint16_t imm16) { 1329 void Assembler::bkpt(uint16_t imm16) {
1305 // bkpt requires that the cond field is AL. 1330 // bkpt requires that the cond field is AL.
(...skipping 1042 matching lines...) Expand 10 before | Expand all | Expand 10 after
2348 2373
2349 const char* Assembler::FpuRegisterName(FpuRegister reg) { 2374 const char* Assembler::FpuRegisterName(FpuRegister reg) {
2350 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters)); 2375 ASSERT((0 <= reg) && (reg < kNumberOfFpuRegisters));
2351 return fpu_reg_names[reg]; 2376 return fpu_reg_names[reg];
2352 } 2377 }
2353 2378
2354 } // namespace dart 2379 } // namespace dart
2355 2380
2356 #endif // defined TARGET_ARCH_ARM 2381 #endif // defined TARGET_ARCH_ARM
2357 2382
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698