AArch64Schedule.td 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. //==-- AArch64Schedule.td - AArch64 Scheduling Definitions -*- tablegen -*-===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. // Define TII for use in SchedVariant Predicates.
  9. // const MachineInstr *MI and const TargetSchedModel *SchedModel
  10. // are defined by default.
  11. def : PredicateProlog<[{
  12. const AArch64InstrInfo *TII =
  13. static_cast<const AArch64InstrInfo*>(SchedModel->getInstrInfo());
  14. (void)TII;
  15. }]>;
  16. // AArch64 Scheduler Definitions
  17. def WriteImm : SchedWrite; // MOVN, MOVZ
  18. // TODO: Provide variants for MOV32/64imm Pseudos that dynamically
  19. // select the correct sequence of WriteImms.
  20. def WriteI : SchedWrite; // ALU
  21. def WriteISReg : SchedWrite; // ALU of Shifted-Reg
  22. def WriteIEReg : SchedWrite; // ALU of Extended-Reg
  23. def ReadI : SchedRead; // ALU
  24. def ReadISReg : SchedRead; // ALU of Shifted-Reg
  25. def ReadIEReg : SchedRead; // ALU of Extended-Reg
  26. def WriteExtr : SchedWrite; // EXTR shifts a reg pair
  27. def ReadExtrHi : SchedRead; // Read the high reg of the EXTR pair
  28. def WriteIS : SchedWrite; // Shift/Scale
  29. def WriteID32 : SchedWrite; // 32-bit Divide
  30. def WriteID64 : SchedWrite; // 64-bit Divide
  31. def ReadID : SchedRead; // 32/64-bit Divide
  32. def WriteIM32 : SchedWrite; // 32-bit Multiply
  33. def WriteIM64 : SchedWrite; // 64-bit Multiply
  34. def ReadIM : SchedRead; // 32/64-bit Multiply
  35. def ReadIMA : SchedRead; // 32/64-bit Multiply Accumulate
  36. def WriteBr : SchedWrite; // Branch
  37. def WriteBrReg : SchedWrite; // Indirect Branch
  38. def WriteLD : SchedWrite; // Load from base addr plus immediate offset
  39. def WriteST : SchedWrite; // Store to base addr plus immediate offset
  40. def WriteSTP : SchedWrite; // Store a register pair.
  41. def WriteAdr : SchedWrite; // Address pre/post increment.
  42. def WriteLDIdx : SchedWrite; // Load from a register index (maybe scaled).
  43. def WriteSTIdx : SchedWrite; // Store to a register index (maybe scaled).
  44. def ReadST : SchedRead; // Read the stored value.
  45. def ReadAdrBase : SchedRead; // Read the base resister of a reg-offset LD/ST.
  46. // Serialized two-level address load.
  47. // EXAMPLE: LOADGot
  48. def WriteLDAdr : WriteSequence<[WriteAdr, WriteLD]>;
  49. // Serialized two-level address lookup.
  50. // EXAMPLE: MOVaddr...
  51. def WriteAdrAdr : WriteSequence<[WriteAdr, WriteAdr]>;
  52. // The second register of a load-pair.
  53. // LDP,LDPSW,LDNP,LDXP,LDAXP
  54. def WriteLDHi : SchedWrite;
  55. // Store-exclusive is a store followed by a dependent load.
  56. def WriteSTX : WriteSequence<[WriteST, WriteLD]>;
  57. def WriteSys : SchedWrite; // Long, variable latency system ops.
  58. def WriteBarrier : SchedWrite; // Memory barrier.
  59. def WriteHint : SchedWrite; // Hint instruction.
  60. def WriteF : SchedWrite; // General floating-point ops.
  61. def WriteFCmp : SchedWrite; // Floating-point compare.
  62. def WriteFCvt : SchedWrite; // Float conversion.
  63. def WriteFCopy : SchedWrite; // Float-int register copy.
  64. def WriteFImm : SchedWrite; // Floating-point immediate.
  65. def WriteFMul : SchedWrite; // Floating-point multiply.
  66. def WriteFDiv : SchedWrite; // Floating-point division.
  67. def WriteVd : SchedWrite; // 64bit Vector D ops.
  68. def WriteVq : SchedWrite; // 128bit Vector Q ops.
  69. def WriteVLD : SchedWrite; // Vector loads.
  70. def WriteVST : SchedWrite; // Vector stores.
  71. def WriteAtomic : SchedWrite; // Atomic memory operations (CAS, Swap, LDOP)
  72. // Read the unwritten lanes of the VLD's destination registers.
  73. def ReadVLD : SchedRead;
  74. // Sequential vector load and shuffle.
  75. def WriteVLDShuffle : WriteSequence<[WriteVLD, WriteVq]>;
  76. def WriteVLDPairShuffle : WriteSequence<[WriteVLD, WriteVq, WriteVq]>;
  77. // Store a shuffled vector.
  78. def WriteVSTShuffle : WriteSequence<[WriteVq, WriteVST]>;
  79. def WriteVSTPairShuffle : WriteSequence<[WriteVq, WriteVq, WriteVST]>;