75 lines · plain
1// RUN: llvm-tblgen -gen-dag-isel -I %p/../../include %s -o - | FileCheck %s2 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, [[#]],9// CHECK-NEXT:/* 5*/ OPC_RecordChild1, // #0 = $src10// CHECK-NEXT:/* 6*/ OPC_Scope, 9, /*->17*/ // 2 children in Scope11// CHECK-NEXT:/* 8*/ OPC_CheckChild1Type, /*MVT::c64*/0|128,2/*256*/,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] } [[#]]:{ *:[iPTR] }, c64:{ *:[c64] }:$src) - Complexity = 815// CHECK-NEXT: // Dst: (C64_TO_I64:{ *:[i64] } ?:{ *:[c64] }:$src)16// CHECK-NEXT:/* 17*/ /*Scope*/ 9, /*->27*/17// CHECK-NEXT:/* 18*/ OPC_CheckChild1Type, /*MVT::c128*/1|128,2/*257*/,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] } [[#]]:{ *:[iPTR] }, c128:{ *:[c128] }:$src) - Complexity = 821// CHECK-NEXT: // Dst: (C128_TO_I64:{ *:[i64] } ?:{ *:[c128] }:$src)22// CHECK-NEXT:/* 27*/ 0, /*End of Scope*/23// CHECK-NEXT: 024// CHECK-NEXT: }; // Total Array size is 29 bytes25 26include "llvm/Target/Target.td"27 28def my_cap_ty : LLVMQualPointerType<200> {29 let VT = cPTR;30}31 32def int_cap_get_length :33 Intrinsic<[llvm_i64_ty],34 [my_cap_ty],35 [IntrNoMem, IntrWillReturn]>;36 37class CapReg<string n> : Register<n> {38 let Namespace = "MyTarget";39}40 41def C64 : CapReg<"c0">;42def C64s43 : RegisterClass<"MyTarget", [i64, c64], 64,44 (add C64)>;45 46def C128 : CapReg<"c0">;47def C128s48 : RegisterClass<"MyTarget", [c128], 64,49 (add C128)>;50 51def C64_TO_I64 : Instruction {52 let Namespace = "MyTarget";53 let OutOperandList = (outs C64s:$dst);54 let InOperandList = (ins C64s:$src);55}56 57def C128_TO_I64 : Instruction {58 let Namespace = "MyTarget";59 let OutOperandList = (outs C64s:$dst);60 let InOperandList = (ins C128s:$src);61}62 63def : Pat<64 (int_cap_get_length c64:$src),65 (C64_TO_I64 $src)66>;67 68def : Pat<69 (int_cap_get_length c128:$src),70 (C128_TO_I64 $src)71>;72 73def MyTargetISA : InstrInfo;74def MyTarget : Target { let InstructionSet = MyTargetISA; }75