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