// RUN: llvm-tblgen -gen-instr-info -I %p/../../include %s -DALLCASES -o - | FileCheck -check-prefixes=CHECK,ALLCASES %s // RUN: not llvm-tblgen -gen-instr-info -I %p/../../include %s -DONECASE -o /dev/null 2>&1 | FileCheck -check-prefixes=ERROR-MISSING %s // RUN: not llvm-tblgen -gen-instr-info -I %p/../../include %s -DMULTIPLE_OVERRIDE_ERROR -o /dev/null 2>&1 | FileCheck -implicit-check-not=error: -check-prefix=MULTIPLE-OVERRIDE-ERROR %s // RUN: not llvm-tblgen -gen-instr-info -I %p/../../include %s -DALLCASES -DERROR_NONPSEUDO -o /dev/null 2>&1 | FileCheck -implicit-check-not=error: -check-prefix=ERROR-NONPSEUDO %s // def PREALLOCATED_ARG : StandardPseudoInstruction { // CHECK: namespace llvm::MyTarget { // CHECK: enum { // CHECK: LOAD_STACK_GUARD = [[LOAD_STACK_GUARD_OPCODE:[0-9]+]], // CHECK: PREALLOCATED_ARG = [[PREALLOCATED_ARG_OPCODE:[0-9]+]], // CHECK: PATCHABLE_EVENT_CALL = [[PATCHABLE_EVENT_CALL_OPCODE:[0-9]+]], // CHECK: PATCHABLE_TYPED_EVENT_CALL = [[PATCHABLE_TYPED_EVENT_CALL_OPCODE:[0-9]+]], // Make sure no enum entry is emitted for MY_LOAD_STACK_GUARD // CHECK: G_UBFX = [[G_UBFX_OPCODE:[0-9]+]], // CHECK-NEXT: MY_MOV = [[MY_MOV_OPCODE:[0-9]+]], // CHECK-NEXT: INSTRUCTION_LIST_END = [[INSTR_LIST_END_OPCODE:[0-9]+]] // CHECK: extern const MyTargetInstrTable MyTargetDescs = { // CHECK-NEXT: { // CHECK-NEXT: { [[MY_MOV_OPCODE]], 2, 1, 2, 0, 0, 0, MyTargetOpInfoBase + {{[0-9]+}}, 0, 0|(1ULL< : Register { let Namespace = "MyTarget"; } class MyClass types, dag registers> : RegisterClass<"MyTarget", types, size, registers> { let Size = size; } def X0 : MyReg<"x0">; def X1 : MyReg<"x1">; def XRegs : RegisterClass<"MyTarget", [i64], 64, (add X0, X1)>; class TestInstruction : Instruction { let Size = 2; let Namespace = "MyTarget"; let hasSideEffects = false; } #ifdef ONECASE // Example setting the pointer register class manually def MY_LOAD_STACK_GUARD : TargetSpecializedStandardPseudoInstruction { let Namespace = "MyTarget"; let OutOperandList = (outs XRegs:$dst); } // ERROR-MISSING: error: missing target override for pseudoinstruction using PointerLikeRegClass // ERROR-MISSING note: target should define equivalent instruction with RegisterClassLike replacement; (use RemapAllTargetPseudoPointerOperands?) #endif #ifdef ALLCASES defm my_remaps : RemapAllTargetPseudoPointerOperands; #endif #ifdef MULTIPLE_OVERRIDE_ERROR def MY_LOAD_STACK_GUARD_0 : TargetSpecializedStandardPseudoInstruction; // MULTIPLE-OVERRIDE-ERROR: :[[@LINE+1]]:5: error: multiple overrides of 'LOAD_STACK_GUARD' defined def MY_LOAD_STACK_GUARD_1 : TargetSpecializedStandardPseudoInstruction; #endif #ifdef ERROR_NONPSEUDO // FIXME: Double error // ERROR-NONPSEUDO: [[@LINE+2]]:5: error: non-pseudoinstruction user of PointerLikeRegClass // ERROR-NONPSEUDO: [[@LINE+1]]:5: error: non-pseudoinstruction user of PointerLikeRegClass def NON_PSEUDO : TestInstruction { let OutOperandList = (outs XRegs:$dst); let InOperandList = (ins ptr_rc:$src); let AsmString = "non_pseudo $dst, $src"; } #endif def MY_MOV : TestInstruction { let OutOperandList = (outs XRegs:$dst); let InOperandList = (ins XRegs:$src); let AsmString = "my_mov $dst, $src"; } def MyTargetISA : InstrInfo; def MyTarget : Target { let InstructionSet = MyTargetISA; }