Mercurial > hg > CbC > CbC_gcc
comparison gcc/config/i386/sse.md @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children | f6334be47118 |
comparison
equal
deleted
inserted
replaced
56:3c8a44c06a95 | 63:b7f97abdc517 |
---|---|
1 ;; GCC machine description for SSE instructions | 1 ;; GCC machine description for SSE instructions |
2 ;; Copyright (C) 2005, 2006, 2007, 2008, 2009 | 2 ;; Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010 |
3 ;; Free Software Foundation, Inc. | 3 ;; Free Software Foundation, Inc. |
4 ;; | 4 ;; |
5 ;; This file is part of GCC. | 5 ;; This file is part of GCC. |
6 ;; | 6 ;; |
7 ;; GCC is free software; you can redistribute it and/or modify | 7 ;; GCC is free software; you can redistribute it and/or modify |
192 case MODE_V8SF: | 192 case MODE_V8SF: |
193 case MODE_V4SF: | 193 case MODE_V4SF: |
194 return "vmovaps\t{%1, %0|%0, %1}"; | 194 return "vmovaps\t{%1, %0|%0, %1}"; |
195 case MODE_V4DF: | 195 case MODE_V4DF: |
196 case MODE_V2DF: | 196 case MODE_V2DF: |
197 return "vmovapd\t{%1, %0|%0, %1}"; | 197 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL) |
198 return "vmovaps\t{%1, %0|%0, %1}"; | |
199 else | |
200 return "vmovapd\t{%1, %0|%0, %1}"; | |
198 default: | 201 default: |
199 return "vmovdqa\t{%1, %0|%0, %1}"; | 202 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL) |
203 return "vmovaps\t{%1, %0|%0, %1}"; | |
204 else | |
205 return "vmovdqa\t{%1, %0|%0, %1}"; | |
200 } | 206 } |
201 default: | 207 default: |
202 gcc_unreachable (); | 208 gcc_unreachable (); |
203 } | 209 } |
204 } | 210 } |
234 switch (get_attr_mode (insn)) | 240 switch (get_attr_mode (insn)) |
235 { | 241 { |
236 case MODE_V4SF: | 242 case MODE_V4SF: |
237 return "movaps\t{%1, %0|%0, %1}"; | 243 return "movaps\t{%1, %0|%0, %1}"; |
238 case MODE_V2DF: | 244 case MODE_V2DF: |
239 return "movapd\t{%1, %0|%0, %1}"; | 245 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL) |
246 return "movaps\t{%1, %0|%0, %1}"; | |
247 else | |
248 return "movapd\t{%1, %0|%0, %1}"; | |
240 default: | 249 default: |
241 return "movdqa\t{%1, %0|%0, %1}"; | 250 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL) |
251 return "movaps\t{%1, %0|%0, %1}"; | |
252 else | |
253 return "movdqa\t{%1, %0|%0, %1}"; | |
242 } | 254 } |
243 default: | 255 default: |
244 gcc_unreachable (); | 256 gcc_unreachable (); |
245 } | 257 } |
246 } | 258 } |
1013 (smaxmin:AVXMODEF2P | 1025 (smaxmin:AVXMODEF2P |
1014 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x") | 1026 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x") |
1015 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))] | 1027 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))] |
1016 "AVX_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only | 1028 "AVX_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only |
1017 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 1029 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
1018 "v<maxminfprefix>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}" | 1030 "v<maxmin_float>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}" |
1019 [(set_attr "type" "sseadd") | 1031 [(set_attr "type" "sseadd") |
1020 (set_attr "prefix" "vex") | 1032 (set_attr "prefix" "vex") |
1021 (set_attr "mode" "<MODE>")]) | 1033 (set_attr "mode" "<MODE>")]) |
1022 | 1034 |
1023 (define_insn "*<code><mode>3_finite" | 1035 (define_insn "*<code><mode>3_finite" |
1025 (smaxmin:SSEMODEF2P | 1037 (smaxmin:SSEMODEF2P |
1026 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0") | 1038 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0") |
1027 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))] | 1039 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))] |
1028 "SSE_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only | 1040 "SSE_VEC_FLOAT_MODE_P (<MODE>mode) && flag_finite_math_only |
1029 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 1041 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
1030 "<maxminfprefix>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}" | 1042 "<maxmin_float>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}" |
1031 [(set_attr "type" "sseadd") | 1043 [(set_attr "type" "sseadd") |
1032 (set_attr "mode" "<MODE>")]) | 1044 (set_attr "mode" "<MODE>")]) |
1033 | 1045 |
1034 (define_insn "*avx_<code><mode>3" | 1046 (define_insn "*avx_<code><mode>3" |
1035 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x") | 1047 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x") |
1036 (smaxmin:AVXMODEF2P | 1048 (smaxmin:AVXMODEF2P |
1037 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x") | 1049 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x") |
1038 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))] | 1050 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))] |
1039 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)" | 1051 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)" |
1040 "v<maxminfprefix>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}" | 1052 "v<maxmin_float>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}" |
1041 [(set_attr "type" "sseadd") | 1053 [(set_attr "type" "sseadd") |
1042 (set_attr "prefix" "vex") | 1054 (set_attr "prefix" "vex") |
1043 (set_attr "mode" "<avxvecmode>")]) | 1055 (set_attr "mode" "<avxvecmode>")]) |
1044 | 1056 |
1045 (define_insn "*<code><mode>3" | 1057 (define_insn "*<code><mode>3" |
1046 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x") | 1058 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x") |
1047 (smaxmin:SSEMODEF2P | 1059 (smaxmin:SSEMODEF2P |
1048 (match_operand:SSEMODEF2P 1 "register_operand" "0") | 1060 (match_operand:SSEMODEF2P 1 "register_operand" "0") |
1049 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))] | 1061 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))] |
1050 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)" | 1062 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)" |
1051 "<maxminfprefix>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}" | 1063 "<maxmin_float>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}" |
1052 [(set_attr "type" "sseadd") | 1064 [(set_attr "type" "sseadd") |
1053 (set_attr "mode" "<MODE>")]) | 1065 (set_attr "mode" "<MODE>")]) |
1054 | 1066 |
1055 (define_insn "*avx_vm<code><mode>3" | 1067 (define_insn "*avx_vm<code><mode>3" |
1056 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x") | 1068 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x") |
1059 (match_operand:SSEMODEF2P 1 "register_operand" "x") | 1071 (match_operand:SSEMODEF2P 1 "register_operand" "x") |
1060 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")) | 1072 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")) |
1061 (match_dup 1) | 1073 (match_dup 1) |
1062 (const_int 1)))] | 1074 (const_int 1)))] |
1063 "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)" | 1075 "AVX128_VEC_FLOAT_MODE_P (<MODE>mode)" |
1064 "v<maxminfprefix>s<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}" | 1076 "v<maxmin_float>s<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}" |
1065 [(set_attr "type" "sse") | 1077 [(set_attr "type" "sse") |
1066 (set_attr "prefix" "vex") | 1078 (set_attr "prefix" "vex") |
1067 (set_attr "mode" "<ssescalarmode>")]) | 1079 (set_attr "mode" "<ssescalarmode>")]) |
1068 | 1080 |
1069 (define_insn "<sse>_vm<code><mode>3" | 1081 (define_insn "<sse>_vm<code><mode>3" |
1073 (match_operand:SSEMODEF2P 1 "register_operand" "0") | 1085 (match_operand:SSEMODEF2P 1 "register_operand" "0") |
1074 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")) | 1086 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")) |
1075 (match_dup 1) | 1087 (match_dup 1) |
1076 (const_int 1)))] | 1088 (const_int 1)))] |
1077 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)" | 1089 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)" |
1078 "<maxminfprefix>s<ssemodesuffixf2c>\t{%2, %0|%0, %2}" | 1090 "<maxmin_float>s<ssemodesuffixf2c>\t{%2, %0|%0, %2}" |
1079 [(set_attr "type" "sseadd") | 1091 [(set_attr "type" "sseadd") |
1080 (set_attr "mode" "<ssescalarmode>")]) | 1092 (set_attr "mode" "<ssescalarmode>")]) |
1081 | 1093 |
1082 ;; These versions of the min/max patterns implement exactly the operations | 1094 ;; These versions of the min/max patterns implement exactly the operations |
1083 ;; min = (op1 < op2 ? op1 : op2) | 1095 ;; min = (op1 < op2 ? op1 : op2) |
1481 "cmp%D3<ssemodesuffixf4>\t{%2, %0|%0, %2}" | 1493 "cmp%D3<ssemodesuffixf4>\t{%2, %0|%0, %2}" |
1482 [(set_attr "type" "ssecmp") | 1494 [(set_attr "type" "ssecmp") |
1483 (set_attr "length_immediate" "1") | 1495 (set_attr "length_immediate" "1") |
1484 (set_attr "mode" "<MODE>")]) | 1496 (set_attr "mode" "<MODE>")]) |
1485 | 1497 |
1498 (define_insn "*avx_vmmaskcmp<mode>3" | |
1499 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x") | |
1500 (vec_merge:SSEMODEF2P | |
1501 (match_operator:SSEMODEF2P 3 "sse_comparison_operator" | |
1502 [(match_operand:SSEMODEF2P 1 "register_operand" "x") | |
1503 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")]) | |
1504 (match_dup 1) | |
1505 (const_int 1)))] | |
1506 "AVX_VEC_FLOAT_MODE_P (<MODE>mode)" | |
1507 "vcmp%D3s<ssemodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}" | |
1508 [(set_attr "type" "ssecmp") | |
1509 (set_attr "prefix" "vex") | |
1510 (set_attr "mode" "<ssescalarmode>")]) | |
1511 | |
1486 (define_insn "<sse>_vmmaskcmp<mode>3" | 1512 (define_insn "<sse>_vmmaskcmp<mode>3" |
1487 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x") | 1513 [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x") |
1488 (vec_merge:SSEMODEF2P | 1514 (vec_merge:SSEMODEF2P |
1489 (match_operator:SSEMODEF2P 3 "sse_comparison_operator" | 1515 (match_operator:SSEMODEF2P 3 "sse_comparison_operator" |
1490 [(match_operand:SSEMODEF2P 1 "register_operand" "0") | 1516 [(match_operand:SSEMODEF2P 1 "register_operand" "0") |
1536 (const_string "1") | 1562 (const_string "1") |
1537 (const_string "0"))) | 1563 (const_string "0"))) |
1538 (set_attr "mode" "<MODE>")]) | 1564 (set_attr "mode" "<MODE>")]) |
1539 | 1565 |
1540 (define_expand "vcond<mode>" | 1566 (define_expand "vcond<mode>" |
1541 [(set (match_operand:SSEMODEF2P 0 "register_operand" "") | 1567 [(set (match_operand:AVXMODEF2P 0 "register_operand" "") |
1542 (if_then_else:SSEMODEF2P | 1568 (if_then_else:AVXMODEF2P |
1543 (match_operator 3 "" | 1569 (match_operator 3 "" |
1544 [(match_operand:SSEMODEF2P 4 "nonimmediate_operand" "") | 1570 [(match_operand:AVXMODEF2P 4 "nonimmediate_operand" "") |
1545 (match_operand:SSEMODEF2P 5 "nonimmediate_operand" "")]) | 1571 (match_operand:AVXMODEF2P 5 "nonimmediate_operand" "")]) |
1546 (match_operand:SSEMODEF2P 1 "general_operand" "") | 1572 (match_operand:AVXMODEF2P 1 "general_operand" "") |
1547 (match_operand:SSEMODEF2P 2 "general_operand" "")))] | 1573 (match_operand:AVXMODEF2P 2 "general_operand" "")))] |
1548 "SSE_VEC_FLOAT_MODE_P (<MODE>mode)" | 1574 "(SSE_VEC_FLOAT_MODE_P (<MODE>mode) |
1575 || AVX_VEC_FLOAT_MODE_P (<MODE>mode))" | |
1549 { | 1576 { |
1550 bool ok = ix86_expand_fp_vcond (operands); | 1577 bool ok = ix86_expand_fp_vcond (operands); |
1551 gcc_assert (ok); | 1578 gcc_assert (ok); |
1552 DONE; | 1579 DONE; |
1553 }) | 1580 }) |
1594 (any_logic:AVXMODEF2P | 1621 (any_logic:AVXMODEF2P |
1595 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x") | 1622 (match_operand:AVXMODEF2P 1 "nonimmediate_operand" "%x") |
1596 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))] | 1623 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "xm")))] |
1597 "AVX_VEC_FLOAT_MODE_P (<MODE>mode) | 1624 "AVX_VEC_FLOAT_MODE_P (<MODE>mode) |
1598 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 1625 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
1599 "v<logicprefix>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}" | 1626 { |
1627 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL) | |
1628 return "v<logic>ps\t{%2, %1, %0|%0, %1, %2}"; | |
1629 else | |
1630 return "v<logic>p<avxmodesuffixf2c>\t{%2, %1, %0|%0, %1, %2}"; | |
1631 } | |
1600 [(set_attr "type" "sselog") | 1632 [(set_attr "type" "sselog") |
1601 (set_attr "prefix" "vex") | 1633 (set_attr "prefix" "vex") |
1602 (set_attr "mode" "<avxvecmode>")]) | 1634 (set_attr "mode" "<avxvecmode>")]) |
1603 | 1635 |
1604 (define_expand "<code><mode>3" | 1636 (define_expand "<code><mode>3" |
1614 (any_logic:SSEMODEF2P | 1646 (any_logic:SSEMODEF2P |
1615 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0") | 1647 (match_operand:SSEMODEF2P 1 "nonimmediate_operand" "%0") |
1616 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))] | 1648 (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "xm")))] |
1617 "SSE_VEC_FLOAT_MODE_P (<MODE>mode) | 1649 "SSE_VEC_FLOAT_MODE_P (<MODE>mode) |
1618 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 1650 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
1619 "<logicprefix>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}" | 1651 { |
1652 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL) | |
1653 return "<logic>ps\t{%2, %0|%0, %2}"; | |
1654 else | |
1655 return "<logic>p<ssemodesuffixf2c>\t{%2, %0|%0, %2}"; | |
1656 } | |
1620 [(set_attr "type" "sselog") | 1657 [(set_attr "type" "sselog") |
1621 (set_attr "mode" "<MODE>")]) | 1658 (set_attr "mode" "<MODE>")]) |
1622 | 1659 |
1623 (define_expand "copysign<mode>3" | 1660 (define_expand "copysign<mode>3" |
1624 [(set (match_dup 4) | 1661 [(set (match_dup 4) |
1670 [(set (match_operand:MODEF 0 "register_operand" "=x") | 1707 [(set (match_operand:MODEF 0 "register_operand" "=x") |
1671 (any_logic:MODEF | 1708 (any_logic:MODEF |
1672 (match_operand:MODEF 1 "register_operand" "x") | 1709 (match_operand:MODEF 1 "register_operand" "x") |
1673 (match_operand:MODEF 2 "register_operand" "x")))] | 1710 (match_operand:MODEF 2 "register_operand" "x")))] |
1674 "AVX_FLOAT_MODE_P (<MODE>mode)" | 1711 "AVX_FLOAT_MODE_P (<MODE>mode)" |
1675 "v<logicprefix>p<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}" | 1712 { |
1713 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL) | |
1714 return "v<logic>ps\t{%2, %1, %0|%0, %1, %2}"; | |
1715 else | |
1716 return "v<logic>p<ssemodefsuffix>\t{%2, %1, %0|%0, %1, %2}"; | |
1717 } | |
1676 [(set_attr "type" "sselog") | 1718 [(set_attr "type" "sselog") |
1677 (set_attr "prefix" "vex") | 1719 (set_attr "prefix" "vex") |
1678 (set_attr "mode" "<ssevecmode>")]) | 1720 (set_attr "mode" "<ssevecmode>")]) |
1679 | 1721 |
1680 (define_insn "*<code><mode>3" | 1722 (define_insn "*<code><mode>3" |
1681 [(set (match_operand:MODEF 0 "register_operand" "=x") | 1723 [(set (match_operand:MODEF 0 "register_operand" "=x") |
1682 (any_logic:MODEF | 1724 (any_logic:MODEF |
1683 (match_operand:MODEF 1 "register_operand" "0") | 1725 (match_operand:MODEF 1 "register_operand" "0") |
1684 (match_operand:MODEF 2 "register_operand" "x")))] | 1726 (match_operand:MODEF 2 "register_operand" "x")))] |
1685 "SSE_FLOAT_MODE_P (<MODE>mode)" | 1727 "SSE_FLOAT_MODE_P (<MODE>mode)" |
1686 "<logicprefix>p<ssemodefsuffix>\t{%2, %0|%0, %2}" | 1728 { |
1729 if (TARGET_SSE_PACKED_SINGLE_INSN_OPTIMAL) | |
1730 return "<logic>ps\t{%2, %0|%0, %2}"; | |
1731 else | |
1732 return "<logic>p<ssemodefsuffix>\t{%2, %0|%0, %2}"; | |
1733 } | |
1687 [(set_attr "type" "sselog") | 1734 [(set_attr "type" "sselog") |
1688 (set_attr "mode" "<ssevecmode>")]) | 1735 (set_attr "mode" "<ssevecmode>")]) |
1689 | 1736 |
1690 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 1737 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
1691 ;; | 1738 ;; |
6028 [(set (match_operand:SSEMODE124 0 "register_operand" "=x") | 6075 [(set (match_operand:SSEMODE124 0 "register_operand" "=x") |
6029 (maxmin:SSEMODE124 | 6076 (maxmin:SSEMODE124 |
6030 (match_operand:SSEMODE124 1 "nonimmediate_operand" "%x") | 6077 (match_operand:SSEMODE124 1 "nonimmediate_operand" "%x") |
6031 (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")))] | 6078 (match_operand:SSEMODE124 2 "nonimmediate_operand" "xm")))] |
6032 "TARGET_AVX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 6079 "TARGET_AVX && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
6033 "vp<maxminiprefix><ssevecsize>\t{%2, %1, %0|%0, %1, %2}" | 6080 "vp<maxmin_int><ssevecsize>\t{%2, %1, %0|%0, %1, %2}" |
6034 [(set_attr "type" "sseiadd") | 6081 [(set_attr "type" "sseiadd") |
6035 (set (attr "prefix_extra") | 6082 (set (attr "prefix_extra") |
6036 (if_then_else | 6083 (if_then_else |
6037 (ne (symbol_ref "<MODE>mode != ((<CODE> == SMAX || <CODE> == SMIN) ? V8HImode : V16QImode)") | 6084 (ne (symbol_ref "<MODE>mode != ((<CODE> == SMAX || <CODE> == SMIN) ? V8HImode : V16QImode)") |
6038 (const_int 0)) | 6085 (const_int 0)) |
6053 [(set (match_operand:V16QI 0 "register_operand" "=x") | 6100 [(set (match_operand:V16QI 0 "register_operand" "=x") |
6054 (umaxmin:V16QI | 6101 (umaxmin:V16QI |
6055 (match_operand:V16QI 1 "nonimmediate_operand" "%0") | 6102 (match_operand:V16QI 1 "nonimmediate_operand" "%0") |
6056 (match_operand:V16QI 2 "nonimmediate_operand" "xm")))] | 6103 (match_operand:V16QI 2 "nonimmediate_operand" "xm")))] |
6057 "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, V16QImode, operands)" | 6104 "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, V16QImode, operands)" |
6058 "p<maxminiprefix>b\t{%2, %0|%0, %2}" | 6105 "p<maxmin_int>b\t{%2, %0|%0, %2}" |
6059 [(set_attr "type" "sseiadd") | 6106 [(set_attr "type" "sseiadd") |
6060 (set_attr "prefix_data16" "1") | 6107 (set_attr "prefix_data16" "1") |
6061 (set_attr "mode" "TI")]) | 6108 (set_attr "mode" "TI")]) |
6062 | 6109 |
6063 (define_expand "<code>v8hi3" | 6110 (define_expand "<code>v8hi3" |
6072 [(set (match_operand:V8HI 0 "register_operand" "=x") | 6119 [(set (match_operand:V8HI 0 "register_operand" "=x") |
6073 (smaxmin:V8HI | 6120 (smaxmin:V8HI |
6074 (match_operand:V8HI 1 "nonimmediate_operand" "%0") | 6121 (match_operand:V8HI 1 "nonimmediate_operand" "%0") |
6075 (match_operand:V8HI 2 "nonimmediate_operand" "xm")))] | 6122 (match_operand:V8HI 2 "nonimmediate_operand" "xm")))] |
6076 "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, V8HImode, operands)" | 6123 "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, V8HImode, operands)" |
6077 "p<maxminiprefix>w\t{%2, %0|%0, %2}" | 6124 "p<maxmin_int>w\t{%2, %0|%0, %2}" |
6078 [(set_attr "type" "sseiadd") | 6125 [(set_attr "type" "sseiadd") |
6079 (set_attr "prefix_data16" "1") | 6126 (set_attr "prefix_data16" "1") |
6080 (set_attr "mode" "TI")]) | 6127 (set_attr "mode" "TI")]) |
6081 | 6128 |
6082 (define_expand "umaxv8hi3" | 6129 (define_expand "umaxv8hi3" |
6127 [(set (match_operand:SSEMODE14 0 "register_operand" "=x") | 6174 [(set (match_operand:SSEMODE14 0 "register_operand" "=x") |
6128 (smaxmin:SSEMODE14 | 6175 (smaxmin:SSEMODE14 |
6129 (match_operand:SSEMODE14 1 "nonimmediate_operand" "%0") | 6176 (match_operand:SSEMODE14 1 "nonimmediate_operand" "%0") |
6130 (match_operand:SSEMODE14 2 "nonimmediate_operand" "xm")))] | 6177 (match_operand:SSEMODE14 2 "nonimmediate_operand" "xm")))] |
6131 "TARGET_SSE4_1 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 6178 "TARGET_SSE4_1 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
6132 "p<maxminiprefix><ssevecsize>\t{%2, %0|%0, %2}" | 6179 "p<maxmin_int><ssevecsize>\t{%2, %0|%0, %2}" |
6133 [(set_attr "type" "sseiadd") | 6180 [(set_attr "type" "sseiadd") |
6134 (set_attr "prefix_extra" "1") | 6181 (set_attr "prefix_extra" "1") |
6135 (set_attr "mode" "TI")]) | 6182 (set_attr "mode" "TI")]) |
6183 | |
6184 (define_expand "smaxv2di3" | |
6185 [(set (match_operand:V2DI 0 "register_operand" "") | |
6186 (smax:V2DI (match_operand:V2DI 1 "register_operand" "") | |
6187 (match_operand:V2DI 2 "register_operand" "")))] | |
6188 "TARGET_SSE4_2" | |
6189 { | |
6190 rtx xops[6]; | |
6191 bool ok; | |
6192 | |
6193 xops[0] = operands[0]; | |
6194 xops[1] = operands[1]; | |
6195 xops[2] = operands[2]; | |
6196 xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]); | |
6197 xops[4] = operands[1]; | |
6198 xops[5] = operands[2]; | |
6199 ok = ix86_expand_int_vcond (xops); | |
6200 gcc_assert (ok); | |
6201 DONE; | |
6202 }) | |
6136 | 6203 |
6137 (define_expand "umaxv4si3" | 6204 (define_expand "umaxv4si3" |
6138 [(set (match_operand:V4SI 0 "register_operand" "") | 6205 [(set (match_operand:V4SI 0 "register_operand" "") |
6139 (umax:V4SI (match_operand:V4SI 1 "register_operand" "") | 6206 (umax:V4SI (match_operand:V4SI 1 "register_operand" "") |
6140 (match_operand:V4SI 2 "register_operand" "")))] | 6207 (match_operand:V4SI 2 "register_operand" "")))] |
6163 [(set (match_operand:SSEMODE24 0 "register_operand" "=x") | 6230 [(set (match_operand:SSEMODE24 0 "register_operand" "=x") |
6164 (umaxmin:SSEMODE24 | 6231 (umaxmin:SSEMODE24 |
6165 (match_operand:SSEMODE24 1 "nonimmediate_operand" "%0") | 6232 (match_operand:SSEMODE24 1 "nonimmediate_operand" "%0") |
6166 (match_operand:SSEMODE24 2 "nonimmediate_operand" "xm")))] | 6233 (match_operand:SSEMODE24 2 "nonimmediate_operand" "xm")))] |
6167 "TARGET_SSE4_1 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 6234 "TARGET_SSE4_1 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
6168 "p<maxminiprefix><ssevecsize>\t{%2, %0|%0, %2}" | 6235 "p<maxmin_int><ssevecsize>\t{%2, %0|%0, %2}" |
6169 [(set_attr "type" "sseiadd") | 6236 [(set_attr "type" "sseiadd") |
6170 (set_attr "prefix_extra" "1") | 6237 (set_attr "prefix_extra" "1") |
6171 (set_attr "mode" "TI")]) | 6238 (set_attr "mode" "TI")]) |
6239 | |
6240 (define_expand "umaxv2di3" | |
6241 [(set (match_operand:V2DI 0 "register_operand" "") | |
6242 (umax:V2DI (match_operand:V2DI 1 "register_operand" "") | |
6243 (match_operand:V2DI 2 "register_operand" "")))] | |
6244 "TARGET_SSE4_2" | |
6245 { | |
6246 rtx xops[6]; | |
6247 bool ok; | |
6248 | |
6249 xops[0] = operands[0]; | |
6250 xops[1] = operands[1]; | |
6251 xops[2] = operands[2]; | |
6252 xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]); | |
6253 xops[4] = operands[1]; | |
6254 xops[5] = operands[2]; | |
6255 ok = ix86_expand_int_vcond (xops); | |
6256 gcc_assert (ok); | |
6257 DONE; | |
6258 }) | |
6172 | 6259 |
6173 (define_expand "smin<mode>3" | 6260 (define_expand "smin<mode>3" |
6174 [(set (match_operand:SSEMODE14 0 "register_operand" "") | 6261 [(set (match_operand:SSEMODE14 0 "register_operand" "") |
6175 (smin:SSEMODE14 (match_operand:SSEMODE14 1 "register_operand" "") | 6262 (smin:SSEMODE14 (match_operand:SSEMODE14 1 "register_operand" "") |
6176 (match_operand:SSEMODE14 2 "register_operand" "")))] | 6263 (match_operand:SSEMODE14 2 "register_operand" "")))] |
6193 gcc_assert (ok); | 6280 gcc_assert (ok); |
6194 DONE; | 6281 DONE; |
6195 } | 6282 } |
6196 }) | 6283 }) |
6197 | 6284 |
6285 (define_expand "sminv2di3" | |
6286 [(set (match_operand:V2DI 0 "register_operand" "") | |
6287 (smin:V2DI (match_operand:V2DI 1 "register_operand" "") | |
6288 (match_operand:V2DI 2 "register_operand" "")))] | |
6289 "TARGET_SSE4_2" | |
6290 { | |
6291 rtx xops[6]; | |
6292 bool ok; | |
6293 | |
6294 xops[0] = operands[0]; | |
6295 xops[1] = operands[2]; | |
6296 xops[2] = operands[1]; | |
6297 xops[3] = gen_rtx_GT (VOIDmode, operands[1], operands[2]); | |
6298 xops[4] = operands[1]; | |
6299 xops[5] = operands[2]; | |
6300 ok = ix86_expand_int_vcond (xops); | |
6301 gcc_assert (ok); | |
6302 DONE; | |
6303 }) | |
6304 | |
6198 (define_expand "umin<mode>3" | 6305 (define_expand "umin<mode>3" |
6199 [(set (match_operand:SSEMODE24 0 "register_operand" "") | 6306 [(set (match_operand:SSEMODE24 0 "register_operand" "") |
6200 (umin:SSEMODE24 (match_operand:SSEMODE24 1 "register_operand" "") | 6307 (umin:SSEMODE24 (match_operand:SSEMODE24 1 "register_operand" "") |
6201 (match_operand:SSEMODE24 2 "register_operand" "")))] | 6308 (match_operand:SSEMODE24 2 "register_operand" "")))] |
6202 "TARGET_SSE2" | 6309 "TARGET_SSE2" |
6216 xops[5] = operands[2]; | 6323 xops[5] = operands[2]; |
6217 ok = ix86_expand_int_vcond (xops); | 6324 ok = ix86_expand_int_vcond (xops); |
6218 gcc_assert (ok); | 6325 gcc_assert (ok); |
6219 DONE; | 6326 DONE; |
6220 } | 6327 } |
6328 }) | |
6329 | |
6330 (define_expand "uminv2di3" | |
6331 [(set (match_operand:V2DI 0 "register_operand" "") | |
6332 (umin:V2DI (match_operand:V2DI 1 "register_operand" "") | |
6333 (match_operand:V2DI 2 "register_operand" "")))] | |
6334 "TARGET_SSE4_2" | |
6335 { | |
6336 rtx xops[6]; | |
6337 bool ok; | |
6338 | |
6339 xops[0] = operands[0]; | |
6340 xops[1] = operands[2]; | |
6341 xops[2] = operands[1]; | |
6342 xops[3] = gen_rtx_GTU (VOIDmode, operands[1], operands[2]); | |
6343 xops[4] = operands[1]; | |
6344 xops[5] = operands[2]; | |
6345 ok = ix86_expand_int_vcond (xops); | |
6346 gcc_assert (ok); | |
6347 DONE; | |
6221 }) | 6348 }) |
6222 | 6349 |
6223 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 6350 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
6224 ;; | 6351 ;; |
6225 ;; Parallel integral comparisons | 6352 ;; Parallel integral comparisons |
6435 (any_logic:AVX256MODEI | 6562 (any_logic:AVX256MODEI |
6436 (match_operand:AVX256MODEI 1 "nonimmediate_operand" "%x") | 6563 (match_operand:AVX256MODEI 1 "nonimmediate_operand" "%x") |
6437 (match_operand:AVX256MODEI 2 "nonimmediate_operand" "xm")))] | 6564 (match_operand:AVX256MODEI 2 "nonimmediate_operand" "xm")))] |
6438 "TARGET_AVX | 6565 "TARGET_AVX |
6439 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 6566 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
6440 "v<logicprefix>ps\t{%2, %1, %0|%0, %1, %2}" | 6567 "v<logic>ps\t{%2, %1, %0|%0, %1, %2}" |
6441 [(set_attr "type" "sselog") | 6568 [(set_attr "type" "sselog") |
6442 (set_attr "prefix" "vex") | 6569 (set_attr "prefix" "vex") |
6443 (set_attr "mode" "<avxvecpsmode>")]) | 6570 (set_attr "mode" "<avxvecpsmode>")]) |
6444 | 6571 |
6445 (define_insn "*sse_<code><mode>3" | 6572 (define_insn "*sse_<code><mode>3" |
6447 (any_logic:SSEMODEI | 6574 (any_logic:SSEMODEI |
6448 (match_operand:SSEMODEI 1 "nonimmediate_operand" "%0") | 6575 (match_operand:SSEMODEI 1 "nonimmediate_operand" "%0") |
6449 (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))] | 6576 (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))] |
6450 "(TARGET_SSE && !TARGET_SSE2) | 6577 "(TARGET_SSE && !TARGET_SSE2) |
6451 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 6578 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
6452 "<logicprefix>ps\t{%2, %0|%0, %2}" | 6579 "<logic>ps\t{%2, %0|%0, %2}" |
6453 [(set_attr "type" "sselog") | 6580 [(set_attr "type" "sselog") |
6454 (set_attr "mode" "V4SF")]) | 6581 (set_attr "mode" "V4SF")]) |
6455 | 6582 |
6456 (define_insn "*avx_<code><mode>3" | 6583 (define_insn "*avx_<code><mode>3" |
6457 [(set (match_operand:SSEMODEI 0 "register_operand" "=x") | 6584 [(set (match_operand:SSEMODEI 0 "register_operand" "=x") |
6458 (any_logic:SSEMODEI | 6585 (any_logic:SSEMODEI |
6459 (match_operand:SSEMODEI 1 "nonimmediate_operand" "%x") | 6586 (match_operand:SSEMODEI 1 "nonimmediate_operand" "%x") |
6460 (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))] | 6587 (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))] |
6461 "TARGET_AVX | 6588 "TARGET_AVX |
6462 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 6589 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
6463 "vp<logicprefix>\t{%2, %1, %0|%0, %1, %2}" | 6590 "vp<logic>\t{%2, %1, %0|%0, %1, %2}" |
6464 [(set_attr "type" "sselog") | 6591 [(set_attr "type" "sselog") |
6465 (set_attr "prefix" "vex") | 6592 (set_attr "prefix" "vex") |
6466 (set_attr "mode" "TI")]) | 6593 (set_attr "mode" "TI")]) |
6467 | 6594 |
6468 (define_insn "*sse2_<code><mode>3" | 6595 (define_insn "*sse2_<code><mode>3" |
6469 [(set (match_operand:SSEMODEI 0 "register_operand" "=x") | 6596 [(set (match_operand:SSEMODEI 0 "register_operand" "=x") |
6470 (any_logic:SSEMODEI | 6597 (any_logic:SSEMODEI |
6471 (match_operand:SSEMODEI 1 "nonimmediate_operand" "%0") | 6598 (match_operand:SSEMODEI 1 "nonimmediate_operand" "%0") |
6472 (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))] | 6599 (match_operand:SSEMODEI 2 "nonimmediate_operand" "xm")))] |
6473 "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" | 6600 "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, <MODE>mode, operands)" |
6474 "p<logicprefix>\t{%2, %0|%0, %2}" | 6601 "p<logic>\t{%2, %0|%0, %2}" |
6475 [(set_attr "type" "sselog") | 6602 [(set_attr "type" "sselog") |
6476 (set_attr "prefix_data16" "1") | 6603 (set_attr "prefix_data16" "1") |
6477 (set_attr "mode" "TI")]) | 6604 (set_attr "mode" "TI")]) |
6478 | 6605 |
6479 (define_expand "<code>tf3" | 6606 (define_expand "<code>tf3" |
6488 [(set (match_operand:TF 0 "register_operand" "=x") | 6615 [(set (match_operand:TF 0 "register_operand" "=x") |
6489 (any_logic:TF | 6616 (any_logic:TF |
6490 (match_operand:TF 1 "nonimmediate_operand" "%0") | 6617 (match_operand:TF 1 "nonimmediate_operand" "%0") |
6491 (match_operand:TF 2 "nonimmediate_operand" "xm")))] | 6618 (match_operand:TF 2 "nonimmediate_operand" "xm")))] |
6492 "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, TFmode, operands)" | 6619 "TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, TFmode, operands)" |
6493 "p<logicprefix>\t{%2, %0|%0, %2}" | 6620 "p<logic>\t{%2, %0|%0, %2}" |
6494 [(set_attr "type" "sselog") | 6621 [(set_attr "type" "sselog") |
6495 (set_attr "prefix_data16" "1") | 6622 (set_attr "prefix_data16" "1") |
6496 (set_attr "mode" "TI")]) | 6623 (set_attr "mode" "TI")]) |
6497 | 6624 |
6498 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 6625 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
10340 (const_int 3)])))) | 10467 (const_int 3)])))) |
10341 (match_dup 0)))] | 10468 (match_dup 0)))] |
10342 { | 10469 { |
10343 operands[3] = CONST0_RTX (V2DImode); | 10470 operands[3] = CONST0_RTX (V2DImode); |
10344 } | 10471 } |
10345 [(set_attr "type" "ssemuladd") | 10472 [(set_attr "type" "ssemul") |
10346 (set_attr "mode" "TI")]) | 10473 (set_attr "mode" "TI")]) |
10347 | 10474 |
10348 (define_insn "xop_pmacsdqh" | 10475 (define_insn "xop_pmacsdqh" |
10349 [(set (match_operand:V2DI 0 "register_operand" "=x") | 10476 [(set (match_operand:V2DI 0 "register_operand" "=x") |
10350 (plus:V2DI | 10477 (plus:V2DI |
10402 (const_int 2)])))) | 10529 (const_int 2)])))) |
10403 (match_dup 0)))] | 10530 (match_dup 0)))] |
10404 { | 10531 { |
10405 operands[3] = CONST0_RTX (V2DImode); | 10532 operands[3] = CONST0_RTX (V2DImode); |
10406 } | 10533 } |
10407 [(set_attr "type" "ssemuladd") | 10534 [(set_attr "type" "ssemul") |
10408 (set_attr "mode" "TI")]) | 10535 (set_attr "mode" "TI")]) |
10409 | 10536 |
10410 ;; XOP parallel integer multiply/add instructions for the intrinisics | 10537 ;; XOP parallel integer multiply/add instructions for the intrinisics |
10411 (define_insn "xop_pmacsswd" | 10538 (define_insn "xop_pmacsswd" |
10412 [(set (match_operand:V4SI 0 "register_operand" "=x") | 10539 [(set (match_operand:V4SI 0 "register_operand" "=x") |
11457 (set_attr "prefix_data16" "0") | 11584 (set_attr "prefix_data16" "0") |
11458 (set_attr "prefix_extra" "2") | 11585 (set_attr "prefix_extra" "2") |
11459 (set_attr "length_immediate" "1") | 11586 (set_attr "length_immediate" "1") |
11460 (set_attr "mode" "TI")]) | 11587 (set_attr "mode" "TI")]) |
11461 | 11588 |
11589 (define_insn "xop_vpermil2<mode>3" | |
11590 [(set (match_operand:AVXMODEF2P 0 "register_operand" "=x") | |
11591 (unspec:AVXMODEF2P | |
11592 [(match_operand:AVXMODEF2P 1 "register_operand" "x") | |
11593 (match_operand:AVXMODEF2P 2 "nonimmediate_operand" "%x") | |
11594 (match_operand:<avxpermvecmode> 3 "nonimmediate_operand" "xm") | |
11595 (match_operand:SI 4 "const_0_to_3_operand" "n")] | |
11596 UNSPEC_VPERMIL2))] | |
11597 "TARGET_XOP" | |
11598 "vpermil2p<avxmodesuffixf2c>\t{%4, %3, %2, %1, %0|%0, %1, %2, %3, %4}" | |
11599 [(set_attr "type" "sse4arg") | |
11600 (set_attr "length_immediate" "1") | |
11601 (set_attr "mode" "<MODE>")]) | |
11602 | |
11462 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; | 11603 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; |
11463 (define_insn "*avx_aesenc" | 11604 (define_insn "*avx_aesenc" |
11464 [(set (match_operand:V2DI 0 "register_operand" "=x") | 11605 [(set (match_operand:V2DI 0 "register_operand" "=x") |
11465 (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x") | 11606 (unspec:V2DI [(match_operand:V2DI 1 "register_operand" "x") |
11466 (match_operand:V2DI 2 "nonimmediate_operand" "xm")] | 11607 (match_operand:V2DI 2 "nonimmediate_operand" "xm")] |
11853 (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "") | 11994 (match_operand:AVX256MODE2P 2 "nonimmediate_operand" "") |
11854 (match_operand:SI 3 "const_0_to_255_operand" "")] | 11995 (match_operand:SI 3 "const_0_to_255_operand" "")] |
11855 UNSPEC_VPERMIL2F128))] | 11996 UNSPEC_VPERMIL2F128))] |
11856 "TARGET_AVX" | 11997 "TARGET_AVX" |
11857 { | 11998 { |
11858 int mask = INTVAL (operands[2]); | 11999 int mask = INTVAL (operands[3]); |
11859 if ((mask & 0x88) == 0) | 12000 if ((mask & 0x88) == 0) |
11860 { | 12001 { |
11861 rtx perm[<ssescalarnum>], t1, t2; | 12002 rtx perm[<ssescalarnum>], t1, t2; |
11862 int i, base, nelt = <ssescalarnum>, nelt2 = nelt / 2; | 12003 int i, base, nelt = <ssescalarnum>, nelt2 = nelt / 2; |
11863 | 12004 |