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

Side by Side Diff: test/cctest/test-assembler-arm.cc

Issue 2579913002: [ARM] Add NEON instructions for implementing SIMD. (Closed)
Patch Set: Review comments. Created 4 years 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
« no previous file with comments | « src/arm/simulator-arm.cc ('k') | test/cctest/test-disasm-arm.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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1203 matching lines...) Expand 10 before | Expand all | Expand 10 after
1214 (bit_cast<int64_t>(t.sub_result) >> 32) & 0x7fffffff); 1214 (bit_cast<int64_t>(t.sub_result) >> 32) & 0x7fffffff);
1215 CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.sub_result) & 0xffffffffu); 1215 CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.sub_result) & 0xffffffffu);
1216 CHECK_EQ(kArmNanUpper32, 1216 CHECK_EQ(kArmNanUpper32,
1217 (bit_cast<int64_t>(t.mul_result) >> 32) & 0x7fffffff); 1217 (bit_cast<int64_t>(t.mul_result) >> 32) & 0x7fffffff);
1218 CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.mul_result) & 0xffffffffu); 1218 CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.mul_result) & 0xffffffffu);
1219 CHECK_EQ(kArmNanUpper32, 1219 CHECK_EQ(kArmNanUpper32,
1220 (bit_cast<int64_t>(t.div_result) >> 32) & 0x7fffffff); 1220 (bit_cast<int64_t>(t.div_result) >> 32) & 0x7fffffff);
1221 CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.div_result) & 0xffffffffu); 1221 CHECK_EQ(kArmNanLower32, bit_cast<int64_t>(t.div_result) & 0xffffffffu);
1222 } 1222 }
1223 1223
1224 #define CHECK_EQ_SPLAT(field, ex) \
1225 CHECK_EQ(ex, t.field[0]); \
1226 CHECK_EQ(ex, t.field[1]); \
1227 CHECK_EQ(ex, t.field[2]); \
1228 CHECK_EQ(ex, t.field[3]);
1229
1230 #define CHECK_EQ_32X4(field, ex0, ex1, ex2, ex3) \
1231 CHECK_EQ(ex0, t.field[0]); \
1232 CHECK_EQ(ex1, t.field[1]); \
1233 CHECK_EQ(ex2, t.field[2]); \
1234 CHECK_EQ(ex3, t.field[3]);
1235
1224 #define INT32_TO_FLOAT(val) \ 1236 #define INT32_TO_FLOAT(val) \
1225 std::round(static_cast<float>(bit_cast<int32_t>(val))) 1237 std::round(static_cast<float>(bit_cast<int32_t>(val)))
1226 #define UINT32_TO_FLOAT(val) \ 1238 #define UINT32_TO_FLOAT(val) \
1227 std::round(static_cast<float>(bit_cast<uint32_t>(val))) 1239 std::round(static_cast<float>(bit_cast<uint32_t>(val)))
1228 1240
1229 TEST(15) { 1241 TEST(15) {
1230 // Test the Neon instructions. 1242 // Test the Neon instructions.
1231 CcTest::InitializeVM(); 1243 CcTest::InitializeVM();
1232 Isolate* isolate = CcTest::i_isolate(); 1244 Isolate* isolate = CcTest::i_isolate();
1233 HandleScope scope(isolate); 1245 HandleScope scope(isolate);
(...skipping 18 matching lines...) Expand all
1252 uint32_t srcA0; 1264 uint32_t srcA0;
1253 uint32_t srcA1; 1265 uint32_t srcA1;
1254 uint32_t dstA0; 1266 uint32_t dstA0;
1255 uint32_t dstA1; 1267 uint32_t dstA1;
1256 uint32_t dstA2; 1268 uint32_t dstA2;
1257 uint32_t dstA3; 1269 uint32_t dstA3;
1258 uint32_t dstA4; 1270 uint32_t dstA4;
1259 uint32_t dstA5; 1271 uint32_t dstA5;
1260 uint32_t dstA6; 1272 uint32_t dstA6;
1261 uint32_t dstA7; 1273 uint32_t dstA7;
1274 uint32_t lane_test[4];
1262 uint64_t vmov_to_scalar1, vmov_to_scalar2; 1275 uint64_t vmov_to_scalar1, vmov_to_scalar2;
1263 uint32_t vmov_from_scalar_s8, vmov_from_scalar_u8; 1276 uint32_t vmov_from_scalar_s8, vmov_from_scalar_u8;
1264 uint32_t vmov_from_scalar_s16, vmov_from_scalar_u16; 1277 uint32_t vmov_from_scalar_s16, vmov_from_scalar_u16;
1265 uint32_t vmov_from_scalar_32; 1278 uint32_t vmov_from_scalar_32;
1266 uint32_t vmov_src[4], vmov_dst[4], vmvn[4]; 1279 uint32_t vmov[4], vmvn[4];
1267 int32_t vcvt_s32_f32[4]; 1280 int32_t vcvt_s32_f32[4];
1268 uint32_t vcvt_u32_f32[4]; 1281 uint32_t vcvt_u32_f32[4];
1269 float vcvt_f32_s32[4], vcvt_f32_u32[4]; 1282 float vcvt_f32_s32[4], vcvt_f32_u32[4];
1270 uint32_t vdup1[4], vdup2[4], vdup3[4], vdup4[4]; 1283 uint32_t vdup8[4], vdup16[4], vdup32[4];
1284 float vabsf[4], vnegf[4];
1285 uint32_t vabs_s8[4], vabs_s16[4], vabs_s32[4];
1286 uint32_t vneg_s8[4], vneg_s16[4], vneg_s32[4];
1271 uint32_t veor[4]; 1287 uint32_t veor[4];
1288 float vdupf[4], vaddf[4], vsubf[4], vmulf[4];
1272 uint32_t vadd8[4], vadd16[4], vadd32[4]; 1289 uint32_t vadd8[4], vadd16[4], vadd32[4];
1273 uint32_t vsub8[4], vsub16[4], vsub32[4]; 1290 uint32_t vsub8[4], vsub16[4], vsub32[4];
1274 uint32_t vtst[4], vceq[4], vbsl[4], vtbl[2], vtbx[2]; 1291 uint32_t vmul8[4], vmul16[4], vmul32[4];
1275 float vaddf[4], vsubf[4]; 1292 uint32_t vtst[4], vceq[4], vbsl[4];
1293 uint32_t vext[4];
1294 uint32_t vzip8a[4], vzip8b[4], vzip16a[4], vzip16b[4], vzip32a[4],
1295 vzip32b[4];
1296 uint32_t vrev64_32[4], vrev64_16[4], vrev64_8[4];
1297 uint32_t vrev32_16[4], vrev32_8[4];
1298 uint32_t vrev16_8[4];
1299 uint32_t vtbl[2], vtbx[2];
1276 } T; 1300 } T;
1277 T t; 1301 T t;
1278 1302
1279 // Create a function that accepts &t, and loads, manipulates, and stores 1303 // Create a function that accepts &t, and loads, manipulates, and stores
1280 // the doubles and floats. 1304 // the doubles, floats, and SIMD values.
1281 Assembler assm(isolate, NULL, 0); 1305 Assembler assm(isolate, NULL, 0);
1282 1306
1283
1284 if (CpuFeatures::IsSupported(NEON)) { 1307 if (CpuFeatures::IsSupported(NEON)) {
1285 CpuFeatureScope scope(&assm, NEON); 1308 CpuFeatureScope scope(&assm, NEON);
1286 1309
1287 __ stm(db_w, sp, r4.bit() | r5.bit() | lr.bit()); 1310 __ stm(db_w, sp, r4.bit() | r5.bit() | lr.bit());
1288 // Move 32 bytes with neon. 1311 // Move 32 bytes with neon.
1289 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, src0)))); 1312 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, src0))));
1290 __ vld1(Neon8, NeonListOperand(d0, 4), NeonMemOperand(r4)); 1313 __ vld1(Neon8, NeonListOperand(d0, 4), NeonMemOperand(r4));
1291 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, dst0)))); 1314 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, dst0))));
1292 __ vst1(Neon8, NeonListOperand(d0, 4), NeonMemOperand(r4)); 1315 __ vst1(Neon8, NeonListOperand(d0, 4), NeonMemOperand(r4));
1293 1316
1294 // Expand 8 bytes into 8 words(16 bits). 1317 // Expand 8 bytes into 8 words(16 bits).
1295 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, srcA0)))); 1318 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, srcA0))));
1296 __ vld1(Neon8, NeonListOperand(d0), NeonMemOperand(r4)); 1319 __ vld1(Neon8, NeonListOperand(d0), NeonMemOperand(r4));
1297 __ vmovl(NeonU8, q0, d0); 1320 __ vmovl(NeonU8, q0, d0);
1298 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, dstA0)))); 1321 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, dstA0))));
1299 __ vst1(Neon8, NeonListOperand(d0, 2), NeonMemOperand(r4)); 1322 __ vst1(Neon8, NeonListOperand(d0, 2), NeonMemOperand(r4));
1300 1323
1301 // The same expansion, but with different source and destination registers. 1324 // The same expansion, but with different source and destination registers.
1302 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, srcA0)))); 1325 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, srcA0))));
1303 __ vld1(Neon8, NeonListOperand(d1), NeonMemOperand(r4)); 1326 __ vld1(Neon8, NeonListOperand(d1), NeonMemOperand(r4));
1304 __ vmovl(NeonU8, q1, d1); 1327 __ vmovl(NeonU8, q1, d1);
1305 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, dstA4)))); 1328 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, dstA4))));
1306 __ vst1(Neon8, NeonListOperand(d2, 2), NeonMemOperand(r4)); 1329 __ vst1(Neon8, NeonListOperand(d2, 2), NeonMemOperand(r4));
1307 1330
1308 // ARM core register to scalar. 1331 // ARM core register to scalar.
1309 __ mov(r4, Operand(0xFFFFFFF8)); 1332 __ mov(r4, Operand(0xfffffff8));
1310 __ vmov(d0, 0); 1333 __ vmov(d0, 0);
1311 __ vmov(NeonS8, d0, 1, r4); 1334 __ vmov(NeonS8, d0, 1, r4);
1312 __ vmov(NeonS16, d0, 1, r4); 1335 __ vmov(NeonS16, d0, 1, r4);
1313 __ vmov(NeonS32, d0, 1, r4); 1336 __ vmov(NeonS32, d0, 1, r4);
1314 __ vstr(d0, r0, offsetof(T, vmov_to_scalar1)); 1337 __ vstr(d0, r0, offsetof(T, vmov_to_scalar1));
1315 __ vmov(d0, 0); 1338 __ vmov(d0, 0);
1316 __ vmov(NeonS8, d0, 3, r4); 1339 __ vmov(NeonS8, d0, 3, r4);
1317 __ vmov(NeonS16, d0, 3, r4); 1340 __ vmov(NeonS16, d0, 3, r4);
1318 __ vstr(d0, r0, offsetof(T, vmov_to_scalar2)); 1341 __ vstr(d0, r0, offsetof(T, vmov_to_scalar2));
1319 1342
1320 // Scalar to ARM core register. 1343 // Scalar to ARM core register.
1321 __ mov(r4, Operand(0xFFFFFF00)); 1344 __ mov(r4, Operand(0xffffff00));
1322 __ mov(r5, Operand(0xFFFFFFFF)); 1345 __ mov(r5, Operand(0xffffffff));
1323 __ vmov(d0, r4, r5); 1346 __ vmov(d0, r4, r5);
1324 __ vmov(NeonS8, r4, d0, 1); 1347 __ vmov(NeonS8, r4, d0, 1);
1325 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_s8))); 1348 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_s8)));
1326 __ vmov(NeonU8, r4, d0, 1); 1349 __ vmov(NeonU8, r4, d0, 1);
1327 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_u8))); 1350 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_u8)));
1328 __ vmov(NeonS16, r4, d0, 1); 1351 __ vmov(NeonS16, r4, d0, 1);
1329 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_s16))); 1352 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_s16)));
1330 __ vmov(NeonU16, r4, d0, 1); 1353 __ vmov(NeonU16, r4, d0, 1);
1331 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_u16))); 1354 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_u16)));
1332 __ vmov(NeonS32, r4, d0, 1); 1355 __ vmov(NeonS32, r4, d0, 1);
1333 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_32))); 1356 __ str(r4, MemOperand(r0, offsetof(T, vmov_from_scalar_32)));
1334 1357
1335 // vmov for q-registers. 1358 // vmov for q-registers.
1336 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vmov_src)))); 1359 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, lane_test))));
1337 __ vld1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); 1360 __ vld1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1338 __ vmov(q1, q0); 1361 __ vmov(q1, q0);
1339 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vmov_dst)))); 1362 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vmov))));
1340 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1363 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1341 1364
1342 // vmvn. 1365 // vmvn.
1343 __ mov(r4, Operand(0xFF)); 1366 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, lane_test))));
1344 __ vdup(Neon16, q0, r4); 1367 __ vld1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1345 __ vmvn(q1, q0); 1368 __ vmvn(q1, q0);
1346 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vmvn)))); 1369 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vmvn))));
1347 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1370 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1348 1371
1349 // vcvt for q-registers. 1372 // vcvt for q-registers.
1350 __ vmov(s0, -1.5); 1373 __ vmov(s0, -1.5);
1351 __ vmov(s1, -1); 1374 __ vmov(s1, -1);
1352 __ vmov(s2, 1); 1375 __ vmov(s2, 1);
1353 __ vmov(s3, 1.5); 1376 __ vmov(s3, 1.5);
1354 __ vcvt_s32_f32(q1, q0); 1377 __ vcvt_s32_f32(q1, q0);
1355 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vcvt_s32_f32)))); 1378 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vcvt_s32_f32))));
1356 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1379 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1357 __ vcvt_u32_f32(q1, q0); 1380 __ vcvt_u32_f32(q1, q0);
1358 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vcvt_u32_f32)))); 1381 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vcvt_u32_f32))));
1359 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1382 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1360 __ mov(r4, Operand(kMinInt)); 1383 __ mov(r4, Operand(kMinInt));
1361 __ mov(r5, Operand(kMaxInt)); 1384 __ mov(r5, Operand(kMaxInt));
1362 __ vmov(d0, r4, r5); 1385 __ vmov(d0, r4, r5);
1363 __ mov(r4, Operand(kMaxUInt32)); 1386 __ mov(r4, Operand(kMaxUInt32));
1364 __ mov(r5, Operand(kMinInt + 1)); 1387 __ mov(r5, Operand(kMinInt + 1));
1365 __ vmov(d1, r4, r5); // q0 = [kMinInt, kMaxInt, kMaxUInt32, kMinInt + 1] 1388 __ vmov(d1, r4, r5); // q0 = [kMinInt, kMaxInt, kMaxUInt32, kMinInt + 1]
1366 __ vcvt_f32_s32(q1, q0); 1389 __ vcvt_f32_s32(q1, q0);
1367 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vcvt_f32_s32)))); 1390 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vcvt_f32_s32))));
1368 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1391 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1369 __ vcvt_f32_u32(q1, q0); 1392 __ vcvt_f32_u32(q1, q0);
1370 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vcvt_f32_u32)))); 1393 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vcvt_f32_u32))));
1371 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1394 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1372 1395
1373 // int vdup. 1396 // vdup (integer).
1374 __ mov(r4, Operand(0xa)); 1397 __ mov(r4, Operand(0xa));
1375 __ vdup(Neon8, q0, r4); 1398 __ vdup(Neon8, q0, r4);
1376 __ vdup(Neon16, q1, r4); 1399 __ vdup(Neon16, q1, r4);
1377 __ vdup(Neon32, q2, r4); 1400 __ vdup(Neon32, q2, r4);
1378 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vdup1)))); 1401 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vdup8))));
1379 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); 1402 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1380 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vdup2)))); 1403 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vdup16))));
1381 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1404 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1382 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vdup3)))); 1405 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vdup32))));
1383 __ vst1(Neon8, NeonListOperand(q2), NeonMemOperand(r4)); 1406 __ vst1(Neon8, NeonListOperand(q2), NeonMemOperand(r4));
1384 // float vdup. 1407
1408 // vdup (float).
1385 __ vmov(s0, -1.0); 1409 __ vmov(s0, -1.0);
1386 __ vdup(q0, s0); 1410 __ vdup(q0, s0);
1387 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vdup4)))); 1411 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vdupf))));
1388 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); 1412 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1389 1413
1414 // vabs (float).
1415 __ vmov(s0, -1.0);
1416 __ vmov(s1, -0.0);
1417 __ vmov(s2, 0.0);
1418 __ vmov(s3, 1.0);
1419 __ vabs(q1, q0);
1420 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vabsf))));
1421 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1422 // vneg (float).
1423 __ vneg(q1, q0);
1424 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vnegf))));
1425 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1426
1427 // vabs (integer).
1428 __ mov(r4, Operand(0x7f7f7f7f));
1429 __ mov(r5, Operand(0x01010101));
1430 __ vmov(d0, r4, r5);
1431 __ mov(r4, Operand(0xffffffff));
1432 __ mov(r5, Operand(0x80808080));
1433 __ vmov(d1, r4, r5);
1434 __ vabs(Neon8, q1, q0);
1435 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vabs_s8))));
1436 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1437 __ vabs(Neon16, q1, q0);
1438 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vabs_s16))));
1439 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1440 __ vabs(Neon32, q1, q0);
1441 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vabs_s32))));
1442 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1443 // vneg (integer).
1444 __ vneg(Neon8, q1, q0);
1445 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vneg_s8))));
1446 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1447 __ vneg(Neon16, q1, q0);
1448 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vneg_s16))));
1449 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1450 __ vneg(Neon32, q1, q0);
1451 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vneg_s32))));
1452 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1453
1390 // veor. 1454 // veor.
1391 __ mov(r4, Operand(0x00aa)); 1455 __ mov(r4, Operand(0x00aa));
1392 __ vdup(Neon16, q0, r4); 1456 __ vdup(Neon16, q0, r4);
1393 __ mov(r4, Operand(0x0055)); 1457 __ mov(r4, Operand(0x0055));
1394 __ vdup(Neon16, q1, r4); 1458 __ vdup(Neon16, q1, r4);
1395 __ veor(q1, q1, q0); 1459 __ veor(q1, q1, q0);
1396 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, veor)))); 1460 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, veor))));
1397 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1461 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1398 1462
1399 // vadd(integer). 1463 // vadd (float).
1464 __ vmov(s4, 1.0);
1465 __ vdup(q0, s4);
1466 __ vdup(q1, s4);
1467 __ vadd(q1, q1, q0);
1468 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vaddf))));
1469 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1470 // vsub (float).
1471 __ vmov(s4, 2.0);
1472 __ vdup(q0, s4);
1473 __ vmov(s4, 1.0);
1474 __ vdup(q1, s4);
1475 __ vsub(q1, q1, q0);
1476 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vsubf))));
1477 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1478 // vmul (float).
1479 __ vmov(s4, 2.0);
1480 __ vdup(q0, s4);
1481 __ vdup(q1, s4);
1482 __ vmul(q1, q1, q0);
1483 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vmulf))));
1484 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1485
1486 // vadd (integer).
1400 __ mov(r4, Operand(0x81)); 1487 __ mov(r4, Operand(0x81));
1401 __ vdup(Neon8, q0, r4); 1488 __ vdup(Neon8, q0, r4);
1402 __ mov(r4, Operand(0x82)); 1489 __ mov(r4, Operand(0x82));
1403 __ vdup(Neon8, q1, r4); 1490 __ vdup(Neon8, q1, r4);
1404 __ vadd(Neon8, q1, q1, q0); 1491 __ vadd(Neon8, q1, q1, q0);
1405 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vadd8)))); 1492 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vadd8))));
1406 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1493 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1407 __ mov(r4, Operand(0x8001)); 1494 __ mov(r4, Operand(0x8001));
1408 __ vdup(Neon16, q0, r4); 1495 __ vdup(Neon16, q0, r4);
1409 __ mov(r4, Operand(0x8002)); 1496 __ mov(r4, Operand(0x8002));
1410 __ vdup(Neon16, q1, r4); 1497 __ vdup(Neon16, q1, r4);
1411 __ vadd(Neon16, q1, q1, q0); 1498 __ vadd(Neon16, q1, q1, q0);
1412 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vadd16)))); 1499 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vadd16))));
1413 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1500 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1414 __ mov(r4, Operand(0x80000001)); 1501 __ mov(r4, Operand(0x80000001));
1415 __ vdup(Neon32, q0, r4); 1502 __ vdup(Neon32, q0, r4);
1416 __ mov(r4, Operand(0x80000002)); 1503 __ mov(r4, Operand(0x80000002));
1417 __ vdup(Neon32, q1, r4); 1504 __ vdup(Neon32, q1, r4);
1418 __ vadd(Neon32, q1, q1, q0); 1505 __ vadd(Neon32, q1, q1, q0);
1419 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vadd32)))); 1506 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vadd32))));
1420 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1507 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1421 1508
1422 // vadd(float). 1509 // vsub (integer).
1423 __ vmov(s4, 1.0);
1424 __ vdup(q0, s4);
1425 __ vdup(q1, s4);
1426 __ vadd(q1, q1, q0);
1427 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vaddf))));
1428 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1429
1430 // vsub(integer).
1431 __ mov(r4, Operand(0x01)); 1510 __ mov(r4, Operand(0x01));
1432 __ vdup(Neon8, q0, r4); 1511 __ vdup(Neon8, q0, r4);
1433 __ mov(r4, Operand(0x02)); 1512 __ mov(r4, Operand(0x03));
1434 __ vdup(Neon8, q1, r4); 1513 __ vdup(Neon8, q1, r4);
1435 __ vsub(Neon8, q1, q0, q1); 1514 __ vsub(Neon8, q1, q0, q1);
1436 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vsub8)))); 1515 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vsub8))));
1437 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1516 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1438 __ mov(r4, Operand(0x0001)); 1517 __ mov(r4, Operand(0x0001));
1439 __ vdup(Neon16, q0, r4); 1518 __ vdup(Neon16, q0, r4);
1440 __ mov(r4, Operand(0x0002)); 1519 __ mov(r4, Operand(0x0003));
1441 __ vdup(Neon16, q1, r4); 1520 __ vdup(Neon16, q1, r4);
1442 __ vsub(Neon16, q1, q0, q1); 1521 __ vsub(Neon16, q1, q0, q1);
1443 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vsub16)))); 1522 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vsub16))));
1444 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1523 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1445 __ mov(r4, Operand(0x00000001)); 1524 __ mov(r4, Operand(0x00000001));
1446 __ vdup(Neon32, q0, r4); 1525 __ vdup(Neon32, q0, r4);
1447 __ mov(r4, Operand(0x00000002)); 1526 __ mov(r4, Operand(0x00000003));
1448 __ vdup(Neon32, q1, r4); 1527 __ vdup(Neon32, q1, r4);
1449 __ vsub(Neon32, q1, q0, q1); 1528 __ vsub(Neon32, q1, q0, q1);
1450 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vsub32)))); 1529 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vsub32))));
1451 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1530 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1452 1531
1453 // vsub(float). 1532 // vmul (integer).
1454 __ vmov(s4, 2.0); 1533 __ mov(r4, Operand(0x02));
1455 __ vdup(q0, s4); 1534 __ vdup(Neon8, q0, r4);
1456 __ vmov(s4, 1.0); 1535 __ vmul(Neon8, q1, q0, q0);
1457 __ vdup(q1, s4); 1536 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vmul8))));
1458 __ vsub(q1, q1, q0); 1537 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1459 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vsubf)))); 1538 __ mov(r4, Operand(0x0002));
1539 __ vdup(Neon16, q0, r4);
1540 __ vmul(Neon16, q1, q0, q0);
1541 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vmul16))));
1542 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1543 __ mov(r4, Operand(0x00000002));
1544 __ vdup(Neon32, q0, r4);
1545 __ vmul(Neon32, q1, q0, q0);
1546 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vmul32))));
1460 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1547 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1461 1548
1462 // vceq. 1549 // vceq.
1463 __ mov(r4, Operand(0x03)); 1550 __ mov(r4, Operand(0x03));
1464 __ vdup(Neon8, q0, r4); 1551 __ vdup(Neon8, q0, r4);
1465 __ mov(r4, Operand(0x03)); 1552 __ mov(r4, Operand(0x03));
1466 __ vdup(Neon16, q1, r4); 1553 __ vdup(Neon16, q1, r4);
1467 __ vceq(Neon8, q1, q0, q1); 1554 __ vceq(Neon8, q1, q0, q1);
1468 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vceq)))); 1555 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vceq))));
1469 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4)); 1556 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
(...skipping 11 matching lines...) Expand all
1481 __ mov(r4, Operand(0x00ff)); 1568 __ mov(r4, Operand(0x00ff));
1482 __ vdup(Neon16, q0, r4); 1569 __ vdup(Neon16, q0, r4);
1483 __ mov(r4, Operand(0x01)); 1570 __ mov(r4, Operand(0x01));
1484 __ vdup(Neon8, q1, r4); 1571 __ vdup(Neon8, q1, r4);
1485 __ mov(r4, Operand(0x02)); 1572 __ mov(r4, Operand(0x02));
1486 __ vdup(Neon8, q2, r4); 1573 __ vdup(Neon8, q2, r4);
1487 __ vbsl(q0, q1, q2); 1574 __ vbsl(q0, q1, q2);
1488 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vbsl)))); 1575 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vbsl))));
1489 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4)); 1576 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1490 1577
1578 // vext.
1579 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, lane_test))));
1580 __ vld1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1581 __ vmov(q1, q0);
1582 __ vext(q2, q0, q1, 3);
1583 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vext))));
1584 __ vst1(Neon8, NeonListOperand(q2), NeonMemOperand(r4));
1585
1586 // vzip.
1587 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, lane_test))));
1588 __ vld1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1589 __ vmov(q1, q0);
1590 __ vzip(Neon8, q0, q1);
1591 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vzip8a))));
1592 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1593 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vzip8b))));
1594 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1595 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, lane_test))));
1596 __ vld1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1597 __ vmov(q1, q0);
1598 __ vzip(Neon16, q0, q1);
1599 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vzip16a))));
1600 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1601 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vzip16b))));
1602 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1603 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, lane_test))));
1604 __ vld1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1605 __ vmov(q1, q0);
1606 __ vzip(Neon32, q0, q1);
1607 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vzip32a))));
1608 __ vst1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1609 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vzip32b))));
1610 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1611
1612 // vrev64/32/16
1613 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, lane_test))));
1614 __ vld1(Neon8, NeonListOperand(q0), NeonMemOperand(r4));
1615 __ vrev64(Neon32, q1, q0);
1616 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vrev64_32))));
1617 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1618 __ vrev64(Neon16, q1, q0);
1619 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vrev64_16))));
1620 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1621 __ vrev64(Neon8, q1, q0);
1622 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vrev64_8))));
1623 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1624 __ vrev32(Neon16, q1, q0);
1625 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vrev32_16))));
1626 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1627 __ vrev32(Neon8, q1, q0);
1628 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vrev32_8))));
1629 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1630 __ vrev16(Neon8, q1, q0);
1631 __ add(r4, r0, Operand(static_cast<int32_t>(offsetof(T, vrev16_8))));
1632 __ vst1(Neon8, NeonListOperand(q1), NeonMemOperand(r4));
1633
1491 // vtb[l/x]. 1634 // vtb[l/x].
1492 __ mov(r4, Operand(0x06040200)); 1635 __ mov(r4, Operand(0x06040200));
1493 __ mov(r5, Operand(0xff050301)); 1636 __ mov(r5, Operand(0xff050301));
1494 __ vmov(d2, r4, r5); // d2 = ff05030106040200 1637 __ vmov(d2, r4, r5); // d2 = ff05030106040200
1495 __ vtbl(d0, NeonListOperand(d2, 1), d2); 1638 __ vtbl(d0, NeonListOperand(d2, 1), d2);
1496 __ vstr(d0, r0, offsetof(T, vtbl)); 1639 __ vstr(d0, r0, offsetof(T, vtbl));
1497 __ vtbx(d2, NeonListOperand(d2, 1), d2); 1640 __ vtbx(d2, NeonListOperand(d2, 1), d2);
1498 __ vstr(d2, r0, offsetof(T, vtbx)); 1641 __ vstr(d2, r0, offsetof(T, vtbx));
1499 1642
1500 // Restore and return. 1643 // Restore and return.
(...skipping 27 matching lines...) Expand all
1528 t.srcA0 = 0x41424344; 1671 t.srcA0 = 0x41424344;
1529 t.srcA1 = 0x81828384; 1672 t.srcA1 = 0x81828384;
1530 t.dstA0 = 0; 1673 t.dstA0 = 0;
1531 t.dstA1 = 0; 1674 t.dstA1 = 0;
1532 t.dstA2 = 0; 1675 t.dstA2 = 0;
1533 t.dstA3 = 0; 1676 t.dstA3 = 0;
1534 t.dstA4 = 0; 1677 t.dstA4 = 0;
1535 t.dstA5 = 0; 1678 t.dstA5 = 0;
1536 t.dstA6 = 0; 1679 t.dstA6 = 0;
1537 t.dstA7 = 0; 1680 t.dstA7 = 0;
1538 t.vmov_src[0] = t.vmov_src[1] = t.vmov_src[2] = t.vmov_src[3] = 1; 1681 t.lane_test[0] = 0x03020100;
1539 t.vmov_dst[0] = t.vmov_dst[1] = t.vmov_dst[2] = t.vmov_dst[3] = 0; 1682 t.lane_test[1] = 0x07060504;
1683 t.lane_test[2] = 0x0b0a0908;
1684 t.lane_test[3] = 0x0f0e0d0c;
1540 Object* dummy = CALL_GENERATED_CODE(isolate, f, &t, 0, 0, 0, 0); 1685 Object* dummy = CALL_GENERATED_CODE(isolate, f, &t, 0, 0, 0, 0);
1541 USE(dummy); 1686 USE(dummy);
1542 1687
1543 CHECK_EQ(0x01020304u, t.dst0); 1688 CHECK_EQ(0x01020304u, t.dst0);
1544 CHECK_EQ(0x11121314u, t.dst1); 1689 CHECK_EQ(0x11121314u, t.dst1);
1545 CHECK_EQ(0x21222324u, t.dst2); 1690 CHECK_EQ(0x21222324u, t.dst2);
1546 CHECK_EQ(0x31323334u, t.dst3); 1691 CHECK_EQ(0x31323334u, t.dst3);
1547 CHECK_EQ(0x41424344u, t.dst4); 1692 CHECK_EQ(0x41424344u, t.dst4);
1548 CHECK_EQ(0x51525354u, t.dst5); 1693 CHECK_EQ(0x51525354u, t.dst5);
1549 CHECK_EQ(0x61626364u, t.dst6); 1694 CHECK_EQ(0x61626364u, t.dst6);
1550 CHECK_EQ(0x71727374u, t.dst7); 1695 CHECK_EQ(0x71727374u, t.dst7);
1551 CHECK_EQ(0x00430044u, t.dstA0); 1696 CHECK_EQ(0x00430044u, t.dstA0);
1552 CHECK_EQ(0x00410042u, t.dstA1); 1697 CHECK_EQ(0x00410042u, t.dstA1);
1553 CHECK_EQ(0x00830084u, t.dstA2); 1698 CHECK_EQ(0x00830084u, t.dstA2);
1554 CHECK_EQ(0x00810082u, t.dstA3); 1699 CHECK_EQ(0x00810082u, t.dstA3);
1555 CHECK_EQ(0x00430044u, t.dstA4); 1700 CHECK_EQ(0x00430044u, t.dstA4);
1556 CHECK_EQ(0x00410042u, t.dstA5); 1701 CHECK_EQ(0x00410042u, t.dstA5);
1557 CHECK_EQ(0x00830084u, t.dstA6); 1702 CHECK_EQ(0x00830084u, t.dstA6);
1558 CHECK_EQ(0x00810082u, t.dstA7); 1703 CHECK_EQ(0x00810082u, t.dstA7);
1704
1559 CHECK_EQ(0xfffffff8fff8f800u, t.vmov_to_scalar1); 1705 CHECK_EQ(0xfffffff8fff8f800u, t.vmov_to_scalar1);
1560 CHECK_EQ(0xfff80000f8000000u, t.vmov_to_scalar2); 1706 CHECK_EQ(0xfff80000f8000000u, t.vmov_to_scalar2);
1561 CHECK_EQ(0xFFFFFFFFu, t.vmov_from_scalar_s8); 1707 CHECK_EQ(0xFFFFFFFFu, t.vmov_from_scalar_s8);
1562 CHECK_EQ(0xFFu, t.vmov_from_scalar_u8); 1708 CHECK_EQ(0xFFu, t.vmov_from_scalar_u8);
1563 CHECK_EQ(0xFFFFFFFFu, t.vmov_from_scalar_s16); 1709 CHECK_EQ(0xFFFFFFFFu, t.vmov_from_scalar_s16);
1564 CHECK_EQ(0xFFFFu, t.vmov_from_scalar_u16); 1710 CHECK_EQ(0xFFFFu, t.vmov_from_scalar_u16);
1565 CHECK_EQ(0xFFFFFFFFu, t.vmov_from_scalar_32); 1711 CHECK_EQ(0xFFFFFFFFu, t.vmov_from_scalar_32);
1566 CHECK_EQ(1u, t.vmov_dst[0]);
1567 CHECK_EQ(1u, t.vmov_dst[1]);
1568 CHECK_EQ(1u, t.vmov_dst[2]);
1569 CHECK_EQ(1u, t.vmov_dst[3]);
1570 CHECK_EQ(-1, t.vcvt_s32_f32[0]);
1571 CHECK_EQ(-1, t.vcvt_s32_f32[1]);
1572 CHECK_EQ(1, t.vcvt_s32_f32[2]);
1573 CHECK_EQ(1, t.vcvt_s32_f32[3]);
1574 CHECK_EQ(0u, t.vcvt_u32_f32[0]);
1575 CHECK_EQ(0u, t.vcvt_u32_f32[1]);
1576 CHECK_EQ(1u, t.vcvt_u32_f32[2]);
1577 CHECK_EQ(1u, t.vcvt_u32_f32[3]);
1578 1712
1713 CHECK_EQ_32X4(vmov, 0x03020100u, 0x07060504u, 0x0b0a0908u, 0x0f0e0d0cu);
1714 CHECK_EQ_32X4(vmvn, 0xfcfdfeffu, 0xf8f9fafbu, 0xf4f5f6f7u, 0xf0f1f2f3u);
1715
1716 CHECK_EQ_SPLAT(vdup8, 0x0a0a0a0au);
1717 CHECK_EQ_SPLAT(vdup16, 0x000a000au);
1718 CHECK_EQ_SPLAT(vdup32, 0x0000000au);
1719 CHECK_EQ_SPLAT(vdupf, -1.0);
1720
1721 // src: [-1, -1, 1, 1]
1722 CHECK_EQ_32X4(vcvt_s32_f32, -1, -1, 1, 1);
1723 CHECK_EQ_32X4(vcvt_u32_f32, 0u, 0u, 1u, 1u);
1579 // src: [kMinInt, kMaxInt, kMaxUInt32, kMinInt + 1] 1724 // src: [kMinInt, kMaxInt, kMaxUInt32, kMinInt + 1]
1580 CHECK_EQ(INT32_TO_FLOAT(kMinInt), t.vcvt_f32_s32[0]); 1725 CHECK_EQ_32X4(vcvt_f32_s32, INT32_TO_FLOAT(kMinInt),
1581 CHECK_EQ(INT32_TO_FLOAT(kMaxInt), t.vcvt_f32_s32[1]); 1726 INT32_TO_FLOAT(kMaxInt), INT32_TO_FLOAT(kMaxUInt32),
1582 CHECK_EQ(INT32_TO_FLOAT(kMaxUInt32), t.vcvt_f32_s32[2]); 1727 INT32_TO_FLOAT(kMinInt + 1));
1583 CHECK_EQ(INT32_TO_FLOAT(kMinInt + 1), t.vcvt_f32_s32[3]); 1728 CHECK_EQ_32X4(vcvt_f32_u32, UINT32_TO_FLOAT(kMinInt),
1584 CHECK_EQ(UINT32_TO_FLOAT(kMinInt), t.vcvt_f32_u32[0]); 1729 UINT32_TO_FLOAT(kMaxInt), UINT32_TO_FLOAT(kMaxUInt32),
1585 CHECK_EQ(UINT32_TO_FLOAT(kMaxInt), t.vcvt_f32_u32[1]); 1730 UINT32_TO_FLOAT(kMinInt + 1));
1586 CHECK_EQ(UINT32_TO_FLOAT(kMaxUInt32), t.vcvt_f32_u32[2]);
1587 CHECK_EQ(UINT32_TO_FLOAT(kMinInt + 1), t.vcvt_f32_u32[3]);
1588 1731
1589 for (int i = 0; i < 4; i++) CHECK_EQ(0xFF00FF00, t.vmvn[i]); 1732 CHECK_EQ_32X4(vabsf, 1.0, 0.0, 0.0, 1.0);
1590 for (int i = 0; i < 4; i++) CHECK_EQ(0x0a0a0a0au, t.vdup1[i]); 1733 CHECK_EQ_32X4(vnegf, 1.0, 0.0, -0.0, -1.0);
1591 for (int i = 0; i < 4; i++) CHECK_EQ(0x000a000au, t.vdup2[i]); 1734 // src: [0x7f7f7f7f, 0x01010101, 0xffffffff, 0x80808080]
1592 for (int i = 0; i < 4; i++) CHECK_EQ(0x0000000au, t.vdup3[i]); 1735 CHECK_EQ_32X4(vabs_s8, 0x7f7f7f7fu, 0x01010101u, 0x01010101u, 0x80808080u);
1593 for (int i = 0; i < 4; i++) CHECK_EQ(0xbf800000u, t.vdup4[i]); // -1.0f 1736 CHECK_EQ_32X4(vabs_s16, 0x7f7f7f7fu, 0x01010101u, 0x00010001u, 0x7f807f80u);
1594 for (int i = 0; i < 4; i++) CHECK_EQ(0x00ff00ffu, t.veor[i]); 1737 CHECK_EQ_32X4(vabs_s32, 0x7f7f7f7fu, 0x01010101u, 0x00000001u, 0x7f7f7f80u);
1595 for (int i = 0; i < 4; i++) CHECK_EQ(2.0, t.vaddf[i]); 1738 CHECK_EQ_32X4(vneg_s8, 0x81818181u, 0xffffffffu, 0x01010101u, 0x80808080u);
1596 for (int i = 0; i < 4; i++) CHECK_EQ(0x03030303u, t.vadd8[i]); 1739 CHECK_EQ_32X4(vneg_s16, 0x80818081u, 0xfefffeffu, 0x00010001u, 0x7f807f80u);
1597 for (int i = 0; i < 4; i++) CHECK_EQ(0x00030003u, t.vadd16[i]); 1740 CHECK_EQ_32X4(vneg_s32, 0x80808081u, 0xfefefeffu, 0x00000001u, 0x7f7f7f80u);
1598 for (int i = 0; i < 4; i++) CHECK_EQ(0x00000003u, t.vadd32[i]); 1741
1599 for (int i = 0; i < 4; i++) CHECK_EQ(-1.0, t.vsubf[i]); 1742 CHECK_EQ_SPLAT(veor, 0x00ff00ffu);
1600 for (int i = 0; i < 4; i++) CHECK_EQ(0xffffffffu, t.vsub8[i]); 1743 CHECK_EQ_SPLAT(vaddf, 2.0);
1601 for (int i = 0; i < 4; i++) CHECK_EQ(0xffffffffu, t.vsub16[i]); 1744 CHECK_EQ_SPLAT(vsubf, -1.0);
1602 for (int i = 0; i < 4; i++) CHECK_EQ(0xffffffffu, t.vsub32[i]); 1745 CHECK_EQ_SPLAT(vmulf, 4.0);
1603 for (int i = 0; i < 4; i++) CHECK_EQ(0x00ff00ffu, t.vceq[i]); 1746 CHECK_EQ_SPLAT(vadd8, 0x03030303u);
1604 for (int i = 0; i < 4; i++) CHECK_EQ(0x00ff00ffu, t.vtst[i]); 1747 CHECK_EQ_SPLAT(vadd16, 0x00030003u);
1605 for (int i = 0; i < 4; i++) CHECK_EQ(0x02010201u, t.vbsl[i]); 1748 CHECK_EQ_SPLAT(vadd32, 0x00000003u);
1749 CHECK_EQ_SPLAT(vsub8, 0xfefefefeu);
1750 CHECK_EQ_SPLAT(vsub16, 0xfffefffeu);
1751 CHECK_EQ_SPLAT(vsub32, 0xfffffffeu);
1752 CHECK_EQ_SPLAT(vmul8, 0x04040404u);
1753 CHECK_EQ_SPLAT(vmul16, 0x00040004u);
1754 CHECK_EQ_SPLAT(vmul32, 0x00000004u);
1755 CHECK_EQ_SPLAT(vceq, 0x00ff00ffu);
1756 CHECK_EQ_SPLAT(vtst, 0x00ff00ffu);
1757 CHECK_EQ_SPLAT(vbsl, 0x02010201u);
1758
1759 CHECK_EQ_32X4(vext, 0x06050403u, 0x0a090807u, 0x0e0d0c0bu, 0x0201000fu);
1760
1761 CHECK_EQ_32X4(vzip8a, 0x01010000u, 0x03030202u, 0x05050404u, 0x07070606u);
1762 CHECK_EQ_32X4(vzip8b, 0x09090808u, 0x0b0b0a0au, 0x0d0d0c0cu, 0x0f0f0e0eu);
1763 CHECK_EQ_32X4(vzip16a, 0x01000100u, 0x03020302u, 0x05040504u, 0x07060706u);
1764 CHECK_EQ_32X4(vzip16b, 0x09080908u, 0x0b0a0b0au, 0x0d0c0d0cu, 0x0f0e0f0eu);
1765 CHECK_EQ_32X4(vzip32a, 0x03020100u, 0x03020100u, 0x07060504u, 0x07060504u);
1766 CHECK_EQ_32X4(vzip32b, 0x0b0a0908u, 0x0b0a0908u, 0x0f0e0d0cu, 0x0f0e0d0cu);
1767
1768 // src: 0 1 2 3 4 5 6 7 8 9 a b c d e f (little endian)
1769 CHECK_EQ_32X4(vrev64_32, 0x07060504u, 0x03020100u, 0x0f0e0d0cu,
1770 0x0b0a0908u);
1771 CHECK_EQ_32X4(vrev64_16, 0x05040706u, 0x01000302u, 0x0d0c0f0eu,
1772 0x09080b0au);
1773 CHECK_EQ_32X4(vrev64_8, 0x04050607u, 0x00010203u, 0x0c0d0e0fu, 0x08090a0bu);
1774 CHECK_EQ_32X4(vrev32_16, 0x01000302u, 0x05040706u, 0x09080b0au,
1775 0x0d0c0f0eu);
1776 CHECK_EQ_32X4(vrev32_8, 0x00010203u, 0x04050607u, 0x08090a0bu, 0x0c0d0e0fu);
1777 CHECK_EQ_32X4(vrev16_8, 0x02030001u, 0x06070405u, 0x0a0b0809u, 0x0e0f0c0du);
1778
1606 CHECK_EQ(0x05010400u, t.vtbl[0]); 1779 CHECK_EQ(0x05010400u, t.vtbl[0]);
1607 CHECK_EQ(0x00030602u, t.vtbl[1]); 1780 CHECK_EQ(0x00030602u, t.vtbl[1]);
1608 CHECK_EQ(0x05010400u, t.vtbx[0]); 1781 CHECK_EQ(0x05010400u, t.vtbx[0]);
1609 CHECK_EQ(0xff030602u, t.vtbx[1]); 1782 CHECK_EQ(0xff030602u, t.vtbx[1]);
1610 } 1783 }
1611 } 1784 }
1612 1785
1613
1614 TEST(16) { 1786 TEST(16) {
1615 // Test the pkh, uxtb, uxtab and uxtb16 instructions. 1787 // Test the pkh, uxtb, uxtab and uxtb16 instructions.
1616 CcTest::InitializeVM(); 1788 CcTest::InitializeVM();
1617 Isolate* isolate = CcTest::i_isolate(); 1789 Isolate* isolate = CcTest::i_isolate();
1618 HandleScope scope(isolate); 1790 HandleScope scope(isolate);
1619 1791
1620 typedef struct { 1792 typedef struct {
1621 uint32_t src0; 1793 uint32_t src0;
1622 uint32_t src1; 1794 uint32_t src1;
1623 uint32_t src2; 1795 uint32_t src2;
(...skipping 1659 matching lines...) Expand 10 before | Expand all | Expand 10 after
3283 HandleScope scope(isolate); 3455 HandleScope scope(isolate);
3284 3456
3285 Assembler assm(isolate, NULL, 0); 3457 Assembler assm(isolate, NULL, 0);
3286 __ mov(r0, Operand(isolate->factory()->infinity_value())); 3458 __ mov(r0, Operand(isolate->factory()->infinity_value()));
3287 __ BlockConstPoolFor(1019); 3459 __ BlockConstPoolFor(1019);
3288 for (int i = 0; i < 1019; ++i) __ nop(); 3460 for (int i = 0; i < 1019; ++i) __ nop();
3289 __ vldr(d0, MemOperand(r0, 0)); 3461 __ vldr(d0, MemOperand(r0, 0));
3290 } 3462 }
3291 3463
3292 #undef __ 3464 #undef __
OLDNEW
« no previous file with comments | « src/arm/simulator-arm.cc ('k') | test/cctest/test-disasm-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698