brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.5 KiB · 867d6f8 Raw
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