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 |