| OLD | NEW |
| 1 //===- subzero/src/IceInstMIPS32.h - MIPS32 machine instrs --*- C++ -*-=== // | 1 //===- subzero/src/IceInstMIPS32.h - MIPS32 machine instrs --*- 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 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 112 /// Base class for Mips instructions. | 112 /// Base class for Mips instructions. |
| 113 class InstMIPS32 : public InstTarget { | 113 class InstMIPS32 : public InstTarget { |
| 114 InstMIPS32() = delete; | 114 InstMIPS32() = delete; |
| 115 InstMIPS32(const InstMIPS32 &) = delete; | 115 InstMIPS32(const InstMIPS32 &) = delete; |
| 116 InstMIPS32 &operator=(const InstMIPS32 &) = delete; | 116 InstMIPS32 &operator=(const InstMIPS32 &) = delete; |
| 117 | 117 |
| 118 public: | 118 public: |
| 119 enum InstKindMIPS32 { | 119 enum InstKindMIPS32 { |
| 120 k__Start = Inst::Target, | 120 k__Start = Inst::Target, |
| 121 Add, | 121 Add, |
| 122 Add_d, |
| 123 Add_s, |
| 122 Addiu, | 124 Addiu, |
| 123 Addu, | 125 Addu, |
| 124 And, | 126 And, |
| 125 Andi, | 127 Andi, |
| 126 Br, | 128 Br, |
| 127 Call, | 129 Call, |
| 128 Div, | 130 Div, |
| 131 Div_d, |
| 132 Div_s, |
| 129 Divu, | 133 Divu, |
| 130 La, | 134 La, |
| 131 Label, | 135 Label, |
| 132 Lui, | 136 Lui, |
| 137 Mfc1, |
| 133 Mfhi, | 138 Mfhi, |
| 134 Mflo, | 139 Mflo, |
| 135 Mov, // actually a pseudo op for addi rd, rs, 0 | 140 Mov, // actually a pseudo op for addi rd, rs, 0 |
| 141 Mov_d, |
| 142 Mov_s, |
| 143 Mtc1, |
| 136 Mthi, | 144 Mthi, |
| 137 Mtlo, | 145 Mtlo, |
| 138 Mul, | 146 Mul, |
| 147 Mul_d, |
| 148 Mul_s, |
| 139 Mult, | 149 Mult, |
| 140 Multu, | 150 Multu, |
| 141 Or, | 151 Or, |
| 142 Ori, | 152 Ori, |
| 143 Ret, | 153 Ret, |
| 144 Sll, | 154 Sll, |
| 145 Sllv, | 155 Sllv, |
| 146 Slt, | 156 Slt, |
| 147 Slti, | 157 Slti, |
| 148 Sltiu, | 158 Sltiu, |
| 149 Sltu, | 159 Sltu, |
| 150 Sra, | 160 Sra, |
| 151 Srav, | 161 Srav, |
| 152 Srl, | 162 Srl, |
| 153 Srlv, | 163 Srlv, |
| 154 Sub, | 164 Sub, |
| 165 Sub_d, |
| 166 Sub_s, |
| 155 Subu, | 167 Subu, |
| 156 Xor, | 168 Xor, |
| 157 Xori | 169 Xori |
| 158 }; | 170 }; |
| 159 | 171 |
| 160 static const char *getWidthString(Type Ty); | 172 static const char *getWidthString(Type Ty); |
| 161 | 173 |
| 162 void dump(const Cfg *Func) const override; | 174 void dump(const Cfg *Func) const override; |
| 163 | 175 |
| 164 void dumpOpcode(Ostream &Str, const char *Opcode, Type Ty) const { | 176 void dumpOpcode(Ostream &Str, const char *Opcode, Type Ty) const { |
| 165 Str << Opcode << "." << Ty; | 177 Str << Opcode << "." << Ty; |
| 166 } | 178 } |
| 167 | 179 |
| 168 // TODO(rkotler): while branching is not implemented | 180 // TODO(rkotler): while branching is not implemented |
| 169 bool repointEdges(CfgNode *, CfgNode *) override { return true; } | 181 bool repointEdges(CfgNode *, CfgNode *) override { return true; } |
| 170 | 182 |
| 171 /// Shared emit routines for common forms of instructions. | 183 /// Shared emit routines for common forms of instructions. |
| 172 static void emitUnaryopGPR(const char *Opcode, const InstMIPS32 *Inst, | 184 static void emitUnaryopGPR(const char *Opcode, const InstMIPS32 *Inst, |
| 173 const Cfg *Func); | 185 const Cfg *Func); |
| 174 static void emitUnaryopGPRFLoHi(const char *Opcode, const InstMIPS32 *Inst, | 186 static void emitUnaryopGPRFLoHi(const char *Opcode, const InstMIPS32 *Inst, |
| 175 const Cfg *Func); | 187 const Cfg *Func); |
| 176 static void emitUnaryopGPRTLoHi(const char *Opcode, const InstMIPS32 *Inst, | 188 static void emitUnaryopGPRTLoHi(const char *Opcode, const InstMIPS32 *Inst, |
| 177 const Cfg *Func); | 189 const Cfg *Func); |
| 190 static void emitTwoAddr(const char *Opcode, const InstMIPS32 *Inst, |
| 191 const Cfg *Func); |
| 178 static void emitThreeAddr(const char *Opcode, const InstMIPS32 *Inst, | 192 static void emitThreeAddr(const char *Opcode, const InstMIPS32 *Inst, |
| 179 const Cfg *Func); | 193 const Cfg *Func); |
| 180 static void emitThreeAddrLoHi(const char *Opcode, const InstMIPS32 *Inst, | 194 static void emitThreeAddrLoHi(const char *Opcode, const InstMIPS32 *Inst, |
| 181 const Cfg *Func); | 195 const Cfg *Func); |
| 182 | 196 |
| 183 protected: | 197 protected: |
| 184 InstMIPS32(Cfg *Func, InstKindMIPS32 Kind, SizeT Maxsrcs, Variable *Dest) | 198 InstMIPS32(Cfg *Func, InstKindMIPS32 Kind, SizeT Maxsrcs, Variable *Dest) |
| 185 : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {} | 199 : InstTarget(Func, static_cast<InstKind>(Kind), Maxsrcs, Dest) {} |
| 186 static bool isClassof(const Inst *Inst, InstKindMIPS32 MyKind) { | 200 static bool isClassof(const Inst *Inst, InstKindMIPS32 MyKind) { |
| 187 return Inst->getKind() == static_cast<InstKind>(MyKind); | 201 return Inst->getKind() == static_cast<InstKind>(MyKind); |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 252 protected: | 266 protected: |
| 253 InstMIPS32UnaryopGPR(Cfg *Func, Variable *Dest, Operand *Src) | 267 InstMIPS32UnaryopGPR(Cfg *Func, Variable *Dest, Operand *Src) |
| 254 : InstMIPS32(Func, K, 1, Dest) { | 268 : InstMIPS32(Func, K, 1, Dest) { |
| 255 addSource(Src); | 269 addSource(Src); |
| 256 } | 270 } |
| 257 | 271 |
| 258 private: | 272 private: |
| 259 static const char *Opcode; | 273 static const char *Opcode; |
| 260 }; | 274 }; |
| 261 | 275 |
| 276 /// Instructions of the form opcode reg, reg. |
| 277 template <InstMIPS32::InstKindMIPS32 K> |
| 278 class InstMIPS32TwoAddrFPR : public InstMIPS32 { |
| 279 InstMIPS32TwoAddrFPR() = delete; |
| 280 InstMIPS32TwoAddrFPR(const InstMIPS32TwoAddrFPR &) = delete; |
| 281 InstMIPS32TwoAddrFPR &operator=(const InstMIPS32TwoAddrFPR &) = delete; |
| 282 |
| 283 public: |
| 284 static InstMIPS32TwoAddrFPR *create(Cfg *Func, Variable *Dest, |
| 285 Variable *Src0) { |
| 286 return new (Func->allocate<InstMIPS32TwoAddrFPR>()) |
| 287 InstMIPS32TwoAddrFPR(Func, Dest, Src0); |
| 288 } |
| 289 void emit(const Cfg *Func) const override { |
| 290 if (!BuildDefs::dump()) |
| 291 return; |
| 292 emitTwoAddr(Opcode, this, Func); |
| 293 } |
| 294 void emitIAS(const Cfg *Func) const override { |
| 295 (void)Func; |
| 296 llvm_unreachable("Not yet implemented"); |
| 297 } |
| 298 |
| 299 void dump(const Cfg *Func) const override { |
| 300 if (!BuildDefs::dump()) |
| 301 return; |
| 302 Ostream &Str = Func->getContext()->getStrDump(); |
| 303 dumpDest(Func); |
| 304 Str << " = "; |
| 305 dumpOpcode(Str, Opcode, getDest()->getType()); |
| 306 Str << " "; |
| 307 dumpSources(Func); |
| 308 } |
| 309 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
| 310 |
| 311 private: |
| 312 InstMIPS32TwoAddrFPR(Cfg *Func, Variable *Dest, Variable *Src0) |
| 313 : InstMIPS32(Func, K, 1, Dest) { |
| 314 addSource(Src0); |
| 315 } |
| 316 |
| 317 static const char *Opcode; |
| 318 }; |
| 319 |
| 320 /// Instructions of the form opcode reg, reg. |
| 321 template <InstMIPS32::InstKindMIPS32 K> |
| 322 class InstMIPS32TwoAddrGPR : public InstMIPS32 { |
| 323 InstMIPS32TwoAddrGPR() = delete; |
| 324 InstMIPS32TwoAddrGPR(const InstMIPS32TwoAddrGPR &) = delete; |
| 325 InstMIPS32TwoAddrGPR &operator=(const InstMIPS32TwoAddrGPR &) = delete; |
| 326 |
| 327 public: |
| 328 static InstMIPS32TwoAddrGPR *create(Cfg *Func, Variable *Dest, |
| 329 Variable *Src0) { |
| 330 return new (Func->allocate<InstMIPS32TwoAddrGPR>()) |
| 331 InstMIPS32TwoAddrGPR(Func, Dest, Src0); |
| 332 } |
| 333 void emit(const Cfg *Func) const override { |
| 334 if (!BuildDefs::dump()) |
| 335 return; |
| 336 emitTwoAddr(Opcode, this, Func); |
| 337 } |
| 338 void emitIAS(const Cfg *Func) const override { |
| 339 (void)Func; |
| 340 llvm_unreachable("Not yet implemented"); |
| 341 } |
| 342 |
| 343 void dump(const Cfg *Func) const override { |
| 344 if (!BuildDefs::dump()) |
| 345 return; |
| 346 Ostream &Str = Func->getContext()->getStrDump(); |
| 347 dumpDest(Func); |
| 348 Str << " = "; |
| 349 dumpOpcode(Str, Opcode, getDest()->getType()); |
| 350 Str << " "; |
| 351 dumpSources(Func); |
| 352 } |
| 353 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
| 354 |
| 355 private: |
| 356 InstMIPS32TwoAddrGPR(Cfg *Func, Variable *Dest, Variable *Src0) |
| 357 : InstMIPS32(Func, K, 1, Dest) { |
| 358 addSource(Src0); |
| 359 } |
| 360 |
| 361 static const char *Opcode; |
| 362 }; |
| 363 |
| 262 /// Instructions of the form x := y op z. May have the side-effect of setting | 364 /// Instructions of the form x := y op z. May have the side-effect of setting |
| 263 /// status flags. | 365 /// status flags. |
| 264 template <InstMIPS32::InstKindMIPS32 K> | 366 template <InstMIPS32::InstKindMIPS32 K> |
| 367 class InstMIPS32ThreeAddrFPR : public InstMIPS32 { |
| 368 InstMIPS32ThreeAddrFPR() = delete; |
| 369 InstMIPS32ThreeAddrFPR(const InstMIPS32ThreeAddrFPR &) = delete; |
| 370 InstMIPS32ThreeAddrFPR &operator=(const InstMIPS32ThreeAddrFPR &) = delete; |
| 371 |
| 372 public: |
| 373 /// Create an ordinary binary-op instruction like add, and sub. Dest and Src1 |
| 374 /// must be registers. |
| 375 static InstMIPS32ThreeAddrFPR *create(Cfg *Func, Variable *Dest, |
| 376 Variable *Src0, Variable *Src1) { |
| 377 return new (Func->allocate<InstMIPS32ThreeAddrFPR>()) |
| 378 InstMIPS32ThreeAddrFPR(Func, Dest, Src0, Src1); |
| 379 } |
| 380 void emit(const Cfg *Func) const override { |
| 381 if (!BuildDefs::dump()) |
| 382 return; |
| 383 emitThreeAddr(Opcode, this, Func); |
| 384 } |
| 385 void emitIAS(const Cfg *Func) const override { |
| 386 (void)Func; |
| 387 llvm_unreachable("Not yet implemented"); |
| 388 } |
| 389 |
| 390 void dump(const Cfg *Func) const override { |
| 391 if (!BuildDefs::dump()) |
| 392 return; |
| 393 Ostream &Str = Func->getContext()->getStrDump(); |
| 394 dumpDest(Func); |
| 395 Str << " = "; |
| 396 dumpOpcode(Str, Opcode, getDest()->getType()); |
| 397 Str << " "; |
| 398 dumpSources(Func); |
| 399 } |
| 400 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
| 401 |
| 402 private: |
| 403 InstMIPS32ThreeAddrFPR(Cfg *Func, Variable *Dest, Variable *Src0, |
| 404 Variable *Src1) |
| 405 : InstMIPS32(Func, K, 2, Dest) { |
| 406 addSource(Src0); |
| 407 addSource(Src1); |
| 408 } |
| 409 |
| 410 static const char *Opcode; |
| 411 }; |
| 412 |
| 413 /// Instructions of the form x := y op z. May have the side-effect of setting |
| 414 /// status flags. |
| 415 template <InstMIPS32::InstKindMIPS32 K> |
| 265 class InstMIPS32ThreeAddrGPR : public InstMIPS32 { | 416 class InstMIPS32ThreeAddrGPR : public InstMIPS32 { |
| 266 InstMIPS32ThreeAddrGPR() = delete; | 417 InstMIPS32ThreeAddrGPR() = delete; |
| 267 InstMIPS32ThreeAddrGPR(const InstMIPS32ThreeAddrGPR &) = delete; | 418 InstMIPS32ThreeAddrGPR(const InstMIPS32ThreeAddrGPR &) = delete; |
| 268 InstMIPS32ThreeAddrGPR &operator=(const InstMIPS32ThreeAddrGPR &) = delete; | 419 InstMIPS32ThreeAddrGPR &operator=(const InstMIPS32ThreeAddrGPR &) = delete; |
| 269 | 420 |
| 270 public: | 421 public: |
| 271 /// Create an ordinary binary-op instruction like add, and sub. Dest and Src1 | 422 /// Create an ordinary binary-op instruction like add, and sub. Dest and Src1 |
| 272 /// must be registers. | 423 /// must be registers. |
| 273 static InstMIPS32ThreeAddrGPR *create(Cfg *Func, Variable *Dest, | 424 static InstMIPS32ThreeAddrGPR *create(Cfg *Func, Variable *Dest, |
| 274 Variable *Src0, Variable *Src1) { | 425 Variable *Src0, Variable *Src1) { |
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 491 | 642 |
| 492 InstMIPS32Imm16(Cfg *Func, Variable *Dest, uint32_t Imm) | 643 InstMIPS32Imm16(Cfg *Func, Variable *Dest, uint32_t Imm) |
| 493 : InstMIPS32(Func, K, 0, Dest), Imm(Imm) {} | 644 : InstMIPS32(Func, K, 0, Dest), Imm(Imm) {} |
| 494 | 645 |
| 495 static const char *Opcode; | 646 static const char *Opcode; |
| 496 | 647 |
| 497 const uint32_t Imm; | 648 const uint32_t Imm; |
| 498 }; | 649 }; |
| 499 | 650 |
| 500 using InstMIPS32Add = InstMIPS32ThreeAddrGPR<InstMIPS32::Add>; | 651 using InstMIPS32Add = InstMIPS32ThreeAddrGPR<InstMIPS32::Add>; |
| 652 using InstMIPS32Add_d = InstMIPS32ThreeAddrFPR<InstMIPS32::Add_d>; |
| 653 using InstMIPS32Add_s = InstMIPS32ThreeAddrFPR<InstMIPS32::Add_s>; |
| 501 using InstMIPS32Addu = InstMIPS32ThreeAddrGPR<InstMIPS32::Addu>; | 654 using InstMIPS32Addu = InstMIPS32ThreeAddrGPR<InstMIPS32::Addu>; |
| 502 using InstMIPS32Addiu = InstMIPS32Imm16<InstMIPS32::Addiu, true>; | 655 using InstMIPS32Addiu = InstMIPS32Imm16<InstMIPS32::Addiu, true>; |
| 503 using InstMIPS32And = InstMIPS32ThreeAddrGPR<InstMIPS32::And>; | 656 using InstMIPS32And = InstMIPS32ThreeAddrGPR<InstMIPS32::And>; |
| 504 using InstMIPS32Andi = InstMIPS32Imm16<InstMIPS32::Andi>; | 657 using InstMIPS32Andi = InstMIPS32Imm16<InstMIPS32::Andi>; |
| 505 using InstMIPS32Div = InstMIPS32ThreeAddrGPR<InstMIPS32::Div>; | 658 using InstMIPS32Div = InstMIPS32ThreeAddrGPR<InstMIPS32::Div>; |
| 659 using InstMIPS32Div_d = InstMIPS32ThreeAddrFPR<InstMIPS32::Div_d>; |
| 660 using InstMIPS32Div_s = InstMIPS32ThreeAddrFPR<InstMIPS32::Div_s>; |
| 506 using InstMIPS32Divu = InstMIPS32ThreeAddrGPR<InstMIPS32::Divu>; | 661 using InstMIPS32Divu = InstMIPS32ThreeAddrGPR<InstMIPS32::Divu>; |
| 507 using InstMIPS32Lui = InstMIPS32Imm16<InstMIPS32::Lui>; | 662 using InstMIPS32Lui = InstMIPS32Imm16<InstMIPS32::Lui>; |
| 508 using InstMIPS32La = InstMIPS32UnaryopGPR<InstMIPS32::La>; | 663 using InstMIPS32La = InstMIPS32UnaryopGPR<InstMIPS32::La>; |
| 664 using InstMIPS32Mfc1 = InstMIPS32TwoAddrGPR<InstMIPS32::Mfc1>; |
| 509 using InstMIPS32Mfhi = InstMIPS32UnaryopGPR<InstMIPS32::Mfhi>; | 665 using InstMIPS32Mfhi = InstMIPS32UnaryopGPR<InstMIPS32::Mfhi>; |
| 510 using InstMIPS32Mflo = InstMIPS32UnaryopGPR<InstMIPS32::Mflo>; | 666 using InstMIPS32Mflo = InstMIPS32UnaryopGPR<InstMIPS32::Mflo>; |
| 667 using InstMIPS32Mov_d = InstMIPS32TwoAddrFPR<InstMIPS32::Mov_d>; |
| 668 using InstMIPS32Mov_s = InstMIPS32TwoAddrFPR<InstMIPS32::Mov_s>; |
| 669 using InstMIPS32Mtc1 = InstMIPS32TwoAddrGPR<InstMIPS32::Mtc1>; |
| 511 using InstMIPS32Mthi = InstMIPS32UnaryopGPR<InstMIPS32::Mthi>; | 670 using InstMIPS32Mthi = InstMIPS32UnaryopGPR<InstMIPS32::Mthi>; |
| 512 using InstMIPS32Mtlo = InstMIPS32UnaryopGPR<InstMIPS32::Mtlo>; | 671 using InstMIPS32Mtlo = InstMIPS32UnaryopGPR<InstMIPS32::Mtlo>; |
| 513 using InstMIPS32Mul = InstMIPS32ThreeAddrGPR<InstMIPS32::Mul>; | 672 using InstMIPS32Mul = InstMIPS32ThreeAddrGPR<InstMIPS32::Mul>; |
| 673 using InstMIPS32Mul_d = InstMIPS32ThreeAddrFPR<InstMIPS32::Mul_d>; |
| 674 using InstMIPS32Mul_s = InstMIPS32ThreeAddrFPR<InstMIPS32::Mul_s>; |
| 514 using InstMIPS32Mult = InstMIPS32ThreeAddrGPR<InstMIPS32::Mult>; | 675 using InstMIPS32Mult = InstMIPS32ThreeAddrGPR<InstMIPS32::Mult>; |
| 515 using InstMIPS32Multu = InstMIPS32ThreeAddrGPR<InstMIPS32::Multu>; | 676 using InstMIPS32Multu = InstMIPS32ThreeAddrGPR<InstMIPS32::Multu>; |
| 516 using InstMIPS32Or = InstMIPS32ThreeAddrGPR<InstMIPS32::Or>; | 677 using InstMIPS32Or = InstMIPS32ThreeAddrGPR<InstMIPS32::Or>; |
| 517 using InstMIPS32Ori = InstMIPS32Imm16<InstMIPS32::Ori>; | 678 using InstMIPS32Ori = InstMIPS32Imm16<InstMIPS32::Ori>; |
| 518 using InstMIPS32Sll = InstMIPS32Imm16<InstMIPS32::Sll>; | 679 using InstMIPS32Sll = InstMIPS32Imm16<InstMIPS32::Sll>; |
| 519 using InstMIPS32Sllv = InstMIPS32ThreeAddrGPR<InstMIPS32::Sllv>; | 680 using InstMIPS32Sllv = InstMIPS32ThreeAddrGPR<InstMIPS32::Sllv>; |
| 520 using InstMIPS32Slt = InstMIPS32ThreeAddrGPR<InstMIPS32::Slt>; | 681 using InstMIPS32Slt = InstMIPS32ThreeAddrGPR<InstMIPS32::Slt>; |
| 521 using InstMIPS32Slti = InstMIPS32Imm16<InstMIPS32::Slti>; | 682 using InstMIPS32Slti = InstMIPS32Imm16<InstMIPS32::Slti>; |
| 522 using InstMIPS32Sltiu = InstMIPS32Imm16<InstMIPS32::Sltiu>; | 683 using InstMIPS32Sltiu = InstMIPS32Imm16<InstMIPS32::Sltiu>; |
| 523 using InstMIPS32Sltu = InstMIPS32ThreeAddrGPR<InstMIPS32::Sltu>; | 684 using InstMIPS32Sltu = InstMIPS32ThreeAddrGPR<InstMIPS32::Sltu>; |
| 524 using InstMIPS32Sra = InstMIPS32Imm16<InstMIPS32::Sra>; | 685 using InstMIPS32Sra = InstMIPS32Imm16<InstMIPS32::Sra>; |
| 525 using InstMIPS32Srav = InstMIPS32ThreeAddrGPR<InstMIPS32::Srav>; | 686 using InstMIPS32Srav = InstMIPS32ThreeAddrGPR<InstMIPS32::Srav>; |
| 526 using InstMIPS32Srl = InstMIPS32Imm16<InstMIPS32::Srl>; | 687 using InstMIPS32Srl = InstMIPS32Imm16<InstMIPS32::Srl>; |
| 527 using InstMIPS32Srlv = InstMIPS32ThreeAddrGPR<InstMIPS32::Srlv>; | 688 using InstMIPS32Srlv = InstMIPS32ThreeAddrGPR<InstMIPS32::Srlv>; |
| 528 using InstMIPS32Sub = InstMIPS32ThreeAddrGPR<InstMIPS32::Sub>; | 689 using InstMIPS32Sub = InstMIPS32ThreeAddrGPR<InstMIPS32::Sub>; |
| 690 using InstMIPS32Sub_d = InstMIPS32ThreeAddrFPR<InstMIPS32::Sub_d>; |
| 691 using InstMIPS32Sub_s = InstMIPS32ThreeAddrFPR<InstMIPS32::Sub_s>; |
| 529 using InstMIPS32Subu = InstMIPS32ThreeAddrGPR<InstMIPS32::Subu>; | 692 using InstMIPS32Subu = InstMIPS32ThreeAddrGPR<InstMIPS32::Subu>; |
| 530 using InstMIPS32Ori = InstMIPS32Imm16<InstMIPS32::Ori>; | 693 using InstMIPS32Ori = InstMIPS32Imm16<InstMIPS32::Ori>; |
| 531 using InstMIPS32Xor = InstMIPS32ThreeAddrGPR<InstMIPS32::Xor>; | 694 using InstMIPS32Xor = InstMIPS32ThreeAddrGPR<InstMIPS32::Xor>; |
| 532 using InstMIPS32Xori = InstMIPS32Imm16<InstMIPS32::Xori>; | 695 using InstMIPS32Xori = InstMIPS32Imm16<InstMIPS32::Xori>; |
| 533 | 696 |
| 534 /// Handles (some of) vmov's various formats. | 697 /// Handles (some of) vmov's various formats. |
| 535 class InstMIPS32Mov final : public InstMIPS32 { | 698 class InstMIPS32Mov final : public InstMIPS32 { |
| 536 InstMIPS32Mov() = delete; | 699 InstMIPS32Mov() = delete; |
| 537 InstMIPS32Mov(const InstMIPS32Mov &) = delete; | 700 InstMIPS32Mov(const InstMIPS32Mov &) = delete; |
| 538 InstMIPS32Mov &operator=(const InstMIPS32Mov &) = delete; | 701 InstMIPS32Mov &operator=(const InstMIPS32Mov &) = delete; |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 578 template <> void InstMIPS32Mfhi::emit(const Cfg *Func) const; | 741 template <> void InstMIPS32Mfhi::emit(const Cfg *Func) const; |
| 579 template <> void InstMIPS32Mtlo::emit(const Cfg *Func) const; | 742 template <> void InstMIPS32Mtlo::emit(const Cfg *Func) const; |
| 580 template <> void InstMIPS32Mthi::emit(const Cfg *Func) const; | 743 template <> void InstMIPS32Mthi::emit(const Cfg *Func) const; |
| 581 template <> void InstMIPS32Mult::emit(const Cfg *Func) const; | 744 template <> void InstMIPS32Mult::emit(const Cfg *Func) const; |
| 582 template <> void InstMIPS32Multu::emit(const Cfg *Func) const; | 745 template <> void InstMIPS32Multu::emit(const Cfg *Func) const; |
| 583 | 746 |
| 584 } // end of namespace MIPS32 | 747 } // end of namespace MIPS32 |
| 585 } // end of namespace Ice | 748 } // end of namespace Ice |
| 586 | 749 |
| 587 #endif // SUBZERO_SRC_ICEINSTMIPS32_H | 750 #endif // SUBZERO_SRC_ICEINSTMIPS32_H |
| OLD | NEW |