// Test -instr-info-expand-mi-operand-info=0 mode which keeps complex operands
// that contain a DAG of basic operands unexpanded (the default is to expand).

include "llvm/Target/Target.td"

def archInstrInfo : InstrInfo { }

def arch : Target {
  let InstructionSet = archInstrInfo;
}

def Reg : Register<"reg">;
def RegClass : RegisterClass<"foo", [i32], 0, (add Reg)>;

class ComplexOperand<int size> : Operand<iPTR> {
  let MIOperandInfo = (ops i8imm, i32imm);
  int Size = size;
}

def i8complex : ComplexOperand<8>;
def i512complex: ComplexOperand<512>;

def InstA : Instruction {
  let Size = 1;
  let OutOperandList = (outs i512complex:$a);
  let InOperandList = (ins i8complex:$b, i32imm:$c);
  field bits<8> Inst;
  field bits<8> SoftFail = 0;
  let Namespace = "MyNamespace";
}

// RUN: llvm-tblgen -gen-instr-info -I %p/../../include %s \
// RUN:   -instr-info-expand-mi-operand-info=1 \
// RUN:   | FileCheck %s --check-prefix=CHECK-EXPAND
// CHECK-EXPAND: #ifdef GET_INSTRINFO_OPERAND_TYPE
// CHECK-EXPAND: OpcodeOperandTypes[] = {
// CHECK-EXPAND:        /* InstA */
// CHECK-EXPAND-NEXT:   i8imm, i32imm, i8imm, i32imm, i32imm,
// CHECK-EXPAND: #endif // GET_INSTRINFO_OPERAND_TYPE

// RUN: llvm-tblgen -gen-instr-info -I %p/../../include %s \
// RUN:   -instr-info-expand-mi-operand-info=0 \
// RUN:   | FileCheck %s --check-prefix=CHECK-NOEXPAND
// CHECK-NOEXPAND: #ifdef GET_INSTRINFO_OPERAND_TYPE
// CHECK-NOEXPAND: OpcodeOperandTypes[] = {
// CHECK-NOEXPAND:        /* InstA */
// CHECK-NOEXPAND-NEXT:   i512complex, i8complex, i32imm,
// CHECK-NOEXPAND: #endif // GET_INSTRINFO_OPERAND_TYPE
