AArch64SchedThunderX.td 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360
  1. //==- AArch64SchedThunderX.td - Cavium ThunderX T8X 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. //
  9. // This file defines the itinerary class data for the ARM ThunderX T8X
  10. // (T88, T81, T83) processors.
  11. // Loosely based on Cortex-A53 which is somewhat similar.
  12. //
  13. //===----------------------------------------------------------------------===//
  14. // ===---------------------------------------------------------------------===//
  15. // The following definitions describe the simpler per-operand machine model.
  16. // This works with MachineScheduler. See llvm/MC/MCSchedule.h for details.
  17. // Cavium ThunderX T8X scheduling machine model.
  18. def ThunderXT8XModel : SchedMachineModel {
  19. let IssueWidth = 2; // 2 micro-ops dispatched per cycle.
  20. let MicroOpBufferSize = 0; // ThunderX T88/T81/T83 are in-order.
  21. let LoadLatency = 3; // Optimistic load latency.
  22. let MispredictPenalty = 8; // Branch mispredict penalty.
  23. let PostRAScheduler = 1; // Use PostRA scheduler.
  24. let CompleteModel = 1;
  25. list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F,
  26. PAUnsupported.F,
  27. SMEUnsupported.F,
  28. [HasMTE]);
  29. // FIXME: Remove when all errors have been fixed.
  30. let FullInstRWOverlapCheck = 0;
  31. }
  32. // Modeling each pipeline with BufferSize == 0 since T8X is in-order.
  33. def THXT8XUnitALU : ProcResource<2> { let BufferSize = 0; } // Int ALU
  34. def THXT8XUnitMAC : ProcResource<1> { let BufferSize = 0; } // Int MAC
  35. def THXT8XUnitDiv : ProcResource<1> { let BufferSize = 0; } // Int Division
  36. def THXT8XUnitLdSt : ProcResource<1> { let BufferSize = 0; } // Load/Store
  37. def THXT8XUnitBr : ProcResource<1> { let BufferSize = 0; } // Branch
  38. def THXT8XUnitFPALU : ProcResource<1> { let BufferSize = 0; } // FP ALU
  39. def THXT8XUnitFPMDS : ProcResource<1> { let BufferSize = 0; } // FP Mul/Div/Sqrt
  40. //===----------------------------------------------------------------------===//
  41. // Subtarget-specific SchedWrite types mapping the ProcResources and
  42. // latencies.
  43. let SchedModel = ThunderXT8XModel in {
  44. // ALU
  45. def : WriteRes<WriteImm, [THXT8XUnitALU]> { let Latency = 1; }
  46. def : WriteRes<WriteI, [THXT8XUnitALU]> { let Latency = 1; }
  47. def : WriteRes<WriteISReg, [THXT8XUnitALU]> { let Latency = 2; }
  48. def : WriteRes<WriteIEReg, [THXT8XUnitALU]> { let Latency = 2; }
  49. def : WriteRes<WriteIS, [THXT8XUnitALU]> { let Latency = 2; }
  50. def : WriteRes<WriteExtr, [THXT8XUnitALU]> { let Latency = 2; }
  51. // MAC
  52. def : WriteRes<WriteIM32, [THXT8XUnitMAC]> {
  53. let Latency = 4;
  54. let ResourceCycles = [1];
  55. }
  56. def : WriteRes<WriteIM64, [THXT8XUnitMAC]> {
  57. let Latency = 4;
  58. let ResourceCycles = [1];
  59. }
  60. // Div
  61. def : WriteRes<WriteID32, [THXT8XUnitDiv]> {
  62. let Latency = 12;
  63. let ResourceCycles = [6];
  64. }
  65. def : WriteRes<WriteID64, [THXT8XUnitDiv]> {
  66. let Latency = 14;
  67. let ResourceCycles = [8];
  68. }
  69. // Load
  70. def : WriteRes<WriteLD, [THXT8XUnitLdSt]> { let Latency = 3; }
  71. def : WriteRes<WriteLDIdx, [THXT8XUnitLdSt]> { let Latency = 3; }
  72. def : WriteRes<WriteLDHi, [THXT8XUnitLdSt]> { let Latency = 3; }
  73. // Vector Load
  74. def : WriteRes<WriteVLD, [THXT8XUnitLdSt]> {
  75. let Latency = 8;
  76. let ResourceCycles = [3];
  77. }
  78. def THXT8XWriteVLD1 : SchedWriteRes<[THXT8XUnitLdSt]> {
  79. let Latency = 6;
  80. let ResourceCycles = [1];
  81. }
  82. def THXT8XWriteVLD2 : SchedWriteRes<[THXT8XUnitLdSt]> {
  83. let Latency = 11;
  84. let ResourceCycles = [7];
  85. }
  86. def THXT8XWriteVLD3 : SchedWriteRes<[THXT8XUnitLdSt]> {
  87. let Latency = 12;
  88. let ResourceCycles = [8];
  89. }
  90. def THXT8XWriteVLD4 : SchedWriteRes<[THXT8XUnitLdSt]> {
  91. let Latency = 13;
  92. let ResourceCycles = [9];
  93. }
  94. def THXT8XWriteVLD5 : SchedWriteRes<[THXT8XUnitLdSt]> {
  95. let Latency = 13;
  96. let ResourceCycles = [9];
  97. }
  98. // Pre/Post Indexing
  99. def : WriteRes<WriteAdr, []> { let Latency = 0; }
  100. // Store
  101. def : WriteRes<WriteST, [THXT8XUnitLdSt]> { let Latency = 1; }
  102. def : WriteRes<WriteSTP, [THXT8XUnitLdSt]> { let Latency = 1; }
  103. def : WriteRes<WriteSTIdx, [THXT8XUnitLdSt]> { let Latency = 1; }
  104. def : WriteRes<WriteSTX, [THXT8XUnitLdSt]> { let Latency = 1; }
  105. // Vector Store
  106. def : WriteRes<WriteVST, [THXT8XUnitLdSt]>;
  107. def THXT8XWriteVST1 : SchedWriteRes<[THXT8XUnitLdSt]>;
  108. def THXT8XWriteVST2 : SchedWriteRes<[THXT8XUnitLdSt]> {
  109. let Latency = 10;
  110. let ResourceCycles = [9];
  111. }
  112. def THXT8XWriteVST3 : SchedWriteRes<[THXT8XUnitLdSt]> {
  113. let Latency = 11;
  114. let ResourceCycles = [10];
  115. }
  116. def : WriteRes<WriteAtomic, []> { let Unsupported = 1; }
  117. // Branch
  118. def : WriteRes<WriteBr, [THXT8XUnitBr]>;
  119. def THXT8XWriteBR : SchedWriteRes<[THXT8XUnitBr]>;
  120. def : WriteRes<WriteBrReg, [THXT8XUnitBr]>;
  121. def THXT8XWriteBRR : SchedWriteRes<[THXT8XUnitBr]>;
  122. def THXT8XWriteRET : SchedWriteRes<[THXT8XUnitALU]>;
  123. def : WriteRes<WriteSys, [THXT8XUnitBr]>;
  124. def : WriteRes<WriteBarrier, [THXT8XUnitBr]>;
  125. def : WriteRes<WriteHint, [THXT8XUnitBr]>;
  126. // FP ALU
  127. def : WriteRes<WriteF, [THXT8XUnitFPALU]> { let Latency = 6; }
  128. def : WriteRes<WriteFCmp, [THXT8XUnitFPALU]> { let Latency = 6; }
  129. def : WriteRes<WriteFCvt, [THXT8XUnitFPALU]> { let Latency = 6; }
  130. def : WriteRes<WriteFCopy, [THXT8XUnitFPALU]> { let Latency = 6; }
  131. def : WriteRes<WriteFImm, [THXT8XUnitFPALU]> { let Latency = 6; }
  132. def : WriteRes<WriteVd, [THXT8XUnitFPALU]> { let Latency = 6; }
  133. def : WriteRes<WriteVq, [THXT8XUnitFPALU]> { let Latency = 6; }
  134. // FP Mul, Div, Sqrt
  135. def : WriteRes<WriteFMul, [THXT8XUnitFPMDS]> { let Latency = 6; }
  136. def : WriteRes<WriteFDiv, [THXT8XUnitFPMDS]> {
  137. let Latency = 22;
  138. let ResourceCycles = [19];
  139. }
  140. def THXT8XWriteFMAC : SchedWriteRes<[THXT8XUnitFPMDS]> { let Latency = 10; }
  141. def THXT8XWriteFDivSP : SchedWriteRes<[THXT8XUnitFPMDS]> {
  142. let Latency = 12;
  143. let ResourceCycles = [9];
  144. }
  145. def THXT8XWriteFDivDP : SchedWriteRes<[THXT8XUnitFPMDS]> {
  146. let Latency = 22;
  147. let ResourceCycles = [19];
  148. }
  149. def THXT8XWriteFSqrtSP : SchedWriteRes<[THXT8XUnitFPMDS]> {
  150. let Latency = 17;
  151. let ResourceCycles = [14];
  152. }
  153. def THXT8XWriteFSqrtDP : SchedWriteRes<[THXT8XUnitFPMDS]> {
  154. let Latency = 31;
  155. let ResourceCycles = [28];
  156. }
  157. //===----------------------------------------------------------------------===//
  158. // Subtarget-specific SchedRead types.
  159. // No forwarding for these reads.
  160. def : ReadAdvance<ReadExtrHi, 1>;
  161. def : ReadAdvance<ReadAdrBase, 2>;
  162. def : ReadAdvance<ReadVLD, 2>;
  163. def : ReadAdvance<ReadST, 2>;
  164. // FIXME: This needs more targeted benchmarking.
  165. // ALU - Most operands in the ALU pipes are not needed for two cycles. Shiftable
  166. // operands are needed one cycle later if and only if they are to be
  167. // shifted. Otherwise, they too are needed two cycles later. This same
  168. // ReadAdvance applies to Extended registers as well, even though there is
  169. // a separate SchedPredicate for them.
  170. def : ReadAdvance<ReadI, 2, [WriteImm, WriteI,
  171. WriteISReg, WriteIEReg, WriteIS,
  172. WriteID32, WriteID64,
  173. WriteIM32, WriteIM64]>;
  174. def THXT8XReadShifted : SchedReadAdvance<1, [WriteImm, WriteI,
  175. WriteISReg, WriteIEReg, WriteIS,
  176. WriteID32, WriteID64,
  177. WriteIM32, WriteIM64]>;
  178. def THXT8XReadNotShifted : SchedReadAdvance<2, [WriteImm, WriteI,
  179. WriteISReg, WriteIEReg, WriteIS,
  180. WriteID32, WriteID64,
  181. WriteIM32, WriteIM64]>;
  182. def THXT8XReadISReg : SchedReadVariant<[
  183. SchedVar<RegShiftedPred, [THXT8XReadShifted]>,
  184. SchedVar<NoSchedPred, [THXT8XReadNotShifted]>]>;
  185. def : SchedAlias<ReadISReg, THXT8XReadISReg>;
  186. def THXT8XReadIEReg : SchedReadVariant<[
  187. SchedVar<RegExtendedPred, [THXT8XReadShifted]>,
  188. SchedVar<NoSchedPred, [THXT8XReadNotShifted]>]>;
  189. def : SchedAlias<ReadIEReg, THXT8XReadIEReg>;
  190. // MAC - Operands are generally needed one cycle later in the MAC pipe.
  191. // Accumulator operands are needed two cycles later.
  192. def : ReadAdvance<ReadIM, 1, [WriteImm,WriteI,
  193. WriteISReg, WriteIEReg, WriteIS,
  194. WriteID32, WriteID64,
  195. WriteIM32, WriteIM64]>;
  196. def : ReadAdvance<ReadIMA, 2, [WriteImm, WriteI,
  197. WriteISReg, WriteIEReg, WriteIS,
  198. WriteID32, WriteID64,
  199. WriteIM32, WriteIM64]>;
  200. // Div
  201. def : ReadAdvance<ReadID, 1, [WriteImm, WriteI,
  202. WriteISReg, WriteIEReg, WriteIS,
  203. WriteID32, WriteID64,
  204. WriteIM32, WriteIM64]>;
  205. //===----------------------------------------------------------------------===//
  206. // Subtarget-specific InstRW.
  207. //---
  208. // Branch
  209. //---
  210. def : InstRW<[THXT8XWriteBR], (instregex "^B$")>;
  211. def : InstRW<[THXT8XWriteBR], (instregex "^BL$")>;
  212. def : InstRW<[THXT8XWriteBR], (instregex "^B..$")>;
  213. def : InstRW<[THXT8XWriteBR], (instregex "^CBNZ")>;
  214. def : InstRW<[THXT8XWriteBR], (instregex "^CBZ")>;
  215. def : InstRW<[THXT8XWriteBR], (instregex "^TBNZ")>;
  216. def : InstRW<[THXT8XWriteBR], (instregex "^TBZ")>;
  217. def : InstRW<[THXT8XWriteBRR], (instregex "^BR$")>;
  218. def : InstRW<[THXT8XWriteBRR], (instregex "^BLR$")>;
  219. //---
  220. // Ret
  221. //---
  222. def : InstRW<[THXT8XWriteRET], (instregex "^RET$")>;
  223. //---
  224. // Miscellaneous
  225. //---
  226. def : InstRW<[WriteI], (instrs COPY)>;
  227. //---
  228. // Vector Loads
  229. //---
  230. def : InstRW<[THXT8XWriteVLD1], (instregex "LD1i(8|16|32|64)$")>;
  231. def : InstRW<[THXT8XWriteVLD1], (instregex "LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  232. def : InstRW<[THXT8XWriteVLD1], (instregex "LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  233. def : InstRW<[THXT8XWriteVLD2], (instregex "LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  234. def : InstRW<[THXT8XWriteVLD3], (instregex "LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  235. def : InstRW<[THXT8XWriteVLD4], (instregex "LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  236. def : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD1i(8|16|32|64)_POST$")>;
  237. def : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  238. def : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  239. def : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  240. def : InstRW<[THXT8XWriteVLD3, WriteAdr], (instregex "LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  241. def : InstRW<[THXT8XWriteVLD4, WriteAdr], (instregex "LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  242. def : InstRW<[THXT8XWriteVLD1], (instregex "LD2i(8|16|32|64)$")>;
  243. def : InstRW<[THXT8XWriteVLD1], (instregex "LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  244. def : InstRW<[THXT8XWriteVLD2], (instregex "LD2Twov(8b|4h|2s)$")>;
  245. def : InstRW<[THXT8XWriteVLD4], (instregex "LD2Twov(16b|8h|4s|2d)$")>;
  246. def : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD2i(8|16|32|64)(_POST)?$")>;
  247. def : InstRW<[THXT8XWriteVLD1, WriteAdr], (instregex "LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)(_POST)?$")>;
  248. def : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD2Twov(8b|4h|2s)(_POST)?$")>;
  249. def : InstRW<[THXT8XWriteVLD4, WriteAdr], (instregex "LD2Twov(16b|8h|4s|2d)(_POST)?$")>;
  250. def : InstRW<[THXT8XWriteVLD2], (instregex "LD3i(8|16|32|64)$")>;
  251. def : InstRW<[THXT8XWriteVLD2], (instregex "LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  252. def : InstRW<[THXT8XWriteVLD4], (instregex "LD3Threev(8b|4h|2s|1d|16b|8h|4s)$")>;
  253. def : InstRW<[THXT8XWriteVLD3], (instregex "LD3Threev(2d)$")>;
  254. def : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD3i(8|16|32|64)_POST$")>;
  255. def : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  256. def : InstRW<[THXT8XWriteVLD4, WriteAdr], (instregex "LD3Threev(8b|4h|2s|1d|16b|8h|4s)_POST$")>;
  257. def : InstRW<[THXT8XWriteVLD3, WriteAdr], (instregex "LD3Threev(2d)_POST$")>;
  258. def : InstRW<[THXT8XWriteVLD2], (instregex "LD4i(8|16|32|64)$")>;
  259. def : InstRW<[THXT8XWriteVLD2], (instregex "LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  260. def : InstRW<[THXT8XWriteVLD5], (instregex "LD4Fourv(8b|4h|2s|1d|16b|8h|4s)$")>;
  261. def : InstRW<[THXT8XWriteVLD4], (instregex "LD4Fourv(2d)$")>;
  262. def : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD4i(8|16|32|64)_POST$")>;
  263. def : InstRW<[THXT8XWriteVLD2, WriteAdr], (instregex "LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  264. def : InstRW<[THXT8XWriteVLD5, WriteAdr], (instregex "LD4Fourv(8b|4h|2s|1d|16b|8h|4s)_POST$")>;
  265. def : InstRW<[THXT8XWriteVLD4, WriteAdr], (instregex "LD4Fourv(2d)_POST$")>;
  266. //---
  267. // Vector Stores
  268. //---
  269. def : InstRW<[THXT8XWriteVST1], (instregex "ST1i(8|16|32|64)$")>;
  270. def : InstRW<[THXT8XWriteVST1], (instregex "ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  271. def : InstRW<[THXT8XWriteVST1], (instregex "ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  272. def : InstRW<[THXT8XWriteVST2], (instregex "ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  273. def : InstRW<[THXT8XWriteVST2], (instregex "ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>;
  274. def : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST1i(8|16|32|64)_POST$")>;
  275. def : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  276. def : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  277. def : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  278. def : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>;
  279. def : InstRW<[THXT8XWriteVST1], (instregex "ST2i(8|16|32|64)$")>;
  280. def : InstRW<[THXT8XWriteVST1], (instregex "ST2Twov(8b|4h|2s)$")>;
  281. def : InstRW<[THXT8XWriteVST2], (instregex "ST2Twov(16b|8h|4s|2d)$")>;
  282. def : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST2i(8|16|32|64)_POST$")>;
  283. def : InstRW<[THXT8XWriteVST1, WriteAdr], (instregex "ST2Twov(8b|4h|2s)_POST$")>;
  284. def : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST2Twov(16b|8h|4s|2d)_POST$")>;
  285. def : InstRW<[THXT8XWriteVST2], (instregex "ST3i(8|16|32|64)$")>;
  286. def : InstRW<[THXT8XWriteVST3], (instregex "ST3Threev(8b|4h|2s|1d|16b|8h|4s)$")>;
  287. def : InstRW<[THXT8XWriteVST2], (instregex "ST3Threev(2d)$")>;
  288. def : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST3i(8|16|32|64)_POST$")>;
  289. def : InstRW<[THXT8XWriteVST3, WriteAdr], (instregex "ST3Threev(8b|4h|2s|1d|16b|8h|4s)_POST$")>;
  290. def : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST3Threev(2d)_POST$")>;
  291. def : InstRW<[THXT8XWriteVST2], (instregex "ST4i(8|16|32|64)$")>;
  292. def : InstRW<[THXT8XWriteVST3], (instregex "ST4Fourv(8b|4h|2s|1d|16b|8h|4s)$")>;
  293. def : InstRW<[THXT8XWriteVST2], (instregex "ST4Fourv(2d)$")>;
  294. def : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST4i(8|16|32|64)_POST$")>;
  295. def : InstRW<[THXT8XWriteVST3, WriteAdr], (instregex "ST4Fourv(8b|4h|2s|1d|16b|8h|4s)_POST$")>;
  296. def : InstRW<[THXT8XWriteVST2, WriteAdr], (instregex "ST4Fourv(2d)_POST$")>;
  297. //---
  298. // Floating Point MAC, DIV, SQRT
  299. //---
  300. def : InstRW<[THXT8XWriteFMAC], (instregex "^FN?M(ADD|SUB).*")>;
  301. def : InstRW<[THXT8XWriteFMAC], (instregex "^FML(A|S).*")>;
  302. def : InstRW<[THXT8XWriteFDivSP], (instrs FDIVSrr)>;
  303. def : InstRW<[THXT8XWriteFDivDP], (instrs FDIVDrr)>;
  304. def : InstRW<[THXT8XWriteFDivSP], (instregex "^FDIVv.*32$")>;
  305. def : InstRW<[THXT8XWriteFDivDP], (instregex "^FDIVv.*64$")>;
  306. def : InstRW<[THXT8XWriteFSqrtSP], (instregex "^.*SQRT.*32$")>;
  307. def : InstRW<[THXT8XWriteFSqrtDP], (instregex "^.*SQRT.*64$")>;
  308. }