2004-09-11 Jan Hubicka <jh@suse.cz>
+ * i386.h (MODE_NEEDED): Calls need UNINITIALIZED mode; add comment.
+ (EMIT_MODE_SET): UNINITIALIZED mode needs no set.
+ * i386.md (i387_cw): Add 'uninitialized' mode.
+
* profile.c (BB_TO_GCOV_INDEX): move more to the front.
(output_location): Break out from ....
(branch_prob): ... here; handle gcov output on trees.
`OPTIMIZE_MODE_SWITCHING' is defined, you must define this macro to
return an integer value not larger than the corresponding element
in `NUM_MODES_FOR_MODE_SWITCHING', to denote the mode that ENTITY
- must be switched into prior to the execution of INSN. */
+ must be switched into prior to the execution of INSN.
+
+ The mode UNINITIALIZED is used to force re-load of possibly previously
+ stored control word after function call. The mode ANY specify that
+ function has no requirements on the control word and make no changes
+ in the bits we are interested in. */
#define MODE_NEEDED(ENTITY, I) \
(GET_CODE (I) == CALL_INSN \
|| (GET_CODE (I) == INSN && (asm_noperands (PATTERN (I)) >= 0 \
|| GET_CODE (PATTERN (I)) == ASM_INPUT))\
- ? I387_CW_ANY \
+ ? I387_CW_UNINITIALIZED \
: recog_memoized (I) < 0 \
? I387_CW_ANY \
: get_attr_i387_cw (I))
are to be inserted. */
#define EMIT_MODE_SET(ENTITY, MODE, HARD_REGS_LIVE) \
- ((MODE) != I387_CW_ANY \
+ ((MODE) != I387_CW_ANY && (MODE) != I387_CW_UNINITIALIZED \
? emit_i387_cw_initialization (assign_386_stack_local (HImode, 1), \
assign_386_stack_local (HImode, 2), \
MODE), 0 \
;; Defines rounding mode of an FP operation.
-(define_attr "i387_cw" "floor,ceil,trunc,mask_pm,any"
+(define_attr "i387_cw" "floor,ceil,trunc,mask_pm,uninitialized,any"
(const_string "any"))
;; Describe a user's asm statement.