cast.td 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. // RUN: llvm-tblgen %s | FileCheck %s
  2. // XFAIL: vg_leak
  3. // CHECK: add_ps
  4. // CHECK: add_ps
  5. // CHECK: add_ps
  6. // CHECK-NOT: add_ps
  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. // Define intrinsics
  57. def int_x86_sse2_add_ps : Intrinsic<"addps">;
  58. def int_x86_sse2_add_pd : Intrinsic<"addpd">;
  59. multiclass arith<bits<8> opcode, string asmstr, string Intr> {
  60. def PS : Inst<opcode, (outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
  61. !strconcat(asmstr, "\t$dst, $src1, $src2"),
  62. [(set VR128:$dst, (!cast<Intrinsic>(!strconcat(Intr, "_ps")) VR128:$src1, VR128:$src2))]>;
  63. def PD : Inst<opcode, (outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
  64. !strconcat(asmstr, "\t$dst, $src1, $src2"),
  65. [(set VR128:$dst, (!cast<Intrinsic>(!strconcat(Intr, "_pd")) VR128:$src1, VR128:$src2))]>;
  66. }
  67. defm ADD : arith<0x58, "add", "int_x86_sse2_add">;
  68. class IntInst<bits<8> opcode, string asmstr, Intrinsic Intr> :
  69. Inst<opcode,(outs VR128:$dst), (ins VR128:$src1, VR128:$src2),
  70. !strconcat(asmstr, "\t$dst, $src1, $src2"),
  71. [(set VR128:$dst, (Intr VR128:$src1, VR128:$src2))]>;
  72. multiclass arith_int<bits<8> opcode, string asmstr, string Intr> {
  73. def PS_Int : IntInst<opcode, asmstr, !cast<Intrinsic>(!strconcat(Intr, "_ps"))>;
  74. def PD_Int : IntInst<opcode, asmstr, !cast<Intrinsic>(!strconcat(Intr, "_pd"))>;
  75. }
  76. defm ADD : arith_int<0x58, "add", "int_x86_sse2_add">;