BitOffsetDecoder.td 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. // RUN: llvm-tblgen -gen-disassembler -I %p/../../include %s | FileCheck %s
  2. include "llvm/Target/Target.td"
  3. def archInstrInfo : InstrInfo { }
  4. def arch : Target {
  5. let InstructionSet = archInstrInfo;
  6. }
  7. def Myi32 : Operand<i32> {
  8. let DecoderMethod = "DecodeMyi32";
  9. }
  10. let OutOperandList = (outs), Size = 2 in {
  11. def foo : Instruction {
  12. let InOperandList = (ins i32imm:$factor);
  13. field bits<16> Inst;
  14. bits<32> factor;
  15. let Inst{7-0} = 0xAA;
  16. let Inst{14-8} = factor{6-0}; // no offset
  17. let AsmString = "foo $factor";
  18. field bits<16> SoftFail = 0;
  19. }
  20. def bar : Instruction {
  21. let InOperandList = (ins i32imm:$factor);
  22. field bits<16> Inst;
  23. bits<32> factor;
  24. let Inst{7-0} = 0xBB;
  25. let Inst{15-8} = factor{10-3}; // offset by 3
  26. let AsmString = "bar $factor";
  27. field bits<16> SoftFail = 0;
  28. }
  29. def biz : Instruction {
  30. let InOperandList = (ins i32imm:$factor);
  31. field bits<16> Inst;
  32. bits<32> factor;
  33. let Inst{7-0} = 0xCC;
  34. let Inst{11-8,15-12} = factor{10-3}; // offset by 3, multipart
  35. let AsmString = "biz $factor";
  36. field bits<16> SoftFail = 0;
  37. }
  38. def baz : Instruction {
  39. let InOperandList = (ins Myi32:$factor);
  40. field bits<16> Inst;
  41. bits<32> factor;
  42. let Inst{7-0} = 0xDD;
  43. let Inst{15-8} = factor{11-4}; // offset by 4 + custom decode
  44. let AsmString = "baz $factor";
  45. field bits<16> SoftFail = 0;
  46. }
  47. def bum : Instruction {
  48. let InOperandList = (ins i32imm:$factor);
  49. field bits<16> Inst;
  50. bits<32> factor;
  51. let Inst{7-0} = 0xEE;
  52. let Inst{15-8} = !srl(factor,5);
  53. let AsmString = "bum $factor";
  54. field bits<16> SoftFail = 0;
  55. }
  56. }
  57. // CHECK: tmp = fieldFromInstruction(insn, 8, 7);
  58. // CHECK: tmp = fieldFromInstruction(insn, 8, 8) << 3;
  59. // CHECK: tmp |= fieldFromInstruction(insn, 8, 4) << 7;
  60. // CHECK: tmp |= fieldFromInstruction(insn, 12, 4) << 3;
  61. // CHECK: tmp = fieldFromInstruction(insn, 8, 8) << 4;