134 lines · plain
1// RUN: llvm-tblgen -gen-dag-isel -I %p/../../include %s 2>&1 | FileCheck -check-prefix=SDAG %s2// RUN: llvm-tblgen -gen-global-isel -optimize-match-table=false -I %p/../../include %s -o - < %s | FileCheck -check-prefix=GISEL %s3 4include "llvm/Target/Target.td"5 6def TestTargetInstrInfo : InstrInfo;7 8 9def TestTarget : Target {10 let InstructionSet = TestTargetInstrInfo;11}12 13def R0 : Register<"r0"> { let Namespace = "MyTarget"; }14def GPR32 : RegisterClass<"MyTarget", [i32], 32, (add R0)>;15 16 17// With one address space18def pat_frag_a : PatFrag <(ops node:$ptr), (load node:$ptr), [{}]> {19 let IsLoad = 1; // FIXME: Can this be inferred?20 let MinAlignment = 2;21}22 23// With multiple address spaces24def pat_frag_b : PatFrag <(ops node:$ptr), (load node:$ptr), [{}]> {25 let AddressSpaces = [ 123, 455 ];26 let IsLoad = 1; // FIXME: Can this be inferred?27}28 29def inst_a : Instruction {30 let OutOperandList = (outs GPR32:$dst);31 let InOperandList = (ins GPR32:$src);32}33 34def inst_b : Instruction {35 let OutOperandList = (outs GPR32:$dst);36 let InOperandList = (ins GPR32:$src);37}38 39def inst_c : Instruction {40 let OutOperandList = (outs);41 let InOperandList = (ins GPR32:$src0, GPR32:$src1);42}43 44def inst_d : Instruction {45 let OutOperandList = (outs);46 let InOperandList = (ins GPR32:$src0, GPR32:$src1);47}48 49// SDAG: case 0: {50// SDAG-NEXT: // Predicate_pat_frag_b51// SDAG-NEXT: // Predicate_truncstorei16_addrspace52// SDAG-NEXT: SDNode *N = Op.getNode();53// SDAG-NEXT: (void)N;54// SDAG-NEXT: unsigned AddrSpace = cast<MemSDNode>(N)->getAddressSpace();55// SDAG-NEXT: if (AddrSpace != 123 && AddrSpace != 455)56// SDAG-NEXT: return false;57// SDAG-NEXT: return true;58 59 60// GISEL: GIM_Try, /*On fail goto*//*Label 0*/ GIMT_Encode4({{[0-9]+}}), // Rule ID 0 //61// GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,62// GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_LOAD),63// GISEL-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(uint8_t)AtomicOrdering::NotAtomic,64// GISEL-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,65// GISEL-NEXT: GIM_CheckMemoryAddressSpace, /*MI*/0, /*MMO*/0, /*NumAddrSpace*/2, /*AddrSpace*/123, /*AddrSpace*//* 455(*/0xC7, 0x03/*)*/,66def : Pat <67 (pat_frag_b GPR32:$src),68 (inst_b GPR32:$src)69>;70 71 72// SDAG: case 4: {73// SDAG: // Predicate_pat_frag_a74// SDAG-NEXT: SDNode *N = Op.getNode();75// SDAG-NEXT: (void)N;76// SDAG-NEXT: if (cast<MemSDNode>(N)->getAlign() < Align(2))77// SDAG-NEXT: return false;78// SDAG-NEXT: return true;79 80// GISEL: GIM_Try, /*On fail goto*//*Label 1*/ GIMT_Encode4({{[0-9]+}}), // Rule ID 1 //81// GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,82// GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_LOAD),83// GISEL-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(uint8_t)AtomicOrdering::NotAtomic,84// GISEL-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,85// GISEL-NEXT: GIM_CheckMemoryAlignment, /*MI*/0, /*MMO*/0, /*MinAlign*/2,86def : Pat <87 (pat_frag_a GPR32:$src),88 (inst_a GPR32:$src)89>;90 91 92def truncstorei16_addrspace : PatFrag<(ops node:$val, node:$ptr),93 (truncstorei16 node:$val, node:$ptr)> {94 let IsStore = 1;95 let AddressSpaces = [ 123, 455 ];96}97 98// Test truncstore without a specific MemoryVT99// GISEL: GIM_Try, /*On fail goto*//*Label 2*/ GIMT_Encode4({{[0-9]+}}), // Rule ID 2 //100// GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,101// GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_STORE),102// GISEL-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(uint8_t)AtomicOrdering::NotAtomic,103// GISEL-NEXT: GIM_CheckMemorySizeLessThanLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,104// GISEL-NEXT: // MIs[0] src0105// GISEL-NEXT: GIM_RootCheckType, /*Op*/0, /*Type*/GILLT_s32,106def : Pat <107 (truncstore GPR32:$src0, GPR32:$src1),108 (inst_c GPR32:$src0, GPR32:$src1)109>;110 111// Test non-truncstore has a size equal to LLT check.112// GISEL: GIM_Try, /*On fail goto*//*Label 3*/ GIMT_Encode4({{[0-9]+}}), // Rule ID 3 //113// GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,114// GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_STORE),115// GISEL-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(uint8_t)AtomicOrdering::NotAtomic,116// GISEL-NEXT: GIM_CheckMemorySizeEqualToLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,117def : Pat <118 (store GPR32:$src0, GPR32:$src1),119 (inst_d GPR32:$src0, GPR32:$src1)120>;121 122// Test truncstore with specific MemoryVT123// GISEL: GIM_Try, /*On fail goto*//*Label 4*/ GIMT_Encode4({{[0-9]+}}), // Rule ID 4 //124// GISEL-NEXT: GIM_CheckNumOperands, /*MI*/0, /*Expected*/2,125// GISEL-NEXT: GIM_CheckOpcode, /*MI*/0, GIMT_Encode2(TargetOpcode::G_STORE),126// GISEL-NEXT: GIM_CheckAtomicOrdering, /*MI*/0, /*Order*/(uint8_t)AtomicOrdering::NotAtomic,127// GISEL-NEXT: GIM_CheckMemorySizeLessThanLLT, /*MI*/0, /*MMO*/0, /*OpIdx*/0,128// GISEL-NEXT: GIM_CheckMemorySizeEqualTo, /*MI*/0, /*MMO*/0, /*Size*/GIMT_Encode4(2),129// GISEL-NEXT: GIM_CheckMemoryAddressSpace, /*MI*/0, /*MMO*/0, /*NumAddrSpace*/2, /*AddrSpace*/123, /*AddrSpace*//* 455(*/0xC7, 0x03/*)*/,130def : Pat <131 (truncstorei16_addrspace GPR32:$src0, GPR32:$src1),132 (inst_c GPR32:$src0, GPR32:$src1)133>;134