Import pre-release gcc-5.0 to new vendor branch
[dragonfly.git] / contrib / gcc-5.0 / gcc / config / i386 / subst.md
1 ;; GCC machine description for AVX512F instructions
2 ;; Copyright (C) 2013-2015 Free Software Foundation, Inc.
3 ;;
4 ;; This file is part of GCC.
5 ;;
6 ;; GCC is free software; you can redistribute it and/or modify
7 ;; it under the terms of the GNU General Public License as published by
8 ;; the Free Software Foundation; either version 3, or (at your option)
9 ;; any later version.
10 ;;
11 ;; GCC is distributed in the hope that it will be useful,
12 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
13 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 ;; GNU General Public License for more details.
15 ;;
16 ;; You should have received a copy of the GNU General Public License
17 ;; along with GCC; see the file COPYING3.  If not see
18 ;; <http://www.gnu.org/licenses/>.
19
20 ;; Some iterators for extending subst as much as possible
21 ;; All vectors (Use it for destination)
22 (define_mode_iterator SUBST_V
23   [V64QI V32QI V16QI
24    V32HI V16HI V8HI
25    V16SI V8SI  V4SI
26    V8DI  V4DI  V2DI
27    V16SF V8SF  V4SF
28    V8DF  V4DF  V2DF])
29
30 (define_mode_iterator SUBST_S
31   [QI HI SI DI])
32
33 (define_mode_iterator SUBST_A
34   [V64QI V32QI V16QI
35    V32HI V16HI V8HI
36    V16SI V8SI  V4SI
37    V8DI  V4DI  V2DI
38    V16SF V8SF  V4SF
39    V8DF  V4DF  V2DF
40    QI HI SI DI SF DF
41    CCFP CCFPU])
42
43 (define_subst_attr "mask_name" "mask" "" "_mask")
44 (define_subst_attr "mask_applied" "mask" "false" "true")
45 (define_subst_attr "mask_operand2" "mask" "" "%{%3%}%N2")
46 (define_subst_attr "mask_operand3" "mask" "" "%{%4%}%N3")
47 (define_subst_attr "mask_operand3_1" "mask" "" "%%{%%4%%}%%N3") ;; for sprintf
48 (define_subst_attr "mask_operand4" "mask" "" "%{%5%}%N4")
49 (define_subst_attr "mask_operand6" "mask" "" "%{%7%}%N6")
50 (define_subst_attr "mask_operand7" "mask" "" "%{%8%}%N7")
51 (define_subst_attr "mask_operand10" "mask" "" "%{%11%}%N10")
52 (define_subst_attr "mask_operand11" "mask" "" "%{%12%}%N11")
53 (define_subst_attr "mask_operand18" "mask" "" "%{%19%}%N18")
54 (define_subst_attr "mask_operand19" "mask" "" "%{%20%}%N19")
55 (define_subst_attr "mask_codefor" "mask" "*" "")
56 (define_subst_attr "mask_operand_arg34" "mask" "" ", operands[3], operands[4]")
57 (define_subst_attr "mask_mode512bit_condition" "mask" "1" "(<MODE_SIZE> == 64 || TARGET_AVX512VL)")
58 (define_subst_attr "mask_avx512vl_condition" "mask" "1" "TARGET_AVX512VL")
59 (define_subst_attr "mask_avx512bw_condition" "mask" "1" "TARGET_AVX512BW")
60 (define_subst_attr "mask_avx512dq_condition" "mask" "1" "TARGET_AVX512DQ")
61 (define_subst_attr "store_mask_constraint" "mask" "vm" "v")
62 (define_subst_attr "store_mask_predicate" "mask" "nonimmediate_operand" "register_operand")
63 (define_subst_attr "mask_prefix" "mask" "vex" "evex")
64 (define_subst_attr "mask_prefix2" "mask" "maybe_vex" "evex")
65 (define_subst_attr "mask_prefix3" "mask" "orig,vex" "evex")
66 (define_subst_attr "mask_prefix4" "mask" "orig,orig,vex" "evex")
67 (define_subst_attr "mask_expand_op3" "mask" "3" "5")
68
69 (define_subst "mask"
70   [(set (match_operand:SUBST_V 0)
71         (match_operand:SUBST_V 1))]
72   "TARGET_AVX512F"
73   [(set (match_dup 0)
74         (vec_merge:SUBST_V
75           (match_dup 1)
76           (match_operand:SUBST_V 2 "vector_move_operand" "0C")
77           (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")))])
78
79 (define_subst_attr "mask_scalar_merge_name" "mask_scalar_merge" "" "_mask")
80 (define_subst_attr "mask_scalar_merge_operand3" "mask_scalar_merge" "" "%{%3%}")
81 (define_subst_attr "mask_scalar_merge_operand4" "mask_scalar_merge" "" "%{%4%}")
82
83 (define_subst "mask_scalar_merge"
84   [(set (match_operand:SUBST_S 0)
85         (match_operand:SUBST_S 1))]
86   "TARGET_AVX512F"
87   [(set (match_dup 0)
88         (and:SUBST_S
89           (match_dup 1)
90           (match_operand:SUBST_S 3 "register_operand" "Yk")))])
91
92 (define_subst_attr "sd_maskz_name" "sd" "" "_maskz_1")
93 (define_subst_attr "sd_mask_op4" "sd" "" "%{%5%}%N4")
94 (define_subst_attr "sd_mask_op5" "sd" "" "%{%6%}%N5")
95 (define_subst_attr "sd_mask_codefor" "sd" "*" "")
96 (define_subst_attr "sd_mask_mode512bit_condition" "sd" "1" "(<MODE_SIZE> == 64 || TARGET_AVX512VL)")
97
98 (define_subst "sd"
99  [(set (match_operand:SUBST_V 0)
100        (match_operand:SUBST_V 1))]
101  ""
102  [(set (match_dup 0)
103        (vec_merge:SUBST_V
104          (match_dup 1)
105          (match_operand:SUBST_V 2 "const0_operand" "C")
106          (match_operand:<avx512fmaskmode> 3 "register_operand" "Yk")))
107 ])
108
109 (define_subst_attr "round_name" "round" "" "_round")
110 (define_subst_attr "round_mask_operand2" "mask" "%R2" "%R4")
111 (define_subst_attr "round_mask_operand3" "mask" "%R3" "%R5")
112 (define_subst_attr "round_mask_operand4" "mask" "%R4" "%R6")
113 (define_subst_attr "round_sd_mask_operand4" "sd" "%R4" "%R6")
114 (define_subst_attr "round_op2" "round" "" "%R2")
115 (define_subst_attr "round_op3" "round" "" "%R3")
116 (define_subst_attr "round_op4" "round" "" "%R4")
117 (define_subst_attr "round_op5" "round" "" "%R5")
118 (define_subst_attr "round_op6" "round" "" "%R6")
119 (define_subst_attr "round_mask_op2" "round" "" "<round_mask_operand2>")
120 (define_subst_attr "round_mask_op3" "round" "" "<round_mask_operand3>")
121 (define_subst_attr "round_mask_op4" "round" "" "<round_mask_operand4>")
122 (define_subst_attr "round_sd_mask_op4" "round" "" "<round_sd_mask_operand4>")
123 (define_subst_attr "round_constraint" "round" "vm" "v")
124 (define_subst_attr "round_constraint2" "round" "m" "v")
125 (define_subst_attr "round_constraint3" "round" "rm" "r")
126 (define_subst_attr "round_nimm_predicate" "round" "nonimmediate_operand" "register_operand")
127 (define_subst_attr "round_prefix" "round" "vex" "evex")
128 (define_subst_attr "round_mode512bit_condition" "round" "1" "(<MODE>mode == V16SFmode
129                                                               || <MODE>mode == V8DFmode
130                                                               || <MODE>mode == V8DImode
131                                                               || <MODE>mode == V16SImode)")
132 (define_subst_attr "round_modev8sf_condition" "round" "1" "(<MODE>mode == V8SFmode)")
133 (define_subst_attr "round_modev4sf_condition" "round" "1" "(<MODE>mode == V4SFmode)")
134 (define_subst_attr "round_codefor" "round" "*" "")
135 (define_subst_attr "round_opnum" "round" "5" "6")
136
137 (define_subst "round"
138   [(set (match_operand:SUBST_A 0)
139         (match_operand:SUBST_A 1))]
140   "TARGET_AVX512F"
141   [(parallel[
142      (set (match_dup 0)
143           (match_dup 1))
144      (unspec [(match_operand:SI 2 "const_4_or_8_to_11_operand")] UNSPEC_EMBEDDED_ROUNDING)])])
145
146 (define_subst_attr "round_saeonly_name" "round_saeonly" "" "_round")
147 (define_subst_attr "round_saeonly_mask_operand2" "mask" "%r2" "%r4")
148 (define_subst_attr "round_saeonly_mask_operand3" "mask" "%r3" "%r5")
149 (define_subst_attr "round_saeonly_mask_operand4" "mask" "%r4" "%r6")
150 (define_subst_attr "round_saeonly_mask_scalar_merge_operand4" "mask_scalar_merge" "%r4" "%r5")
151 (define_subst_attr "round_saeonly_sd_mask_operand5" "sd" "%r5" "%r7")
152 (define_subst_attr "round_saeonly_op2" "round_saeonly" "" "%r2")
153 (define_subst_attr "round_saeonly_op3" "round_saeonly" "" "%r3")
154 (define_subst_attr "round_saeonly_op4" "round_saeonly" "" "%r4")
155 (define_subst_attr "round_saeonly_op5" "round_saeonly" "" "%r5")
156 (define_subst_attr "round_saeonly_op6" "round_saeonly" "" "%r6")
157 (define_subst_attr "round_saeonly_prefix" "round_saeonly" "vex" "evex")
158 (define_subst_attr "round_saeonly_mask_op2" "round_saeonly" "" "<round_saeonly_mask_operand2>")
159 (define_subst_attr "round_saeonly_mask_op3" "round_saeonly" "" "<round_saeonly_mask_operand3>")
160 (define_subst_attr "round_saeonly_mask_op4" "round_saeonly" "" "<round_saeonly_mask_operand4>")
161 (define_subst_attr "round_saeonly_mask_scalar_merge_op4" "round_saeonly" "" "<round_saeonly_mask_scalar_merge_operand4>")
162 (define_subst_attr "round_saeonly_sd_mask_op5" "round_saeonly" "" "<round_saeonly_sd_mask_operand5>")
163 (define_subst_attr "round_saeonly_constraint" "round_saeonly" "vm" "v")
164 (define_subst_attr "round_saeonly_constraint2" "round_saeonly" "m" "v")
165 (define_subst_attr "round_saeonly_nimm_predicate" "round_saeonly" "nonimmediate_operand" "register_operand")
166 (define_subst_attr "round_saeonly_mode512bit_condition" "round_saeonly" "1" "(<MODE>mode == V16SFmode
167                                                                               || <MODE>mode == V8DFmode
168                                                                               || <MODE>mode == V8DImode
169                                                                               || <MODE>mode == V16SImode)")
170 (define_subst_attr "round_saeonly_modev8sf_condition" "round_saeonly" "1" "(<MODE>mode == V8SFmode)")
171
172 (define_subst "round_saeonly"
173   [(set (match_operand:SUBST_A 0)
174         (match_operand:SUBST_A 1))]
175   "TARGET_AVX512F"
176   [(parallel[
177      (set (match_dup 0)
178           (match_dup 1))
179      (unspec [(match_operand:SI 2 "const48_operand")] UNSPEC_EMBEDDED_ROUNDING)])])
180
181 (define_subst_attr "round_expand_name" "round_expand" "" "_round")
182 (define_subst_attr "round_expand_nimm_predicate" "round_expand" "nonimmediate_operand" "register_operand")
183 (define_subst_attr "round_expand_operand" "round_expand" "" ", operands[5]")
184
185 (define_subst "round_expand"
186  [(match_operand:SUBST_V 0)
187   (match_operand:SUBST_V 1)
188   (match_operand:SUBST_V 2)
189   (match_operand:SUBST_V 3)
190   (match_operand:SUBST_S 4)]
191   "TARGET_AVX512F"
192   [(match_dup 0)
193    (match_dup 1)
194    (match_dup 2)
195    (match_dup 3)
196    (match_dup 4)
197    (unspec [(match_operand:SI 5 "const_4_or_8_to_11_operand")] UNSPEC_EMBEDDED_ROUNDING)])
198
199 (define_subst_attr "round_saeonly_expand_name" "round_saeonly_expand" "" "_round")
200 (define_subst_attr "round_saeonly_expand_nimm_predicate" "round_saeonly_expand" "nonimmediate_operand" "register_operand")
201 (define_subst_attr "round_saeonly_expand_operand6" "round_saeonly_expand" "" ", operands[6]")
202
203 (define_subst "round_saeonly_expand"
204  [(match_operand:SUBST_V 0)
205   (match_operand:SUBST_V 1)
206   (match_operand:SUBST_V 2)
207   (match_operand:SUBST_A 3)
208   (match_operand:SI 4)
209   (match_operand:SUBST_S 5)]
210   "TARGET_AVX512F"
211   [(match_dup 0)
212    (match_dup 1)
213    (match_dup 2)
214    (match_dup 3)
215    (match_dup 4)
216    (match_dup 5)
217    (unspec [(match_operand:SI 6 "const48_operand")] UNSPEC_EMBEDDED_ROUNDING)])
218
219 (define_subst_attr "mask_expand4_name" "mask_expand4" "" "_mask")
220 (define_subst_attr "mask_expand4_args" "mask_expand4" "" ", operands[4], operands[5]")
221
222 (define_subst "mask_expand4"
223   [(match_operand:SUBST_V 0)
224    (match_operand:SUBST_V 1)
225    (match_operand:SUBST_V 2)
226    (match_operand:SI 3)]
227    "TARGET_AVX512VL"
228    [(match_dup 0)
229     (match_dup 1)
230     (match_dup 2)
231     (match_dup 3)
232     (match_operand:SUBST_V 4 "vector_move_operand")
233     (match_operand:<avx512fmaskmode> 5 "register_operand")])