diff options
-rw-r--r-- | llvm/lib/Target/RISCV/RISCV.td | 13 | ||||
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfo.td | 6 | ||||
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVInstrInfoM.td | 28 | ||||
-rw-r--r-- | llvm/lib/Target/RISCV/RISCVSubtarget.h | 2 | ||||
-rw-r--r-- | llvm/test/MC/RISCV/rv32i-invalid.s | 3 | ||||
-rw-r--r-- | llvm/test/MC/RISCV/rv32m-valid.s | 33 |
6 files changed, 81 insertions, 4 deletions
diff --git a/llvm/lib/Target/RISCV/RISCV.td b/llvm/lib/Target/RISCV/RISCV.td index da919acad36..d8581f8d03c 100644 --- a/llvm/lib/Target/RISCV/RISCV.td +++ b/llvm/lib/Target/RISCV/RISCV.td @@ -13,11 +13,16 @@ include "llvm/Target/Target.td" // RISC-V subtarget features and instruction predicates. //===----------------------------------------------------------------------===// -def Feature64Bit : SubtargetFeature<"64bit", "HasRV64", "true", - "Implements RV64">; +def FeatureStdExtM : SubtargetFeature<"m", "HasStdExtM", "true", + "'M' (Integer Multiplication and Division)">; +def HasStdExtM : Predicate<"Subtarget->hasStdExtM()">, + AssemblerPredicate<"FeatureStdExtM">; -def RV64 : HwMode<"+64bit">; -def RV32 : HwMode<"-64bit">; +def Feature64Bit : SubtargetFeature<"64bit", "HasRV64", "true", + "Implements RV64">; + +def RV64 : HwMode<"+64bit">; +def RV32 : HwMode<"-64bit">; //===----------------------------------------------------------------------===// // Registers, calling conventions, instruction descriptions. diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfo.td b/llvm/lib/Target/RISCV/RISCVInstrInfo.td index 23f218fda8f..e95a8e1c813 100644 --- a/llvm/lib/Target/RISCV/RISCVInstrInfo.td +++ b/llvm/lib/Target/RISCV/RISCVInstrInfo.td @@ -399,3 +399,9 @@ def ADJCALLSTACKDOWN : Pseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), def ADJCALLSTACKUP : Pseudo<(outs), (ins i32imm:$amt1, i32imm:$amt2), [(CallSeqEnd timm:$amt1, timm:$amt2)]>; } // Defs = [X2], Uses = [X2] + +//===----------------------------------------------------------------------===// +// Standard extensions +//===----------------------------------------------------------------------===// + +include "RISCVInstrInfoM.td" diff --git a/llvm/lib/Target/RISCV/RISCVInstrInfoM.td b/llvm/lib/Target/RISCV/RISCVInstrInfoM.td new file mode 100644 index 00000000000..a253c1eb811 --- /dev/null +++ b/llvm/lib/Target/RISCV/RISCVInstrInfoM.td @@ -0,0 +1,28 @@ +//===-- RISCVInstrInfoM.td - RISC-V 'M' instructions -------*- tablegen -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file describes the RISC-V instructions from the standard 'M', Integer +// Multiplication and Division instruction set extension. +// +//===----------------------------------------------------------------------===// + +//===----------------------------------------------------------------------===// +// Instructions +//===----------------------------------------------------------------------===// + +let Predicates = [HasStdExtM] in { +def MUL : ALU_rr<0b0000001, 0b000, "mul">; +def MULH : ALU_rr<0b0000001, 0b001, "mulh">; +def MULHSU : ALU_rr<0b0000001, 0b010, "mulhsu">; +def MULHU : ALU_rr<0b0000001, 0b011, "mulhu">; +def DIV : ALU_rr<0b0000001, 0b100, "div">; +def DIVU : ALU_rr<0b0000001, 0b101, "divu">; +def REM : ALU_rr<0b0000001, 0b110, "rem">; +def REMU : ALU_rr<0b0000001, 0b111, "remu">; +} // Predicates = [HasStdExtM] diff --git a/llvm/lib/Target/RISCV/RISCVSubtarget.h b/llvm/lib/Target/RISCV/RISCVSubtarget.h index 657b0e65620..be9b04990ca 100644 --- a/llvm/lib/Target/RISCV/RISCVSubtarget.h +++ b/llvm/lib/Target/RISCV/RISCVSubtarget.h @@ -30,6 +30,7 @@ class StringRef; class RISCVSubtarget : public RISCVGenSubtargetInfo { virtual void anchor(); + bool HasStdExtM; bool HasRV64 = false; unsigned XLen = 32; MVT XLenVT = MVT::i32; @@ -66,6 +67,7 @@ public: const SelectionDAGTargetInfo *getSelectionDAGInfo() const override { return &TSInfo; } + bool hasStdExtM() const { return HasStdExtM; } bool is64Bit() const { return HasRV64; } MVT getXLenVT() const { return XLenVT; } unsigned getXLen() const { return XLen; } diff --git a/llvm/test/MC/RISCV/rv32i-invalid.s b/llvm/test/MC/RISCV/rv32i-invalid.s index 3e4ac85ed60..763d4c547a2 100644 --- a/llvm/test/MC/RISCV/rv32i-invalid.s +++ b/llvm/test/MC/RISCV/rv32i-invalid.s @@ -128,3 +128,6 @@ lw a4, a5, 111 # CHECK: :[[@LINE]]:8: error: immediate must be an integer in the # Too few operands ori a0, a1 # CHECK: :[[@LINE]]:1: error: too few operands for instruction xor s2, s2 # CHECK: :[[@LINE]]:1: error: too few operands for instruction + +# Instruction not in the base ISA +mul a4, ra, s0 # CHECK: :[[@LINE]]:1: error: instruction use requires an option to be enabled diff --git a/llvm/test/MC/RISCV/rv32m-valid.s b/llvm/test/MC/RISCV/rv32m-valid.s new file mode 100644 index 00000000000..70c1c29d3ad --- /dev/null +++ b/llvm/test/MC/RISCV/rv32m-valid.s @@ -0,0 +1,33 @@ +# RUN: llvm-mc %s -triple=riscv32 -mattr=+m -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s +# RUN: llvm-mc %s -triple=riscv64 -mattr=+m -show-encoding \ +# RUN: | FileCheck -check-prefixes=CHECK,CHECK-INST %s +# RUN: llvm-mc -filetype=obj -triple riscv32 -mattr=+m < %s \ +# RUN: | llvm-objdump -mattr=+m -d - | FileCheck -check-prefix=CHECK-INST %s +# RUN: llvm-mc -filetype=obj -triple riscv64 -mattr=+m < %s \ +# RUN: | llvm-objdump -mattr=+m -d - | FileCheck -check-prefix=CHECK-INST %s + +# CHECK-INST: mul a4, ra, s0 +# CHECK: encoding: [0x33,0x87,0x80,0x02] +mul a4, ra, s0 +# CHECK-INST: mulh ra, zero, zero +# CHECK: encoding: [0xb3,0x10,0x00,0x02] +mulh x1, x0, x0 +# CHECK-INST: mulhsu t0, t2, t1 +# CHECK: encoding: [0xb3,0xa2,0x63,0x02] +mulhsu t0, t2, t1 +# CHECK-INST: mulhu a5, a4, a3 +# CHECK: encoding: [0xb3,0x37,0xd7,0x02] +mulhu a5, a4, a3 +# CHECK-INST: div s0, s0, s0 +# CHECK: encoding: [0x33,0x44,0x84,0x02] +div s0, s0, s0 +# CHECK-INST: divu gp, a0, a1 +# CHECK: encoding: [0xb3,0x51,0xb5,0x02] +divu gp, a0, a1 +# CHECK-INST: rem s2, s2, s8 +# CHECK: encoding: [0x33,0x69,0x89,0x03] +rem s2, s2, s8 +# CHECK-INST: remu s2, s2, s8 +# CHECK: encoding: [0x33,0x79,0x89,0x03] +remu x18, x18, x24 |