diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f33f6ac40a0..ec68f0e86af 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +Thu Jan 10 11:19:18 CET 2002 Jan Hubicka + + * optabs.c (expand_fix): Look for wider integer modes first. + + * i386.md (mov?f): Avoid the fake const double trick for medium + memory model. + (min?f*/max?f*): Prohibit memory operands for i387 variant. + (fop_df_4): Disable for SSE compilation. + 2002-01-20 Graham Stott * dwarf2out.c (indirect_string_alloc, output_indirect_string): diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index 6e61108b49a..ec38dece3ea 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -2718,6 +2718,7 @@ (match_operand:SF 1 "general_operand" "fm#rx,f#rx,G,rmF#fx,Fr#fx,H,x,xm#rf,x#rf"))] "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) && (reload_in_progress || reload_completed + || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) || GET_CODE (operands[1]) != CONST_DOUBLE || memory_operand (operands[0], SFmode))" { @@ -2893,6 +2894,7 @@ "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) && (optimize_size || !TARGET_INTEGER_DFMODE_MOVES) && (reload_in_progress || reload_completed + || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) || GET_CODE (operands[1]) != CONST_DOUBLE || memory_operand (operands[0], DFmode))" { @@ -2950,6 +2952,7 @@ "(GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) && !optimize_size && TARGET_INTEGER_DFMODE_MOVES && (reload_in_progress || reload_completed + || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) || GET_CODE (operands[1]) != CONST_DOUBLE || memory_operand (operands[0], DFmode))" { @@ -3253,6 +3256,7 @@ && optimize_size && (reload_in_progress || reload_completed || GET_CODE (operands[1]) != CONST_DOUBLE + || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) || memory_operand (operands[0], TFmode))" { switch (which_alternative) @@ -3346,6 +3350,7 @@ && !optimize_size && (reload_in_progress || reload_completed || GET_CODE (operands[1]) != CONST_DOUBLE + || (ix86_cmodel == CM_MEDIUM || ix86_cmodel == CM_LARGE) || memory_operand (operands[0], TFmode))" { switch (which_alternative) @@ -14132,7 +14137,7 @@ (match_operator:DF 3 "binary_fp_operator" [(float_extend:DF (match_operand:SF 1 "nonimmediate_operand" "fm,0")) (match_operand:DF 2 "register_operand" "0,f")]))] - "TARGET_80387 + "TARGET_80387 && (!TARGET_SSE2 || !TARGET_SSE_MATH) && (GET_CODE (operands[1]) != MEM || GET_CODE (operands[2]) != MEM)" "* return output_387_binary_op (insn, operands);" [(set (attr "type") @@ -15962,7 +15967,7 @@ (define_insn "*minsf_nonieee" [(set (match_operand:SF 0 "register_operand" "=x#f,f#x") (if_then_else:SF (lt (match_operand:SF 1 "register_operand" "%0,0") - (match_operand:SF 2 "nonimmediate_operand" "xm#f,fm#x")) + (match_operand:SF 2 "nonimmediate_operand" "xm#f,f#x")) (match_dup 1) (match_dup 2))) (clobber (reg:CC 17))] @@ -16044,7 +16049,7 @@ (define_insn "*mindf_nonieee" [(set (match_operand:DF 0 "register_operand" "=Y#f,f#Y") (if_then_else:DF (lt (match_operand:DF 1 "register_operand" "%0,0") - (match_operand:DF 2 "nonimmediate_operand" "Ym#f,fm#Y")) + (match_operand:DF 2 "nonimmediate_operand" "Ym#f,f#Y")) (match_dup 1) (match_dup 2))) (clobber (reg:CC 17))] @@ -16115,7 +16120,7 @@ (define_insn "*maxsf" [(set (match_operand:SF 0 "register_operand" "=x#f,f#x,f#x") (if_then_else:SF (gt (match_operand:SF 1 "register_operand" "0,0,f#x") - (match_operand:SF 2 "nonimmediate_operand" "xm#f,fm#x,0")) + (match_operand:SF 2 "nonimmediate_operand" "xm#f,f#x,0")) (match_dup 1) (match_dup 2))) (clobber (reg:CC 17))] @@ -16125,7 +16130,7 @@ (define_insn "*maxsf_nonieee" [(set (match_operand:SF 0 "register_operand" "=x#f,f#x") (if_then_else:SF (gt (match_operand:SF 1 "register_operand" "%0,0") - (match_operand:SF 2 "nonimmediate_operand" "xm#f,fm#x")) + (match_operand:SF 2 "nonimmediate_operand" "xm#f,f#x")) (match_dup 1) (match_dup 2))) (clobber (reg:CC 17))] @@ -16195,7 +16200,7 @@ (define_insn "*maxdf" [(set (match_operand:DF 0 "register_operand" "=Y#f,f#Y,f#Y") (if_then_else:DF (gt (match_operand:DF 1 "register_operand" "0,0,f#Y") - (match_operand:DF 2 "nonimmediate_operand" "Ym#f,fm#Y,0")) + (match_operand:DF 2 "nonimmediate_operand" "Ym#f,f#Y,0")) (match_dup 1) (match_dup 2))) (clobber (reg:CC 17))] @@ -16205,7 +16210,7 @@ (define_insn "*maxdf_nonieee" [(set (match_operand:DF 0 "register_operand" "=Y#f,f#Y") (if_then_else:DF (gt (match_operand:DF 1 "register_operand" "%0,0") - (match_operand:DF 2 "nonimmediate_operand" "Ym#f,fm#Y")) + (match_operand:DF 2 "nonimmediate_operand" "Ym#f,f#Y")) (match_dup 1) (match_dup 2))) (clobber (reg:CC 17))] diff --git a/gcc/optabs.c b/gcc/optabs.c index 49ea3193c8c..9e26e7f78c8 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -4349,10 +4349,10 @@ expand_fix (to, from, unsignedp) this conversion. If the integer mode is wider than the mode of TO, we can do the conversion either signed or unsigned. */ - for (imode = GET_MODE (to); imode != VOIDmode; - imode = GET_MODE_WIDER_MODE (imode)) - for (fmode = GET_MODE (from); fmode != VOIDmode; - fmode = GET_MODE_WIDER_MODE (fmode)) + for (fmode = GET_MODE (from); fmode != VOIDmode; + fmode = GET_MODE_WIDER_MODE (fmode)) + for (imode = GET_MODE (to); imode != VOIDmode; + imode = GET_MODE_WIDER_MODE (imode)) { int doing_unsigned = unsignedp;