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

Side by Side Diff: src/IceInstX86Base.h

Issue 1530423002: Add template parameter for suffix to BinopXmm (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Created 5 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 | « no previous file | src/IceInstX86BaseImpl.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 //===- subzero/src/IceInstX86Base.h - Generic x86 instructions -*- C++ -*--===// 1 //===- subzero/src/IceInstX86Base.h - Generic x86 instructions -*- C++ -*--===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 131 matching lines...) Expand 10 before | Expand all | Expand 10 after
142 Xor, 142 Xor,
143 Xorps, 143 Xorps,
144 XorRMW, 144 XorRMW,
145 145
146 /// Intel Architecture Code Analyzer markers. These are not executable so 146 /// Intel Architecture Code Analyzer markers. These are not executable so
147 /// must only be used for analysis. 147 /// must only be used for analysis.
148 IacaStart, 148 IacaStart,
149 IacaEnd 149 IacaEnd
150 }; 150 };
151 151
152 enum SseSuffix { None, Packed, Scalar };
153
152 static const char *getWidthString(Type Ty); 154 static const char *getWidthString(Type Ty);
153 static const char *getFldString(Type Ty); 155 static const char *getFldString(Type Ty);
154 static typename Traits::Cond::BrCond 156 static typename Traits::Cond::BrCond
155 getOppositeCondition(typename Traits::Cond::BrCond Cond); 157 getOppositeCondition(typename Traits::Cond::BrCond Cond);
156 void dump(const Cfg *Func) const override; 158 void dump(const Cfg *Func) const override;
157 159
158 // Shared emit routines for common forms of instructions. 160 // Shared emit routines for common forms of instructions.
159 static void emitTwoAddress(const char *Opcode, const Inst *Inst, 161 static void emitTwoAddress(const char *Opcode, const Inst *Inst,
160 const Cfg *Func); 162 const Cfg *Func);
161 163
(...skipping 580 matching lines...) Expand 10 before | Expand all | Expand 10 after
742 this->addSource(DestSrc0); 744 this->addSource(DestSrc0);
743 this->addSource(Src1); 745 this->addSource(Src1);
744 } 746 }
745 747
746 static const char *Opcode; 748 static const char *Opcode;
747 static const typename InstX86Base< 749 static const typename InstX86Base<
748 Machine>::Traits::Assembler::GPREmitterAddrOp Emitter; 750 Machine>::Traits::Assembler::GPREmitterAddrOp Emitter;
749 }; 751 };
750 752
751 template <class Machine, typename InstX86Base<Machine>::InstKindX86 K, 753 template <class Machine, typename InstX86Base<Machine>::InstKindX86 K,
752 bool NeedsElementType> 754 bool NeedsElementType,
755 typename InstX86Base<Machine>::SseSuffix Suffix>
753 class InstX86BaseBinopXmm : public InstX86Base<Machine> { 756 class InstX86BaseBinopXmm : public InstX86Base<Machine> {
754 InstX86BaseBinopXmm() = delete; 757 InstX86BaseBinopXmm() = delete;
755 InstX86BaseBinopXmm(const InstX86BaseBinopXmm &) = delete; 758 InstX86BaseBinopXmm(const InstX86BaseBinopXmm &) = delete;
756 InstX86BaseBinopXmm &operator=(const InstX86BaseBinopXmm &) = delete; 759 InstX86BaseBinopXmm &operator=(const InstX86BaseBinopXmm &) = delete;
757 760
758 public: 761 public:
759 using Base = InstX86BaseBinopXmm<Machine, K, NeedsElementType>; 762 using Base = InstX86BaseBinopXmm<Machine, K, NeedsElementType, Suffix>;
760 763
761 void emit(const Cfg *Func) const override { 764 void emit(const Cfg *Func) const override {
762 if (!BuildDefs::dump()) 765 if (!BuildDefs::dump())
763 return; 766 return;
764 this->validateVectorAddrMode(); 767 this->validateVectorAddrMode();
765 this->emitTwoAddress(Opcode, this, Func); 768 switch (Suffix) {
769 case InstX86Base<Machine>::SseSuffix::None:
770 this->emitTwoAddress(Opcode, this, Func);
771 break;
772 case InstX86Base<Machine>::SseSuffix::Packed: {
773 char buf[30];
John 2015/12/17 14:06:36 I know these routines don't make to the final bina
sehr 2015/12/17 21:03:31 Done. And added another case for the Integral SSE
774 Type DestTy = this->getDest()->getType();
775 snprintf(buf, llvm::array_lengthof(buf), "%s%s", this->Opcode,
776 InstX86Base<Machine>::Traits::TypeAttributes[DestTy].PdPsString);
777 this->emitTwoAddress(buf, this, Func);
778 } break;
779 case InstX86Base<Machine>::SseSuffix::Scalar: {
780 char buf[30];
781 Type DestTy = this->getDest()->getType();
782 snprintf(buf, llvm::array_lengthof(buf), "%s%s", this->Opcode,
783 InstX86Base<Machine>::Traits::TypeAttributes[DestTy].SdSsString);
784 this->emitTwoAddress(buf, this, Func);
785 } break;
786 }
766 } 787 }
767 void emitIAS(const Cfg *Func) const override { 788 void emitIAS(const Cfg *Func) const override {
768 this->validateVectorAddrMode(); 789 this->validateVectorAddrMode();
769 Type Ty = this->getDest()->getType(); 790 Type Ty = this->getDest()->getType();
770 if (NeedsElementType) 791 if (NeedsElementType)
771 Ty = typeElementType(Ty); 792 Ty = typeElementType(Ty);
772 assert(this->getSrcSize() == 2); 793 assert(this->getSrcSize() == 2);
773 emitIASRegOpTyXMM<Machine>(Func, Ty, this->getDest(), this->getSrc(1), 794 emitIASRegOpTyXMM<Machine>(Func, Ty, this->getDest(), this->getSrc(1),
774 Emitter); 795 Emitter);
775 } 796 }
(...skipping 471 matching lines...) Expand 10 before | Expand all | Expand 10 after
1247 private: 1268 private:
1248 InstX86AddRMW(Cfg *Func, 1269 InstX86AddRMW(Cfg *Func,
1249 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1270 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1250 Operand *Src1) 1271 Operand *Src1)
1251 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::AddRMW>( 1272 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::AddRMW>(
1252 Func, DestSrc0, Src1) {} 1273 Func, DestSrc0, Src1) {}
1253 }; 1274 };
1254 1275
1255 template <class Machine> 1276 template <class Machine>
1256 class InstX86Addps 1277 class InstX86Addps
1257 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true> { 1278 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true,
1279 InstX86Base<Machine>::SseSuffix::Packed> {
1258 public: 1280 public:
1259 static InstX86Addps *create(Cfg *Func, Variable *Dest, Operand *Source) { 1281 static InstX86Addps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1260 return new (Func->allocate<InstX86Addps>()) 1282 return new (Func->allocate<InstX86Addps>())
1261 InstX86Addps(Func, Dest, Source); 1283 InstX86Addps(Func, Dest, Source);
1262 } 1284 }
1263 1285
1264 private: 1286 private:
1265 InstX86Addps(Cfg *Func, Variable *Dest, Operand *Source) 1287 InstX86Addps(Cfg *Func, Variable *Dest, Operand *Source)
1266 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true>( 1288 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addps, true,
1267 Func, Dest, Source) {} 1289 InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
1290 Source) {}
1268 }; 1291 };
1269 1292
1270 template <class Machine> 1293 template <class Machine>
1271 class InstX86Adc 1294 class InstX86Adc
1272 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Adc> { 1295 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Adc> {
1273 public: 1296 public:
1274 static InstX86Adc *create(Cfg *Func, Variable *Dest, Operand *Source) { 1297 static InstX86Adc *create(Cfg *Func, Variable *Dest, Operand *Source) {
1275 return new (Func->allocate<InstX86Adc>()) InstX86Adc(Func, Dest, Source); 1298 return new (Func->allocate<InstX86Adc>()) InstX86Adc(Func, Dest, Source);
1276 } 1299 }
1277 1300
(...skipping 18 matching lines...) Expand all
1296 private: 1319 private:
1297 InstX86AdcRMW(Cfg *Func, 1320 InstX86AdcRMW(Cfg *Func,
1298 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1321 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1299 Operand *Src1) 1322 Operand *Src1)
1300 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::AdcRMW>( 1323 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::AdcRMW>(
1301 Func, DestSrc0, Src1) {} 1324 Func, DestSrc0, Src1) {}
1302 }; 1325 };
1303 1326
1304 template <class Machine> 1327 template <class Machine>
1305 class InstX86Addss 1328 class InstX86Addss
1306 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false> { 1329 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false,
1330 InstX86Base<Machine>::SseSuffix::Scalar> {
1307 public: 1331 public:
1308 static InstX86Addss *create(Cfg *Func, Variable *Dest, Operand *Source) { 1332 static InstX86Addss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1309 return new (Func->allocate<InstX86Addss>()) 1333 return new (Func->allocate<InstX86Addss>())
1310 InstX86Addss(Func, Dest, Source); 1334 InstX86Addss(Func, Dest, Source);
1311 } 1335 }
1312 1336
1313 void emit(const Cfg *Func) const override;
1314
1315 private: 1337 private:
1316 InstX86Addss(Cfg *Func, Variable *Dest, Operand *Source) 1338 InstX86Addss(Cfg *Func, Variable *Dest, Operand *Source)
1317 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false>( 1339 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Addss, false,
1318 Func, Dest, Source) {} 1340 InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
1341 Source) {}
1319 }; 1342 };
1320 1343
1321 template <class Machine> 1344 template <class Machine>
1322 class InstX86Padd 1345 class InstX86Padd
1323 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true> { 1346 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true,
1347 InstX86Base<Machine>::SseSuffix::None> {
1324 public: 1348 public:
1325 static InstX86Padd *create(Cfg *Func, Variable *Dest, Operand *Source) { 1349 static InstX86Padd *create(Cfg *Func, Variable *Dest, Operand *Source) {
1326 return new (Func->allocate<InstX86Padd>()) InstX86Padd(Func, Dest, Source); 1350 return new (Func->allocate<InstX86Padd>()) InstX86Padd(Func, Dest, Source);
1327 } 1351 }
1328 1352
1329 void emit(const Cfg *Func) const override; 1353 void emit(const Cfg *Func) const override;
1330 1354
1331 private: 1355 private:
1332 InstX86Padd(Cfg *Func, Variable *Dest, Operand *Source) 1356 InstX86Padd(Cfg *Func, Variable *Dest, Operand *Source)
1333 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true>( 1357 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Padd, true,
1334 Func, Dest, Source) {} 1358 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
1359 Source) {}
1335 }; 1360 };
1336 1361
1337 template <class Machine> 1362 template <class Machine>
1338 class InstX86Sub 1363 class InstX86Sub
1339 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Sub> { 1364 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Sub> {
1340 public: 1365 public:
1341 static InstX86Sub *create(Cfg *Func, Variable *Dest, Operand *Source) { 1366 static InstX86Sub *create(Cfg *Func, Variable *Dest, Operand *Source) {
1342 return new (Func->allocate<InstX86Sub>()) InstX86Sub(Func, Dest, Source); 1367 return new (Func->allocate<InstX86Sub>()) InstX86Sub(Func, Dest, Source);
1343 } 1368 }
1344 1369
(...skipping 18 matching lines...) Expand all
1363 private: 1388 private:
1364 InstX86SubRMW(Cfg *Func, 1389 InstX86SubRMW(Cfg *Func,
1365 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1390 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1366 Operand *Src1) 1391 Operand *Src1)
1367 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::SubRMW>( 1392 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::SubRMW>(
1368 Func, DestSrc0, Src1) {} 1393 Func, DestSrc0, Src1) {}
1369 }; 1394 };
1370 1395
1371 template <class Machine> 1396 template <class Machine>
1372 class InstX86Subps 1397 class InstX86Subps
1373 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true> { 1398 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true,
1399 InstX86Base<Machine>::SseSuffix::Packed> {
1374 public: 1400 public:
1375 static InstX86Subps *create(Cfg *Func, Variable *Dest, Operand *Source) { 1401 static InstX86Subps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1376 return new (Func->allocate<InstX86Subps>()) 1402 return new (Func->allocate<InstX86Subps>())
1377 InstX86Subps(Func, Dest, Source); 1403 InstX86Subps(Func, Dest, Source);
1378 } 1404 }
1379 1405
1380 private: 1406 private:
1381 InstX86Subps(Cfg *Func, Variable *Dest, Operand *Source) 1407 InstX86Subps(Cfg *Func, Variable *Dest, Operand *Source)
1382 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true>( 1408 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subps, true,
1383 Func, Dest, Source) {} 1409 InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
1410 Source) {}
1384 }; 1411 };
1385 1412
1386 template <class Machine> 1413 template <class Machine>
1387 class InstX86Subss 1414 class InstX86Subss
1388 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false> { 1415 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false,
1416 InstX86Base<Machine>::SseSuffix::Scalar> {
1389 public: 1417 public:
1390 static InstX86Subss *create(Cfg *Func, Variable *Dest, Operand *Source) { 1418 static InstX86Subss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1391 return new (Func->allocate<InstX86Subss>()) 1419 return new (Func->allocate<InstX86Subss>())
1392 InstX86Subss(Func, Dest, Source); 1420 InstX86Subss(Func, Dest, Source);
1393 } 1421 }
1394 1422
1395 void emit(const Cfg *Func) const override;
1396
1397 private: 1423 private:
1398 InstX86Subss(Cfg *Func, Variable *Dest, Operand *Source) 1424 InstX86Subss(Cfg *Func, Variable *Dest, Operand *Source)
1399 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false>( 1425 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Subss, false,
1400 Func, Dest, Source) {} 1426 InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
1427 Source) {}
1401 }; 1428 };
1402 1429
1403 template <class Machine> 1430 template <class Machine>
1404 class InstX86Sbb 1431 class InstX86Sbb
1405 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Sbb> { 1432 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Sbb> {
1406 public: 1433 public:
1407 static InstX86Sbb *create(Cfg *Func, Variable *Dest, Operand *Source) { 1434 static InstX86Sbb *create(Cfg *Func, Variable *Dest, Operand *Source) {
1408 return new (Func->allocate<InstX86Sbb>()) InstX86Sbb(Func, Dest, Source); 1435 return new (Func->allocate<InstX86Sbb>()) InstX86Sbb(Func, Dest, Source);
1409 } 1436 }
1410 1437
(...skipping 18 matching lines...) Expand all
1429 private: 1456 private:
1430 InstX86SbbRMW(Cfg *Func, 1457 InstX86SbbRMW(Cfg *Func,
1431 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1458 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1432 Operand *Src1) 1459 Operand *Src1)
1433 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::SbbRMW>( 1460 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::SbbRMW>(
1434 Func, DestSrc0, Src1) {} 1461 Func, DestSrc0, Src1) {}
1435 }; 1462 };
1436 1463
1437 template <class Machine> 1464 template <class Machine>
1438 class InstX86Psub 1465 class InstX86Psub
1439 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true> { 1466 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true,
1467 InstX86Base<Machine>::SseSuffix::None> {
1440 public: 1468 public:
1441 static InstX86Psub *create(Cfg *Func, Variable *Dest, Operand *Source) { 1469 static InstX86Psub *create(Cfg *Func, Variable *Dest, Operand *Source) {
1442 return new (Func->allocate<InstX86Psub>()) InstX86Psub(Func, Dest, Source); 1470 return new (Func->allocate<InstX86Psub>()) InstX86Psub(Func, Dest, Source);
1443 } 1471 }
1444 1472
1445 void emit(const Cfg *Func) const override; 1473 void emit(const Cfg *Func) const override;
1446 1474
1447 private: 1475 private:
1448 InstX86Psub(Cfg *Func, Variable *Dest, Operand *Source) 1476 InstX86Psub(Cfg *Func, Variable *Dest, Operand *Source)
1449 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true>( 1477 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Psub, true,
1450 Func, Dest, Source) {} 1478 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
1479 Source) {}
1451 }; 1480 };
1452 1481
1453 template <class Machine> 1482 template <class Machine>
1454 class InstX86And 1483 class InstX86And
1455 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::And> { 1484 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::And> {
1456 public: 1485 public:
1457 static InstX86And *create(Cfg *Func, Variable *Dest, Operand *Source) { 1486 static InstX86And *create(Cfg *Func, Variable *Dest, Operand *Source) {
1458 return new (Func->allocate<InstX86And>()) InstX86And(Func, Dest, Source); 1487 return new (Func->allocate<InstX86And>()) InstX86And(Func, Dest, Source);
1459 } 1488 }
1460 1489
1461 private: 1490 private:
1462 InstX86And(Cfg *Func, Variable *Dest, Operand *Source) 1491 InstX86And(Cfg *Func, Variable *Dest, Operand *Source)
1463 : InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::And>(Func, Dest, 1492 : InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::And>(Func, Dest,
1464 Source) {} 1493 Source) {}
1465 }; 1494 };
1466 1495
1467 template <class Machine> 1496 template <class Machine>
1468 class InstX86Andnps 1497 class InstX86Andnps
1469 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true> { 1498 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true,
1499 InstX86Base<Machine>::SseSuffix::Packed> {
1470 public: 1500 public:
1471 static InstX86Andnps *create(Cfg *Func, Variable *Dest, Operand *Source) { 1501 static InstX86Andnps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1472 return new (Func->allocate<InstX86Andnps>()) 1502 return new (Func->allocate<InstX86Andnps>())
1473 InstX86Andnps(Func, Dest, Source); 1503 InstX86Andnps(Func, Dest, Source);
1474 } 1504 }
1475 1505
1476 void emit(const Cfg *Func) const override;
1477
1478 private: 1506 private:
1479 InstX86Andnps(Cfg *Func, Variable *Dest, Operand *Source) 1507 InstX86Andnps(Cfg *Func, Variable *Dest, Operand *Source)
1480 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true>( 1508 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andnps, true,
1481 Func, Dest, Source) {} 1509 InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
1510 Source) {}
1482 }; 1511 };
1483 1512
1484 template <class Machine> 1513 template <class Machine>
1485 class InstX86Andps 1514 class InstX86Andps
1486 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true> { 1515 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true,
1516 InstX86Base<Machine>::SseSuffix::Packed> {
1487 public: 1517 public:
1488 static InstX86Andps *create(Cfg *Func, Variable *Dest, Operand *Source) { 1518 static InstX86Andps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1489 return new (Func->allocate<InstX86Andps>()) 1519 return new (Func->allocate<InstX86Andps>())
1490 InstX86Andps(Func, Dest, Source); 1520 InstX86Andps(Func, Dest, Source);
1491 } 1521 }
1492 1522
1493 void emit(const Cfg *Func) const override;
1494
1495 private: 1523 private:
1496 InstX86Andps(Cfg *Func, Variable *Dest, Operand *Source) 1524 InstX86Andps(Cfg *Func, Variable *Dest, Operand *Source)
1497 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true>( 1525 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Andps, true,
1498 Func, Dest, Source) {} 1526 InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
1527 Source) {}
1499 }; 1528 };
1500 1529
1501 template <class Machine> 1530 template <class Machine>
1502 class InstX86AndRMW 1531 class InstX86AndRMW
1503 : public InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::AndRMW> { 1532 : public InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::AndRMW> {
1504 public: 1533 public:
1505 static InstX86AndRMW * 1534 static InstX86AndRMW *
1506 create(Cfg *Func, 1535 create(Cfg *Func,
1507 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1536 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1508 Operand *Src1) { 1537 Operand *Src1) {
1509 return new (Func->allocate<InstX86AndRMW>()) 1538 return new (Func->allocate<InstX86AndRMW>())
1510 InstX86AndRMW(Func, DestSrc0, Src1); 1539 InstX86AndRMW(Func, DestSrc0, Src1);
1511 } 1540 }
1512 1541
1513 private: 1542 private:
1514 InstX86AndRMW(Cfg *Func, 1543 InstX86AndRMW(Cfg *Func,
1515 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1544 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1516 Operand *Src1) 1545 Operand *Src1)
1517 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::AndRMW>( 1546 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::AndRMW>(
1518 Func, DestSrc0, Src1) {} 1547 Func, DestSrc0, Src1) {}
1519 }; 1548 };
1520 1549
1521 template <class Machine> 1550 template <class Machine>
1522 class InstX86Pand 1551 class InstX86Pand
1523 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false> { 1552 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false,
1553 InstX86Base<Machine>::SseSuffix::None> {
1524 public: 1554 public:
1525 static InstX86Pand *create(Cfg *Func, Variable *Dest, Operand *Source) { 1555 static InstX86Pand *create(Cfg *Func, Variable *Dest, Operand *Source) {
1526 return new (Func->allocate<InstX86Pand>()) InstX86Pand(Func, Dest, Source); 1556 return new (Func->allocate<InstX86Pand>()) InstX86Pand(Func, Dest, Source);
1527 } 1557 }
1528 1558
1529 private: 1559 private:
1530 InstX86Pand(Cfg *Func, Variable *Dest, Operand *Source) 1560 InstX86Pand(Cfg *Func, Variable *Dest, Operand *Source)
1531 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false>( 1561 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pand, false,
1532 Func, Dest, Source) {} 1562 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
1563 Source) {}
1533 }; 1564 };
1534 1565
1535 template <class Machine> 1566 template <class Machine>
1536 class InstX86Pandn 1567 class InstX86Pandn
1537 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false> { 1568 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false,
1569 InstX86Base<Machine>::SseSuffix::None> {
1538 public: 1570 public:
1539 static InstX86Pandn *create(Cfg *Func, Variable *Dest, Operand *Source) { 1571 static InstX86Pandn *create(Cfg *Func, Variable *Dest, Operand *Source) {
1540 return new (Func->allocate<InstX86Pandn>()) 1572 return new (Func->allocate<InstX86Pandn>())
1541 InstX86Pandn(Func, Dest, Source); 1573 InstX86Pandn(Func, Dest, Source);
1542 } 1574 }
1543 1575
1544 private: 1576 private:
1545 InstX86Pandn(Cfg *Func, Variable *Dest, Operand *Source) 1577 InstX86Pandn(Cfg *Func, Variable *Dest, Operand *Source)
1546 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false>( 1578 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pandn, false,
1547 Func, Dest, Source) {} 1579 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
1580 Source) {}
1548 }; 1581 };
1549 1582
1550 template <class Machine> 1583 template <class Machine>
1551 class InstX86Maxss 1584 class InstX86Maxss
1552 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true> { 1585 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true,
1586 InstX86Base<Machine>::SseSuffix::Scalar> {
1553 public: 1587 public:
1554 static InstX86Maxss *create(Cfg *Func, Variable *Dest, Operand *Source) { 1588 static InstX86Maxss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1555 return new (Func->allocate<InstX86Maxss>()) 1589 return new (Func->allocate<InstX86Maxss>())
1556 InstX86Maxss(Func, Dest, Source); 1590 InstX86Maxss(Func, Dest, Source);
1557 } 1591 }
1558 1592
1559 void emit(const Cfg *Func) const override;
1560
1561 private: 1593 private:
1562 InstX86Maxss(Cfg *Func, Variable *Dest, Operand *Source) 1594 InstX86Maxss(Cfg *Func, Variable *Dest, Operand *Source)
1563 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true>( 1595 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Maxss, true,
1564 Func, Dest, Source) {} 1596 InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
1597 Source) {}
1565 }; 1598 };
1566 1599
1567 template <class Machine> 1600 template <class Machine>
1568 class InstX86Minss 1601 class InstX86Minss
1569 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true> { 1602 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true,
1603 InstX86Base<Machine>::SseSuffix::Scalar> {
1570 public: 1604 public:
1571 static InstX86Minss *create(Cfg *Func, Variable *Dest, Operand *Source) { 1605 static InstX86Minss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1572 return new (Func->allocate<InstX86Minss>()) 1606 return new (Func->allocate<InstX86Minss>())
1573 InstX86Minss(Func, Dest, Source); 1607 InstX86Minss(Func, Dest, Source);
1574 } 1608 }
1575 1609
1576 void emit(const Cfg *Func) const override;
1577
1578 private: 1610 private:
1579 InstX86Minss(Cfg *Func, Variable *Dest, Operand *Source) 1611 InstX86Minss(Cfg *Func, Variable *Dest, Operand *Source)
1580 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true>( 1612 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Minss, true,
1581 Func, Dest, Source) {} 1613 InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
1614 Source) {}
1582 }; 1615 };
1583 1616
1584 template <class Machine> 1617 template <class Machine>
1585 class InstX86Or 1618 class InstX86Or
1586 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Or> { 1619 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Or> {
1587 public: 1620 public:
1588 static InstX86Or *create(Cfg *Func, Variable *Dest, Operand *Source) { 1621 static InstX86Or *create(Cfg *Func, Variable *Dest, Operand *Source) {
1589 return new (Func->allocate<InstX86Or>()) InstX86Or(Func, Dest, Source); 1622 return new (Func->allocate<InstX86Or>()) InstX86Or(Func, Dest, Source);
1590 } 1623 }
1591 1624
1592 private: 1625 private:
1593 InstX86Or(Cfg *Func, Variable *Dest, Operand *Source) 1626 InstX86Or(Cfg *Func, Variable *Dest, Operand *Source)
1594 : InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Or>(Func, Dest, 1627 : InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Or>(Func, Dest,
1595 Source) {} 1628 Source) {}
1596 }; 1629 };
1597 1630
1598 template <class Machine> 1631 template <class Machine>
1599 class InstX86Orps 1632 class InstX86Orps
1600 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true> { 1633 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true,
1634 InstX86Base<Machine>::SseSuffix::Packed> {
1601 public: 1635 public:
1602 static InstX86Orps *create(Cfg *Func, Variable *Dest, Operand *Source) { 1636 static InstX86Orps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1603 return new (Func->allocate<InstX86Orps>()) InstX86Orps(Func, Dest, Source); 1637 return new (Func->allocate<InstX86Orps>()) InstX86Orps(Func, Dest, Source);
1604 } 1638 }
1605 1639
1606 void emit(const Cfg *Func) const override;
1607
1608 private: 1640 private:
1609 InstX86Orps(Cfg *Func, Variable *Dest, Operand *Source) 1641 InstX86Orps(Cfg *Func, Variable *Dest, Operand *Source)
1610 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true>( 1642 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Orps, true,
1611 Func, Dest, Source) {} 1643 InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
1644 Source) {}
1612 }; 1645 };
1613 1646
1614 template <class Machine> 1647 template <class Machine>
1615 class InstX86OrRMW 1648 class InstX86OrRMW
1616 : public InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::OrRMW> { 1649 : public InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::OrRMW> {
1617 public: 1650 public:
1618 static InstX86OrRMW * 1651 static InstX86OrRMW *
1619 create(Cfg *Func, 1652 create(Cfg *Func,
1620 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1653 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1621 Operand *Src1) { 1654 Operand *Src1) {
1622 return new (Func->allocate<InstX86OrRMW>()) 1655 return new (Func->allocate<InstX86OrRMW>())
1623 InstX86OrRMW(Func, DestSrc0, Src1); 1656 InstX86OrRMW(Func, DestSrc0, Src1);
1624 } 1657 }
1625 1658
1626 private: 1659 private:
1627 InstX86OrRMW(Cfg *Func, 1660 InstX86OrRMW(Cfg *Func,
1628 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1661 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1629 Operand *Src1) 1662 Operand *Src1)
1630 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::OrRMW>( 1663 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::OrRMW>(
1631 Func, DestSrc0, Src1) {} 1664 Func, DestSrc0, Src1) {}
1632 }; 1665 };
1633 1666
1634 template <class Machine> 1667 template <class Machine>
1635 class InstX86Por 1668 class InstX86Por
1636 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false> { 1669 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false,
1670 InstX86Base<Machine>::SseSuffix::None> {
1637 public: 1671 public:
1638 static InstX86Por *create(Cfg *Func, Variable *Dest, Operand *Source) { 1672 static InstX86Por *create(Cfg *Func, Variable *Dest, Operand *Source) {
1639 return new (Func->allocate<InstX86Por>()) InstX86Por(Func, Dest, Source); 1673 return new (Func->allocate<InstX86Por>()) InstX86Por(Func, Dest, Source);
1640 } 1674 }
1641 1675
1642 private: 1676 private:
1643 InstX86Por(Cfg *Func, Variable *Dest, Operand *Source) 1677 InstX86Por(Cfg *Func, Variable *Dest, Operand *Source)
1644 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false>( 1678 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Por, false,
1645 Func, Dest, Source) {} 1679 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
1680 Source) {}
1646 }; 1681 };
1647 1682
1648 template <class Machine> 1683 template <class Machine>
1649 class InstX86Xor 1684 class InstX86Xor
1650 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Xor> { 1685 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Xor> {
1651 public: 1686 public:
1652 static InstX86Xor *create(Cfg *Func, Variable *Dest, Operand *Source) { 1687 static InstX86Xor *create(Cfg *Func, Variable *Dest, Operand *Source) {
1653 return new (Func->allocate<InstX86Xor>()) InstX86Xor(Func, Dest, Source); 1688 return new (Func->allocate<InstX86Xor>()) InstX86Xor(Func, Dest, Source);
1654 } 1689 }
1655 1690
1656 private: 1691 private:
1657 InstX86Xor(Cfg *Func, Variable *Dest, Operand *Source) 1692 InstX86Xor(Cfg *Func, Variable *Dest, Operand *Source)
1658 : InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Xor>(Func, Dest, 1693 : InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Xor>(Func, Dest,
1659 Source) {} 1694 Source) {}
1660 }; 1695 };
1661 1696
1662 template <class Machine> 1697 template <class Machine>
1663 class InstX86Xorps 1698 class InstX86Xorps
1664 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true> { 1699 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true,
1700 InstX86Base<Machine>::SseSuffix::Packed> {
1665 public: 1701 public:
1666 static InstX86Xorps *create(Cfg *Func, Variable *Dest, Operand *Source) { 1702 static InstX86Xorps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1667 return new (Func->allocate<InstX86Xorps>()) 1703 return new (Func->allocate<InstX86Xorps>())
1668 InstX86Xorps(Func, Dest, Source); 1704 InstX86Xorps(Func, Dest, Source);
1669 } 1705 }
1670 1706
1671 void emit(const Cfg *Func) const override;
1672
1673 private: 1707 private:
1674 InstX86Xorps(Cfg *Func, Variable *Dest, Operand *Source) 1708 InstX86Xorps(Cfg *Func, Variable *Dest, Operand *Source)
1675 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true>( 1709 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Xorps, true,
1676 Func, Dest, Source) {} 1710 InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
1711 Source) {}
1677 }; 1712 };
1678 1713
1679 template <class Machine> 1714 template <class Machine>
1680 class InstX86XorRMW 1715 class InstX86XorRMW
1681 : public InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::XorRMW> { 1716 : public InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::XorRMW> {
1682 public: 1717 public:
1683 static InstX86XorRMW * 1718 static InstX86XorRMW *
1684 create(Cfg *Func, 1719 create(Cfg *Func,
1685 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1720 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1686 Operand *Src1) { 1721 Operand *Src1) {
1687 return new (Func->allocate<InstX86XorRMW>()) 1722 return new (Func->allocate<InstX86XorRMW>())
1688 InstX86XorRMW(Func, DestSrc0, Src1); 1723 InstX86XorRMW(Func, DestSrc0, Src1);
1689 } 1724 }
1690 1725
1691 private: 1726 private:
1692 InstX86XorRMW(Cfg *Func, 1727 InstX86XorRMW(Cfg *Func,
1693 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0, 1728 typename InstX86Base<Machine>::Traits::X86OperandMem *DestSrc0,
1694 Operand *Src1) 1729 Operand *Src1)
1695 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::XorRMW>( 1730 : InstX86BaseBinopRMW<Machine, InstX86Base<Machine>::XorRMW>(
1696 Func, DestSrc0, Src1) {} 1731 Func, DestSrc0, Src1) {}
1697 }; 1732 };
1698 1733
1699 template <class Machine> 1734 template <class Machine>
1700 class InstX86Pxor 1735 class InstX86Pxor
1701 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false> { 1736 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false,
1737 InstX86Base<Machine>::SseSuffix::None> {
1702 public: 1738 public:
1703 static InstX86Pxor *create(Cfg *Func, Variable *Dest, Operand *Source) { 1739 static InstX86Pxor *create(Cfg *Func, Variable *Dest, Operand *Source) {
1704 return new (Func->allocate<InstX86Pxor>()) InstX86Pxor(Func, Dest, Source); 1740 return new (Func->allocate<InstX86Pxor>()) InstX86Pxor(Func, Dest, Source);
1705 } 1741 }
1706 1742
1707 private: 1743 private:
1708 InstX86Pxor(Cfg *Func, Variable *Dest, Operand *Source) 1744 InstX86Pxor(Cfg *Func, Variable *Dest, Operand *Source)
1709 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false>( 1745 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pxor, false,
1710 Func, Dest, Source) {} 1746 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
1747 Source) {}
1711 }; 1748 };
1712 1749
1713 template <class Machine> 1750 template <class Machine>
1714 class InstX86Imul 1751 class InstX86Imul
1715 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Imul> { 1752 : public InstX86BaseBinopGPR<Machine, InstX86Base<Machine>::Imul> {
1716 public: 1753 public:
1717 static InstX86Imul *create(Cfg *Func, Variable *Dest, Operand *Source) { 1754 static InstX86Imul *create(Cfg *Func, Variable *Dest, Operand *Source) {
1718 return new (Func->allocate<InstX86Imul>()) InstX86Imul(Func, Dest, Source); 1755 return new (Func->allocate<InstX86Imul>()) InstX86Imul(Func, Dest, Source);
1719 } 1756 }
1720 1757
(...skipping 20 matching lines...) Expand all
1741 void emitIAS(const Cfg *Func) const override; 1778 void emitIAS(const Cfg *Func) const override;
1742 1779
1743 private: 1780 private:
1744 InstX86ImulImm(Cfg *Func, Variable *Dest, Operand *Source0, Operand *Source1) 1781 InstX86ImulImm(Cfg *Func, Variable *Dest, Operand *Source0, Operand *Source1)
1745 : InstX86BaseThreeAddressop<Machine, InstX86Base<Machine>::ImulImm>( 1782 : InstX86BaseThreeAddressop<Machine, InstX86Base<Machine>::ImulImm>(
1746 Func, Dest, Source0, Source1) {} 1783 Func, Dest, Source0, Source1) {}
1747 }; 1784 };
1748 1785
1749 template <class Machine> 1786 template <class Machine>
1750 class InstX86Mulps 1787 class InstX86Mulps
1751 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true> { 1788 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true,
1789 InstX86Base<Machine>::SseSuffix::Packed> {
1752 public: 1790 public:
1753 static InstX86Mulps *create(Cfg *Func, Variable *Dest, Operand *Source) { 1791 static InstX86Mulps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1754 return new (Func->allocate<InstX86Mulps>()) 1792 return new (Func->allocate<InstX86Mulps>())
1755 InstX86Mulps(Func, Dest, Source); 1793 InstX86Mulps(Func, Dest, Source);
1756 } 1794 }
1757 1795
1758 private: 1796 private:
1759 InstX86Mulps(Cfg *Func, Variable *Dest, Operand *Source) 1797 InstX86Mulps(Cfg *Func, Variable *Dest, Operand *Source)
1760 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true>( 1798 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulps, true,
1761 Func, Dest, Source) {} 1799 InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
1800 Source) {}
1762 }; 1801 };
1763 1802
1764 template <class Machine> 1803 template <class Machine>
1765 class InstX86Mulss 1804 class InstX86Mulss
1766 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false> { 1805 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false,
1806 InstX86Base<Machine>::SseSuffix::Scalar> {
1767 public: 1807 public:
1768 static InstX86Mulss *create(Cfg *Func, Variable *Dest, Operand *Source) { 1808 static InstX86Mulss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1769 return new (Func->allocate<InstX86Mulss>()) 1809 return new (Func->allocate<InstX86Mulss>())
1770 InstX86Mulss(Func, Dest, Source); 1810 InstX86Mulss(Func, Dest, Source);
1771 } 1811 }
1772 1812
1773 void emit(const Cfg *Func) const override;
1774
1775 private: 1813 private:
1776 InstX86Mulss(Cfg *Func, Variable *Dest, Operand *Source) 1814 InstX86Mulss(Cfg *Func, Variable *Dest, Operand *Source)
1777 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false>( 1815 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Mulss, false,
1778 Func, Dest, Source) {} 1816 InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
1817 Source) {}
1779 }; 1818 };
1780 1819
1781 template <class Machine> 1820 template <class Machine>
1782 class InstX86Pmull 1821 class InstX86Pmull
1783 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true> { 1822 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true,
1823 InstX86Base<Machine>::SseSuffix::None> {
1784 public: 1824 public:
1785 static InstX86Pmull *create(Cfg *Func, Variable *Dest, Operand *Source) { 1825 static InstX86Pmull *create(Cfg *Func, Variable *Dest, Operand *Source) {
1786 return new (Func->allocate<InstX86Pmull>()) 1826 return new (Func->allocate<InstX86Pmull>())
1787 InstX86Pmull(Func, Dest, Source); 1827 InstX86Pmull(Func, Dest, Source);
1788 } 1828 }
1789 1829
1790 void emit(const Cfg *Func) const override; 1830 void emit(const Cfg *Func) const override;
1791 void emitIAS(const Cfg *Func) const override; 1831 void emitIAS(const Cfg *Func) const override;
1792 1832
1793 private: 1833 private:
1794 InstX86Pmull(Cfg *Func, Variable *Dest, Operand *Source) 1834 InstX86Pmull(Cfg *Func, Variable *Dest, Operand *Source)
1795 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true>( 1835 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmull, true,
1796 Func, Dest, Source) {} 1836 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
1837 Source) {}
1797 }; 1838 };
1798 1839
1799 template <class Machine> 1840 template <class Machine>
1800 class InstX86Pmuludq 1841 class InstX86Pmuludq
1801 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, 1842 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, false,
1802 false> { 1843 InstX86Base<Machine>::SseSuffix::None> {
1803 public: 1844 public:
1804 static InstX86Pmuludq *create(Cfg *Func, Variable *Dest, Operand *Source) { 1845 static InstX86Pmuludq *create(Cfg *Func, Variable *Dest, Operand *Source) {
1805 return new (Func->allocate<InstX86Pmuludq>()) 1846 return new (Func->allocate<InstX86Pmuludq>())
1806 InstX86Pmuludq(Func, Dest, Source); 1847 InstX86Pmuludq(Func, Dest, Source);
1807 } 1848 }
1808 1849
1809 void emit(const Cfg *Func) const override; 1850 void emit(const Cfg *Func) const override;
1810 1851
1811 private: 1852 private:
1812 InstX86Pmuludq(Cfg *Func, Variable *Dest, Operand *Source) 1853 InstX86Pmuludq(Cfg *Func, Variable *Dest, Operand *Source)
1813 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, false>( 1854 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pmuludq, false,
1814 Func, Dest, Source) {} 1855 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
1856 Source) {}
1815 }; 1857 };
1816 1858
1817 template <class Machine> 1859 template <class Machine>
1818 class InstX86Divps 1860 class InstX86Divps
1819 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true> { 1861 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true,
1862 InstX86Base<Machine>::SseSuffix::Packed> {
1820 public: 1863 public:
1821 static InstX86Divps *create(Cfg *Func, Variable *Dest, Operand *Source) { 1864 static InstX86Divps *create(Cfg *Func, Variable *Dest, Operand *Source) {
1822 return new (Func->allocate<InstX86Divps>()) 1865 return new (Func->allocate<InstX86Divps>())
1823 InstX86Divps(Func, Dest, Source); 1866 InstX86Divps(Func, Dest, Source);
1824 } 1867 }
1825 1868
1826 private: 1869 private:
1827 InstX86Divps(Cfg *Func, Variable *Dest, Operand *Source) 1870 InstX86Divps(Cfg *Func, Variable *Dest, Operand *Source)
1828 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true>( 1871 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divps, true,
1829 Func, Dest, Source) {} 1872 InstX86Base<Machine>::SseSuffix::Packed>(Func, Dest,
1873 Source) {}
1830 }; 1874 };
1831 1875
1832 template <class Machine> 1876 template <class Machine>
1833 class InstX86Divss 1877 class InstX86Divss
1834 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false> { 1878 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false,
1879 InstX86Base<Machine>::SseSuffix::Scalar> {
1835 public: 1880 public:
1836 static InstX86Divss *create(Cfg *Func, Variable *Dest, Operand *Source) { 1881 static InstX86Divss *create(Cfg *Func, Variable *Dest, Operand *Source) {
1837 return new (Func->allocate<InstX86Divss>()) 1882 return new (Func->allocate<InstX86Divss>())
1838 InstX86Divss(Func, Dest, Source); 1883 InstX86Divss(Func, Dest, Source);
1839 } 1884 }
1840 1885
1841 void emit(const Cfg *Func) const override;
1842
1843 private: 1886 private:
1844 InstX86Divss(Cfg *Func, Variable *Dest, Operand *Source) 1887 InstX86Divss(Cfg *Func, Variable *Dest, Operand *Source)
1845 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false>( 1888 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Divss, false,
1846 Func, Dest, Source) {} 1889 InstX86Base<Machine>::SseSuffix::Scalar>(Func, Dest,
1890 Source) {}
1847 }; 1891 };
1848 1892
1849 template <class Machine> 1893 template <class Machine>
1850 class InstX86Rol 1894 class InstX86Rol
1851 : public InstX86BaseBinopGPRShift<Machine, InstX86Base<Machine>::Rol> { 1895 : public InstX86BaseBinopGPRShift<Machine, InstX86Base<Machine>::Rol> {
1852 public: 1896 public:
1853 static InstX86Rol *create(Cfg *Func, Variable *Dest, Operand *Source) { 1897 static InstX86Rol *create(Cfg *Func, Variable *Dest, Operand *Source) {
1854 return new (Func->allocate<InstX86Rol>()) InstX86Rol(Func, Dest, Source); 1898 return new (Func->allocate<InstX86Rol>()) InstX86Rol(Func, Dest, Source);
1855 } 1899 }
1856 1900
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
1946 void emit(const Cfg *Func) const override; 1990 void emit(const Cfg *Func) const override;
1947 1991
1948 private: 1992 private:
1949 InstX86Psra(Cfg *Func, Variable *Dest, Operand *Source) 1993 InstX86Psra(Cfg *Func, Variable *Dest, Operand *Source)
1950 : InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psra>( 1994 : InstX86BaseBinopXmmShift<Machine, InstX86Base<Machine>::Psra>(
1951 Func, Dest, Source) {} 1995 Func, Dest, Source) {}
1952 }; 1996 };
1953 1997
1954 template <class Machine> 1998 template <class Machine>
1955 class InstX86Pcmpeq 1999 class InstX86Pcmpeq
1956 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true> { 2000 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true,
2001 InstX86Base<Machine>::SseSuffix::None> {
1957 public: 2002 public:
1958 static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source) { 2003 static InstX86Pcmpeq *create(Cfg *Func, Variable *Dest, Operand *Source) {
1959 return new (Func->allocate<InstX86Pcmpeq>()) 2004 return new (Func->allocate<InstX86Pcmpeq>())
1960 InstX86Pcmpeq(Func, Dest, Source); 2005 InstX86Pcmpeq(Func, Dest, Source);
1961 } 2006 }
1962 2007
1963 void emit(const Cfg *Func) const override; 2008 void emit(const Cfg *Func) const override;
1964 2009
1965 private: 2010 private:
1966 InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source) 2011 InstX86Pcmpeq(Cfg *Func, Variable *Dest, Operand *Source)
1967 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true>( 2012 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpeq, true,
1968 Func, Dest, Source) {} 2013 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
2014 Source) {}
1969 }; 2015 };
1970 2016
1971 template <class Machine> 2017 template <class Machine>
1972 class InstX86Pcmpgt 2018 class InstX86Pcmpgt
1973 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true> { 2019 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true,
2020 InstX86Base<Machine>::SseSuffix::None> {
1974 public: 2021 public:
1975 static InstX86Pcmpgt *create(Cfg *Func, Variable *Dest, Operand *Source) { 2022 static InstX86Pcmpgt *create(Cfg *Func, Variable *Dest, Operand *Source) {
1976 return new (Func->allocate<InstX86Pcmpgt>()) 2023 return new (Func->allocate<InstX86Pcmpgt>())
1977 InstX86Pcmpgt(Func, Dest, Source); 2024 InstX86Pcmpgt(Func, Dest, Source);
1978 } 2025 }
1979 2026
1980 void emit(const Cfg *Func) const override; 2027 void emit(const Cfg *Func) const override;
1981 2028
1982 private: 2029 private:
1983 InstX86Pcmpgt(Cfg *Func, Variable *Dest, Operand *Source) 2030 InstX86Pcmpgt(Cfg *Func, Variable *Dest, Operand *Source)
1984 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true>( 2031 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::Pcmpgt, true,
1985 Func, Dest, Source) {} 2032 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
2033 Source) {}
1986 }; 2034 };
1987 2035
1988 /// movss is only a binary operation when the source and dest operands are both 2036 /// movss is only a binary operation when the source and dest operands are both
1989 /// registers (the high bits of dest are left untouched). In other cases, it 2037 /// registers (the high bits of dest are left untouched). In other cases, it
1990 /// behaves like a copy (mov-like) operation (and the high bits of dest are 2038 /// behaves like a copy (mov-like) operation (and the high bits of dest are
1991 /// cleared). InstX86Movss will assert that both its source and dest operands 2039 /// cleared). InstX86Movss will assert that both its source and dest operands
1992 /// are registers, so the lowering code should use _mov instead of _movss in 2040 /// are registers, so the lowering code should use _mov instead of _movss in
1993 /// cases where a copy operation is intended. 2041 /// cases where a copy operation is intended.
1994 template <class Machine> 2042 template <class Machine>
1995 class InstX86MovssRegs 2043 class InstX86MovssRegs
1996 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs, 2044 : public InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs,
1997 false> { 2045 false, InstX86Base<Machine>::SseSuffix::None> {
1998 public: 2046 public:
1999 static InstX86MovssRegs *create(Cfg *Func, Variable *Dest, Operand *Source) { 2047 static InstX86MovssRegs *create(Cfg *Func, Variable *Dest, Operand *Source) {
2000 return new (Func->allocate<InstX86MovssRegs>()) 2048 return new (Func->allocate<InstX86MovssRegs>())
2001 InstX86MovssRegs(Func, Dest, Source); 2049 InstX86MovssRegs(Func, Dest, Source);
2002 } 2050 }
2003 2051
2004 void emitIAS(const Cfg *Func) const override; 2052 void emitIAS(const Cfg *Func) const override;
2005 2053
2006 private: 2054 private:
2007 InstX86MovssRegs(Cfg *Func, Variable *Dest, Operand *Source) 2055 InstX86MovssRegs(Cfg *Func, Variable *Dest, Operand *Source)
2008 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs, false>( 2056 : InstX86BaseBinopXmm<Machine, InstX86Base<Machine>::MovssRegs, false,
2009 Func, Dest, Source) {} 2057 InstX86Base<Machine>::SseSuffix::None>(Func, Dest,
2058 Source) {}
2010 }; 2059 };
2011 2060
2012 template <class Machine> 2061 template <class Machine>
2013 class InstX86Idiv 2062 class InstX86Idiv
2014 : public InstX86BaseTernop<Machine, InstX86Base<Machine>::Idiv> { 2063 : public InstX86BaseTernop<Machine, InstX86Base<Machine>::Idiv> {
2015 public: 2064 public:
2016 static InstX86Idiv *create(Cfg *Func, Variable *Dest, Operand *Source1, 2065 static InstX86Idiv *create(Cfg *Func, Variable *Dest, Operand *Source1,
2017 Operand *Source2) { 2066 Operand *Source2) {
2018 return new (Func->allocate<InstX86Idiv>()) 2067 return new (Func->allocate<InstX86Idiv>())
2019 InstX86Idiv(Func, Dest, Source1, Source2); 2068 InstX86Idiv(Func, Dest, Source1, Source2);
(...skipping 1345 matching lines...) Expand 10 before | Expand all | Expand 10 after
3365 &InstX86Base<Machine>::Traits::Assembler::psrl}; \ 3414 &InstX86Base<Machine>::Traits::Assembler::psrl}; \
3366 } \ 3415 } \
3367 } 3416 }
3368 3417
3369 } // end of namespace X86Internal 3418 } // end of namespace X86Internal
3370 } // end of namespace Ice 3419 } // end of namespace Ice
3371 3420
3372 #include "IceInstX86BaseImpl.h" 3421 #include "IceInstX86BaseImpl.h"
3373 3422
3374 #endif // SUBZERO_SRC_ICEINSTX86BASE_H 3423 #endif // SUBZERO_SRC_ICEINSTX86BASE_H
OLDNEW
« no previous file with comments | « no previous file | src/IceInstX86BaseImpl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698