From d4983fea7e0e964896858eeae7cfdecbacb9cba0 Mon Sep 17 00:00:00 2001 From: echristo Date: Mon, 10 Jun 2002 20:00:54 +0000 Subject: [PATCH] 2002-06-10 Eric Christopher * config/i386/i386.c (ix86_osf_output_function_prologue): Remove prototype and function. (TARGET_ASM_FUNCTION_PROLOGUE): Remove OSF version. (call_insn_operand): Remove half pic references. (legitimate_address_p): Ditto. * config/i386/i386.h: Remove half pic defines. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54451 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 9 +++ gcc/config/i386/i386.c | 177 ++++++++----------------------------------------- gcc/config/i386/i386.h | 64 +++++++----------- 3 files changed, 63 insertions(+), 187 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 96c940228c5..66b9e1a6d68 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2002-06-10 Eric Christopher + * config/i386/i386.c (ix86_osf_output_function_prologue): Remove + prototype and function. + (TARGET_ASM_FUNCTION_PROLOGUE): Remove OSF version. + (call_insn_operand): Remove half pic references. + (legitimate_address_p): Ditto. + * config/i386/i386.h: Remove half pic defines. + +2002-06-10 Eric Christopher + * doc/extend.texi (Return Address): Add note explaining the side- effects of inlining on __builtin_return_address. diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index b5ca28f4fc7..d64521d0684 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -49,7 +49,7 @@ Boston, MA 02111-1307, USA. */ #endif /* Processor costs (relative to an add) */ -static const +static const struct processor_costs size_cost = { /* costs for tunning for size */ 2, /* cost of an add instruction */ 3, /* cost of a lea instruction */ @@ -86,7 +86,7 @@ struct processor_costs size_cost = { /* costs for tunning for size */ 0, /* number of parallel prefetches */ }; /* Processor costs (relative to an add) */ -static const +static const struct processor_costs i386_cost = { /* 386 specific costs */ 1, /* cost of an add instruction */ 1, /* cost of a lea instruction */ @@ -123,7 +123,7 @@ struct processor_costs i386_cost = { /* 386 specific costs */ 0, /* number of parallel prefetches */ }; -static const +static const struct processor_costs i486_cost = { /* 486 specific costs */ 1, /* cost of an add instruction */ 1, /* cost of a lea instruction */ @@ -160,7 +160,7 @@ struct processor_costs i486_cost = { /* 486 specific costs */ 0, /* number of parallel prefetches */ }; -static const +static const struct processor_costs pentium_cost = { 1, /* cost of an add instruction */ 1, /* cost of a lea instruction */ @@ -197,7 +197,7 @@ struct processor_costs pentium_cost = { 0, /* number of parallel prefetches */ }; -static const +static const struct processor_costs pentiumpro_cost = { 1, /* cost of an add instruction */ 1, /* cost of a lea instruction */ @@ -234,7 +234,7 @@ struct processor_costs pentiumpro_cost = { 6, /* number of parallel prefetches */ }; -static const +static const struct processor_costs k6_cost = { 1, /* cost of an add instruction */ 2, /* cost of a lea instruction */ @@ -271,7 +271,7 @@ struct processor_costs k6_cost = { 1, /* number of parallel prefetches */ }; -static const +static const struct processor_costs athlon_cost = { 1, /* cost of an add instruction */ 2, /* cost of a lea instruction */ @@ -308,7 +308,7 @@ struct processor_costs athlon_cost = { 6, /* number of parallel prefetches */ }; -static const +static const struct processor_costs pentium4_cost = { 1, /* cost of an add instruction */ 1, /* cost of a lea instruction */ @@ -801,12 +801,6 @@ static enum x86_64_reg_class merge_classes PARAMS ((enum x86_64_reg_class, #undef TARGET_EXPAND_BUILTIN #define TARGET_EXPAND_BUILTIN ix86_expand_builtin -#if defined (OSF_OS) || defined (TARGET_OSF1ELF) - static void ix86_osf_output_function_prologue PARAMS ((FILE *, - HOST_WIDE_INT)); -# undef TARGET_ASM_FUNCTION_PROLOGUE -# define TARGET_ASM_FUNCTION_PROLOGUE ix86_osf_output_function_prologue -#endif #undef TARGET_ASM_FUNCTION_EPILOGUE #define TARGET_ASM_FUNCTION_EPILOGUE ix86_output_function_epilogue @@ -841,7 +835,7 @@ static enum x86_64_reg_class merge_classes PARAMS ((enum x86_64_reg_class, #define TARGET_SCHED_INIT ix86_sched_init #undef TARGET_SCHED_REORDER #define TARGET_SCHED_REORDER ix86_sched_reorder -#undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE +#undef TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE #define TARGET_SCHED_USE_DFA_PIPELINE_INTERFACE \ ia32_use_dfa_pipeline_interface #undef TARGET_SCHED_FIRST_CYCLE_MULTIPASS_DFA_LOOKAHEAD @@ -1040,7 +1034,7 @@ override_options () /* Arrange to set up i386_stack_locals for all functions. */ init_machine_status = ix86_init_machine_status; - + /* Validate -mregparm= value. */ if (ix86_regparm_string) { @@ -1208,7 +1202,7 @@ override_options () else ix86_fpmath = FPMATH_SSE | FPMATH_387; } - else + else error ("bad value (%s) for -mfpmath= switch", ix86_fpmath_string); } @@ -1354,105 +1348,6 @@ ix86_handle_regparm_attribute (node, name, args, flags, no_add_attrs) return NULL_TREE; } -#if defined (OSF_OS) || defined (TARGET_OSF1ELF) - -/* Generate the assembly code for function entry. FILE is a stdio - stream to output the code to. SIZE is an int: how many units of - temporary storage to allocate. - - Refer to the array `regs_ever_live' to determine which registers to - save; `regs_ever_live[I]' is nonzero if register number I is ever - used in the function. This function is responsible for knowing - which registers should not be saved even if used. - - We override it here to allow for the new profiling code to go before - the prologue and the old mcount code to go after the prologue (and - after %ebx has been set up for ELF shared library support). */ - -static void -ix86_osf_output_function_prologue (file, size) - FILE *file; - HOST_WIDE_INT size; -{ - const char *prefix = ""; - const char *const lprefix = LPREFIX; - int labelno = current_function_profile_label_no; - -#ifdef OSF_OS - - if (TARGET_UNDERSCORES) - prefix = "_"; - - if (current_function_profile && OSF_PROFILE_BEFORE_PROLOGUE) - { - if (!flag_pic && !HALF_PIC_P ()) - { - fprintf (file, "\tmovl $%sP%d,%%edx\n", lprefix, labelno); - fprintf (file, "\tcall *%s_mcount_ptr\n", prefix); - } - - else if (HALF_PIC_P ()) - { - rtx symref; - - HALF_PIC_EXTERNAL ("_mcount_ptr"); - symref = HALF_PIC_PTR (gen_rtx_SYMBOL_REF (Pmode, - "_mcount_ptr")); - - fprintf (file, "\tmovl $%sP%d,%%edx\n", lprefix, labelno); - fprintf (file, "\tmovl %s%s,%%eax\n", prefix, - XSTR (symref, 0)); - fprintf (file, "\tcall *(%%eax)\n"); - } - - else - { - static int call_no = 0; - - fprintf (file, "\tcall %sPc%d\n", lprefix, call_no); - fprintf (file, "%sPc%d:\tpopl %%eax\n", lprefix, call_no); - fprintf (file, "\taddl $_GLOBAL_OFFSET_TABLE_+[.-%sPc%d],%%eax\n", - lprefix, call_no++); - fprintf (file, "\tleal %sP%d@GOTOFF(%%eax),%%edx\n", - lprefix, labelno); - fprintf (file, "\tmovl %s_mcount_ptr@GOT(%%eax),%%eax\n", - prefix); - fprintf (file, "\tcall *(%%eax)\n"); - } - } - -#else /* !OSF_OS */ - - if (current_function_profile && OSF_PROFILE_BEFORE_PROLOGUE) - { - if (!flag_pic) - { - fprintf (file, "\tmovl $%sP%d,%%edx\n", lprefix, labelno); - fprintf (file, "\tcall *%s_mcount_ptr\n", prefix); - } - - else - { - static int call_no = 0; - - fprintf (file, "\tcall %sPc%d\n", lprefix, call_no); - fprintf (file, "%sPc%d:\tpopl %%eax\n", lprefix, call_no); - fprintf (file, "\taddl $_GLOBAL_OFFSET_TABLE_+[.-%sPc%d],%%eax\n", - lprefix, call_no++); - fprintf (file, "\tleal %sP%d@GOTOFF(%%eax),%%edx\n", - lprefix, labelno); - fprintf (file, "\tmovl %s_mcount_ptr@GOT(%%eax),%%eax\n", - prefix); - fprintf (file, "\tcall *(%%eax)\n"); - } - } -#endif /* !OSF_OS */ - - function_prologue (file, size); -} - -#endif /* OSF_OS || TARGET_OSF1ELF */ - /* Return 0 if the attributes for two types are incompatible, 1 if they are compatible, and 2 if they are nearly compatible (which causes a warning to be generated). */ @@ -2403,9 +2298,9 @@ ix86_build_va_list () record = (*lang_hooks.types.make_type) (RECORD_TYPE); type_decl = build_decl (TYPE_DECL, get_identifier ("__va_list_tag"), record); - f_gpr = build_decl (FIELD_DECL, get_identifier ("gp_offset"), + f_gpr = build_decl (FIELD_DECL, get_identifier ("gp_offset"), unsigned_type_node); - f_fpr = build_decl (FIELD_DECL, get_identifier ("fp_offset"), + f_fpr = build_decl (FIELD_DECL, get_identifier ("fp_offset"), unsigned_type_node); f_ovf = build_decl (FIELD_DECL, get_identifier ("overflow_arg_area"), ptr_type_node); @@ -2431,7 +2326,7 @@ ix86_build_va_list () } /* Perform any needed actions needed for a function that is receiving a - variable number of arguments. + variable number of arguments. CUM is as above. @@ -2999,7 +2894,7 @@ pic_symbolic_operand (op, mode) if (GET_CODE (XEXP (op, 0)) == UNSPEC) return 1; } - else + else { if (GET_CODE (op) == UNSPEC) return 1; @@ -3037,7 +2932,7 @@ local_symbolic_operand (op, mode) return 1; /* There is, however, a not insubstantial body of code in the rest of - the compiler that assumes it can just stick the results of + the compiler that assumes it can just stick the results of ASM_GENERATE_INTERNAL_LABEL in a symbol_ref and have done. */ /* ??? This is a hack. Should update the body of the compiler to always create a DECL an invoke targetm.encode_section_info. */ @@ -3139,11 +3034,6 @@ call_insn_operand (op, mode) if (GET_CODE (op) == SYMBOL_REF) return 1; - /* Half-pic doesn't allow anything but registers and constants. - We've just taken care of the later. */ - if (HALF_PIC_P ()) - return register_operand (op, Pmode); - /* Otherwise we can allow any general_operand in the address. */ return general_operand (op, Pmode); } @@ -4099,7 +3989,7 @@ ix86_select_alt_pic_regnum () return INVALID_REGNUM; } - + /* Return 1 if we need to save REGNO. */ static int ix86_save_reg (regno, maybe_eh_return) @@ -4965,7 +4855,7 @@ constant_address_p (x) } /* Nonzero if the constant value X is a legitimate general operand - when generating PIC code. It is given that flag_pic is on and + when generating PIC code. It is given that flag_pic is on and that X satisfies CONSTANT_P or is a CONST_DOUBLE. */ bool @@ -5080,7 +4970,7 @@ legitimate_pic_address_disp_p (disp) return false; return local_dynamic_symbolic_operand (XVECEXP (disp, 0, 0), Pmode); } - + return 0; } @@ -5291,15 +5181,6 @@ legitimate_address_p (mode, addr, strict) that never results in lea, this seems to be easier and correct fix for crash to disable this test. */ } - else if (HALF_PIC_P ()) - { - if (! HALF_PIC_ADDRESS_P (disp) - || (base != NULL_RTX || index != NULL_RTX)) - { - reason = "displacement is an invalid half-pic reference"; - goto report_error; - } - } else if (!CONSTANT_ADDRESS_P (disp)) { reason = "displacement is not constant"; @@ -5582,7 +5463,7 @@ get_thread_pointer () return tp; } - + /* Try machine-dependent ways of modifying an illegitimate address to be legitimate. If we find one, return the new, valid address. This macro is used in only one place: `memory_address' in explow.c. @@ -6528,7 +6409,7 @@ print_operand (file, x, code) /* Like above, but reverse condition */ case 'c': - /* Check to see if argument to %c is really a constant + /* Check to see if argument to %c is really a constant and not a condition code which needs to be reversed. */ if (GET_RTX_CLASS (GET_CODE (x)) != '<') { @@ -7565,7 +7446,7 @@ ix86_expand_vector_move (mode, operands) } emit_insn (gen_rtx_SET (VOIDmode, operands[0], operands[1])); -} +} /* Attempt to expand a binary operator. Make the expansion closer to the actual machine, then just general_operand, which will allow 3 separate @@ -8430,7 +8311,7 @@ ix86_expand_branch (code, label) code = ix86_prepare_fp_compare_args (code, &ix86_compare_op0, &ix86_compare_op1); - + ix86_fp_comparison_codes (code, &bypass_code, &first_code, &second_code); /* Check whether we will use the natural sequence with one jump. If @@ -10626,7 +10507,7 @@ ix86_expand_call (retval, fnaddr, callarg1, callarg2, pop) if (use) CALL_INSN_FUNCTION_USAGE (call) = use; } - + /* Clear stack slot assignments remembered from previous functions. This is called from INIT_EXPANDERS once before RTL is emitted for each @@ -11214,7 +11095,7 @@ ix86_sched_reorder (dump, sched_verbose, ready, n_readyp, clock_var) int n_ready = *n_readyp; rtx *e_ready = ready + n_ready - 1; - /* Make sure to go ahead and initialize key items in + /* Make sure to go ahead and initialize key items in ix86_sched_data if we are not going to bother trying to reorder the ready queue. */ if (n_ready < 2) @@ -12689,7 +12570,7 @@ ix86_expand_binop_builtin (icode, arglist, target) return target; } -/* In type_for_mode we restrict the ability to create TImode types +/* In type_for_mode we restrict the ability to create TImode types to hosts with 64-bit H_W_I. So we've defined the SSE logicals to have a V4SFmode signature. Convert them in-place to TImode. */ @@ -12819,11 +12700,11 @@ ix86_expand_unop1_builtin (icode, arglist, target) if (! (*insn_data[icode].operand[1].predicate) (op0, mode0)) op0 = copy_to_mode_reg (mode0, op0); - + op1 = op0; if (! (*insn_data[icode].operand[2].predicate) (op1, mode0)) op1 = copy_to_mode_reg (mode0, op1); - + pat = GEN_FCN (icode) (target, op0, op1); if (! pat) return 0; @@ -13820,7 +13701,7 @@ x86_order_regs_for_local_alloc () if (!TARGET_SSE_MATH) for (i = FIRST_STACK_REG; i <= LAST_STACK_REG; i++) reg_alloc_order [pos++] = i; - + /* SSE registers. */ for (i = FIRST_SSE_REG; i <= LAST_SSE_REG; i++) reg_alloc_order [pos++] = i; diff --git a/gcc/config/i386/i386.h b/gcc/config/i386/i386.h index 0064adf13c6..12e9bc24f28 100644 --- a/gcc/config/i386/i386.h +++ b/gcc/config/i386/i386.h @@ -34,20 +34,6 @@ Boston, MA 02111-1307, USA. */ ADDR_BEG, ADDR_END, PRINT_IREG, PRINT_SCALE, PRINT_B_I_S, and many that start with ASM_ or end in ASM_OP. */ -/* Stubs for half-pic support if not OSF/1 reference platform. */ - -#ifndef HALF_PIC_P -#define HALF_PIC_P() 0 -#define HALF_PIC_NUMBER_PTRS 0 -#define HALF_PIC_NUMBER_REFS 0 -#define HALF_PIC_ENCODE(DECL) -#define HALF_PIC_DECLARE(NAME) -#define HALF_PIC_INIT() error ("half-pic init called on systems that don't support it") -#define HALF_PIC_ADDRESS_P(X) 0 -#define HALF_PIC_PTR(X) (X) -#define HALF_PIC_FINISH(STREAM) -#endif - /* Define the specific costs for a given cpu */ struct processor_costs { @@ -140,7 +126,7 @@ extern int target_flags; /* Compile using ret insn that pops args. This will not work unless you use prototypes at least - for all functions that can take varying numbers of args. */ + for all functions that can take varying numbers of args. */ #define TARGET_RTD (target_flags & MASK_RTD) /* Align doubles to a two word boundary. This breaks compatibility with @@ -712,7 +698,7 @@ extern int x86_prefetch_sse; and all fundamental data types supported by the hardware might need to be aligned. No data type wants to be aligned rounder than this. - + Pentium+ preferrs DFmode values to be aligned to 64 bit boundary and Pentium Pro XFmode values at 128 bit boundaries. */ @@ -826,7 +812,7 @@ extern int x86_prefetch_sse; /* 1 for registers that have pervasive standard uses and are not available for the register allocator. On the 80386, the stack pointer is such, as is the arg pointer. - + The value is an mask - bit 1 is set for fixed registers for 32bit target, while 2 is set for fixed registers for 64bit. Proper value is computed in the CONDITIONAL_REGISTER_USAGE. @@ -844,15 +830,15 @@ extern int x86_prefetch_sse; 1, 1, 1, 1, 1, 1, 1, 1, \ /*xmm8,xmm9,xmm10,xmm11,xmm12,xmm13,xmm14,xmm15*/ \ 1, 1, 1, 1, 1, 1, 1, 1} - + /* 1 for registers not available across function calls. These must include the FIXED_REGISTERS and also any registers that can be used without being saved. The latter must include the registers where values are returned and the register where structure-value addresses are passed. - Aside from that, you can include as many other registers as you like. - + Aside from that, you can include as many other registers as you like. + The value is an mask - bit 1 is set for call used for 32bit target, while 2 is set for call used for 64bit. Proper value is computed in the CONDITIONAL_REGISTER_USAGE. @@ -938,7 +924,7 @@ do { \ This is ordinarily the length in words of a value of mode MODE but can be less for certain modes in special long registers. - Actually there are no two word move instructions for consecutive + Actually there are no two word move instructions for consecutive registers. And only registers 0-3 may have mov byte instructions applied to them. */ @@ -1051,7 +1037,7 @@ do { \ #define FIRST_SSE_REG (FRAME_POINTER_REGNUM + 1) #define LAST_SSE_REG (FIRST_SSE_REG + 7) - + #define FIRST_MMX_REG (LAST_SSE_REG + 1) #define LAST_MMX_REG (FIRST_MMX_REG + 7) @@ -1087,7 +1073,7 @@ do { \ /* Register to hold the addressing base for position independent code access to data items. We don't use PIC pointer for 64bit mode. Define the regnum to dummy value to prevent gcc from - pessimizing code dealing with EBX. + pessimizing code dealing with EBX. To avoid clobbering a call-saved register unnecessarily, we renumber the pic register when possible. The change is visible after the @@ -1300,7 +1286,7 @@ enum reg_class #define MMX_REGNO_P(N) ((N) >= FIRST_MMX_REG && (N) <= LAST_MMX_REG) #define MMX_REG_P(XOP) (REG_P (XOP) && MMX_REGNO_P (REGNO (XOP))) - + #define STACK_REG_P(XOP) \ (REG_P (XOP) && \ REGNO (XOP) >= FIRST_STACK_REG && \ @@ -1431,7 +1417,7 @@ enum reg_class ix86_secondary_memory_needed ((CLASS1), (CLASS2), (MODE), 1) /* QImode spills from non-QI registers need a scratch. This does not - happen often -- the only example so far requires an uninitialized + happen often -- the only example so far requires an uninitialized pseudo. */ #define SECONDARY_OUTPUT_RELOAD_CLASS(CLASS, MODE, OUT) \ @@ -1478,7 +1464,7 @@ enum reg_class || ((CLASS) == DIREG)) /* A C statement that adds to CLOBBERS any hard regs the port wishes - to automatically clobber for all asms. + to automatically clobber for all asms. We do this in the new i386 backend to maintain source compatibility with the old cc0-based compiler. */ @@ -1516,7 +1502,7 @@ enum reg_class On 386 pushw decrements by exactly 2 no matter what the position was. On the 386 there is no pushb; we use pushw instead, and this has the effect of rounding up to 2. - + For 64bit ABI we round up to 8 bytes. */ @@ -1737,7 +1723,7 @@ do { \ the stack pointer does not matter. The value is tested only in functions that have frame pointers. No definition is equivalent to always zero. */ -/* Note on the 386 it might be more efficient not to define this since +/* Note on the 386 it might be more efficient not to define this since we have to restore it ourselves from the frame pointer, in order to use pop */ @@ -1956,7 +1942,7 @@ do { \ #define REWRITE_ADDRESS(X) rewrite_address (X) /* Nonzero if the constant value X is a legitimate general operand - when generating PIC code. It is given that flag_pic is on and + when generating PIC code. It is given that flag_pic is on and that X satisfies CONSTANT_P or is a CONST_DOUBLE. */ #define LEGITIMATE_PIC_OPERAND_P(X) legitimate_pic_operand_p (X) @@ -2146,7 +2132,7 @@ enum ix86_builtins IX86_BUILTIN_RSQRTSS, IX86_BUILTIN_SQRTPS, IX86_BUILTIN_SQRTSS, - + IX86_BUILTIN_UNPCKHPS, IX86_BUILTIN_UNPCKLPS, @@ -2519,7 +2505,7 @@ do { \ precise value of the constant, which is available for examination in X, and the rtx code of the expression in which it is contained, found in OUTER_CODE. - + CODE is the expression code--redundant, since it can be obtained with `GET_CODE (X)'. */ @@ -2851,8 +2837,8 @@ do { \ /* Add any extra modes needed to represent the condition code. For the i386, we need separate modes when floating-point - equality comparisons are being done. - + equality comparisons are being done. + Add CCNO to indicate comparisons against zero that requires Overflow flag to be unset. Sign bit test is used instead and thus can be used to form "a&b>0" type of tests. @@ -2911,7 +2897,7 @@ do { \ For float regs, the stack top is sometimes referred to as "%st(0)" instead of just "%st". PRINT_REG handles this with the "y" code. */ -#undef HI_REGISTER_NAMES +#undef HI_REGISTER_NAMES #define HI_REGISTER_NAMES \ {"ax","dx","cx","bx","si","di","bp","sp", \ "st","st(1)","st(2)","st(3)","st(4)","st(5)","st(6)","st(7)","", \ @@ -2961,7 +2947,7 @@ extern int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER]; /* Before the prologue, RA is at 0(%esp). */ #define INCOMING_RETURN_ADDR_RTX \ gen_rtx_MEM (VOIDmode, gen_rtx_REG (VOIDmode, STACK_POINTER_REGNUM)) - + /* After the prologue, RA is at -4(AP) in the current frame. */ #define RETURN_ADDR_RTX(COUNT, FRAME) \ ((COUNT) == 0 \ @@ -3034,7 +3020,7 @@ extern int const svr4_dbx_register_map[FIRST_PSEUDO_REGISTER]; #define JUMP_TABLES_IN_TEXT_SECTION \ (!TARGET_64BIT && flag_pic && !HAVE_AS_GOTOFF_IN_DATA) -/* A C statement that outputs an address constant appropriate to +/* A C statement that outputs an address constant appropriate to for DWARF debugging. */ #define ASM_OUTPUT_DWARF_ADDR_CONST(FILE, X) \ @@ -3291,7 +3277,7 @@ extern const char *ix86_asm_string; extern enum asm_dialect ix86_asm_dialect; extern int ix86_regparm; -extern const char *ix86_regparm_string; +extern const char *ix86_regparm_string; extern int ix86_preferred_stack_boundary; extern const char *ix86_preferred_stack_boundary_string; @@ -3319,12 +3305,12 @@ extern rtx ix86_compare_op1; /* operand 1 for comparisons */ redundant computation of new control word by the mode switching pass. The fldcw instructions are still emitted redundantly, but this is probably not going to be noticeable problem, as most CPUs do have fast path for - the sequence. + the sequence. The machinery is to emit simple truncation instructions and split them before reload to instructions having USEs of two memory locations that are filled by this code to old and new control word. - + Post-reload pass may be later used to eliminate the redundant fildcw if needed. */ -- 2.11.4.GIT