i386.h (MODE_NEEDED): Calls need UNINITIALIZED mode; add comment.
authorJan Hubicka <jh@suse.cz>
Sat, 11 Sep 2004 19:54:21 +0000 (21:54 +0200)
committerJan Hubicka <hubicka@gcc.gnu.org>
Sat, 11 Sep 2004 19:54:21 +0000 (19:54 +0000)
* 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.

From-SVN: r87365

gcc/ChangeLog
gcc/config/i386/i386.h
gcc/config/i386/i386.md

index 7429882c3c19134a6e4072d3c0e0fa68a796673d..e0c197a9cd7fd1dd990299c6e4c0b73029ed9fc5 100644 (file)
@@ -1,5 +1,9 @@
 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.
index 4c4ce5843dbc4f9011c4d54c6bd900dd7f974e5c..e32684885c4d3d18b48f07bee8e7d0523e2b49f6 100644 (file)
@@ -2960,13 +2960,18 @@ extern rtx ix86_compare_op1;    /* operand 1 for comparisons */
    `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))
@@ -2981,7 +2986,7 @@ extern rtx ix86_compare_op1;      /* operand 1 for comparisons */
    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                              \
index f08c85a4d44eee29023b3d6842924d1c37a024af..8ec7719b660735571d3a91a0e8a1041c3585b717 100644 (file)
 
 ;; 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.