2014-05-09 17:46:21 +08:00
|
|
|
//=- Mips64r6InstrInfo.td - Mips64r6 Instruction Information -*- 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 Mips64r6 instructions.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
|
|
|
// Notes about removals/changes from MIPS32r6:
|
|
|
|
// Reencoded: dclo, dclz
|
|
|
|
// Reencoded: lld, scd
|
|
|
|
// Removed: daddi
|
|
|
|
|
2014-05-12 23:12:45 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// Instruction Encodings
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2014-05-15 20:06:36 +08:00
|
|
|
class DALIGN_ENC : SPECIAL3_DALIGN_FM<OPCODE6_DALIGN>;
|
2014-05-15 18:27:19 +08:00
|
|
|
class DAUI_ENC : DAUI_FM;
|
|
|
|
class DAHI_ENC : REGIMM_FM<OPCODE5_DAHI>;
|
|
|
|
class DATI_ENC : REGIMM_FM<OPCODE5_DATI>;
|
2014-05-15 20:18:23 +08:00
|
|
|
class DBITSWAP_ENC : SPECIAL3_2R_FM<OPCODE6_DBITSWAP>;
|
2014-05-12 23:24:16 +08:00
|
|
|
class DDIV_ENC : SPECIAL_3R_FM<0b00010, 0b011110>;
|
|
|
|
class DDIVU_ENC : SPECIAL_3R_FM<0b00010, 0b011111>;
|
|
|
|
class DMOD_ENC : SPECIAL_3R_FM<0b00011, 0b011110>;
|
|
|
|
class DMODU_ENC : SPECIAL_3R_FM<0b00011, 0b011111>;
|
2014-05-12 23:12:45 +08:00
|
|
|
class DMUH_ENC : SPECIAL_3R_FM<0b00011, 0b111000>;
|
|
|
|
class DMUHU_ENC : SPECIAL_3R_FM<0b00011, 0b111001>;
|
|
|
|
class DMUL_R6_ENC : SPECIAL_3R_FM<0b00010, 0b111000>;
|
|
|
|
class DMULU_ENC : SPECIAL_3R_FM<0b00010, 0b111001>;
|
2014-06-09 17:49:51 +08:00
|
|
|
class LDPC_ENC : PCREL18_FM<OPCODE3_LDPC>;
|
2014-05-12 23:12:45 +08:00
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// Instruction Descriptions
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2014-05-22 19:23:21 +08:00
|
|
|
class AHI_ATI_DESC_BASE<string instr_asm, RegisterOperand GPROpnd> {
|
|
|
|
dag OutOperandList = (outs GPROpnd:$rs);
|
|
|
|
dag InOperandList = (ins GPROpnd:$rt, simm16:$imm);
|
|
|
|
string AsmString = !strconcat(instr_asm, "\t$rt, $imm");
|
|
|
|
string Constraints = "$rs = $rt";
|
|
|
|
}
|
|
|
|
|
2014-05-15 20:06:36 +08:00
|
|
|
class DALIGN_DESC : ALIGN_DESC_BASE<"dalign", GPR64Opnd, uimm3>;
|
2014-05-22 19:23:21 +08:00
|
|
|
class DAHI_DESC : AHI_ATI_DESC_BASE<"dahi", GPR64Opnd>;
|
|
|
|
class DATI_DESC : AHI_ATI_DESC_BASE<"dati", GPR64Opnd>;
|
2014-05-15 18:27:19 +08:00
|
|
|
class DAUI_DESC : AUI_DESC_BASE<"daui", GPR64Opnd>;
|
2014-05-15 20:18:23 +08:00
|
|
|
class DBITSWAP_DESC : BITSWAP_DESC_BASE<"dbitswap", GPR64Opnd>;
|
[mips][mips64r6] Replace m[tf]hi, m[tf]lo, mult, multu, dmult, dmultu, div, ddiv, divu, ddivu for MIPS32r6/MIPS64.
Summary:
The accumulator-based (HI/LO) multiplies and divides from earlier ISA's have
been removed and replaced with GPR-based equivalents. For example:
div $1, $2
mflo $3
is now:
div $3, $1, $2
This patch disables the accumulator-based multiplies and divides for
MIPS32r6/MIPS64r6 and uses the GPR-based equivalents instead.
Renamed expandPseudoDiv to insertDivByZeroTrap to better describe the
behaviour of the function.
MipsDelaySlotFiller now invalidates the liveness information when moving
instructions to the delay slot. Without this, divrem.ll will abort since
%GP ends up used before it is defined.
Reviewers: vmedic, zoran.jovanovic, jkolek
Reviewed By: jkolek
Differential Revision: http://reviews.llvm.org/D3896
llvm-svn: 210760
2014-06-12 18:44:10 +08:00
|
|
|
class DDIV_DESC : DIVMOD_DESC_BASE<"ddiv", GPR64Opnd, sdiv>;
|
|
|
|
class DDIVU_DESC : DIVMOD_DESC_BASE<"ddivu", GPR64Opnd, udiv>;
|
|
|
|
class DMOD_DESC : DIVMOD_DESC_BASE<"dmod", GPR64Opnd, srem>;
|
|
|
|
class DMODU_DESC : DIVMOD_DESC_BASE<"dmodu", GPR64Opnd, urem>;
|
|
|
|
class DMUH_DESC : MUL_R6_DESC_BASE<"dmuh", GPR64Opnd, mulhs>;
|
|
|
|
class DMUHU_DESC : MUL_R6_DESC_BASE<"dmuhu", GPR64Opnd, mulhu>;
|
|
|
|
class DMUL_R6_DESC : MUL_R6_DESC_BASE<"dmul", GPR64Opnd, mul>;
|
2014-05-12 23:12:45 +08:00
|
|
|
class DMULU_DESC : MUL_R6_DESC_BASE<"dmulu", GPR64Opnd>;
|
2014-06-09 17:49:51 +08:00
|
|
|
class LDPC_DESC : PCREL_DESC_BASE<"ldpc", GPR64Opnd, simm18_lsl3>;
|
2014-05-12 23:12:45 +08:00
|
|
|
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
//
|
|
|
|
// Instruction Definitions
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2014-05-15 18:27:19 +08:00
|
|
|
def DAHI : DAHI_ENC, DAHI_DESC, ISA_MIPS64R6;
|
2014-05-15 20:06:36 +08:00
|
|
|
def DALIGN : DALIGN_ENC, DALIGN_DESC, ISA_MIPS64R6;
|
2014-05-15 18:27:19 +08:00
|
|
|
def DATI : DATI_ENC, DATI_DESC, ISA_MIPS64R6;
|
|
|
|
def DAUI : DAUI_ENC, DAUI_DESC, ISA_MIPS64R6;
|
2014-05-15 20:18:23 +08:00
|
|
|
def DBITSWAP : DBITSWAP_ENC, DBITSWAP_DESC, ISA_MIPS64R6;
|
2014-05-12 23:24:16 +08:00
|
|
|
def DDIV : DDIV_ENC, DDIV_DESC, ISA_MIPS64R6;
|
|
|
|
def DDIVU : DDIVU_ENC, DDIVU_DESC, ISA_MIPS64R6;
|
2014-05-09 17:46:21 +08:00
|
|
|
// def DLSA; // See MSA
|
2014-05-12 23:24:16 +08:00
|
|
|
def DMOD : DMOD_ENC, DMOD_DESC, ISA_MIPS64R6;
|
|
|
|
def DMODU : DMODU_ENC, DMODU_DESC, ISA_MIPS64R6;
|
2014-05-12 23:12:45 +08:00
|
|
|
def DMUH: DMUH_ENC, DMUH_DESC, ISA_MIPS64R6;
|
|
|
|
def DMUHU: DMUHU_ENC, DMUHU_DESC, ISA_MIPS64R6;
|
|
|
|
def DMUL_R6: DMUL_R6_ENC, DMUL_R6_DESC, ISA_MIPS64R6;
|
|
|
|
def DMULU: DMULU_ENC, DMULU_DESC, ISA_MIPS64R6;
|
2014-06-09 17:49:51 +08:00
|
|
|
def LDPC: LDPC_ENC, LDPC_DESC, ISA_MIPS64R6;
|