diff options
| author | Alex Bradbury <asb@lowrisc.org> | 2019-02-21 14:09:34 +0000 | 
|---|---|---|
| committer | Alex Bradbury <asb@lowrisc.org> | 2019-02-21 14:09:34 +0000 | 
| commit | 047170cfc3d635b32d4aacce25cc007c4a706337 (patch) | |
| tree | 2404981bceef87d5561dcee9d8819cd3cde08a16 /llvm/lib/Target/RISCV | |
| parent | fdf651ee8d0b233bdeaf35b07033c1338b54fb39 (diff) | |
| download | bcm5719-llvm-047170cfc3d635b32d4aacce25cc007c4a706337.tar.gz bcm5719-llvm-047170cfc3d635b32d4aacce25cc007c4a706337.zip  | |
[RISCV] Add implied zero offset load/store alias patterns
Allow load/store instructions with implied zero offset for compatibility with
GNU assembler.
Differential Revision: https://reviews.llvm.org/D57141
Patch by James Clarke.
llvm-svn: 354581
Diffstat (limited to 'llvm/lib/Target/RISCV')
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfo.td | 25 | ||||
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfoC.td | 50 | ||||
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfoD.td | 3 | ||||
| -rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfoF.td | 3 | 
4 files changed, 81 insertions, 0 deletions
diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index c13bcf5be9d..296e736ab10 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -619,6 +619,24 @@ def : InstAlias<"sfence.vma",     (SFENCE_VMA      X0, X0)>;  def : InstAlias<"sfence.vma $rs", (SFENCE_VMA GPR:$rs, X0)>;  let EmitPriority = 0 in { +def : InstAlias<"lb $rd, (${rs1})", +                (LB  GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"lh $rd, (${rs1})", +                (LH  GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"lw $rd, (${rs1})", +                (LW  GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"lbu $rd, (${rs1})", +                (LBU  GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"lhu $rd, (${rs1})", +                (LHU  GPR:$rd, GPR:$rs1, 0)>; + +def : InstAlias<"sb $rs2, (${rs1})", +                (SB  GPR:$rs2, GPR:$rs1, 0)>; +def : InstAlias<"sh $rs2, (${rs1})", +                (SH  GPR:$rs2, GPR:$rs1, 0)>; +def : InstAlias<"sw $rs2, (${rs1})", +                (SW  GPR:$rs2, GPR:$rs1, 0)>; +  def : InstAlias<"add $rd, $rs1, $imm12",                  (ADDI  GPR:$rd, GPR:$rs1, simm12:$imm12)>;  def : InstAlias<"and $rd, $rs1, $imm12", @@ -634,6 +652,13 @@ def : InstAlias<"srl $rd, $rs1, $shamt",  def : InstAlias<"sra $rd, $rs1, $shamt",                  (SRAI  GPR:$rd, GPR:$rs1, uimmlog2xlen:$shamt)>;  let Predicates = [IsRV64] in { +def : InstAlias<"lwu $rd, (${rs1})", +                (LWU  GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"ld $rd, (${rs1})", +                (LD  GPR:$rd, GPR:$rs1, 0)>; +def : InstAlias<"sd $rs2, (${rs1})", +                (SD  GPR:$rs2, GPR:$rs1, 0)>; +  def : InstAlias<"addw $rd, $rs1, $imm12",                  (ADDIW  GPR:$rd, GPR:$rs1, simm12:$imm12)>;  def : InstAlias<"sllw $rd, $rs1, $shamt", diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td index efb1587849f..94477341eea 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoC.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoC.td @@ -523,6 +523,56 @@ def C_UNIMP : RVInst16<(outs), (ins), "c.unimp", "", [], InstFormatOther> {  } // Predicates = [HasStdExtC]  //===----------------------------------------------------------------------===// +// Assembler Pseudo Instructions +//===----------------------------------------------------------------------===// + +let EmitPriority = 0 in { +let Predicates = [HasStdExtC, HasStdExtD] in +def : InstAlias<"c.fld $rd, (${rs1})", (C_FLD FPR64C:$rd, GPRC:$rs1, 0)>; + +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)>; + +let Predicates = [HasStdExtC, HasStdExtF, IsRV32] in +def : InstAlias<"c.flwsp $rd, (${rs1})", (C_FLWSP FPR32C:$rd, SP:$rs1, 0)>; + +let Predicates = [HasStdExtC, IsRV64] in +def : InstAlias<"c.ldsp $rd, (${rs1})", (C_LDSP GPRC:$rd, 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 +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)>; +} + +//===----------------------------------------------------------------------===//  // Compress Instruction tablegen backend.  //===----------------------------------------------------------------------===// diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td index 1e48d24bfab..fdb9a41ec60 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoD.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoD.td @@ -178,6 +178,9 @@ def FMV_D_X : FPUnaryOp_r<0b1111001, 0b000, FPR64, GPR, "fmv.d.x"> {  //===----------------------------------------------------------------------===//  let Predicates = [HasStdExtD] in { +def : InstAlias<"fld $rd, (${rs1})",  (FLD FPR64:$rd,  GPR:$rs1, 0), 0>; +def : InstAlias<"fsd $rs2, (${rs1})", (FSD FPR64:$rs2, GPR:$rs1, 0), 0>; +  def : InstAlias<"fmv.d $rd, $rs",  (FSGNJ_D  FPR64:$rd, FPR64:$rs, FPR64:$rs)>;  def : InstAlias<"fabs.d $rd, $rs", (FSGNJX_D FPR64:$rd, FPR64:$rs, FPR64:$rs)>;  def : InstAlias<"fneg.d $rd, $rs", (FSGNJN_D FPR64:$rd, FPR64:$rs, FPR64:$rs)>; diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td index c7fa72dfae1..17ba146730a 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfoF.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoF.td @@ -206,6 +206,9 @@ def           : FPUnaryOpDynFrmAlias<FCVT_S_LU, "fcvt.s.lu", FPR32, GPR>;  //===----------------------------------------------------------------------===//  let Predicates = [HasStdExtF] in { +def : InstAlias<"flw $rd, (${rs1})",  (FLW FPR32:$rd,  GPR:$rs1, 0), 0>; +def : InstAlias<"fsw $rs2, (${rs1})", (FSW FPR32:$rs2, GPR:$rs1, 0), 0>; +  def : InstAlias<"fmv.s $rd, $rs",  (FSGNJ_S  FPR32:$rd, FPR32:$rs, FPR32:$rs)>;  def : InstAlias<"fabs.s $rd, $rs", (FSGNJX_S FPR32:$rd, FPR32:$rs, FPR32:$rs)>;  def : InstAlias<"fneg.s $rd, $rs", (FSGNJN_S FPR32:$rd, FPR32:$rs, FPR32:$rs)>;  | 

