summaryrefslogtreecommitdiff
path: root/gcc/config/i386
diff options
context:
space:
mode:
authorjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-12 19:37:21 +0000
committerjakub <jakub@138bc75d-0d04-0410-961f-82ee72b054a4>2016-04-12 19:37:21 +0000
commit7f2ea2fbc716530d3539f23d53df8b3482ff51ea (patch)
treebca4d0d594bb17de510c93e22b980b91d0796409 /gcc/config/i386
parent249ca944e509f411291982d7d6eb740f3cf15eb2 (diff)
downloadgcc-7f2ea2fbc716530d3539f23d53df8b3482ff51ea.tar.gz
* config/i386/i386.c (ix86_simd_clone_compute_vecsize_and_simdlen):
Bump the upper SIMDLEN limits, so that if the return type or characteristic type if the return type is void can be passed in all available SSE2/AVX/AVX2/AVX512-F registers, the SIMDLEN is allowed. * c-c++-common/cilk-plus/SE/ef_error2.c (func2): Use vectorlength 128 instead of 32. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@234913 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/config/i386')
-rw-r--r--gcc/config/i386/i386.c39
1 files changed, 23 insertions, 16 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index acbecbd24e1..1fa007efdc3 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -53761,7 +53761,7 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node,
if (clonei->simdlen
&& (clonei->simdlen < 2
- || clonei->simdlen > 128
+ || clonei->simdlen > 1024
|| (clonei->simdlen & (clonei->simdlen - 1)) != 0))
{
warning_at (DECL_SOURCE_LOCATION (node->decl), 0,
@@ -53867,21 +53867,28 @@ ix86_simd_clone_compute_vecsize_and_simdlen (struct cgraph_node *node,
clonei->simdlen /= GET_MODE_BITSIZE (TYPE_MODE (base_type));
}
else if (clonei->simdlen > 16)
- switch (clonei->vecsize_int)
- {
- case 512:
- /* For AVX512-F, support VLEN up to 128. */
- break;
- case 256:
- /* For AVX2, support VLEN up to 32. */
- if (clonei->simdlen <= 32)
- break;
- /* FALLTHRU */
- default:
- /* Otherwise, support VLEN up to 16. */
- warning_at (DECL_SOURCE_LOCATION (node->decl), 0,
- "unsupported simdlen %d", clonei->simdlen);
- return 0;
+ {
+ /* For compatibility with ICC, use the same upper bounds
+ for simdlen. In particular, for CTYPE below, use the return type,
+ unless the function returns void, in that case use the characteristic
+ type. If it is possible for given SIMDLEN to pass CTYPE value
+ in registers (8 [XYZ]MM* regs for 32-bit code, 16 [XYZ]MM* regs
+ for 64-bit code), accept that SIMDLEN, otherwise warn and don't
+ emit corresponding clone. */
+ tree ctype = ret_type;
+ if (TREE_CODE (ret_type) == VOID_TYPE)
+ ctype = base_type;
+ int cnt = GET_MODE_BITSIZE (TYPE_MODE (ctype)) * clonei->simdlen;
+ if (SCALAR_INT_MODE_P (TYPE_MODE (ctype)))
+ cnt /= clonei->vecsize_int;
+ else
+ cnt /= clonei->vecsize_float;
+ if (cnt > (TARGET_64BIT ? 16 : 8))
+ {
+ warning_at (DECL_SOURCE_LOCATION (node->decl), 0,
+ "unsupported simdlen %d", clonei->simdlen);
+ return 0;
+ }
}
return ret;
}