TargetInstrSpec.td 3.0 KB

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