2
0

MultiPat.td 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. // RUN: llvm-tblgen %s | FileCheck %s
  2. // XFAIL: vg_leak
  3. class ValueType<int size, int value> {
  4. int Size = size;
  5. int Value = value;
  6. }
  7. def v2i64 : ValueType<128, 22>; // 2 x i64 vector value
  8. def v2f64 : ValueType<128, 28>; // 2 x f64 vector value
  9. class Intrinsic<string name> {
  10. string Name = name;
  11. }
  12. class Pattern<dag patternToMatch, list<dag> resultInstrs> {
  13. dag PatternToMatch = patternToMatch;
  14. list<dag> ResultInstrs = resultInstrs;
  15. }
  16. // Pat - A simple (but common) form of a pattern, which produces a simple result
  17. // not needing a full list.
  18. class Pat<dag pattern, dag result> : Pattern<pattern, [result]>;
  19. class Inst<bits<8> opcode, dag oopnds, dag iopnds, string asmstr,
  20. list<dag> pattern> {
  21. bits<8> Opcode = opcode;
  22. dag OutOperands = oopnds;
  23. dag InOperands = iopnds;
  24. string AssemblyString = asmstr;
  25. list<dag> Pattern = pattern;
  26. }
  27. def ops;
  28. def outs;
  29. def ins;
  30. def set;
  31. // Define registers
  32. class Register<string n> {
  33. string Name = n;
  34. }
  35. class RegisterClass<list<ValueType> regTypes, list<Register> regList> {
  36. list<ValueType> RegTypes = regTypes;
  37. list<Register> MemberList = regList;
  38. }
  39. def XMM0: Register<"xmm0">;
  40. def XMM1: Register<"xmm1">;
  41. def XMM2: Register<"xmm2">;
  42. def XMM3: Register<"xmm3">;
  43. def XMM4: Register<"xmm4">;
  44. def XMM5: Register<"xmm5">;
  45. def XMM6: Register<"xmm6">;
  46. def XMM7: Register<"xmm7">;
  47. def XMM8: Register<"xmm8">;
  48. def XMM9: Register<"xmm9">;
  49. def XMM10: Register<"xmm10">;
  50. def XMM11: Register<"xmm11">;
  51. def XMM12: Register<"xmm12">;
  52. def XMM13: Register<"xmm13">;
  53. def XMM14: Register<"xmm14">;
  54. def XMM15: Register<"xmm15">;
  55. def VR128 : RegisterClass<[v2i64, v2f64],
  56. [XMM0, XMM1, XMM2, XMM3, XMM4, XMM5, XMM6, XMM7,
  57. XMM8, XMM9, XMM10, XMM11,
  58. XMM12, XMM13, XMM14, XMM15]>;
  59. // Dummy for subst
  60. def REGCLASS : RegisterClass<[], []>;
  61. def MNEMONIC;
  62. class decls {
  63. // Dummy for foreach
  64. dag pattern;
  65. int operand;
  66. }
  67. def Decls : decls;
  68. // Define intrinsics
  69. def int_x86_sse2_add_ps : Intrinsic<"addps">;
  70. def int_x86_sse2_add_pd : Intrinsic<"addpd">;
  71. def INTRINSIC : Intrinsic<"Dummy">;
  72. def bitconvert;
  73. class MakePat<list<dag> patterns> : Pat<patterns[0], patterns[1]>;
  74. class Base<bits<8> opcode, dag opnds, dag iopnds, string asmstr, Intrinsic intr,
  75. list<list<dag>> patterns>
  76. : Inst<opcode, opnds, iopnds, asmstr,
  77. !foreach(Decls.pattern, patterns[0],
  78. !foreach(Decls.operand, Decls.pattern,
  79. !subst(INTRINSIC, intr,
  80. !subst(REGCLASS, VR128,
  81. !subst(MNEMONIC, set, Decls.operand)))))>,
  82. MakePat<!foreach(Decls.pattern, patterns[1],
  83. !foreach(Decls.operand, Decls.pattern,
  84. !subst(INTRINSIC, intr,
  85. !subst(REGCLASS, VR128,
  86. !subst(MNEMONIC, set, Decls.operand)))))>;
  87. multiclass arith<bits<8> opcode, string asmstr, string intr, list<list<dag>> patterns> {
  88. def PS : Base<opcode, (outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
  89. !strconcat(asmstr, "\t$dst, $src1, $src2"), !cast<Intrinsic>(!subst("SUFFIX", "_ps", intr)), patterns>;
  90. def PD : Base<opcode, (outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
  91. !strconcat(asmstr, "\t$dst, $src1, $src2"), !cast<Intrinsic>(!subst("SUFFIX", "_pd", intr)), patterns>;
  92. }
  93. defm ADD : arith<0x58, "add", "int_x86_sse2_addSUFFIX",
  94. // rr Patterns
  95. [[(set REGCLASS:$dst, (INTRINSIC REGCLASS:$src1, REGCLASS:$src2))],
  96. [(set REGCLASS:$dst, (bitconvert (INTRINSIC REGCLASS:$src1, REGCLASS:$src2))),
  97. (MNEMONIC REGCLASS:$dst, REGCLASS:$src)]]>;
  98. // CHECK: [(set VR128:$dst, (int_x86_sse2_add_pd VR128:$src1, VR128:$src2))]
  99. // CHECK: [(set VR128:$dst, (int_x86_sse2_add_ps VR128:$src1, VR128:$src2))]