===================================================================
@@ -7943,6 +7943,15 @@ classify_argument (machine_mode mode, co
&& targetm.calls.must_pass_in_stack (mode, type))
return 0;
+ /* Special case check for pointer to shared, on 64-bit target. */
+ if (TARGET_64BIT && mode == TImode
+ && type && TREE_CODE (type) == POINTER_TYPE
+ && SHARED_TYPE_P (TREE_TYPE (type)))
+ {
+ classes[0] = classes[1] = X86_64_INTEGER_CLASS;
+ return 2;
+ }
+
if (type && AGGREGATE_TYPE_P (type))
{
int i;
@@ -9536,7 +9545,8 @@ function_value_64 (machine_mode orig_mod
return gen_rtx_REG (mode, regno);
}
- else if (POINTER_TYPE_P (valtype))
+ else if (POINTER_TYPE_P (valtype)
+ && !SHARED_TYPE_P (TREE_TYPE (valtype)))
{
/* Pointers are always returned in word_mode. */
mode = word_mode;
@@ -9680,6 +9690,11 @@ ix86_promote_function_mode (const_tree t
{
if (type != NULL_TREE && POINTER_TYPE_P (type))
{
+ if (SHARED_TYPE_P (TREE_TYPE (type)))
+ {
+ *punsignedp = 1;
+ return TYPE_MODE (upc_pts_rep_type_node);
+ }
*punsignedp = POINTERS_EXTEND_UNSIGNED;
return word_mode;
}