[LoongArch] Add EncoderMethods for transformed immediate operands
authorWeining Lu <luweining@loongson.cn>
Mon, 7 Mar 2022 08:38:30 +0000 (16:38 +0800)
committerWeining Lu <luweining@loongson.cn>
Mon, 7 Mar 2022 08:47:26 +0000 (16:47 +0800)
commitc063f9da5519d7fb83873c04234ef12e33ba28c3
tree5112fe65f1599001967006d5b328ff1c940c004d
parentd1e880acaa6f096618fa09d18daf17b9300558fc
[LoongArch] Add EncoderMethods for transformed immediate operands

This is a split patch of D120476 and thanks to myhsu.

'Transformed' means the encoding of an immediate is not the same as
its binary representation. For example, the `bl` instruction
requires a signed 28-bits integer as its operand and the low 2 bits
must be 0. So only the upper 26 bits are needed to get encoded into
the instruction.

Based on the above reason this kind of immediate needs a customed
`EncoderMethod` to get the real value getting encoded into the
instruction.

Currently these immediate includes:
```
  uimm2_plus1
  simm14_lsl2
  simm16_lsl2
  simm21_lsl2
  simm26_lsl2
```

This patch adds those `EncoderMethod`s and revises related .mir test
in previous patch.

Reviewed By: xen0n, MaskRay

Differential Revision: https://reviews.llvm.org/D120545
llvm/lib/Target/LoongArch/LoongArchInstrInfo.td
llvm/lib/Target/LoongArch/MCTargetDesc/LoongArchMCCodeEmitter.cpp
llvm/test/CodeGen/LoongArch/1ri.mir
llvm/test/CodeGen/LoongArch/2ri.mir
llvm/test/CodeGen/LoongArch/3ri.mir
llvm/test/CodeGen/LoongArch/misc.mir