Chromium Code Reviews| 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 |