2008-02-21 H.J. Lu <hongjiu.lu@intel.com>
+ * config/i386/i386.c (classify_argument): Don't allow COImode
+ and OImode.
+ (function_arg_advance_32): Don't allow OImode.
+ (function_arg_32): Likewise.
+ (function_value_32): Likewise.
+ (return_in_memory_32): Likewise.
+ (function_arg_64): Remove OImode comment.
+
+2008-02-21 H.J. Lu <hongjiu.lu@intel.com>
+
PR target/39261
* config/i386/i386.c (ix86_expand_vector_init_one_nonzero): Use
ix86_expand_vector_set for V4DImode in 64bit mode only.
case TImode:
classes[0] = classes[1] = X86_64_INTEGER_CLASS;
return 2;
- case CTImode:
case COImode:
case OImode:
+ /* OImode shouldn't be used directly. */
+ gcc_unreachable ();
+ case CTImode:
return 0;
case SFmode:
if (!(bit_offset % 64))
}
break;
+ case OImode:
+ /* OImode shouldn't be used directly. */
+ gcc_unreachable ();
+
case DFmode:
if (cum->float_in_sse < 2)
break;
break;
/* FALLTHRU */
- case OImode:
case V8SFmode:
case V8SImode:
case V32QImode:
break;
case OImode:
- /* In 32bit, we pass OImode in ymm registers. */
+ /* OImode shouldn't be used directly. */
+ gcc_unreachable ();
+
case V8SFmode:
case V8SImode:
case V32QImode:
case V16HImode:
case V4DFmode:
case V4DImode:
- /* In 64bit, we pass TImode in interger registers and OImode on
- stack. */
-
/* Unnamed 256bit vector mode parameters are passed on stack. */
if (!named)
return NULL;
regno = TARGET_SSE ? FIRST_SSE_REG : 0;
/* 32-byte vector modes in %ymm0. */
- else if (mode == OImode
- || (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32))
+ else if (VECTOR_MODE_P (mode) && GET_MODE_SIZE (mode) == 32)
regno = TARGET_AVX ? FIRST_SSE_REG : 0;
/* Floating point return values in %st(0) (unless -mno-fp-ret-in-387). */
regno = FIRST_SSE_REG;
}
+ /* OImode shouldn't be used directly. */
+ gcc_assert (mode != OImode);
+
return gen_rtx_REG (orig_mode, regno);
}
if (MS_AGGREGATE_RETURN && AGGREGATE_TYPE_P (type) && size <= 8)
return 0;
- if (VECTOR_MODE_P (mode) || mode == TImode || mode == OImode)
+ if (VECTOR_MODE_P (mode) || mode == TImode)
{
/* User-created vectors small enough to fit in EAX. */
if (size < 8)
if (size > 12)
return 1;
+
+ /* OImode shouldn't be used directly. */
+ gcc_assert (mode != OImode);
+
return 0;
}