Changes in directory llvm/lib/Target/X86:
X86.td updated: 1.29 -> 1.30 X86CodeEmitter.cpp updated: 1.131 -> 1.132 X86InstrInfo.h updated: 1.62 -> 1.63 X86InstrInfo.td updated: 1.300 -> 1.301 X86InstrSSE.td updated: 1.179 -> 1.180 X86Subtarget.cpp updated: 1.53 -> 1.54 X86Subtarget.h updated: 1.28 -> 1.29 --- Log message: Add support for our first SSSE3 instruction "pmulhrsw". --- Diffs of the changes: (+54 -10) X86.td | 2 ++ X86CodeEmitter.cpp | 8 ++++++++ X86InstrInfo.h | 5 ++++- X86InstrInfo.td | 3 +++ X86InstrSSE.td | 40 +++++++++++++++++++++++++++++++++------- X86Subtarget.cpp | 1 + X86Subtarget.h | 5 +++-- 7 files changed, 54 insertions(+), 10 deletions(-) Index: llvm/lib/Target/X86/X86.td diff -u llvm/lib/Target/X86/X86.td:1.29 llvm/lib/Target/X86/X86.td:1.30 --- llvm/lib/Target/X86/X86.td:1.29 Mon Feb 26 12:17:14 2007 +++ llvm/lib/Target/X86/X86.td Tue Apr 10 17:10:25 2007 @@ -30,6 +30,8 @@ "Enable SSE2 instructions">; def FeatureSSE3 : SubtargetFeature<"sse3", "X86SSELevel", "SSE3", "Enable SSE3 instructions">; +def FeatureSSSE3 : SubtargetFeature<"ssse3", "X86SSELevel", "SSSE3", + "Enable SSSE3 instructions">; def Feature3DNow : SubtargetFeature<"3dnow", "X863DNowLevel", "ThreeDNow", "Enable 3DNow! instructions">; def Feature3DNowA : SubtargetFeature<"3dnowa", "X863DNowLevel", "ThreeDNowA", Index: llvm/lib/Target/X86/X86CodeEmitter.cpp diff -u llvm/lib/Target/X86/X86CodeEmitter.cpp:1.131 llvm/lib/Target/X86/X86CodeEmitter.cpp:1.132 --- llvm/lib/Target/X86/X86CodeEmitter.cpp:1.131 Wed Mar 14 15:20:19 2007 +++ llvm/lib/Target/X86/X86CodeEmitter.cpp Tue Apr 10 17:10:25 2007 @@ -584,6 +584,14 @@ case X86II::TB: Need0FPrefix = true; // Two-byte opcode prefix break; + case X86II::T8: + MCE.emitByte(0x0F); + MCE.emitByte(0x38); + break; + case X86II::TA: + MCE.emitByte(0x0F); + MCE.emitByte(0x3A); + break; case X86II::REP: break; // already handled. case X86II::XS: // F3 0F MCE.emitByte(0xF3); Index: llvm/lib/Target/X86/X86InstrInfo.h diff -u llvm/lib/Target/X86/X86InstrInfo.h:1.62 llvm/lib/Target/X86/X86InstrInfo.h:1.63 --- llvm/lib/Target/X86/X86InstrInfo.h:1.62 Fri Jan 26 08:34:52 2007 +++ llvm/lib/Target/X86/X86InstrInfo.h Tue Apr 10 17:10:25 2007 @@ -154,7 +154,10 @@ // XS, XD - These prefix codes are for single and double precision scalar // floating point operations performed in the SSE registers. - XD = 11 << Op0Shift, XS = 12 << Op0Shift, + XD = 11 << Op0Shift, XS = 12 << Op0Shift, + + // T8, TA - Prefix after the 0x0F prefix. + T8 = 13 << Op0Shift, TA = 14 << Op0Shift, //===------------------------------------------------------------------===// // REX_W - REX prefixes are instruction prefixes used in 64-bit mode. Index: llvm/lib/Target/X86/X86InstrInfo.td diff -u llvm/lib/Target/X86/X86InstrInfo.td:1.300 llvm/lib/Target/X86/X86InstrInfo.td:1.301 --- llvm/lib/Target/X86/X86InstrInfo.td:1.300 Tue Mar 20 19:16:56 2007 +++ llvm/lib/Target/X86/X86InstrInfo.td Tue Apr 10 17:10:25 2007 @@ -167,6 +167,7 @@ def HasSSE1 : Predicate<"Subtarget->hasSSE1()">; def HasSSE2 : Predicate<"Subtarget->hasSSE2()">; def HasSSE3 : Predicate<"Subtarget->hasSSE3()">; +def HasSSSE3 : Predicate<"Subtarget->hasSSSE3()">; def FPStack : Predicate<"!Subtarget->hasSSE2()">; def In32BitMode : Predicate<"!Subtarget->is64Bit()">; def In64BitMode : Predicate<"Subtarget->is64Bit()">; @@ -248,6 +249,8 @@ class DF { bits<4> Prefix = 10; } class XD { bits<4> Prefix = 11; } class XS { bits<4> Prefix = 12; } +class T8 { bits<4> Prefix = 13; } +class TA { bits<4> Prefix = 14; } //===----------------------------------------------------------------------===// Index: llvm/lib/Target/X86/X86InstrSSE.td diff -u llvm/lib/Target/X86/X86InstrSSE.td:1.179 llvm/lib/Target/X86/X86InstrSSE.td:1.180 --- llvm/lib/Target/X86/X86InstrSSE.td:1.179 Tue Mar 20 19:16:56 2007 +++ llvm/lib/Target/X86/X86InstrSSE.td Tue Apr 10 17:10:25 2007 @@ -183,15 +183,17 @@ //===----------------------------------------------------------------------===// // Instruction templates -// SSI - SSE1 instructions with XS prefix. -// SDI - SSE2 instructions with XD prefix. -// PSI - SSE1 instructions with TB prefix. -// PDI - SSE2 instructions with TB and OpSize prefixes. +// SSI - SSE1 instructions with XS prefix. +// SDI - SSE2 instructions with XD prefix. +// PSI - SSE1 instructions with TB prefix. +// PDI - SSE2 instructions with TB and OpSize prefixes. // PSIi8 - SSE1 instructions with ImmT == Imm8 and TB prefix. // PDIi8 - SSE2 instructions with ImmT == Imm8 and TB and OpSize prefixes. -// S3I - SSE3 instructions with TB and OpSize prefixes. -// S3SI - SSE3 instructions with XS prefix. -// S3DI - SSE3 instructions with XD prefix. +// S3I - SSE3 instructions with TB and OpSize prefixes. +// S3SI - SSE3 instructions with XS prefix. +// S3DI - SSE3 instructions with XD prefix. +// SS38I - SSSE3 instructions with T8 and OpSize prefixes. +// SS3AI - SSSE3 instructions with TA and OpSize prefixes. class SSI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern> : I<o, F, ops, asm, pattern>, XS, Requires<[HasSSE1]>; class SDI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern> @@ -212,6 +214,11 @@ class S3I<bits<8> o, Format F, dag ops, string asm, list<dag> pattern> : I<o, F, ops, asm, pattern>, TB, OpSize, Requires<[HasSSE3]>; +class SS38I<bits<8> o, Format F, dag ops, string asm, list<dag> pattern> + : I<o, F, ops, asm, pattern>, T8, OpSize, Requires<[HasSSSE3]>; +class SS3AI<bits<8> o, Format F, dag ops, string asm, list<dag> pattern> + : I<o, F, ops, asm, pattern>, TA, OpSize, Requires<[HasSSSE3]>; + //===----------------------------------------------------------------------===// // Helpers for defining instructions that directly correspond to intrinsics. @@ -1311,6 +1318,22 @@ } } +/// SS3I_binop_rm_int - Simple SSSE3 binary operatr whose type is v2i64. +let isTwoAddress = 1 in { + multiclass SS3I_binop_rm_int<bits<8> opc, string OpcodeStr, Intrinsic IntId, + bit Commutable = 0> { + def rr : SS38I<opc, MRMSrcReg, (ops VR128:$dst, VR128:$src1, VR128:$src2), + !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"), + [(set VR128:$dst, (IntId VR128:$src1, VR128:$src2))]> { + let isCommutable = Commutable; + } + def rm : SS38I<opc, MRMSrcMem, (ops VR128:$dst, VR128:$src1, i128mem:$src2), + !strconcat(OpcodeStr, " {$src2, $dst|$dst, $src2}"), + [(set VR128:$dst, + (IntId VR128:$src1, + (bitconvert (loadv2i64 addr:$src2))))]>; + } +} // 128-bit Integer Arithmetic @@ -1340,6 +1363,9 @@ defm PMULHW : PDI_binop_rm_int<0xE5, "pmulhw" , int_x86_sse2_pmulh_w , 1>; defm PMULUDQ : PDI_binop_rm_int<0xF4, "pmuludq", int_x86_sse2_pmulu_dq, 1>; +defm PMULHRSW128 : SS3I_binop_rm_int<0x0B, "pmulhrsw", + int_x86_ssse3_pmulhrsw_128, 1>; + defm PMADDWD : PDI_binop_rm_int<0xF5, "pmaddwd", int_x86_sse2_pmadd_wd, 1>; defm PAVGB : PDI_binop_rm_int<0xE0, "pavgb", int_x86_sse2_pavg_b, 1>; Index: llvm/lib/Target/X86/X86Subtarget.cpp diff -u llvm/lib/Target/X86/X86Subtarget.cpp:1.53 llvm/lib/Target/X86/X86Subtarget.cpp:1.54 --- llvm/lib/Target/X86/X86Subtarget.cpp:1.53 Fri Mar 23 18:46:48 2007 +++ llvm/lib/Target/X86/X86Subtarget.cpp Tue Apr 10 17:10:25 2007 @@ -113,6 +113,7 @@ if ((EDX >> 25) & 0x1) X86SSELevel = SSE1; if ((EDX >> 26) & 0x1) X86SSELevel = SSE2; if (ECX & 0x1) X86SSELevel = SSE3; + if ((ECX >> 9) & 0x1) X86SSELevel = SSSE3; if (memcmp(text.c, "GenuineIntel", 12) == 0) { X86::GetCpuIDAndInfo(0x80000001, &EAX, &EBX, &ECX, &EDX); Index: llvm/lib/Target/X86/X86Subtarget.h diff -u llvm/lib/Target/X86/X86Subtarget.h:1.28 llvm/lib/Target/X86/X86Subtarget.h:1.29 --- llvm/lib/Target/X86/X86Subtarget.h:1.28 Tue Jan 16 11:51:40 2007 +++ llvm/lib/Target/X86/X86Subtarget.h Tue Apr 10 17:10:25 2007 @@ -38,7 +38,7 @@ }; protected: enum X86SSEEnum { - NoMMXSSE, MMX, SSE1, SSE2, SSE3 + NoMMXSSE, MMX, SSE1, SSE2, SSE3, SSSE3 }; enum X863DNowEnum { @@ -51,7 +51,7 @@ /// PICStyle - Which PIC style to use PICStyle::Style PICStyle; - /// X86SSELevel - MMX, SSE1, SSE2, SSE3, or none supported. + /// X86SSELevel - MMX, SSE1, SSE2, SSE3, SSSE3, or none supported. X86SSEEnum X86SSELevel; /// X863DNowLevel - 3DNow or 3DNow Athlon, or none supported. @@ -110,6 +110,7 @@ bool hasSSE1() const { return X86SSELevel >= SSE1; } bool hasSSE2() const { return X86SSELevel >= SSE2; } bool hasSSE3() const { return X86SSELevel >= SSE3; } + bool hasSSSE3() const { return X86SSELevel >= SSSE3; } bool has3DNow() const { return X863DNowLevel >= ThreeDNow; } bool has3DNowA() const { return X863DNowLevel >= ThreeDNowA; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits