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
433 lines
12 KiB
YAML
433 lines
12 KiB
YAML
# RUN: llc %s -mtriple=loongarch64 -start-after=prologepilog -O0 -filetype=obj -o - \
|
|
# RUN: | extract-section .text \
|
|
# RUN: | FileCheck %s -check-prefix=CHECK-ENC
|
|
# RUN: llc %s -mtriple=loongarch64 -start-after=prologepilog -O0 -filetype=asm -o - \
|
|
# RUN: | FileCheck %s -check-prefix=CHECK-ASM
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
# Encoding format: 2RI5
|
|
# -------------------------------------------------------------------------------------------------
|
|
# ---------------------------------------------------+--------------+--------------+---------------
|
|
# 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
|
|
# ---------------------------------------------------+--------------+--------------+---------------
|
|
# opcode | imm5 | rj | rd
|
|
# ---------------------------------------------------+--------------+--------------+---------------
|
|
|
|
---
|
|
# CHECK-LABEL: test_SLLI_W:
|
|
# CHECK-ENC: 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: slli.w $a0, $a1, 0
|
|
name: test_SLLI_W
|
|
body: |
|
|
bb.0:
|
|
$r4 = SLLI_W $r5, 0
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_SRLI_W:
|
|
# CHECK-ENC: 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 1 1 1 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: srli.w $a0, $a1, 30
|
|
name: test_SRLI_W
|
|
body: |
|
|
bb.0:
|
|
$r4 = SRLI_W $r5, 30
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_SRAI_W:
|
|
# CHECK-ENC: 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: srai.w $a0, $a1, 24
|
|
name: test_SRAI_W
|
|
body: |
|
|
bb.0:
|
|
$r4 = SRAI_W $r5, 24
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ROTRI_W:
|
|
# CHECK-ENC: 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: rotri.w $a0, $a1, 23
|
|
name: test_ROTRI_W
|
|
body: |
|
|
bb.0:
|
|
$r4 = ROTRI_W $r5, 23
|
|
...
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
# Encoding format: 2RI6
|
|
# -------------------------------------------------------------------------------------------------
|
|
# ------------------------------------------------+-----------------+--------------+---------------
|
|
# 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
|
|
# ------------------------------------------------+-----------------+--------------+---------------
|
|
# opcode | imm6 | rj | rd
|
|
# ------------------------------------------------+-----------------+--------------+---------------
|
|
|
|
---
|
|
# CHECK-LABEL: test_SLLI_D:
|
|
# CHECK-ENC: 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 1 1 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: slli.d $a0, $a1, 39
|
|
name: test_SLLI_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = SLLI_D $r5, 39
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_SRLI_D:
|
|
# CHECK-ENC: 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: srli.d $a0, $a1, 38
|
|
name: test_SRLI_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = SRLI_D $r5, 38
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_SRAI_D:
|
|
# CHECK-ENC: 0 0 0 0 0 0 0 0 0 1 0 0 1 0 0 1 0 1 1 0 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: srai.d $a0, $a1, 27
|
|
name: test_SRAI_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = SRAI_D $r5, 27
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ROTRI_D:
|
|
# CHECK-ENC: 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 1 0 0 0 1 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: rotri.d $a0, $a1, 7
|
|
name: test_ROTRI_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = ROTRI_D $r5, 7
|
|
...
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
# Encoding format: 2RI12
|
|
# -------------------------------------------------------------------------------------------------
|
|
# ------------------------------+-----------------------------------+--------------+---------------
|
|
# 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
|
|
# ------------------------------+-----------------------------------+--------------+---------------
|
|
# opcode | imm12 | rj | rd
|
|
# ------------------------------+-----------------------------------+--------------+---------------
|
|
|
|
---
|
|
# CHECK-LABEL: test_SLTI:
|
|
# CHECK-ENC: 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 1 1 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: slti $a0, $a1, 235
|
|
name: test_SLTI
|
|
body: |
|
|
bb.0:
|
|
$r4 = SLTI $r5, 235
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_SLTUI:
|
|
# CHECK-ENC: 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0 1 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: sltui $a0, $a1, 162
|
|
name: test_SLTUI
|
|
body: |
|
|
bb.0:
|
|
$r4 = SLTUI $r5, 162
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ADDI_W:
|
|
# CHECK-ENC: 0 0 0 0 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: addi.w $a0, $a1, 246
|
|
name: test_ADDI_W
|
|
body: |
|
|
bb.0:
|
|
$r4 = ADDI_W $r5, 246
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ADDI_D:
|
|
# CHECK-ENC: 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 1 0 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: addi.d $a0, $a1, 75
|
|
name: test_ADDI_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = ADDI_D $r5, 75
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LU52I_D:
|
|
# CHECK-ENC: 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: lu52i.d $a0, $a1, 195
|
|
name: test_LU52I_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = LU52I_D $r5, 195
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ANDI:
|
|
# CHECK-ENC: 0 0 0 0 0 0 1 1 0 1 0 0 0 0 0 1 1 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: andi $a0, $a1, 106
|
|
name: test_ANDI
|
|
body: |
|
|
bb.0:
|
|
$r4 = ANDI $r5, 106
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ORI:
|
|
# CHECK-ENC: 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ori $a0, $a1, 47
|
|
name: test_ORI
|
|
body: |
|
|
bb.0:
|
|
$r4 = ORI $r5, 47
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_XORI:
|
|
# CHECK-ENC: 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 1 1 0 0 0 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: xori $a0, $a1, 99
|
|
name: test_XORI
|
|
body: |
|
|
bb.0:
|
|
$r4 = XORI $r5, 99
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LD_B:
|
|
# CHECK-ENC: 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ld.b $a0, $a1, 21
|
|
name: test_LD_B
|
|
body: |
|
|
bb.0:
|
|
$r4 = LD_B $r5, 21
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LD_H:
|
|
# CHECK-ENC: 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 1 0 0 0 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ld.h $a0, $a1, 80
|
|
name: test_LD_H
|
|
body: |
|
|
bb.0:
|
|
$r4 = LD_H $r5, 80
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LD_W:
|
|
# CHECK-ENC: 0 0 1 0 1 0 0 0 1 0 0 0 0 0 0 1 0 1 1 1 0 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ld.w $a0, $a1, 92
|
|
name: test_LD_W
|
|
body: |
|
|
bb.0:
|
|
$r4 = LD_W $r5, 92
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LD_BU:
|
|
# CHECK-ENC: 0 0 1 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ld.bu $a0, $a1, 150
|
|
name: test_LD_BU
|
|
body: |
|
|
bb.0:
|
|
$r4 = LD_BU $r5, 150
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LD_HU:
|
|
# CHECK-ENC: 0 0 1 0 1 0 1 0 0 1 0 0 0 0 1 1 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ld.hu $a0, $a1, 198
|
|
name: test_LD_HU
|
|
body: |
|
|
bb.0:
|
|
$r4 = LD_HU $r5, 198
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LD_WU:
|
|
# CHECK-ENC: 0 0 1 0 1 0 1 0 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ld.wu $a0, $a1, 31
|
|
name: test_LD_WU
|
|
body: |
|
|
bb.0:
|
|
$r4 = LD_WU $r5, 31
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ST_B:
|
|
# CHECK-ENC: 0 0 1 0 1 0 0 1 0 0 0 0 0 0 0 1 0 1 1 1 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: st.b $a0, $a1, 95
|
|
name: test_ST_B
|
|
body: |
|
|
bb.0:
|
|
ST_B $r4, $r5, 95
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ST_H:
|
|
# CHECK-ENC: 0 0 1 0 1 0 0 1 0 1 0 0 0 0 0 1 1 1 1 0 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: st.h $a0, $a1, 122
|
|
name: test_ST_H
|
|
body: |
|
|
bb.0:
|
|
ST_H $r4, $r5, 122
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ST_W:
|
|
# CHECK-ENC: 0 0 1 0 1 0 0 1 1 0 0 0 0 0 1 0 1 0 1 1 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: st.w $a0, $a1, 175
|
|
name: test_ST_W
|
|
body: |
|
|
bb.0:
|
|
ST_W $r4, $r5, 175
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_ST_D:
|
|
# CHECK-ENC: 0 0 1 0 1 0 0 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: st.d $a0, $a1, 60
|
|
name: test_ST_D
|
|
body: |
|
|
bb.0:
|
|
ST_D $r4, $r5, 60
|
|
...
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
# Encoding format: 2RI14
|
|
# -------------------------------------------------------------------------------------------------
|
|
# ------------------------+-----------------------------------------+--------------+---------------
|
|
# 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
|
|
# ------------------------+-----------------------------------------+--------------+---------------
|
|
# opcode | imm14 | rj | rd
|
|
# ------------------------+-----------------------------------------+--------------+---------------
|
|
|
|
---
|
|
# CHECK-LABEL: test_LDPTR_W:
|
|
# CHECK-ENC: 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ldptr.w $a0, $a1, 264
|
|
name: test_LDPTR_W
|
|
body: |
|
|
bb.0:
|
|
$r4 = LDPTR_W $r5, 264
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LDPTR_D:
|
|
# CHECK-ENC: 0 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ldptr.d $a0, $a1, 224
|
|
name: test_LDPTR_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = LDPTR_D $r5, 224
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_STPTR_W:
|
|
# CHECK-ENC: 0 0 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: stptr.w $a0, $a1, 348
|
|
name: test_STPTR_W
|
|
body: |
|
|
bb.0:
|
|
STPTR_W $r4, $r5, 348
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_STPTR_D:
|
|
# CHECK-ENC: 0 0 1 0 0 1 1 1 0 0 0 0 0 0 1 0 0 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: stptr.d $a0, $a1, 580
|
|
name: test_STPTR_D
|
|
body: |
|
|
bb.0:
|
|
STPTR_D $r4, $r5, 580
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LL_W:
|
|
# CHECK-ENC: 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ll.w $a0, $a1, 972
|
|
name: test_LL_W
|
|
body: |
|
|
bb.0:
|
|
$r4 = LL_W $r5, 972
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_LL_D:
|
|
# CHECK-ENC: 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: ll.d $a0, $a1, 296
|
|
name: test_LL_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = LL_D $r5, 296
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_SC_W:
|
|
# CHECK-ENC: 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: sc.w $a0, $a1, 384
|
|
name: test_SC_W
|
|
body: |
|
|
bb.0:
|
|
$r4 = SC_W $r4, $r5, 384
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_SC_D:
|
|
# CHECK-ENC: 0 0 1 0 0 0 1 1 0 0 0 0 0 0 0 1 1 0 1 0 0 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: sc.d $a0, $a1, 420
|
|
name: test_SC_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = SC_D $r4, $r5, 420
|
|
...
|
|
|
|
# -------------------------------------------------------------------------------------------------
|
|
# Encoding format: 2RI16
|
|
# -------------------------------------------------------------------------------------------------
|
|
# ------------------+-----------------------------------------------+--------------+---------------
|
|
# 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
|
|
# ------------------+-----------------------------------------------+--------------+---------------
|
|
# opcode | imm16 | rj | rd
|
|
# ------------------+-----------------------------------------------+--------------+---------------
|
|
|
|
---
|
|
# CHECK-LABEL: test_ADDU16I_D:
|
|
# CHECK-ENC: 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 1 1 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: addu16i.d $a0, $a1, 23
|
|
name: test_ADDU16I_D
|
|
body: |
|
|
bb.0:
|
|
$r4 = ADDU16I_D $r5, 23
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_JIRL:
|
|
# CHECK-ENC: 0 1 0 0 1 1 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 1 0 1 0 0 1 0 0
|
|
# CHECK-ASM: jirl $a0, $a1, 196
|
|
name: test_JIRL
|
|
body: |
|
|
bb.0:
|
|
$r4 = JIRL $r5, 196
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_BEQ:
|
|
# CHECK-ENC: 0 1 0 1 1 0 0 0 0 0 0 0 0 0 1 1 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 1
|
|
# CHECK-ASM: beq $a0, $a1, 784
|
|
name: test_BEQ
|
|
body: |
|
|
bb.0:
|
|
BEQ $r4, $r5, 784
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_BNE:
|
|
# CHECK-ENC: 0 1 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 1 0 0 1 0 0 0 0 1 0 1
|
|
# CHECK-ASM: bne $a0, $a1, 76
|
|
name: test_BNE
|
|
body: |
|
|
bb.0:
|
|
BNE $r4, $r5, 76
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_BLT:
|
|
# CHECK-ENC: 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 1 1 0 0 1 0 0 0 0 1 0 1
|
|
# CHECK-ASM: blt $a0, $a1, 492
|
|
name: test_BLT
|
|
body: |
|
|
bb.0:
|
|
BLT $r4, $r5, 492
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_BGE:
|
|
# CHECK-ENC: 0 1 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 1 0 0 0 0 1 0 1
|
|
# CHECK-ASM: bge $a0, $a1, 48
|
|
name: test_BGE
|
|
body: |
|
|
bb.0:
|
|
BGE $r4, $r5, 48
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_BLTU:
|
|
# CHECK-ENC: 0 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 1 0 0 1 0 0 0 0 1 0 1
|
|
# CHECK-ASM: bltu $a0, $a1, 68
|
|
name: test_BLTU
|
|
body: |
|
|
bb.0:
|
|
BLTU $r4, $r5, 68
|
|
...
|
|
---
|
|
# CHECK-LABEL: test_BGEU:
|
|
# CHECK-ENC: 0 1 1 0 1 1 0 0 0 0 0 0 0 0 0 1 0 1 1 0 0 0 0 0 1 0 0 0 0 1 0 1
|
|
# CHECK-ASM: bgeu $a0, $a1, 352
|
|
name: test_BGEU
|
|
body: |
|
|
bb.0:
|
|
BGEU $r4, $r5, 352
|