OLD | NEW |
---|---|
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |