diff options
author | Craig Topper <craig.topper@sifive.com> | 2022-07-26 10:56:37 -0700 |
---|---|---|
committer | Craig Topper <craig.topper@sifive.com> | 2022-07-26 11:06:00 -0700 |
commit | 3a2d7d8ad5291102ad98b8269b9c2171d3d58d76 (patch) | |
tree | 96659f3fc452d38647f5136bf5be57701e2d9cf7 | |
parent | [Matrix] Refactor tiled loops in a struct. NFC (diff) | |
download | llvm-project-3a2d7d8ad5291102ad98b8269b9c2171d3d58d76.tar.gz llvm-project-3a2d7d8ad5291102ad98b8269b9c2171d3d58d76.tar.bz2 llvm-project-3a2d7d8ad5291102ad98b8269b9c2171d3d58d76.zip |
[RISCV] Add Predicate to c.lw/c.sw/c.lwsp/c.swsp InstAliases with no offset.
These are aliases that allow the immediate offset to be ommitted.
We had predicates for the RV64, RV32+F, and D versions, but
not the base versions.
I've also re-ordered them to share Predicate lines to improve
readability.
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfoC.td | 56 | ||||
-rw-r--r-- | llvm/test/MC/RISCV/rv32c-valid.s | 58 |
2 files changed, 75 insertions, 39 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td index d204c85d6179..cd1da4360002 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -696,52 +696,36 @@ def C_SRAI64_HINT : RVInst16CI<0b100, 0b01, (outs GPRC:$rd_wb), //===----------------------------------------------------------------------===// let EmitPriority = 0 in { -let Predicates = [HasStdExtC, HasStdExtD] in -def : InstAlias<"c.fld $rd, (${rs1})", (C_FLD FPR64C:$rd, GPRC:$rs1, 0)>; - +let Predicates = [HasStdExtC] in { def : InstAlias<"c.lw $rd, (${rs1})", (C_LW GPRC:$rd, GPRC:$rs1, 0)>; - -let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in -def : InstAlias<"c.flw $rd, (${rs1})", (C_FLW FPR32C:$rd, GPRC:$rs1, 0)>; - -let Predicates = [HasStdExtC, IsRV64] in -def : InstAlias<"c.ld $rd, (${rs1})", (C_LD GPRC:$rd, GPRC:$rs1, 0)>; - -let Predicates = [HasStdExtC, HasStdExtD] in -def : InstAlias<"c.fsd $rs2, (${rs1})", (C_FSD FPR64C:$rs2, GPRC:$rs1, 0)>; - def : InstAlias<"c.sw $rs2, (${rs1})", (C_SW GPRC:$rs2, GPRC:$rs1, 0)>; - -let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in -def : InstAlias<"c.fsw $rs2, (${rs1})", (C_FSW FPR32C:$rs2, GPRC:$rs1, 0)>; - -let Predicates = [HasStdExtC, IsRV64] in -def : InstAlias<"c.sd $rs2, (${rs1})", (C_SD GPRC:$rs2, GPRC:$rs1, 0)>; - -let Predicates = [HasStdExtC, HasStdExtD] in -def : InstAlias<"c.fldsp $rd, (${rs1})", (C_FLDSP FPR64C:$rd, SP:$rs1, 0)>; - def : InstAlias<"c.lwsp $rd, (${rs1})", (C_LWSP GPRC:$rd, SP:$rs1, 0)>; +def : InstAlias<"c.swsp $rs2, (${rs1})", (C_SWSP GPRC:$rs2, SP:$rs1, 0)>; +} -let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in -def : InstAlias<"c.flwsp $rd, (${rs1})", (C_FLWSP FPR32C:$rd, SP:$rs1, 0)>; - -let Predicates = [HasStdExtC, IsRV64] in +let Predicates = [HasStdExtC, IsRV64] in { +def : InstAlias<"c.ld $rd, (${rs1})", (C_LD GPRC:$rd, GPRC:$rs1, 0)>; +def : InstAlias<"c.sd $rs2, (${rs1})", (C_SD GPRC:$rs2, GPRC:$rs1, 0)>; def : InstAlias<"c.ldsp $rd, (${rs1})", (C_LDSP GPRC:$rd, SP:$rs1, 0)>; +def : InstAlias<"c.sdsp $rs2, (${rs1})", (C_SDSP GPRC:$rs2, SP:$rs1, 0)>; +} -let Predicates = [HasStdExtC, HasStdExtD] in -def : InstAlias<"c.fsdsp $rs2, (${rs1})", (C_FSDSP FPR64C:$rs2, SP:$rs1, 0)>; - -def : InstAlias<"c.swsp $rs2, (${rs1})", (C_SWSP GPRC:$rs2, SP:$rs1, 0)>; - -let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in +let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in { +def : InstAlias<"c.flw $rd, (${rs1})", (C_FLW FPR32C:$rd, GPRC:$rs1, 0)>; +def : InstAlias<"c.fsw $rs2, (${rs1})", (C_FSW FPR32C:$rs2, GPRC:$rs1, 0)>; +def : InstAlias<"c.flwsp $rd, (${rs1})", (C_FLWSP FPR32C:$rd, SP:$rs1, 0)>; def : InstAlias<"c.fswsp $rs2, (${rs1})", (C_FSWSP FPR32C:$rs2, SP:$rs1, 0)>; +} -let Predicates = [HasStdExtC, IsRV64] in -def : InstAlias<"c.sdsp $rs2, (${rs1})", (C_SDSP GPRC:$rs2, SP:$rs1, 0)>; +let Predicates = [HasStdExtC, HasStdExtD] in { +def : InstAlias<"c.fld $rd, (${rs1})", (C_FLD FPR64C:$rd, GPRC:$rs1, 0)>; +def : InstAlias<"c.fsd $rs2, (${rs1})", (C_FSD FPR64C:$rs2, GPRC:$rs1, 0)>; +def : InstAlias<"c.fldsp $rd, (${rs1})", (C_FLDSP FPR64C:$rd, SP:$rs1, 0)>; +def : InstAlias<"c.fsdsp $rs2, (${rs1})", (C_FSDSP FPR64C:$rs2, SP:$rs1, 0)>; } +} // EmitPriority = 0 -//===----------------------------------------------------------------------===// +//===----------------------------------------------------------------------===/i // Compress Instruction tablegen backend. //===----------------------------------------------------------------------===// diff --git a/llvm/test/MC/RISCV/rv32c-valid.s b/llvm/test/MC/RISCV/rv32c-valid.s index 07c935f0721a..c51ba281a255 100644 --- a/llvm/test/MC/RISCV/rv32c-valid.s +++ b/llvm/test/MC/RISCV/rv32c-valid.s @@ -9,103 +9,155 @@ # RUN: | llvm-objdump --mattr=+c -M no-aliases -d -r - \ # RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s +# RUN: not llvm-mc -triple riscv32 \ +# RUN: -riscv-no-aliases -show-encoding < %s 2>&1 \ +# RUN: | FileCheck -check-prefixes=CHECK-NO-EXT %s + # TODO: more exhaustive testing of immediate encoding. # CHECK-ASM-AND-OBJ: c.lwsp ra, 0(sp) # CHECK-ASM: encoding: [0x82,0x40] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.lwsp ra, 0(sp) # CHECK-ASM-AND-OBJ: c.swsp ra, 252(sp) # CHECK-ASM: encoding: [0x86,0xdf] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.swsp ra, 252(sp) # CHECK-ASM-AND-OBJ: c.lw a2, 0(a0) # CHECK-ASM: encoding: [0x10,0x41] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.lw a2, 0(a0) # CHECK-ASM-AND-OBJ: c.sw a5, 124(a3) # CHECK-ASM: encoding: [0xfc,0xde] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.sw a5, 124(a3) -# CHECK-OBJ: c.j 0xfffff808 +# CHECK-ASM-AND-OBJ: c.lwsp s0, 0(sp) +# CHECK-ASM: encoding: [0x02,0x44] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) +c.lwsp x8, (x2) +# CHECK-ASM-AND-OBJ: c.swsp s0, 0(sp) +# CHECK-ASM: encoding: [0x22,0xc0] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) +c.swsp x8, (x2) +# CHECK-ASM-AND-OBJ: c.lw s0, 0(s1) +# CHECK-ASM: encoding: [0x80,0x40] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) +c.lw x8, (x9) +# CHECK-ASM-AND-OBJ: c.sw s0, 0(s1) +# CHECK-ASM: encoding: [0x80,0xc0] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) +c.sw x8, (x9) + +# CHECK-OBJ: c.j 0xfffff810 # CHECK-ASM: c.j -2048 # CHECK-ASM: encoding: [0x01,0xb0] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.j -2048 # CHECK-ASM-AND-OBJ: c.jr a7 # CHECK-ASM: encoding: [0x82,0x88] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.jr a7 # CHECK-ASM-AND-OBJ: c.jalr a1 # CHECK-ASM: encoding: [0x82,0x95] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.jalr a1 -# CHECK-OBJ: c.beqz a3, 0xffffff0e +# CHECK-OBJ: c.beqz a3, 0xffffff16 # CHECK-ASM: c.beqz a3, -256 # CHECK-ASM: encoding: [0x81,0xd2] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.beqz a3, -256 -# CHECK-OBJ: c.bnez a5, 0x10e +# CHECK-OBJ: c.bnez a5, 0x116 # CHECK-ASM: c.bnez a5, 254 # CHECK-ASM: encoding: [0xfd,0xef] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.bnez a5, 254 # CHECK-ASM-AND-OBJ: c.li a7, 31 # CHECK-ASM: encoding: [0xfd,0x48] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.li a7, 31 # CHECK-ASM-AND-OBJ: c.addi a3, -32 # CHECK-ASM: encoding: [0x81,0x16] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.addi a3, -32 # CHECK-ASM-AND-OBJ: c.addi16sp sp, -512 # CHECK-ASM: encoding: [0x01,0x71] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.addi16sp sp, -512 # CHECK-ASM-AND-OBJ: c.addi16sp sp, 496 # CHECK-ASM: encoding: [0x7d,0x61] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.addi16sp sp, 496 # CHECK-ASM-AND-OBJ: c.addi4spn a3, sp, 1020 # CHECK-ASM: encoding: [0xf4,0x1f] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.addi4spn a3, sp, 1020 # CHECK-ASM-AND-OBJ: c.addi4spn a3, sp, 4 # CHECK-ASM: encoding: [0x54,0x00] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.addi4spn a3, sp, 4 # CHECK-ASM-AND-OBJ: c.slli a1, 1 # CHECK-ASM: encoding: [0x86,0x05] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.slli a1, 1 # CHECK-ASM-AND-OBJ: c.srli a3, 31 # CHECK-ASM: encoding: [0xfd,0x82] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.srli a3, 31 # CHECK-ASM-AND-OBJ: c.srai a4, 2 # CHECK-ASM: encoding: [0x09,0x87] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.srai a4, 2 # CHECK-ASM-AND-OBJ: c.andi a5, 15 # CHECK-ASM: encoding: [0xbd,0x8b] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.andi a5, 15 # CHECK-ASM-AND-OBJ: c.mv a7, s0 # CHECK-ASM: encoding: [0xa2,0x88] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.mv a7, s0 # CHECK-ASM-AND-OBJ: c.and a1, a2 # CHECK-ASM: encoding: [0xf1,0x8d] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.and a1, a2 # CHECK-ASM-AND-OBJ: c.or a2, a3 # CHECK-ASM: encoding: [0x55,0x8e] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.or a2, a3 # CHECK-ASM-AND-OBJ: c.xor a3, a4 # CHECK-ASM: encoding: [0xb9,0x8e] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.xor a3, a4 # CHECK-ASM-AND-OBJ: c.sub a4, a5 # CHECK-ASM: encoding: [0x1d,0x8f] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.sub a4, a5 # CHECK-ASM-AND-OBJ: c.nop # CHECK-ASM: encoding: [0x01,0x00] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.nop # CHECK-ASM-AND-OBJ: c.ebreak # CHECK-ASM: encoding: [0x02,0x90] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.ebreak # CHECK-ASM-AND-OBJ: c.lui s0, 1 # CHECK-ASM: encoding: [0x05,0x64] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.lui s0, 1 # CHECK-ASM-AND-OBJ: c.lui s0, 31 # CHECK-ASM: encoding: [0x7d,0x64] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.lui s0, 31 # CHECK-ASM-AND-OBJ: c.lui s0, 1048544 # CHECK-ASM: encoding: [0x01,0x74] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.lui s0, 0xfffe0 # CHECK-ASM-AND-OBJ: c.lui s0, 1048575 # CHECK-ASM: encoding: [0x7d,0x74] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.lui s0, 0xfffff # CHECK-ASM-AND-OBJ: c.unimp # CHECK-ASM: encoding: [0x00,0x00] +# CHECK-NO-EXT: error: instruction requires the following: 'C' (Compressed Instructions) c.unimp |