diff options
author | Alexandre Oliva <aoliva@redhat.com> | 2006-01-09 16:44:43 +0000 |
---|---|---|
committer | Alexandre Oliva <aoliva@gcc.gnu.org> | 2006-01-09 16:44:43 +0000 |
commit | c49c0c3963e9881c190058bf2219f05f1b3cf75b (patch) | |
tree | 92c8eeda37855cfe42c7584f42b3f622e30ffe08 /gcc | |
parent | f7cd797c5b0c050153fc338e62d23ee51268b915 (diff) | |
download | gcc-c49c0c3963e9881c190058bf2219f05f1b3cf75b.zip gcc-c49c0c3963e9881c190058bf2219f05f1b3cf75b.tar.gz gcc-c49c0c3963e9881c190058bf2219f05f1b3cf75b.tar.bz2 |
sse.md (*vec_extractv2di_1_sse2): New.
* config/i386/sse.md (*vec_extractv2di_1_sse2): New.
(*vec_extractv2di_1_sse): New.
From-SVN: r109501
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/config/i386/sse.md | 28 |
2 files changed, 33 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 941f2af..3d9f48e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2006-01-09 Alexandre Oliva <aoliva@redhat.com> + + * config/i386/sse.md (*vec_extractv2di_1_sse2): New. + (*vec_extractv2di_1_sse): New. + 2006-01-09 Ben Elliston <bje@au.ibm.com> * config/rs6000/rs6000.h (GO_IF_LEGITIMATE_ADDRESS): Typo fix. diff --git a/gcc/config/i386/sse.md b/gcc/config/i386/sse.md index b444491..bb5ed69 100644 --- a/gcc/config/i386/sse.md +++ b/gcc/config/i386/sse.md @@ -3464,6 +3464,34 @@ operands[1] = gen_rtx_REG (DImode, REGNO (operands[1])); }) +(define_insn "*vec_extractv2di_1_sse2" + [(set (match_operand:DI 0 "nonimmediate_operand" "=x,m,x") + (vec_select:DI + (match_operand:V2DI 1 "nonimmediate_operand" "0,x,o") + (parallel [(const_int 1)])))] + "TARGET_SSE2 && !(MEM_P (operands[0]) && MEM_P (operands[1]))" + "@ + psrldq\t{$4, %0|%0, 4} + movhps\t{%1, %0|%0, %1} + movq\t{%H1, %0|%0, %H1}" + [(set_attr "type" "sseishft,ssemov,ssemov") + (set_attr "mode" "TI,V4SF,TI")]) + +;; Not sure this is ever used, but it doesn't hurt to have it. -aoliva +(define_insn "*vec_extractv2di_1_sse" + [(set (match_operand:DI 0 "nonimmediate_operand" "=x,m,x") + (vec_select:DI + (match_operand:V2DI 1 "nonimmediate_operand" "x,x,o") + (parallel [(const_int 1)])))] + "!TARGET_SSE2 && TARGET_SSE + && !(MEM_P (operands[0]) && MEM_P (operands[1]))" + "@ + movhlps\t{%1, %0|%0, %1} + movhps\t{%1, %0|%0, %1} + movlps\t{%H1, %0|%0, %H1}" + [(set_attr "type" "ssemov") + (set_attr "mode" "V2SF,V4SF,V2SF")]) + (define_insn "*vec_dupv4si" [(set (match_operand:V4SI 0 "register_operand" "=Y,x") (vec_duplicate:V4SI |