|
| 1 | +// RUN: llvm-tblgen -gen-dag-isel -I %p/../../include %s -o - | FileCheck %s |
| 2 | + |
| 3 | +// Create an intrinsic that uses cPTR to overload on capability pointer types, |
| 4 | +// and verify that we can match it correct in SelectionDAG. |
| 5 | + |
| 6 | +// CHECK: static const unsigned char MatcherTable[] = { |
| 7 | +// CHECK-NEXT: /* 0*/ OPC_CheckOpcode, TARGET_VAL(ISD::INTRINSIC_WO_CHAIN), |
| 8 | +// CHECK-NEXT:/* 3*/ OPC_CheckChild0Integer, 42, |
| 9 | +// CHECK-NEXT:/* 5*/ OPC_RecordChild1, // #0 = $src |
| 10 | +// CHECK-NEXT:/* 6*/ OPC_Scope, 9, /*->17*/ // 2 children in Scope |
| 11 | +// CHECK-NEXT:/* 8*/ OPC_CheckChild1Type, /*MVT::c64*/126|128,1/*254*/, |
| 12 | +// CHECK-NEXT:/* 11*/ OPC_MorphNodeTo1None, TARGET_VAL(MyTarget::C64_TO_I64), |
| 13 | +// CHECK-NEXT: /*MVT::i64*/8, 1/*#Ops*/, 0, |
| 14 | +// CHECK-NEXT: // Src: (intrinsic_wo_chain:{ *:[i64] } 21:{ *:[iPTR] }, c64:{ *:[c64] }:$src) - Complexity = 8 |
| 15 | +// CHECK-NEXT: // Dst: (C64_TO_I64:{ *:[i64] } ?:{ *:[c64] }:$src) |
| 16 | +// CHECK-NEXT:/* 17*/ /*Scope*/ 9, /*->27*/ |
| 17 | +// CHECK-NEXT:/* 18*/ OPC_CheckChild1Type, /*MVT::c128*/127|128,1/*255*/, |
| 18 | +// CHECK-NEXT:/* 21*/ OPC_MorphNodeTo1None, TARGET_VAL(MyTarget::C128_TO_I64), |
| 19 | +// CHECK-NEXT: /*MVT::i64*/8, 1/*#Ops*/, 0, |
| 20 | +// CHECK-NEXT: // Src: (intrinsic_wo_chain:{ *:[i64] } 21:{ *:[iPTR] }, c128:{ *:[c128] }:$src) - Complexity = 8 |
| 21 | +// CHECK-NEXT: // Dst: (C128_TO_I64:{ *:[i64] } ?:{ *:[c128] }:$src) |
| 22 | +// CHECK-NEXT:/* 27*/ 0, /*End of Scope*/ |
| 23 | +// CHECK-NEXT: 0 |
| 24 | +// CHECK-NEXT: }; // Total Array size is 29 bytes |
| 25 | + |
| 26 | +include "llvm/Target/Target.td" |
| 27 | + |
| 28 | +def my_cap_ty : LLVMQualPointerType<200> { |
| 29 | + let VT = cPTR; |
| 30 | +} |
| 31 | + |
| 32 | +def int_cap_get_length : |
| 33 | + Intrinsic<[llvm_i64_ty], |
| 34 | + [my_cap_ty], |
| 35 | + [IntrNoMem, IntrWillReturn]>; |
| 36 | + |
| 37 | +class CapReg<string n> : Register<n> { |
| 38 | + let Namespace = "MyTarget"; |
| 39 | +} |
| 40 | + |
| 41 | +def C64 : CapReg<"c0">; |
| 42 | +def C64s |
| 43 | + : RegisterClass<"MyTarget", [i64, c64], 64, |
| 44 | + (add C64)>; |
| 45 | + |
| 46 | +def C128 : CapReg<"c0">; |
| 47 | +def C128s |
| 48 | + : RegisterClass<"MyTarget", [c128], 64, |
| 49 | + (add C128)>; |
| 50 | + |
| 51 | +def C64_TO_I64 : Instruction { |
| 52 | + let Namespace = "MyTarget"; |
| 53 | + let OutOperandList = (outs C64s:$dst); |
| 54 | + let InOperandList = (ins C64s:$src); |
| 55 | +} |
| 56 | + |
| 57 | +def C128_TO_I64 : Instruction { |
| 58 | + let Namespace = "MyTarget"; |
| 59 | + let OutOperandList = (outs C64s:$dst); |
| 60 | + let InOperandList = (ins C128s:$src); |
| 61 | +} |
| 62 | + |
| 63 | +def : Pat< |
| 64 | + (int_cap_get_length c64:$src), |
| 65 | + (C64_TO_I64 $src) |
| 66 | +>; |
| 67 | + |
| 68 | +def : Pat< |
| 69 | + (int_cap_get_length c128:$src), |
| 70 | + (C128_TO_I64 $src) |
| 71 | +>; |
| 72 | + |
| 73 | +def MyTargetISA : InstrInfo; |
| 74 | +def MyTarget : Target { let InstructionSet = MyTargetISA; } |
0 commit comments