| OLD | NEW |
| 1 //===- subzero/src/IceInstARM32.h - ARM32 machine instructions --*- C++ -*-===// | 1 //===- subzero/src/IceInstARM32.h - ARM32 machine 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 22 matching lines...) Expand all Loading... |
| 33 OperandARM32() = delete; | 33 OperandARM32() = delete; |
| 34 OperandARM32(const OperandARM32 &) = delete; | 34 OperandARM32(const OperandARM32 &) = delete; |
| 35 OperandARM32 &operator=(const OperandARM32 &) = delete; | 35 OperandARM32 &operator=(const OperandARM32 &) = delete; |
| 36 | 36 |
| 37 public: | 37 public: |
| 38 enum OperandKindARM32 { | 38 enum OperandKindARM32 { |
| 39 k__Start = Operand::kTarget, | 39 k__Start = Operand::kTarget, |
| 40 kMem, | 40 kMem, |
| 41 kFlexStart, | 41 kFlexStart, |
| 42 kFlexImm = kFlexStart, | 42 kFlexImm = kFlexStart, |
| 43 kFlexFpImm, |
| 44 kFlexFpZero, |
| 43 kFlexReg, | 45 kFlexReg, |
| 44 kFlexEnd = kFlexReg | 46 kFlexEnd = kFlexReg |
| 45 }; | 47 }; |
| 46 | 48 |
| 47 enum ShiftKind { | 49 enum ShiftKind { |
| 48 kNoShift = -1, | 50 kNoShift = -1, |
| 49 #define X(enum, emit) enum, | 51 #define X(enum, emit) enum, |
| 50 ICEINSTARM32SHIFT_TABLE | 52 ICEINSTARM32SHIFT_TABLE |
| 51 #undef X | 53 #undef X |
| 52 }; | 54 }; |
| (...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 198 uint32_t getImm() const { return Imm; } | 200 uint32_t getImm() const { return Imm; } |
| 199 uint32_t getRotateAmt() const { return RotateAmt; } | 201 uint32_t getRotateAmt() const { return RotateAmt; } |
| 200 | 202 |
| 201 private: | 203 private: |
| 202 OperandARM32FlexImm(Cfg *Func, Type Ty, uint32_t Imm, uint32_t RotateAmt); | 204 OperandARM32FlexImm(Cfg *Func, Type Ty, uint32_t Imm, uint32_t RotateAmt); |
| 203 | 205 |
| 204 uint32_t Imm; | 206 uint32_t Imm; |
| 205 uint32_t RotateAmt; | 207 uint32_t RotateAmt; |
| 206 }; | 208 }; |
| 207 | 209 |
| 210 /// Modified Floating-point constant. |
| 211 class OperandARM32FlexFpImm : public OperandARM32Flex { |
| 212 OperandARM32FlexFpImm() = delete; |
| 213 OperandARM32FlexFpImm(const OperandARM32FlexFpImm &) = delete; |
| 214 OperandARM32FlexFpImm &operator=(const OperandARM32FlexFpImm &) = delete; |
| 215 |
| 216 public: |
| 217 static OperandARM32FlexFpImm *create(Cfg *Func, Type Ty, |
| 218 uint32_t ModifiedImm) { |
| 219 return new (Func->allocate<OperandARM32FlexFpImm>()) |
| 220 OperandARM32FlexFpImm(Func, Ty, ModifiedImm); |
| 221 } |
| 222 |
| 223 void emit(const Cfg *Func) const override; |
| 224 using OperandARM32::dump; |
| 225 void dump(const Cfg *Func, Ostream &Str) const override; |
| 226 |
| 227 static bool classof(const Operand *Operand) { |
| 228 return Operand->getKind() == static_cast<OperandKind>(kFlexFpImm); |
| 229 } |
| 230 |
| 231 static bool canHoldImm(Operand *C, uint32_t *ModifiedImm); |
| 232 |
| 233 private: |
| 234 OperandARM32FlexFpImm(Cfg *Func, Type Ty, uint32_t ModifiedImm); |
| 235 |
| 236 uint32_t ModifiedImm; |
| 237 }; |
| 238 |
| 239 /// An operand for representing the 0.0 immediate in vcmp. |
| 240 class OperandARM32FlexFpZero : public OperandARM32Flex { |
| 241 OperandARM32FlexFpZero() = delete; |
| 242 OperandARM32FlexFpZero(const OperandARM32FlexFpZero &) = delete; |
| 243 OperandARM32FlexFpZero &operator=(const OperandARM32FlexFpZero &) = delete; |
| 244 |
| 245 public: |
| 246 static OperandARM32FlexFpZero *create(Cfg *Func, Type Ty) { |
| 247 return new (Func->allocate<OperandARM32FlexFpZero>()) |
| 248 OperandARM32FlexFpZero(Func, Ty); |
| 249 } |
| 250 |
| 251 void emit(const Cfg *Func) const override; |
| 252 using OperandARM32::dump; |
| 253 void dump(const Cfg *Func, Ostream &Str) const override; |
| 254 |
| 255 static bool classof(const Operand *Operand) { |
| 256 return Operand->getKind() == static_cast<OperandKind>(kFlexFpZero); |
| 257 } |
| 258 |
| 259 private: |
| 260 OperandARM32FlexFpZero(Cfg *Func, Type Ty); |
| 261 }; |
| 262 |
| 208 /// Shifted register variant. | 263 /// Shifted register variant. |
| 209 class OperandARM32FlexReg : public OperandARM32Flex { | 264 class OperandARM32FlexReg : public OperandARM32Flex { |
| 210 OperandARM32FlexReg() = delete; | 265 OperandARM32FlexReg() = delete; |
| 211 OperandARM32FlexReg(const OperandARM32FlexReg &) = delete; | 266 OperandARM32FlexReg(const OperandARM32FlexReg &) = delete; |
| 212 OperandARM32FlexReg &operator=(const OperandARM32FlexReg &) = delete; | 267 OperandARM32FlexReg &operator=(const OperandARM32FlexReg &) = delete; |
| 213 | 268 |
| 214 public: | 269 public: |
| 215 /// Register with immediate/reg shift amount and shift operation. | 270 /// Register with immediate/reg shift amount and shift operation. |
| 216 static OperandARM32FlexReg *create(Cfg *Func, Type Ty, Variable *Reg, | 271 static OperandARM32FlexReg *create(Cfg *Func, Type Ty, Variable *Reg, |
| 217 ShiftKind ShiftOp, Operand *ShiftAmt) { | 272 ShiftKind ShiftOp, Operand *ShiftAmt) { |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 enum InstKindARM32 { | 337 enum InstKindARM32 { |
| 283 k__Start = Inst::Target, | 338 k__Start = Inst::Target, |
| 284 Adc, | 339 Adc, |
| 285 Add, | 340 Add, |
| 286 Adjuststack, | 341 Adjuststack, |
| 287 And, | 342 And, |
| 288 Asr, | 343 Asr, |
| 289 Bic, | 344 Bic, |
| 290 Br, | 345 Br, |
| 291 Call, | 346 Call, |
| 347 Cmn, |
| 292 Cmp, | 348 Cmp, |
| 293 Clz, | 349 Clz, |
| 294 Dmb, | 350 Dmb, |
| 295 Eor, | 351 Eor, |
| 296 Label, | 352 Label, |
| 297 Ldr, | 353 Ldr, |
| 298 Ldrex, | 354 Ldrex, |
| 299 Lsl, | 355 Lsl, |
| 300 Lsr, | 356 Lsr, |
| 301 Mla, | 357 Mla, |
| 302 Mls, | 358 Mls, |
| 303 Mov, | 359 Mov, |
| 304 Movt, | 360 Movt, |
| 305 Movw, | 361 Movw, |
| 306 Mul, | 362 Mul, |
| 307 Mvn, | 363 Mvn, |
| 308 Orr, | 364 Orr, |
| 309 Pop, | 365 Pop, |
| 310 Push, | 366 Push, |
| 311 Rbit, | 367 Rbit, |
| 312 Ret, | 368 Ret, |
| 313 Rev, | 369 Rev, |
| 314 Rsb, | 370 Rsb, |
| 371 Rsc, |
| 315 Sbc, | 372 Sbc, |
| 316 Sdiv, | 373 Sdiv, |
| 317 Str, | 374 Str, |
| 318 Strex, | 375 Strex, |
| 319 Sub, | 376 Sub, |
| 320 Sxt, | 377 Sxt, |
| 321 Trap, | 378 Trap, |
| 322 Tst, | 379 Tst, |
| 323 Udiv, | 380 Udiv, |
| 324 Umull, | 381 Umull, |
| 325 Uxt, | 382 Uxt, |
| 326 Vabs, | 383 Vabs, |
| 327 Vadd, | 384 Vadd, |
| 328 Vcmp, | 385 Vcmp, |
| 329 Vcvt, | 386 Vcvt, |
| 330 Vdiv, | 387 Vdiv, |
| 388 Veor, |
| 331 Vmrs, | 389 Vmrs, |
| 332 Vmul, | 390 Vmul, |
| 333 Vsqrt, | 391 Vsqrt, |
| 334 Vsub | 392 Vsub |
| 335 }; | 393 }; |
| 336 | 394 |
| 337 static constexpr size_t InstSize = sizeof(uint32_t); | 395 static constexpr size_t InstSize = sizeof(uint32_t); |
| 338 | 396 |
| 339 static const char *getWidthString(Type Ty); | 397 static const char *getWidthString(Type Ty); |
| 340 static const char *getVecWidthString(Type Ty); | 398 static const char *getVecWidthString(Type Ty); |
| (...skipping 261 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 602 dumpOpcodePred(Str, Opcode, getDest()->getType()); | 660 dumpOpcodePred(Str, Opcode, getDest()->getType()); |
| 603 Str << (SetFlags ? ".s " : " "); | 661 Str << (SetFlags ? ".s " : " "); |
| 604 dumpSources(Func); | 662 dumpSources(Func); |
| 605 } | 663 } |
| 606 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } | 664 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
| 607 | 665 |
| 608 private: | 666 private: |
| 609 InstARM32ThreeAddrGPR(Cfg *Func, Variable *Dest, Variable *Src0, | 667 InstARM32ThreeAddrGPR(Cfg *Func, Variable *Dest, Variable *Src0, |
| 610 Operand *Src1, CondARM32::Cond Predicate, bool SetFlags) | 668 Operand *Src1, CondARM32::Cond Predicate, bool SetFlags) |
| 611 : InstARM32Pred(Func, K, 2, Dest, Predicate), SetFlags(SetFlags) { | 669 : InstARM32Pred(Func, K, 2, Dest, Predicate), SetFlags(SetFlags) { |
| 670 HasSideEffects = SetFlags; |
| 612 addSource(Src0); | 671 addSource(Src0); |
| 613 addSource(Src1); | 672 addSource(Src1); |
| 614 } | 673 } |
| 615 | 674 |
| 616 static const char *Opcode; | 675 static const char *Opcode; |
| 617 bool SetFlags; | 676 bool SetFlags; |
| 618 }; | 677 }; |
| 619 | 678 |
| 620 /// Instructions of the form x := y op z, for vector/FP. We leave these as | 679 /// Instructions of the form x := y op z, for vector/FP. We leave these as |
| 621 /// unconditional: "ARM deprecates the conditional execution of any instruction | 680 /// unconditional: "ARM deprecates the conditional execution of any instruction |
| (...skipping 112 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 734 dumpOpcodePred(Str, Opcode, getSrc(0)->getType()); | 793 dumpOpcodePred(Str, Opcode, getSrc(0)->getType()); |
| 735 Str << " "; | 794 Str << " "; |
| 736 dumpSources(Func); | 795 dumpSources(Func); |
| 737 } | 796 } |
| 738 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } | 797 static bool classof(const Inst *Inst) { return isClassof(Inst, K); } |
| 739 | 798 |
| 740 private: | 799 private: |
| 741 InstARM32CmpLike(Cfg *Func, Variable *Src0, Operand *Src1, | 800 InstARM32CmpLike(Cfg *Func, Variable *Src0, Operand *Src1, |
| 742 CondARM32::Cond Predicate) | 801 CondARM32::Cond Predicate) |
| 743 : InstARM32Pred(Func, K, 2, nullptr, Predicate) { | 802 : InstARM32Pred(Func, K, 2, nullptr, Predicate) { |
| 803 HasSideEffects = true; |
| 744 addSource(Src0); | 804 addSource(Src0); |
| 745 addSource(Src1); | 805 addSource(Src1); |
| 746 } | 806 } |
| 747 | 807 |
| 748 static const char *Opcode; | 808 static const char *Opcode; |
| 749 }; | 809 }; |
| 750 | 810 |
| 751 using InstARM32Adc = InstARM32ThreeAddrGPR<InstARM32::Adc>; | 811 using InstARM32Adc = InstARM32ThreeAddrGPR<InstARM32::Adc>; |
| 752 using InstARM32Add = InstARM32ThreeAddrGPR<InstARM32::Add>; | 812 using InstARM32Add = InstARM32ThreeAddrGPR<InstARM32::Add>; |
| 753 using InstARM32And = InstARM32ThreeAddrGPR<InstARM32::And>; | 813 using InstARM32And = InstARM32ThreeAddrGPR<InstARM32::And>; |
| 754 using InstARM32Asr = InstARM32ThreeAddrGPR<InstARM32::Asr>; | 814 using InstARM32Asr = InstARM32ThreeAddrGPR<InstARM32::Asr>; |
| 755 using InstARM32Bic = InstARM32ThreeAddrGPR<InstARM32::Bic>; | 815 using InstARM32Bic = InstARM32ThreeAddrGPR<InstARM32::Bic>; |
| 756 using InstARM32Eor = InstARM32ThreeAddrGPR<InstARM32::Eor>; | 816 using InstARM32Eor = InstARM32ThreeAddrGPR<InstARM32::Eor>; |
| 757 using InstARM32Lsl = InstARM32ThreeAddrGPR<InstARM32::Lsl>; | 817 using InstARM32Lsl = InstARM32ThreeAddrGPR<InstARM32::Lsl>; |
| 758 using InstARM32Lsr = InstARM32ThreeAddrGPR<InstARM32::Lsr>; | 818 using InstARM32Lsr = InstARM32ThreeAddrGPR<InstARM32::Lsr>; |
| 759 using InstARM32Mul = InstARM32ThreeAddrGPR<InstARM32::Mul>; | 819 using InstARM32Mul = InstARM32ThreeAddrGPR<InstARM32::Mul>; |
| 760 using InstARM32Orr = InstARM32ThreeAddrGPR<InstARM32::Orr>; | 820 using InstARM32Orr = InstARM32ThreeAddrGPR<InstARM32::Orr>; |
| 761 using InstARM32Rsb = InstARM32ThreeAddrGPR<InstARM32::Rsb>; | 821 using InstARM32Rsb = InstARM32ThreeAddrGPR<InstARM32::Rsb>; |
| 822 using InstARM32Rsc = InstARM32ThreeAddrGPR<InstARM32::Rsc>; |
| 762 using InstARM32Sbc = InstARM32ThreeAddrGPR<InstARM32::Sbc>; | 823 using InstARM32Sbc = InstARM32ThreeAddrGPR<InstARM32::Sbc>; |
| 763 using InstARM32Sdiv = InstARM32ThreeAddrGPR<InstARM32::Sdiv>; | 824 using InstARM32Sdiv = InstARM32ThreeAddrGPR<InstARM32::Sdiv>; |
| 764 using InstARM32Sub = InstARM32ThreeAddrGPR<InstARM32::Sub>; | 825 using InstARM32Sub = InstARM32ThreeAddrGPR<InstARM32::Sub>; |
| 765 using InstARM32Udiv = InstARM32ThreeAddrGPR<InstARM32::Udiv>; | 826 using InstARM32Udiv = InstARM32ThreeAddrGPR<InstARM32::Udiv>; |
| 766 using InstARM32Vadd = InstARM32ThreeAddrFP<InstARM32::Vadd>; | 827 using InstARM32Vadd = InstARM32ThreeAddrFP<InstARM32::Vadd>; |
| 767 using InstARM32Vdiv = InstARM32ThreeAddrFP<InstARM32::Vdiv>; | 828 using InstARM32Vdiv = InstARM32ThreeAddrFP<InstARM32::Vdiv>; |
| 768 using InstARM32Vmul = InstARM32ThreeAddrFP<InstARM32::Vmul>; | 829 using InstARM32Vmul = InstARM32ThreeAddrFP<InstARM32::Vmul>; |
| 830 using InstARM32Veor = InstARM32ThreeAddrFP<InstARM32::Veor>; |
| 769 using InstARM32Vsub = InstARM32ThreeAddrFP<InstARM32::Vsub>; | 831 using InstARM32Vsub = InstARM32ThreeAddrFP<InstARM32::Vsub>; |
| 770 using InstARM32Ldr = InstARM32LoadBase<InstARM32::Ldr>; | 832 using InstARM32Ldr = InstARM32LoadBase<InstARM32::Ldr>; |
| 771 using InstARM32Ldrex = InstARM32LoadBase<InstARM32::Ldrex>; | 833 using InstARM32Ldrex = InstARM32LoadBase<InstARM32::Ldrex>; |
| 772 /// MovT leaves the bottom bits alone so dest is also a source. This helps | 834 /// MovT leaves the bottom bits alone so dest is also a source. This helps |
| 773 /// indicate that a previous MovW setting dest is not dead code. | 835 /// indicate that a previous MovW setting dest is not dead code. |
| 774 using InstARM32Movt = InstARM32TwoAddrGPR<InstARM32::Movt>; | 836 using InstARM32Movt = InstARM32TwoAddrGPR<InstARM32::Movt>; |
| 775 using InstARM32Movw = InstARM32UnaryopGPR<InstARM32::Movw, false>; | 837 using InstARM32Movw = InstARM32UnaryopGPR<InstARM32::Movw, false>; |
| 776 using InstARM32Clz = InstARM32UnaryopGPR<InstARM32::Clz, false>; | 838 using InstARM32Clz = InstARM32UnaryopGPR<InstARM32::Clz, false>; |
| 777 using InstARM32Mvn = InstARM32UnaryopGPR<InstARM32::Mvn, false>; | 839 using InstARM32Mvn = InstARM32UnaryopGPR<InstARM32::Mvn, false>; |
| 778 using InstARM32Rbit = InstARM32UnaryopGPR<InstARM32::Rbit, false>; | 840 using InstARM32Rbit = InstARM32UnaryopGPR<InstARM32::Rbit, false>; |
| 779 using InstARM32Rev = InstARM32UnaryopGPR<InstARM32::Rev, false>; | 841 using InstARM32Rev = InstARM32UnaryopGPR<InstARM32::Rev, false>; |
| 780 // Technically, the uxt{b,h} and sxt{b,h} instructions have a rotation operand | 842 // Technically, the uxt{b,h} and sxt{b,h} instructions have a rotation operand |
| 781 // as well (rotate source by 8, 16, 24 bits prior to extending), but we aren't | 843 // as well (rotate source by 8, 16, 24 bits prior to extending), but we aren't |
| 782 // using that for now, so just model as a Unaryop. | 844 // using that for now, so just model as a Unaryop. |
| 783 using InstARM32Sxt = InstARM32UnaryopGPR<InstARM32::Sxt, true>; | 845 using InstARM32Sxt = InstARM32UnaryopGPR<InstARM32::Sxt, true>; |
| 784 using InstARM32Uxt = InstARM32UnaryopGPR<InstARM32::Uxt, true>; | 846 using InstARM32Uxt = InstARM32UnaryopGPR<InstARM32::Uxt, true>; |
| 785 using InstARM32Vsqrt = InstARM32UnaryopFP<InstARM32::Vsqrt>; | 847 using InstARM32Vsqrt = InstARM32UnaryopFP<InstARM32::Vsqrt>; |
| 786 using InstARM32Mla = InstARM32FourAddrGPR<InstARM32::Mla>; | 848 using InstARM32Mla = InstARM32FourAddrGPR<InstARM32::Mla>; |
| 787 using InstARM32Mls = InstARM32FourAddrGPR<InstARM32::Mls>; | 849 using InstARM32Mls = InstARM32FourAddrGPR<InstARM32::Mls>; |
| 850 using InstARM32Cmn = InstARM32CmpLike<InstARM32::Cmn>; |
| 788 using InstARM32Cmp = InstARM32CmpLike<InstARM32::Cmp>; | 851 using InstARM32Cmp = InstARM32CmpLike<InstARM32::Cmp>; |
| 789 using InstARM32Tst = InstARM32CmpLike<InstARM32::Tst>; | 852 using InstARM32Tst = InstARM32CmpLike<InstARM32::Tst>; |
| 790 | 853 |
| 791 // InstARM32Label represents an intra-block label that is the target of an | 854 // InstARM32Label represents an intra-block label that is the target of an |
| 792 // intra-block branch. The offset between the label and the branch must be fit | 855 // intra-block branch. The offset between the label and the branch must be fit |
| 793 // in the instruction immediate (considered "near"). | 856 // in the instruction immediate (considered "near"). |
| 794 class InstARM32Label : public InstARM32 { | 857 class InstARM32Label : public InstARM32 { |
| 795 InstARM32Label() = delete; | 858 InstARM32Label() = delete; |
| 796 InstARM32Label(const InstARM32Label &) = delete; | 859 InstARM32Label(const InstARM32Label &) = delete; |
| 797 InstARM32Label &operator=(const InstARM32Label &) = delete; | 860 InstARM32Label &operator=(const InstARM32Label &) = delete; |
| (...skipping 373 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 InstARM32Vcmp() = delete; | 1234 InstARM32Vcmp() = delete; |
| 1172 InstARM32Vcmp(const InstARM32Vcmp &) = delete; | 1235 InstARM32Vcmp(const InstARM32Vcmp &) = delete; |
| 1173 InstARM32Vcmp &operator=(const InstARM32Vcmp &) = delete; | 1236 InstARM32Vcmp &operator=(const InstARM32Vcmp &) = delete; |
| 1174 | 1237 |
| 1175 public: | 1238 public: |
| 1176 static InstARM32Vcmp *create(Cfg *Func, Variable *Src0, Variable *Src1, | 1239 static InstARM32Vcmp *create(Cfg *Func, Variable *Src0, Variable *Src1, |
| 1177 CondARM32::Cond Predicate) { | 1240 CondARM32::Cond Predicate) { |
| 1178 return new (Func->allocate<InstARM32Vcmp>()) | 1241 return new (Func->allocate<InstARM32Vcmp>()) |
| 1179 InstARM32Vcmp(Func, Src0, Src1, Predicate); | 1242 InstARM32Vcmp(Func, Src0, Src1, Predicate); |
| 1180 } | 1243 } |
| 1244 static InstARM32Vcmp *create(Cfg *Func, Variable *Src0, |
| 1245 OperandARM32FlexFpZero *Src1, |
| 1246 CondARM32::Cond Predicate) { |
| 1247 return new (Func->allocate<InstARM32Vcmp>()) |
| 1248 InstARM32Vcmp(Func, Src0, Src1, Predicate); |
| 1249 } |
| 1181 void emit(const Cfg *Func) const override; | 1250 void emit(const Cfg *Func) const override; |
| 1182 void dump(const Cfg *Func) const override; | 1251 void dump(const Cfg *Func) const override; |
| 1183 static bool classof(const Inst *Inst) { return isClassof(Inst, Vcmp); } | 1252 static bool classof(const Inst *Inst) { return isClassof(Inst, Vcmp); } |
| 1184 | 1253 |
| 1185 private: | 1254 private: |
| 1186 InstARM32Vcmp(Cfg *Func, Variable *Src0, Variable *Src1, | 1255 InstARM32Vcmp(Cfg *Func, Variable *Src0, Operand *Src1, |
| 1187 CondARM32::Cond Predicate); | 1256 CondARM32::Cond Predicate); |
| 1188 }; | 1257 }; |
| 1189 | 1258 |
| 1190 /// Copies the FP Status and Control Register the core flags. | 1259 /// Copies the FP Status and Control Register the core flags. |
| 1191 class InstARM32Vmrs final : public InstARM32Pred { | 1260 class InstARM32Vmrs final : public InstARM32Pred { |
| 1192 InstARM32Vmrs() = delete; | 1261 InstARM32Vmrs() = delete; |
| 1193 InstARM32Vmrs(const InstARM32Vmrs &) = delete; | 1262 InstARM32Vmrs(const InstARM32Vmrs &) = delete; |
| 1194 InstARM32Vmrs &operator=(const InstARM32Vmrs &) = delete; | 1263 InstARM32Vmrs &operator=(const InstARM32Vmrs &) = delete; |
| 1195 | 1264 |
| 1196 public: | 1265 public: |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1246 // default implementations. Without this, there is the possibility of ODR | 1315 // default implementations. Without this, there is the possibility of ODR |
| 1247 // violations and link errors. | 1316 // violations and link errors. |
| 1248 | 1317 |
| 1249 template <> void InstARM32Ldr::emit(const Cfg *Func) const; | 1318 template <> void InstARM32Ldr::emit(const Cfg *Func) const; |
| 1250 template <> void InstARM32Movw::emit(const Cfg *Func) const; | 1319 template <> void InstARM32Movw::emit(const Cfg *Func) const; |
| 1251 template <> void InstARM32Movt::emit(const Cfg *Func) const; | 1320 template <> void InstARM32Movt::emit(const Cfg *Func) const; |
| 1252 | 1321 |
| 1253 } // end of namespace Ice | 1322 } // end of namespace Ice |
| 1254 | 1323 |
| 1255 #endif // SUBZERO_SRC_ICEINSTARM32_H | 1324 #endif // SUBZERO_SRC_ICEINSTARM32_H |
| OLD | NEW |