mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-01-31 20:51:52 +01:00
Change the x86 assembly output to use tab characters to separate the
mnemonics from their operands instead of single spaces. This makes the assembly output a little more consistent with various other compilers (f.e. GCC), and slightly easier to read. Also, update the regression tests accordingly. llvm-svn: 40648
This commit is contained in:
parent
4251f42689
commit
e3464e6bec
@ -165,9 +165,9 @@ def _Fp64m32: FpI<(outs RFP64:$dst), (ins RFP64:$src1, f32mem:$src2), OneArgFPRW
|
||||
[(set RFP64:$dst,
|
||||
(OpNode RFP64:$src1, (extloadf32 addr:$src2)))]>;
|
||||
def _F32m : FPI<0xD8, fp, (outs), (ins f32mem:$src),
|
||||
!strconcat("f", !strconcat(asmstring, "{s} $src"))>;
|
||||
!strconcat("f", !strconcat(asmstring, "{s}\t$src"))>;
|
||||
def _F64m : FPI<0xDC, fp, (outs), (ins f64mem:$src),
|
||||
!strconcat("f", !strconcat(asmstring, "{l} $src"))>;
|
||||
!strconcat("f", !strconcat(asmstring, "{l}\t$src"))>;
|
||||
// ST(0) = ST(0) + [memint]
|
||||
def _FpI16m32 : FpI<(outs RFP32:$dst), (ins RFP32:$src1, i16mem:$src2), OneArgFPRW,
|
||||
[(set RFP32:$dst, (OpNode RFP32:$src1,
|
||||
@ -182,9 +182,9 @@ def _FpI32m64 : FpI<(outs RFP64:$dst), (ins RFP64:$src1, i32mem:$src2), OneArgFP
|
||||
[(set RFP64:$dst, (OpNode RFP64:$src1,
|
||||
(X86fild addr:$src2, i32)))]>;
|
||||
def _FI16m : FPI<0xDE, fp, (outs), (ins i16mem:$src),
|
||||
!strconcat("fi", !strconcat(asmstring, "{s} $src"))>;
|
||||
!strconcat("fi", !strconcat(asmstring, "{s}\t$src"))>;
|
||||
def _FI32m : FPI<0xDA, fp, (outs), (ins i32mem:$src),
|
||||
!strconcat("fi", !strconcat(asmstring, "{l} $src"))>;
|
||||
!strconcat("fi", !strconcat(asmstring, "{l}\t$src"))>;
|
||||
}
|
||||
|
||||
defm ADD : FPBinary_rr<fadd>;
|
||||
@ -208,24 +208,24 @@ class FPrST0PInst<bits<8> o, string asm>
|
||||
// NOTE: GAS and apparently all other AT&T style assemblers have a broken notion
|
||||
// of some of the 'reverse' forms of the fsub and fdiv instructions. As such,
|
||||
// we have to put some 'r's in and take them out of weird places.
|
||||
def ADD_FST0r : FPST0rInst <0xC0, "fadd $op">;
|
||||
def ADD_FrST0 : FPrST0Inst <0xC0, "fadd {%st(0), $op|$op, %ST(0)}">;
|
||||
def ADD_FPrST0 : FPrST0PInst<0xC0, "faddp $op">;
|
||||
def SUBR_FST0r : FPST0rInst <0xE8, "fsubr $op">;
|
||||
def SUB_FrST0 : FPrST0Inst <0xE8, "fsub{r} {%st(0), $op|$op, %ST(0)}">;
|
||||
def SUB_FPrST0 : FPrST0PInst<0xE8, "fsub{r}p $op">;
|
||||
def SUB_FST0r : FPST0rInst <0xE0, "fsub $op">;
|
||||
def SUBR_FrST0 : FPrST0Inst <0xE0, "fsub{|r} {%st(0), $op|$op, %ST(0)}">;
|
||||
def SUBR_FPrST0 : FPrST0PInst<0xE0, "fsub{|r}p $op">;
|
||||
def MUL_FST0r : FPST0rInst <0xC8, "fmul $op">;
|
||||
def MUL_FrST0 : FPrST0Inst <0xC8, "fmul {%st(0), $op|$op, %ST(0)}">;
|
||||
def MUL_FPrST0 : FPrST0PInst<0xC8, "fmulp $op">;
|
||||
def DIVR_FST0r : FPST0rInst <0xF8, "fdivr $op">;
|
||||
def DIV_FrST0 : FPrST0Inst <0xF8, "fdiv{r} {%st(0), $op|$op, %ST(0)}">;
|
||||
def DIV_FPrST0 : FPrST0PInst<0xF8, "fdiv{r}p $op">;
|
||||
def DIV_FST0r : FPST0rInst <0xF0, "fdiv $op">;
|
||||
def DIVR_FrST0 : FPrST0Inst <0xF0, "fdiv{|r} {%st(0), $op|$op, %ST(0)}">;
|
||||
def DIVR_FPrST0 : FPrST0PInst<0xF0, "fdiv{|r}p $op">;
|
||||
def ADD_FST0r : FPST0rInst <0xC0, "fadd\t$op">;
|
||||
def ADD_FrST0 : FPrST0Inst <0xC0, "fadd\t{%st(0), $op|$op, %ST(0)}">;
|
||||
def ADD_FPrST0 : FPrST0PInst<0xC0, "faddp\t$op">;
|
||||
def SUBR_FST0r : FPST0rInst <0xE8, "fsubr\t$op">;
|
||||
def SUB_FrST0 : FPrST0Inst <0xE8, "fsub{r}\t{%st(0), $op|$op, %ST(0)}">;
|
||||
def SUB_FPrST0 : FPrST0PInst<0xE8, "fsub{r}p\t$op">;
|
||||
def SUB_FST0r : FPST0rInst <0xE0, "fsub\t$op">;
|
||||
def SUBR_FrST0 : FPrST0Inst <0xE0, "fsub{|r}\t{%st(0), $op|$op, %ST(0)}">;
|
||||
def SUBR_FPrST0 : FPrST0PInst<0xE0, "fsub{|r}p\t$op">;
|
||||
def MUL_FST0r : FPST0rInst <0xC8, "fmul\t$op">;
|
||||
def MUL_FrST0 : FPrST0Inst <0xC8, "fmul\t{%st(0), $op|$op, %ST(0)}">;
|
||||
def MUL_FPrST0 : FPrST0PInst<0xC8, "fmulp\t$op">;
|
||||
def DIVR_FST0r : FPST0rInst <0xF8, "fdivr\t$op">;
|
||||
def DIV_FrST0 : FPrST0Inst <0xF8, "fdiv{r}\t{%st(0), $op|$op, %ST(0)}">;
|
||||
def DIV_FPrST0 : FPrST0PInst<0xF8, "fdiv{r}p\t$op">;
|
||||
def DIV_FST0r : FPST0rInst <0xF0, "fdiv\t$op">;
|
||||
def DIVR_FrST0 : FPrST0Inst <0xF0, "fdiv{|r}\t{%st(0), $op|$op, %ST(0)}">;
|
||||
def DIVR_FPrST0 : FPrST0PInst<0xF0, "fdiv{|r}p\t$op">;
|
||||
|
||||
// Unary operations.
|
||||
multiclass FPUnary<SDNode OpNode, bits<8> opcode, string asmstring> {
|
||||
@ -270,21 +270,21 @@ defm CMOVNP : FPCMov<X86_COND_NP>;
|
||||
|
||||
// These are not factored because there's no clean way to pass DA/DB.
|
||||
def CMOVB_F : FPI<0xC0, AddRegFrm, (outs RST:$op), (ins),
|
||||
"fcmovb {$op, %st(0)|%ST(0), $op}">, DA;
|
||||
"fcmovb\t{$op, %st(0)|%ST(0), $op}">, DA;
|
||||
def CMOVBE_F : FPI<0xD0, AddRegFrm, (outs RST:$op), (ins),
|
||||
"fcmovbe {$op, %st(0)|%ST(0), $op}">, DA;
|
||||
"fcmovbe\t{$op, %st(0)|%ST(0), $op}">, DA;
|
||||
def CMOVE_F : FPI<0xC8, AddRegFrm, (outs RST:$op), (ins),
|
||||
"fcmove {$op, %st(0)|%ST(0), $op}">, DA;
|
||||
"fcmove\t{$op, %st(0)|%ST(0), $op}">, DA;
|
||||
def CMOVP_F : FPI<0xD8, AddRegFrm, (outs RST:$op), (ins),
|
||||
"fcmovu {$op, %st(0)|%ST(0), $op}">, DA;
|
||||
"fcmovu\t {$op, %st(0)|%ST(0), $op}">, DA;
|
||||
def CMOVNB_F : FPI<0xC0, AddRegFrm, (outs RST:$op), (ins),
|
||||
"fcmovnb {$op, %st(0)|%ST(0), $op}">, DB;
|
||||
"fcmovnb\t{$op, %st(0)|%ST(0), $op}">, DB;
|
||||
def CMOVNBE_F: FPI<0xD0, AddRegFrm, (outs RST:$op), (ins),
|
||||
"fcmovnbe {$op, %st(0)|%ST(0), $op}">, DB;
|
||||
"fcmovnbe\t{$op, %st(0)|%ST(0), $op}">, DB;
|
||||
def CMOVNE_F : FPI<0xC8, AddRegFrm, (outs RST:$op), (ins),
|
||||
"fcmovne {$op, %st(0)|%ST(0), $op}">, DB;
|
||||
"fcmovne\t{$op, %st(0)|%ST(0), $op}">, DB;
|
||||
def CMOVNP_F : FPI<0xD8, AddRegFrm, (outs RST:$op), (ins),
|
||||
"fcmovnu {$op, %st(0)|%ST(0), $op}">, DB;
|
||||
"fcmovnu\t{$op, %st(0)|%ST(0), $op}">, DB;
|
||||
|
||||
// Floating point loads & stores.
|
||||
def LD_Fp32m : FpI<(outs RFP32:$dst), (ins f32mem:$src), ZeroArgFP,
|
||||
@ -321,20 +321,20 @@ def IST_Fp16m64 : FpI<(outs), (ins i16mem:$op, RFP64:$src), OneArgFP, []>;
|
||||
def IST_Fp32m64 : FpI<(outs), (ins i32mem:$op, RFP64:$src), OneArgFP, []>;
|
||||
def IST_Fp64m64 : FpI<(outs), (ins i64mem:$op, RFP64:$src), OneArgFP, []>;
|
||||
|
||||
def LD_F32m : FPI<0xD9, MRM0m, (outs), (ins f32mem:$src), "fld{s} $src">;
|
||||
def LD_F64m : FPI<0xDD, MRM0m, (outs), (ins f64mem:$src), "fld{l} $src">;
|
||||
def ILD_F16m : FPI<0xDF, MRM0m, (outs), (ins i16mem:$src), "fild{s} $src">;
|
||||
def ILD_F32m : FPI<0xDB, MRM0m, (outs), (ins i32mem:$src), "fild{l} $src">;
|
||||
def ILD_F64m : FPI<0xDF, MRM5m, (outs), (ins i64mem:$src), "fild{ll} $src">;
|
||||
def ST_F32m : FPI<0xD9, MRM2m, (outs), (ins f32mem:$dst), "fst{s} $dst">;
|
||||
def ST_F64m : FPI<0xDD, MRM2m, (outs), (ins f64mem:$dst), "fst{l} $dst">;
|
||||
def ST_FP32m : FPI<0xD9, MRM3m, (outs), (ins f32mem:$dst), "fstp{s} $dst">;
|
||||
def ST_FP64m : FPI<0xDD, MRM3m, (outs), (ins f64mem:$dst), "fstp{l} $dst">;
|
||||
def IST_F16m : FPI<0xDF, MRM2m, (outs), (ins i16mem:$dst), "fist{s} $dst">;
|
||||
def IST_F32m : FPI<0xDB, MRM2m, (outs), (ins i32mem:$dst), "fist{l} $dst">;
|
||||
def IST_FP16m : FPI<0xDF, MRM3m, (outs), (ins i16mem:$dst), "fistp{s} $dst">;
|
||||
def IST_FP32m : FPI<0xDB, MRM3m, (outs), (ins i32mem:$dst), "fistp{l} $dst">;
|
||||
def IST_FP64m : FPI<0xDF, MRM7m, (outs), (ins i64mem:$dst), "fistp{ll} $dst">;
|
||||
def LD_F32m : FPI<0xD9, MRM0m, (outs), (ins f32mem:$src), "fld{s}\t$src">;
|
||||
def LD_F64m : FPI<0xDD, MRM0m, (outs), (ins f64mem:$src), "fld{l}\t$src">;
|
||||
def ILD_F16m : FPI<0xDF, MRM0m, (outs), (ins i16mem:$src), "fild{s}\t$src">;
|
||||
def ILD_F32m : FPI<0xDB, MRM0m, (outs), (ins i32mem:$src), "fild{l}\t$src">;
|
||||
def ILD_F64m : FPI<0xDF, MRM5m, (outs), (ins i64mem:$src), "fild{ll}\t$src">;
|
||||
def ST_F32m : FPI<0xD9, MRM2m, (outs), (ins f32mem:$dst), "fst{s}\t$dst">;
|
||||
def ST_F64m : FPI<0xDD, MRM2m, (outs), (ins f64mem:$dst), "fst{l}\t$dst">;
|
||||
def ST_FP32m : FPI<0xD9, MRM3m, (outs), (ins f32mem:$dst), "fstp{s}\t$dst">;
|
||||
def ST_FP64m : FPI<0xDD, MRM3m, (outs), (ins f64mem:$dst), "fstp{l}\t$dst">;
|
||||
def IST_F16m : FPI<0xDF, MRM2m, (outs), (ins i16mem:$dst), "fist{s}\t$dst">;
|
||||
def IST_F32m : FPI<0xDB, MRM2m, (outs), (ins i32mem:$dst), "fist{l}\t$dst">;
|
||||
def IST_FP16m : FPI<0xDF, MRM3m, (outs), (ins i16mem:$dst), "fistp{s}\t$dst">;
|
||||
def IST_FP32m : FPI<0xDB, MRM3m, (outs), (ins i32mem:$dst), "fistp{l}\t$dst">;
|
||||
def IST_FP64m : FPI<0xDF, MRM7m, (outs), (ins i64mem:$dst), "fistp{ll}\t$dst">;
|
||||
|
||||
// FISTTP requires SSE3 even though it's a FPStack op.
|
||||
def ISTT_Fp16m32 : FpI_<(outs), (ins i16mem:$op, RFP32:$src), OneArgFP,
|
||||
@ -356,15 +356,15 @@ def ISTT_Fp64m64 : FpI_<(outs), (ins i64mem:$op, RFP64:$src), OneArgFP,
|
||||
[(X86fp_to_i64mem RFP64:$src, addr:$op)]>,
|
||||
Requires<[HasSSE3]>;
|
||||
|
||||
def ISTT_FP16m : FPI<0xDF, MRM1m, (outs), (ins i16mem:$dst), "fisttp{s} $dst">;
|
||||
def ISTT_FP32m : FPI<0xDB, MRM1m, (outs), (ins i32mem:$dst), "fisttp{l} $dst">;
|
||||
def ISTT_FP64m : FPI<0xDD, MRM1m, (outs), (ins i64mem:$dst), "fisttp{ll} $dst">;
|
||||
def ISTT_FP16m : FPI<0xDF, MRM1m, (outs), (ins i16mem:$dst), "fisttp{s}\t$dst">;
|
||||
def ISTT_FP32m : FPI<0xDB, MRM1m, (outs), (ins i32mem:$dst), "fisttp{l}\t$dst">;
|
||||
def ISTT_FP64m : FPI<0xDD, MRM1m, (outs), (ins i64mem:$dst), "fisttp{ll}\t$dst">;
|
||||
|
||||
// FP Stack manipulation instructions.
|
||||
def LD_Frr : FPI<0xC0, AddRegFrm, (outs), (ins RST:$op), "fld $op">, D9;
|
||||
def ST_Frr : FPI<0xD0, AddRegFrm, (outs), (ins RST:$op), "fst $op">, DD;
|
||||
def ST_FPrr : FPI<0xD8, AddRegFrm, (outs), (ins RST:$op), "fstp $op">, DD;
|
||||
def XCH_F : FPI<0xC8, AddRegFrm, (outs), (ins RST:$op), "fxch $op">, D9;
|
||||
def LD_Frr : FPI<0xC0, AddRegFrm, (outs), (ins RST:$op), "fld\t$op">, D9;
|
||||
def ST_Frr : FPI<0xD0, AddRegFrm, (outs), (ins RST:$op), "fst\t$op">, DD;
|
||||
def ST_FPrr : FPI<0xD8, AddRegFrm, (outs), (ins RST:$op), "fstp\t$op">, DD;
|
||||
def XCH_F : FPI<0xC8, AddRegFrm, (outs), (ins RST:$op), "fxch\t$op">, D9;
|
||||
|
||||
// Floating point constant loads.
|
||||
let isReMaterializable = 1 in {
|
||||
@ -394,29 +394,29 @@ def UCOM_FpIr64: FpI<(outs), (ins RFP64:$lhs, RFP64:$rhs), CompareFP,
|
||||
|
||||
def UCOM_Fr : FPI<0xE0, AddRegFrm, // FPSW = cmp ST(0) with ST(i)
|
||||
(outs), (ins RST:$reg),
|
||||
"fucom $reg">, DD, Imp<[ST0],[]>;
|
||||
"fucom\t$reg">, DD, Imp<[ST0],[]>;
|
||||
def UCOM_FPr : FPI<0xE8, AddRegFrm, // FPSW = cmp ST(0) with ST(i), pop
|
||||
(outs), (ins RST:$reg),
|
||||
"fucomp $reg">, DD, Imp<[ST0],[]>;
|
||||
"fucomp\t$reg">, DD, Imp<[ST0],[]>;
|
||||
def UCOM_FPPr : FPI<0xE9, RawFrm, // cmp ST(0) with ST(1), pop, pop
|
||||
(outs), (ins),
|
||||
"fucompp">, DA, Imp<[ST0],[]>;
|
||||
|
||||
def UCOM_FIr : FPI<0xE8, AddRegFrm, // CC = cmp ST(0) with ST(i)
|
||||
(outs), (ins RST:$reg),
|
||||
"fucomi {$reg, %st(0)|%ST(0), $reg}">, DB, Imp<[ST0],[]>;
|
||||
"fucomi\t{$reg, %st(0)|%ST(0), $reg}">, DB, Imp<[ST0],[]>;
|
||||
def UCOM_FIPr : FPI<0xE8, AddRegFrm, // CC = cmp ST(0) with ST(i), pop
|
||||
(outs), (ins RST:$reg),
|
||||
"fucomip {$reg, %st(0)|%ST(0), $reg}">, DF, Imp<[ST0],[]>;
|
||||
"fucomip\t{$reg, %st(0)|%ST(0), $reg}">, DF, Imp<[ST0],[]>;
|
||||
|
||||
// Floating point flag ops.
|
||||
def FNSTSW8r : I<0xE0, RawFrm, // AX = fp flags
|
||||
(outs), (ins), "fnstsw", []>, DF, Imp<[],[AX]>;
|
||||
|
||||
def FNSTCW16m : I<0xD9, MRM7m, // [mem16] = X87 control world
|
||||
(outs), (ins i16mem:$dst), "fnstcw $dst", []>;
|
||||
(outs), (ins i16mem:$dst), "fnstcw\t$dst", []>;
|
||||
def FLDCW16m : I<0xD9, MRM5m, // X87 control world = [mem16]
|
||||
(outs), (ins i16mem:$dst), "fldcw $dst", []>;
|
||||
(outs), (ins i16mem:$dst), "fldcw\t$dst", []>;
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
// Non-Instruction Patterns
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -85,12 +85,12 @@ let isTwoAddress = 1 in {
|
||||
multiclass MMXI_binop_rm<bits<8> opc, string OpcodeStr, SDNode OpNode,
|
||||
ValueType OpVT, bit Commutable = 0> {
|
||||
def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
!strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (OpVT (OpNode VR64:$src1, VR64:$src2)))]> {
|
||||
let isCommutable = Commutable;
|
||||
}
|
||||
def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
!strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (OpVT (OpNode VR64:$src1,
|
||||
(bitconvert
|
||||
(load_mmx addr:$src2)))))]>;
|
||||
@ -99,12 +99,12 @@ let isTwoAddress = 1 in {
|
||||
multiclass MMXI_binop_rm_int<bits<8> opc, string OpcodeStr, Intrinsic IntId,
|
||||
bit Commutable = 0> {
|
||||
def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
!strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))]> {
|
||||
let isCommutable = Commutable;
|
||||
}
|
||||
def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
!strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1,
|
||||
(bitconvert (load_mmx addr:$src2))))]>;
|
||||
}
|
||||
@ -117,12 +117,12 @@ let isTwoAddress = 1 in {
|
||||
multiclass MMXI_binop_rm_v1i64<bits<8> opc, string OpcodeStr, SDNode OpNode,
|
||||
bit Commutable = 0> {
|
||||
def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
!strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (v1i64 (OpNode VR64:$src1, VR64:$src2)))]> {
|
||||
let isCommutable = Commutable;
|
||||
}
|
||||
def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
!strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst,
|
||||
(OpNode VR64:$src1,(load_mmx addr:$src2)))]>;
|
||||
}
|
||||
@ -130,14 +130,14 @@ let isTwoAddress = 1 in {
|
||||
multiclass MMXI_binop_rmi_int<bits<8> opc, bits<8> opc2, Format ImmForm,
|
||||
string OpcodeStr, Intrinsic IntId> {
|
||||
def rr : MMXI<opc, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
!strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1, VR64:$src2))]>;
|
||||
def rm : MMXI<opc, MRMSrcMem, (outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
!strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1,
|
||||
(bitconvert (load_mmx addr:$src2))))]>;
|
||||
def ri : MMXIi8<opc2, ImmForm, (outs VR64:$dst), (ins VR64:$src1, i32i8imm:$src2),
|
||||
!strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"),
|
||||
!strconcat(OpcodeStr, "\t{$src2, $dst|$dst, $src2}"),
|
||||
[(set VR64:$dst, (IntId VR64:$src1,
|
||||
(scalar_to_vector (i32 imm:$src2))))]>;
|
||||
}
|
||||
@ -156,50 +156,50 @@ def MMX_FEMMS : MMXI<0x0E, RawFrm, (outs), (ins), "femms", [(int_x86_mmx_femms)]
|
||||
|
||||
// Data Transfer Instructions
|
||||
def MMX_MOVD64rr : MMXI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src),
|
||||
"movd {$src, $dst|$dst, $src}", []>;
|
||||
"movd\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_MOVD64rm : MMXI<0x6E, MRMSrcMem, (outs VR64:$dst), (ins i32mem:$src),
|
||||
"movd {$src, $dst|$dst, $src}", []>;
|
||||
"movd\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_MOVD64mr : MMXI<0x7E, MRMDestMem, (outs), (ins i32mem:$dst, VR64:$src),
|
||||
"movd {$src, $dst|$dst, $src}", []>;
|
||||
"movd\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
def MMX_MOVD64to64rr : MMXRI<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR64:$src),
|
||||
"movd {$src, $dst|$dst, $src}", []>;
|
||||
"movd\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
def MMX_MOVQ64rr : MMXI<0x6F, MRMSrcReg, (outs VR64:$dst), (ins VR64:$src),
|
||||
"movq {$src, $dst|$dst, $src}", []>;
|
||||
"movq\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_MOVQ64rm : MMXI<0x6F, MRMSrcMem, (outs VR64:$dst), (ins i64mem:$src),
|
||||
"movq {$src, $dst|$dst, $src}",
|
||||
"movq\t{$src, $dst|$dst, $src}",
|
||||
[(set VR64:$dst, (load_mmx addr:$src))]>;
|
||||
def MMX_MOVQ64mr : MMXI<0x7F, MRMDestMem, (outs), (ins i64mem:$dst, VR64:$src),
|
||||
"movq {$src, $dst|$dst, $src}",
|
||||
"movq\t{$src, $dst|$dst, $src}",
|
||||
[(store (v1i64 VR64:$src), addr:$dst)]>;
|
||||
|
||||
def MMX_MOVDQ2Qrr : MMXID<0xD6, MRMDestMem, (outs VR64:$dst), (ins VR128:$src),
|
||||
"movdq2q {$src, $dst|$dst, $src}",
|
||||
"movdq2q\t{$src, $dst|$dst, $src}",
|
||||
[(set VR64:$dst,
|
||||
(v1i64 (vector_extract (v2i64 VR128:$src),
|
||||
(iPTR 0))))]>;
|
||||
|
||||
def MMX_MOVQ2DQrr : MMXIS<0xD6, MRMDestMem, (outs VR128:$dst), (ins VR64:$src),
|
||||
"movq2dq {$src, $dst|$dst, $src}",
|
||||
"movq2dq\t{$src, $dst|$dst, $src}",
|
||||
[(set VR128:$dst,
|
||||
(bitconvert (v1i64 VR64:$src)))]>;
|
||||
|
||||
def MMX_MOVNTQmr : MMXI<0xE7, MRMDestMem, (outs), (ins i64mem:$dst, VR64:$src),
|
||||
"movntq {$src, $dst|$dst, $src}",
|
||||
"movntq\t{$src, $dst|$dst, $src}",
|
||||
[(int_x86_mmx_movnt_dq addr:$dst, VR64:$src)]>;
|
||||
|
||||
let AddedComplexity = 15 in
|
||||
// movd to MMX register zero-extends
|
||||
def MMX_MOVZDI2PDIrr : MMX2I<0x6E, MRMSrcReg, (outs VR64:$dst), (ins GR32:$src),
|
||||
"movd {$src, $dst|$dst, $src}",
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(set VR64:$dst,
|
||||
(v2i32 (vector_shuffle immAllZerosV,
|
||||
(v2i32 (scalar_to_vector GR32:$src)),
|
||||
MMX_MOVL_shuffle_mask)))]>;
|
||||
let AddedComplexity = 20 in
|
||||
def MMX_MOVZDI2PDIrm : MMX2I<0x6E, MRMSrcMem, (outs VR64:$dst), (ins i32mem:$src),
|
||||
"movd {$src, $dst|$dst, $src}",
|
||||
"movd\t{$src, $dst|$dst, $src}",
|
||||
[(set VR64:$dst,
|
||||
(v2i32 (vector_shuffle immAllZerosV,
|
||||
(v2i32 (scalar_to_vector
|
||||
@ -261,12 +261,12 @@ defm MMX_PXOR : MMXI_binop_rm_v1i64<0xEF, "pxor", xor, 1>;
|
||||
let isTwoAddress = 1 in {
|
||||
def MMX_PANDNrr : MMXI<0xDF, MRMSrcReg,
|
||||
(outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
"pandn {$src2, $dst|$dst, $src2}",
|
||||
"pandn\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst, (v1i64 (and (vnot VR64:$src1),
|
||||
VR64:$src2)))]>;
|
||||
def MMX_PANDNrm : MMXI<0xDF, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
"pandn {$src2, $dst|$dst, $src2}",
|
||||
"pandn\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst, (v1i64 (and (vnot VR64:$src1),
|
||||
(load addr:$src2))))]>;
|
||||
}
|
||||
@ -307,13 +307,13 @@ let isTwoAddress = 1 in {
|
||||
// Unpack High Packed Data Instructions
|
||||
def MMX_PUNPCKHBWrr : MMXI<0x68, MRMSrcReg,
|
||||
(outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
"punpckhbw {$src2, $dst|$dst, $src2}",
|
||||
"punpckhbw\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v8i8 (vector_shuffle VR64:$src1, VR64:$src2,
|
||||
MMX_UNPCKH_shuffle_mask)))]>;
|
||||
def MMX_PUNPCKHBWrm : MMXI<0x68, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
"punpckhbw {$src2, $dst|$dst, $src2}",
|
||||
"punpckhbw\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v8i8 (vector_shuffle VR64:$src1,
|
||||
(bc_v8i8 (load_mmx addr:$src2)),
|
||||
@ -321,13 +321,13 @@ let isTwoAddress = 1 in {
|
||||
|
||||
def MMX_PUNPCKHWDrr : MMXI<0x69, MRMSrcReg,
|
||||
(outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
"punpckhwd {$src2, $dst|$dst, $src2}",
|
||||
"punpckhwd\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v4i16 (vector_shuffle VR64:$src1, VR64:$src2,
|
||||
MMX_UNPCKH_shuffle_mask)))]>;
|
||||
def MMX_PUNPCKHWDrm : MMXI<0x69, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
"punpckhwd {$src2, $dst|$dst, $src2}",
|
||||
"punpckhwd\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v4i16 (vector_shuffle VR64:$src1,
|
||||
(bc_v4i16 (load_mmx addr:$src2)),
|
||||
@ -335,13 +335,13 @@ let isTwoAddress = 1 in {
|
||||
|
||||
def MMX_PUNPCKHDQrr : MMXI<0x6A, MRMSrcReg,
|
||||
(outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
"punpckhdq {$src2, $dst|$dst, $src2}",
|
||||
"punpckhdq\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v2i32 (vector_shuffle VR64:$src1, VR64:$src2,
|
||||
MMX_UNPCKH_shuffle_mask)))]>;
|
||||
def MMX_PUNPCKHDQrm : MMXI<0x6A, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
"punpckhdq {$src2, $dst|$dst, $src2}",
|
||||
"punpckhdq\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v2i32 (vector_shuffle VR64:$src1,
|
||||
(bc_v2i32 (load_mmx addr:$src2)),
|
||||
@ -350,13 +350,13 @@ let isTwoAddress = 1 in {
|
||||
// Unpack Low Packed Data Instructions
|
||||
def MMX_PUNPCKLBWrr : MMXI<0x60, MRMSrcReg,
|
||||
(outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
"punpcklbw {$src2, $dst|$dst, $src2}",
|
||||
"punpcklbw\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v8i8 (vector_shuffle VR64:$src1, VR64:$src2,
|
||||
MMX_UNPCKL_shuffle_mask)))]>;
|
||||
def MMX_PUNPCKLBWrm : MMXI<0x60, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
"punpcklbw {$src2, $dst|$dst, $src2}",
|
||||
"punpcklbw\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v8i8 (vector_shuffle VR64:$src1,
|
||||
(bc_v8i8 (load_mmx addr:$src2)),
|
||||
@ -364,13 +364,13 @@ let isTwoAddress = 1 in {
|
||||
|
||||
def MMX_PUNPCKLWDrr : MMXI<0x61, MRMSrcReg,
|
||||
(outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
"punpcklwd {$src2, $dst|$dst, $src2}",
|
||||
"punpcklwd\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v4i16 (vector_shuffle VR64:$src1, VR64:$src2,
|
||||
MMX_UNPCKL_shuffle_mask)))]>;
|
||||
def MMX_PUNPCKLWDrm : MMXI<0x61, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
"punpcklwd {$src2, $dst|$dst, $src2}",
|
||||
"punpcklwd\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v4i16 (vector_shuffle VR64:$src1,
|
||||
(bc_v4i16 (load_mmx addr:$src2)),
|
||||
@ -378,13 +378,13 @@ let isTwoAddress = 1 in {
|
||||
|
||||
def MMX_PUNPCKLDQrr : MMXI<0x62, MRMSrcReg,
|
||||
(outs VR64:$dst), (ins VR64:$src1, VR64:$src2),
|
||||
"punpckldq {$src2, $dst|$dst, $src2}",
|
||||
"punpckldq\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v2i32 (vector_shuffle VR64:$src1, VR64:$src2,
|
||||
MMX_UNPCKL_shuffle_mask)))]>;
|
||||
def MMX_PUNPCKLDQrm : MMXI<0x62, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins VR64:$src1, i64mem:$src2),
|
||||
"punpckldq {$src2, $dst|$dst, $src2}",
|
||||
"punpckldq\t{$src2, $dst|$dst, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v2i32 (vector_shuffle VR64:$src1,
|
||||
(bc_v2i32 (load_mmx addr:$src2)),
|
||||
@ -399,14 +399,14 @@ defm MMX_PACKUSWB : MMXI_binop_rm_int<0x67, "packuswb", int_x86_mmx_packuswb>;
|
||||
// -- Shuffle Instructions
|
||||
def MMX_PSHUFWri : MMXIi8<0x70, MRMSrcReg,
|
||||
(outs VR64:$dst), (ins VR64:$src1, i8imm:$src2),
|
||||
"pshufw {$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
"pshufw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v4i16 (vector_shuffle
|
||||
VR64:$src1, (undef),
|
||||
MMX_PSHUFW_shuffle_mask:$src2)))]>;
|
||||
def MMX_PSHUFWmi : MMXIi8<0x70, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins i64mem:$src1, i8imm:$src2),
|
||||
"pshufw {$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
"pshufw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set VR64:$dst,
|
||||
(v4i16 (vector_shuffle
|
||||
(bc_v4i16 (load_mmx addr:$src1)),
|
||||
@ -415,34 +415,34 @@ def MMX_PSHUFWmi : MMXIi8<0x70, MRMSrcMem,
|
||||
|
||||
// -- Conversion Instructions
|
||||
def MMX_CVTPD2PIrr : MMX2I<0x2D, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
|
||||
"cvtpd2pi {$src, $dst|$dst, $src}", []>;
|
||||
"cvtpd2pi\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_CVTPD2PIrm : MMX2I<0x2D, MRMSrcMem, (outs VR64:$dst), (ins f128mem:$src),
|
||||
"cvtpd2pi {$src, $dst|$dst, $src}", []>;
|
||||
"cvtpd2pi\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
def MMX_CVTPI2PDrr : MMX2I<0x2A, MRMSrcReg, (outs VR128:$dst), (ins VR64:$src),
|
||||
"cvtpi2pd {$src, $dst|$dst, $src}", []>;
|
||||
"cvtpi2pd\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_CVTPI2PDrm : MMX2I<0x2A, MRMSrcMem, (outs VR128:$dst), (ins i64mem:$src),
|
||||
"cvtpi2pd {$src, $dst|$dst, $src}", []>;
|
||||
"cvtpi2pd\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
def MMX_CVTPI2PSrr : MMXI<0x2A, MRMSrcReg, (outs VR128:$dst), (ins VR64:$src),
|
||||
"cvtpi2ps {$src, $dst|$dst, $src}", []>;
|
||||
"cvtpi2ps\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_CVTPI2PSrm : MMXI<0x2A, MRMSrcMem, (outs VR128:$dst), (ins i64mem:$src),
|
||||
"cvtpi2ps {$src, $dst|$dst, $src}", []>;
|
||||
"cvtpi2ps\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
def MMX_CVTPS2PIrr : MMXI<0x2D, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
|
||||
"cvtps2pi {$src, $dst|$dst, $src}", []>;
|
||||
"cvtps2pi\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_CVTPS2PIrm : MMXI<0x2D, MRMSrcMem, (outs VR64:$dst), (ins f64mem:$src),
|
||||
"cvtps2pi {$src, $dst|$dst, $src}", []>;
|
||||
"cvtps2pi\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
def MMX_CVTTPD2PIrr : MMX2I<0x2C, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
|
||||
"cvttpd2pi {$src, $dst|$dst, $src}", []>;
|
||||
"cvttpd2pi\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_CVTTPD2PIrm : MMX2I<0x2C, MRMSrcMem, (outs VR64:$dst), (ins f128mem:$src),
|
||||
"cvttpd2pi {$src, $dst|$dst, $src}", []>;
|
||||
"cvttpd2pi\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
def MMX_CVTTPS2PIrr : MMXI<0x2C, MRMSrcReg, (outs VR64:$dst), (ins VR128:$src),
|
||||
"cvttps2pi {$src, $dst|$dst, $src}", []>;
|
||||
"cvttps2pi\t{$src, $dst|$dst, $src}", []>;
|
||||
def MMX_CVTTPS2PIrm : MMXI<0x2C, MRMSrcMem, (outs VR64:$dst), (ins f64mem:$src),
|
||||
"cvttps2pi {$src, $dst|$dst, $src}", []>;
|
||||
"cvttps2pi\t{$src, $dst|$dst, $src}", []>;
|
||||
|
||||
// Extract / Insert
|
||||
def MMX_X86pextrw : SDNode<"X86ISD::PEXTRW", SDTypeProfile<1, 2, []>, []>;
|
||||
@ -450,18 +450,18 @@ def MMX_X86pinsrw : SDNode<"X86ISD::PINSRW", SDTypeProfile<1, 3, []>, []>;
|
||||
|
||||
def MMX_PEXTRWri : MMXIi8<0xC5, MRMSrcReg,
|
||||
(outs GR32:$dst), (ins VR64:$src1, i16i8imm:$src2),
|
||||
"pextrw {$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
"pextrw\t{$src2, $src1, $dst|$dst, $src1, $src2}",
|
||||
[(set GR32:$dst, (MMX_X86pextrw (v4i16 VR64:$src1),
|
||||
(iPTR imm:$src2)))]>;
|
||||
let isTwoAddress = 1 in {
|
||||
def MMX_PINSRWrri : MMXIi8<0xC4, MRMSrcReg,
|
||||
(outs VR64:$dst), (ins VR64:$src1, GR32:$src2, i16i8imm:$src3),
|
||||
"pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
"pinsrw\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
[(set VR64:$dst, (v4i16 (MMX_X86pinsrw (v4i16 VR64:$src1),
|
||||
GR32:$src2, (iPTR imm:$src3))))]>;
|
||||
def MMX_PINSRWrmi : MMXIi8<0xC4, MRMSrcMem,
|
||||
(outs VR64:$dst), (ins VR64:$src1, i16mem:$src2, i16i8imm:$src3),
|
||||
"pinsrw {$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
"pinsrw\t{$src3, $src2, $dst|$dst, $src2, $src3}",
|
||||
[(set VR64:$dst,
|
||||
(v4i16 (MMX_X86pinsrw (v4i16 VR64:$src1),
|
||||
(i32 (anyext (loadi16 addr:$src2))),
|
||||
@ -470,12 +470,12 @@ let isTwoAddress = 1 in {
|
||||
|
||||
// Mask creation
|
||||
def MMX_PMOVMSKBrr : MMXI<0xD7, MRMSrcReg, (outs GR32:$dst), (ins VR64:$src),
|
||||
"pmovmskb {$src, $dst|$dst, $src}",
|
||||
"pmovmskb\t{$src, $dst|$dst, $src}",
|
||||
[(set GR32:$dst, (int_x86_mmx_pmovmskb VR64:$src))]>;
|
||||
|
||||
// Misc.
|
||||
def MMX_MASKMOVQ : MMXI<0xF7, MRMDestMem, (outs), (ins VR64:$src, VR64:$mask),
|
||||
"maskmovq {$mask, $src|$src, $mask}",
|
||||
"maskmovq\t{$mask, $src|$src, $mask}",
|
||||
[(int_x86_mmx_maskmovq VR64:$src, VR64:$mask, EDI)]>,
|
||||
Imp<[EDI],[]>;
|
||||
|
||||
@ -487,10 +487,10 @@ def MMX_MASKMOVQ : MMXI<0xF7, MRMDestMem, (outs), (ins VR64:$src, VR64:$mask),
|
||||
// FIXME: remove when we can teach regalloc that xor reg, reg is ok.
|
||||
let isReMaterializable = 1 in {
|
||||
def MMX_V_SET0 : MMXI<0xEF, MRMInitReg, (outs VR64:$dst), (ins),
|
||||
"pxor $dst, $dst",
|
||||
"pxor\t$dst, $dst",
|
||||
[(set VR64:$dst, (v1i64 immAllZerosV))]>;
|
||||
def MMX_V_SETALLONES : MMXI<0x76, MRMInitReg, (outs VR64:$dst), (ins),
|
||||
"pcmpeqd $dst, $dst",
|
||||
"pcmpeqd\t$dst, $dst",
|
||||
[(set VR64:$dst, (v1i64 immAllOnesV))]>;
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -3,7 +3,7 @@
|
||||
|
||||
; Make sure there are only 3 mov's for each testcase
|
||||
; RUN: llvm-upgrade < %s | llvm-as | llc -march=x86 -x86-asm-syntax=intel | \
|
||||
; RUN: grep {mov } | wc -l | grep 6
|
||||
; RUN: grep {\\\<mov\\\>} | wc -l | grep 6
|
||||
|
||||
|
||||
target triple = "i686-pc-linux-gnu"
|
||||
|
@ -1,6 +1,6 @@
|
||||
; RUN: llvm-upgrade < %s | llvm-as | opt -tailduplicate | \
|
||||
; RUN: llc -march=x86 -o %t -f
|
||||
; RUN: grep {je } %t
|
||||
; RUN: grep {\\\<je\\\>} %t
|
||||
; RUN: not grep jmp %t
|
||||
; END.
|
||||
; This should have no unconditional jumps in it. The C source is:
|
||||
|
Loading…
x
Reference in New Issue
Block a user