From 79373680ed7f2b92df4a5c45d0d9bbd47af77c58 Mon Sep 17 00:00:00 2001 From: Daniel Dunbar Date: Tue, 25 May 2010 18:40:53 +0000 Subject: [PATCH] MC/X86: Define explicit immediate forms of cmp{ss,sd,ps,pd}. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@104622 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Target/X86/X86InstrSSE.td | 42 ++++++++++++++++++++++ test/MC/AsmParser/X86/x86_32-new-encoder.s | 25 +++++++++++++ 2 files changed, 67 insertions(+) diff --git a/lib/Target/X86/X86InstrSSE.td b/lib/Target/X86/X86InstrSSE.td index dcd043c73a1..8103fa72503 100644 --- a/lib/Target/X86/X86InstrSSE.td +++ b/lib/Target/X86/X86InstrSSE.td @@ -509,6 +509,17 @@ let mayLoad = 1 in def CMPSSrm : SSIi8<0xC2, MRMSrcMem, (outs FR32:$dst), (ins FR32:$src1, f32mem:$src, SSECC:$cc), "cmp${cc}ss\t{$src, $dst|$dst, $src}", []>; + + // Accept explicit immediate argument form instead of comparison code. +let isAsmParserOnly = 1 in { + def CMPSSrr_alt : SSIi8<0xC2, MRMSrcReg, + (outs FR32:$dst), (ins FR32:$src1, FR32:$src, i8imm:$src2), + "cmpss\t{$src2, $src, $dst|$dst, $src, $src2}", []>; +let mayLoad = 1 in + def CMPSSrm_alt : SSIi8<0xC2, MRMSrcMem, + (outs FR32:$dst), (ins FR32:$src1, f32mem:$src, i8imm:$src2), + "cmpss\t{$src2, $src, $dst|$dst, $src, $src2}", []>; +} } let Defs = [EFLAGS] in { @@ -1009,6 +1020,16 @@ let Constraints = "$src1 = $dst" in { "cmp${cc}ps\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (int_x86_sse_cmp_ps VR128:$src1, (memop addr:$src), imm:$cc))]>; + + // Accept explicit immediate argument form instead of comparison code. +let isAsmParserOnly = 1 in { + def CMPPSrri_alt : PSIi8<0xC2, MRMSrcReg, + (outs VR128:$dst), (ins VR128:$src1, VR128:$src, i8imm:$src2), + "cmpps\t{$src2, $src, $dst|$dst, $src, $src}", []>; + def CMPPSrmi_alt : PSIi8<0xC2, MRMSrcMem, + (outs VR128:$dst), (ins VR128:$src1, f128mem:$src, i8imm:$src2), + "cmpps\t{$src2, $src, $dst|$dst, $src, $src}", []>; +} } def : Pat<(v4i32 (X86cmpps (v4f32 VR128:$src1), VR128:$src2, imm:$cc)), (CMPPSrri (v4f32 VR128:$src1), (v4f32 VR128:$src2), imm:$cc)>; @@ -1298,6 +1319,17 @@ let mayLoad = 1 in def CMPSDrm : SDIi8<0xC2, MRMSrcMem, (outs FR64:$dst), (ins FR64:$src1, f64mem:$src, SSECC:$cc), "cmp${cc}sd\t{$src, $dst|$dst, $src}", []>; + + // Accept explicit immediate argument form instead of comparison code. +let isAsmParserOnly = 1 in { + def CMPSDrr_alt : SDIi8<0xC2, MRMSrcReg, + (outs FR64:$dst), (ins FR64:$src1, FR64:$src, i8imm:$src2), + "cmpsd\t{$src2, $src, $dst|$dst, $src, $src2}", []>; +let mayLoad = 1 in + def CMPSDrm_alt : SDIi8<0xC2, MRMSrcMem, + (outs FR64:$dst), (ins FR64:$src1, f64mem:$src, i8imm:$src2), + "cmpsd\t{$src2, $src, $dst|$dst, $src, $src2}", []>; +} } let Defs = [EFLAGS] in { @@ -1891,6 +1923,16 @@ let Constraints = "$src1 = $dst" in { "cmp${cc}pd\t{$src, $dst|$dst, $src}", [(set VR128:$dst, (int_x86_sse2_cmp_pd VR128:$src1, (memop addr:$src), imm:$cc))]>; + + // Accept explicit immediate argument form instead of comparison code. +let isAsmParserOnly = 1 in { + def CMPPDrri_alt : PDIi8<0xC2, MRMSrcReg, + (outs VR128:$dst), (ins VR128:$src1, VR128:$src, i8imm:$src2), + "cmppd\t{$src2, $src, $dst|$dst, $src, $src2}", []>; + def CMPPDrmi_alt : PDIi8<0xC2, MRMSrcMem, + (outs VR128:$dst), (ins VR128:$src1, f128mem:$src, i8imm:$src2), + "cmppd\t{$src2, $src, $dst|$dst, $src, $src2}", []>; +} } def : Pat<(v2i64 (X86cmppd (v2f64 VR128:$src1), VR128:$src2, imm:$cc)), (CMPPDrri VR128:$src1, VR128:$src2, imm:$cc)>; diff --git a/test/MC/AsmParser/X86/x86_32-new-encoder.s b/test/MC/AsmParser/X86/x86_32-new-encoder.s index 17614e97919..f4e6857ba30 100644 --- a/test/MC/AsmParser/X86/x86_32-new-encoder.s +++ b/test/MC/AsmParser/X86/x86_32-new-encoder.s @@ -218,3 +218,28 @@ retl // CHECK: cmovel %eax, %edx // CHECK: encoding: [0x0f,0x44,0xd0] cmovzl %eax,%edx + +// CHECK: cmpps $0, %xmm0, %xmm1 +// CHECK: encoding: [0x0f,0xc2,0xc8,0x00] + cmpps $0, %xmm0, %xmm1 +// CHECK: cmpps $0, (%eax), %xmm1 +// CHECK: encoding: [0x0f,0xc2,0x08,0x00] + cmpps $0, 0(%eax), %xmm1 +// CHECK: cmppd $0, %xmm0, %xmm1 +// CHECK: encoding: [0x66,0x0f,0xc2,0xc8,0x00] + cmppd $0, %xmm0, %xmm1 +// CHECK: cmppd $0, (%eax), %xmm1 +// CHECK: encoding: [0x66,0x0f,0xc2,0x08,0x00] + cmppd $0, 0(%eax), %xmm1 +// CHECK: cmpss $0, %xmm0, %xmm1 +// CHECK: encoding: [0xf3,0x0f,0xc2,0xc8,0x00] + cmpss $0, %xmm0, %xmm1 +// CHECK: cmpss $0, (%eax), %xmm1 +// CHECK: encoding: [0xf3,0x0f,0xc2,0x08,0x00] + cmpss $0, 0(%eax), %xmm1 +// CHECK: cmpsd $0, %xmm0, %xmm1 +// CHECK: encoding: [0xf2,0x0f,0xc2,0xc8,0x00] + cmpsd $0, %xmm0, %xmm1 +// CHECK: cmpsd $0, (%eax), %xmm1 +// CHECK: encoding: [0xf2,0x0f,0xc2,0x08,0x00] + cmpsd $0, 0(%eax), %xmm1