|  | 
|  | 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