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

Side by Side Diff: src/arm/assembler-arm.h

Issue 2739033002: [ARM] Implement more NEON permutation instructions. (Closed)
Patch Set: Martyn's review comments. Created 3 years, 9 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
« no previous file with comments | « no previous file | src/arm/assembler-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 (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions 5 // modification, are permitted provided that the following conditions
6 // are met: 6 // are met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
173 return reg_code; 173 return reg_code;
174 } 174 }
175 int bit() const { 175 int bit() const {
176 DCHECK(is_valid()); 176 DCHECK(is_valid());
177 return 1 << reg_code; 177 return 1 << reg_code;
178 } 178 }
179 static SwVfpRegister from_code(int code) { 179 static SwVfpRegister from_code(int code) {
180 SwVfpRegister r = {code}; 180 SwVfpRegister r = {code};
181 return r; 181 return r;
182 } 182 }
183 void split_code(int* vm, int* m) const { 183 static void split_code(int reg_code, int* vm, int* m) {
184 DCHECK(is_valid()); 184 DCHECK(from_code(reg_code).is_valid());
185 *m = reg_code & 0x1; 185 *m = reg_code & 0x1;
186 *vm = reg_code >> 1; 186 *vm = reg_code >> 1;
187 } 187 }
188 void split_code(int* vm, int* m) const {
189 split_code(reg_code, vm, m);
190 }
188 191
189 int reg_code; 192 int reg_code;
190 }; 193 };
191 194
192 typedef SwVfpRegister FloatRegister; 195 typedef SwVfpRegister FloatRegister;
193 196
194 // Double word VFP register. 197 // Double word VFP register.
195 struct DwVfpRegister { 198 struct DwVfpRegister {
196 enum Code { 199 enum Code {
197 #define REGISTER_CODE(R) kCode_##R, 200 #define REGISTER_CODE(R) kCode_##R,
(...skipping 21 matching lines...) Expand all
219 } 222 }
220 int bit() const { 223 int bit() const {
221 DCHECK(is_valid()); 224 DCHECK(is_valid());
222 return 1 << reg_code; 225 return 1 << reg_code;
223 } 226 }
224 227
225 static DwVfpRegister from_code(int code) { 228 static DwVfpRegister from_code(int code) {
226 DwVfpRegister r = {code}; 229 DwVfpRegister r = {code};
227 return r; 230 return r;
228 } 231 }
229 void split_code(int* vm, int* m) const { 232 static void split_code(int reg_code, int* vm, int* m) {
230 DCHECK(is_valid()); 233 DCHECK(from_code(reg_code).is_valid());
231 *m = (reg_code & 0x10) >> 4; 234 *m = (reg_code & 0x10) >> 4;
232 *vm = reg_code & 0x0F; 235 *vm = reg_code & 0x0F;
233 } 236 }
237 void split_code(int* vm, int* m) const {
238 split_code(reg_code, vm, m);
239 }
234 240
235 int reg_code; 241 int reg_code;
236 }; 242 };
237 243
238 244
239 typedef DwVfpRegister DoubleRegister; 245 typedef DwVfpRegister DoubleRegister;
240 246
241 247
242 // Double word VFP register d0-15. 248 // Double word VFP register d0-15.
243 struct LowDwVfpRegister { 249 struct LowDwVfpRegister {
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 } 295 }
290 296
291 bool is_valid() const { 297 bool is_valid() const {
292 return (0 <= reg_code) && (reg_code < kMaxNumRegisters); 298 return (0 <= reg_code) && (reg_code < kMaxNumRegisters);
293 } 299 }
294 bool is(QwNeonRegister reg) const { return reg_code == reg.reg_code; } 300 bool is(QwNeonRegister reg) const { return reg_code == reg.reg_code; }
295 int code() const { 301 int code() const {
296 DCHECK(is_valid()); 302 DCHECK(is_valid());
297 return reg_code; 303 return reg_code;
298 } 304 }
299 void split_code(int* vm, int* m) const { 305 static void split_code(int reg_code, int* vm, int* m) {
300 DCHECK(is_valid()); 306 DCHECK(from_code(reg_code).is_valid());
301 int encoded_code = reg_code << 1; 307 int encoded_code = reg_code << 1;
302 *m = (encoded_code & 0x10) >> 4; 308 *m = (encoded_code & 0x10) >> 4;
303 *vm = encoded_code & 0x0F; 309 *vm = encoded_code & 0x0F;
304 } 310 }
311 void split_code(int* vm, int* m) const {
312 split_code(reg_code, vm, m);
313 }
305 DwVfpRegister low() const { 314 DwVfpRegister low() const {
306 DwVfpRegister reg; 315 DwVfpRegister reg;
307 reg.reg_code = reg_code * 2; 316 reg.reg_code = reg_code * 2;
308 317
309 DCHECK(reg.is_valid()); 318 DCHECK(reg.is_valid());
310 return reg; 319 return reg;
311 } 320 }
312 DwVfpRegister high() const { 321 DwVfpRegister high() const {
313 DwVfpRegister reg; 322 DwVfpRegister reg;
314 reg.reg_code = reg_code * 2 + 1; 323 reg.reg_code = reg_code * 2 + 1;
(...skipping 993 matching lines...) Expand 10 before | Expand all | Expand 10 after
1308 const NeonMemOperand& src); 1317 const NeonMemOperand& src);
1309 void vst1(NeonSize size, 1318 void vst1(NeonSize size,
1310 const NeonListOperand& src, 1319 const NeonListOperand& src,
1311 const NeonMemOperand& dst); 1320 const NeonMemOperand& dst);
1312 void vmovl(NeonDataType dt, QwNeonRegister dst, DwVfpRegister src); 1321 void vmovl(NeonDataType dt, QwNeonRegister dst, DwVfpRegister src);
1313 1322
1314 // Only unconditional core <-> scalar moves are currently supported. 1323 // Only unconditional core <-> scalar moves are currently supported.
1315 void vmov(NeonDataType dt, DwVfpRegister dst, int index, Register src); 1324 void vmov(NeonDataType dt, DwVfpRegister dst, int index, Register src);
1316 void vmov(NeonDataType dt, Register dst, DwVfpRegister src, int index); 1325 void vmov(NeonDataType dt, Register dst, DwVfpRegister src, int index);
1317 1326
1318 void vmov(const QwNeonRegister dst, const QwNeonRegister src); 1327 void vmov(QwNeonRegister dst, QwNeonRegister src);
1319 void vmvn(const QwNeonRegister dst, const QwNeonRegister src); 1328 void vdup(NeonSize size, QwNeonRegister dst, Register src);
1329 void vdup(QwNeonRegister dst, SwVfpRegister src);
1330
1331 void vcvt_f32_s32(QwNeonRegister dst, QwNeonRegister src);
1332 void vcvt_f32_u32(QwNeonRegister dst, QwNeonRegister src);
1333 void vcvt_s32_f32(QwNeonRegister dst, QwNeonRegister src);
1334 void vcvt_u32_f32(QwNeonRegister dst, QwNeonRegister src);
1335
1336 void vmvn(QwNeonRegister dst, QwNeonRegister src);
1320 void vswp(DwVfpRegister dst, DwVfpRegister src); 1337 void vswp(DwVfpRegister dst, DwVfpRegister src);
1321 void vswp(QwNeonRegister dst, QwNeonRegister src); 1338 void vswp(QwNeonRegister dst, QwNeonRegister src);
1322 // vdup conditional execution isn't supported. 1339 void vabs(QwNeonRegister dst, QwNeonRegister src);
1323 void vdup(NeonSize size, const QwNeonRegister dst, const Register src); 1340 void vabs(NeonSize size, QwNeonRegister dst, QwNeonRegister src);
1324 void vdup(const QwNeonRegister dst, const SwVfpRegister src); 1341 void vneg(QwNeonRegister dst, QwNeonRegister src);
1342 void vneg(NeonSize size, QwNeonRegister dst, QwNeonRegister src);
1325 1343
1326 void vcvt_f32_s32(const QwNeonRegister dst, const QwNeonRegister src); 1344 void vand(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1327 void vcvt_f32_u32(const QwNeonRegister dst, const QwNeonRegister src);
1328 void vcvt_s32_f32(const QwNeonRegister dst, const QwNeonRegister src);
1329 void vcvt_u32_f32(const QwNeonRegister dst, const QwNeonRegister src);
1330
1331 void vabs(const QwNeonRegister dst, const QwNeonRegister src);
1332 void vabs(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src);
1333 void vneg(const QwNeonRegister dst, const QwNeonRegister src);
1334 void vneg(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src);
1335 void veor(DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2); 1345 void veor(DwVfpRegister dst, DwVfpRegister src1, DwVfpRegister src2);
1336 void vand(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1346 void veor(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1337 void vbsl(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1347 void vbsl(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1338 void veor(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1339 void vorr(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1348 void vorr(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1340 void vadd(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1349 void vadd(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1341 void vadd(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, 1350 void vadd(NeonSize size, QwNeonRegister dst, QwNeonRegister src1,
1342 QwNeonRegister src2); 1351 QwNeonRegister src2);
1343 void vqadd(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, 1352 void vqadd(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1,
1344 QwNeonRegister src2); 1353 QwNeonRegister src2);
1345 void vsub(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1354 void vsub(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1346 void vsub(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, 1355 void vsub(NeonSize size, QwNeonRegister dst, QwNeonRegister src1,
1347 QwNeonRegister src2); 1356 QwNeonRegister src2);
1348 void vqsub(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1, 1357 void vqsub(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1,
(...skipping 18 matching lines...) Expand all
1367 void vrecpe(QwNeonRegister dst, QwNeonRegister src); 1376 void vrecpe(QwNeonRegister dst, QwNeonRegister src);
1368 void vrsqrte(QwNeonRegister dst, QwNeonRegister src); 1377 void vrsqrte(QwNeonRegister dst, QwNeonRegister src);
1369 void vrecps(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1378 void vrecps(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1370 void vrsqrts(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1379 void vrsqrts(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1371 void vtst(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, 1380 void vtst(NeonSize size, QwNeonRegister dst, QwNeonRegister src1,
1372 QwNeonRegister src2); 1381 QwNeonRegister src2);
1373 void vceq(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1382 void vceq(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1374 void vceq(NeonSize size, QwNeonRegister dst, QwNeonRegister src1, 1383 void vceq(NeonSize size, QwNeonRegister dst, QwNeonRegister src1,
1375 QwNeonRegister src2); 1384 QwNeonRegister src2);
1376 void vcge(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1385 void vcge(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1377 void vcge(NeonDataType dt, QwNeonRegister dst, 1386 void vcge(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1,
1378 QwNeonRegister src1, QwNeonRegister src2); 1387 QwNeonRegister src2);
1379 void vcgt(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2); 1388 void vcgt(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2);
1380 void vcgt(NeonDataType dt, QwNeonRegister dst, 1389 void vcgt(NeonDataType dt, QwNeonRegister dst, QwNeonRegister src1,
1381 QwNeonRegister src1, QwNeonRegister src2); 1390 QwNeonRegister src2);
1382 void vext(const QwNeonRegister dst, const QwNeonRegister src1, 1391 void vext(QwNeonRegister dst, QwNeonRegister src1, QwNeonRegister src2,
1383 const QwNeonRegister src2, int bytes); 1392 int bytes);
1384 void vzip(NeonSize size, const QwNeonRegister dst, const QwNeonRegister src); 1393 void vzip(NeonSize size, QwNeonRegister src1, QwNeonRegister src2);
1385 void vrev16(NeonSize size, const QwNeonRegister dst, 1394 void vuzp(NeonSize size, QwNeonRegister src1, QwNeonRegister src2);
1386 const QwNeonRegister src); 1395 void vrev16(NeonSize size, QwNeonRegister dst, QwNeonRegister src);
1387 void vrev32(NeonSize size, const QwNeonRegister dst, 1396 void vrev32(NeonSize size, QwNeonRegister dst, QwNeonRegister src);
1388 const QwNeonRegister src); 1397 void vrev64(NeonSize size, QwNeonRegister dst, QwNeonRegister src);
1389 void vrev64(NeonSize size, const QwNeonRegister dst, 1398 void vtrn(NeonSize size, QwNeonRegister src1, QwNeonRegister src2);
1390 const QwNeonRegister src); 1399 void vtbl(DwVfpRegister dst, const NeonListOperand& list,
1391 void vtbl(const DwVfpRegister dst, const NeonListOperand& list, 1400 DwVfpRegister index);
1392 const DwVfpRegister index); 1401 void vtbx(DwVfpRegister dst, const NeonListOperand& list,
1393 void vtbx(const DwVfpRegister dst, const NeonListOperand& list, 1402 DwVfpRegister index);
1394 const DwVfpRegister index);
1395 1403
1396 // Pseudo instructions 1404 // Pseudo instructions
1397 1405
1398 // Different nop operations are used by the code generator to detect certain 1406 // Different nop operations are used by the code generator to detect certain
1399 // states of the generated code. 1407 // states of the generated code.
1400 enum NopMarkerTypes { 1408 enum NopMarkerTypes {
1401 NON_MARKING_NOP = 0, 1409 NON_MARKING_NOP = 0,
1402 DEBUG_BREAK_NOP, 1410 DEBUG_BREAK_NOP,
1403 // IC markers. 1411 // IC markers.
1404 PROPERTY_ACCESS_INLINED, 1412 PROPERTY_ACCESS_INLINED,
(...skipping 384 matching lines...) Expand 10 before | Expand all | Expand 10 after
1789 class EnsureSpace BASE_EMBEDDED { 1797 class EnsureSpace BASE_EMBEDDED {
1790 public: 1798 public:
1791 INLINE(explicit EnsureSpace(Assembler* assembler)); 1799 INLINE(explicit EnsureSpace(Assembler* assembler));
1792 }; 1800 };
1793 1801
1794 1802
1795 } // namespace internal 1803 } // namespace internal
1796 } // namespace v8 1804 } // namespace v8
1797 1805
1798 #endif // V8_ARM_ASSEMBLER_ARM_H_ 1806 #endif // V8_ARM_ASSEMBLER_ARM_H_
OLDNEW
« no previous file with comments | « no previous file | src/arm/assembler-arm.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698