diff options
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/config/i386/i386.md | 110 | ||||
-rw-r--r-- | gcc/doc/invoke.texi | 31 |
3 files changed, 83 insertions, 65 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 417e59a..d886022 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2003-06-05 Kelley Cook <kelleycook@wideopenwest.com> + + PR optimization/4490 + * config/i386/i386.md: Don't use XFMode if TARGET_128BIT_LONG_DOUBLE. + * doc/invoke.texi (m96bit-long-double, m128bit-long-double): Reword + documentation to accurately reflect what these options do. + 2003-06-06 Kaz Kojima <kkojima@gcc.gnu.org> * config/sh/linux.h (STARTFILE_SPEC): Handle -pie. Simplify. diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index b255df2..9731d19 100644 --- a/gcc/config/i386/i386.md +++ b/gcc/config/i386/i386.md @@ -707,7 +707,7 @@ [(set (reg:CC 17) (compare:CC (match_operand:XF 0 "cmp_fp_expander_operand" "") (match_operand:XF 1 "cmp_fp_expander_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" { ix86_compare_op0 = operands[0]; ix86_compare_op1 = operands[1]; @@ -841,7 +841,7 @@ (compare:CCFP (match_operand:XF 0 "register_operand" "f") (match_operand:XF 1 "register_operand" "f")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "* return output_fp_compare (insn, operands, 0, 0);" [(set_attr "type" "fcmp") (set_attr "mode" "XF")]) @@ -863,7 +863,7 @@ (match_operand:XF 1 "register_operand" "f") (match_operand:XF 2 "register_operand" "f"))] UNSPEC_FNSTSW))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "* return output_fp_compare (insn, operands, 2, 0);" [(set_attr "type" "multi") (set_attr "mode" "XF")]) @@ -2740,7 +2740,7 @@ (define_expand "movxf" [(set (match_operand:XF 0 "nonimmediate_operand" "") (match_operand:XF 1 "general_operand" ""))] - "!TARGET_64BIT" + "!TARGET_128BIT_LONG_DOUBLE" "ix86_expand_move (XFmode, operands); DONE;") (define_expand "movtf" @@ -2759,7 +2759,7 @@ (define_insn "*pushxf_nointeger" [(set (match_operand:XF 0 "push_operand" "=X,X,X") (match_operand:XF 1 "general_no_elim_operand" "f,Fo,*r"))] - "!TARGET_64BIT && optimize_size" + "!TARGET_128BIT_LONG_DOUBLE && optimize_size" { /* This insn should be already splitted before reg-stack. */ abort (); @@ -2781,7 +2781,7 @@ (define_insn "*pushxf_integer" [(set (match_operand:XF 0 "push_operand" "=<,<") (match_operand:XF 1 "general_no_elim_operand" "f#r,ro#f"))] - "!TARGET_64BIT && !optimize_size" + "!TARGET_128BIT_LONG_DOUBLE && !optimize_size" { /* This insn should be already splitted before reg-stack. */ abort (); @@ -2814,7 +2814,7 @@ (define_split [(set (match_operand:XF 0 "push_operand" "") (match_operand:XF 1 "any_fp_register_operand" ""))] - "!TARGET_64BIT" + "!TARGET_128BIT_LONG_DOUBLE" [(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -12))) (set (mem:XF (reg:SI 7)) (match_dup 1))]) @@ -2836,7 +2836,7 @@ (define_insn "*movxf_nointeger" [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m,f,*r,o") (match_operand:XF 1 "general_operand" "fm,f,G,*roF,F*r"))] - "!TARGET_64BIT + "!TARGET_128BIT_LONG_DOUBLE && optimize_size && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) && (reload_in_progress || reload_completed @@ -2926,7 +2926,7 @@ (define_insn "*movxf_integer" [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,m,f#r,r#f,o") (match_operand:XF 1 "general_operand" "fm#r,f#r,G,roF#f,Fr#f"))] - "!TARGET_64BIT + "!TARGET_128BIT_LONG_DOUBLE && !optimize_size && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM) && (reload_in_progress || reload_completed @@ -3593,7 +3593,7 @@ (define_split [(set (match_operand:XF 0 "push_operand" "") (float_extend:XF (match_operand:SF 1 "fp_register_operand" "")))] - "!TARGET_64BIT" + "!TARGET_128BIT_LONG_DOUBLE" [(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -12))) (set (mem:XF (reg:SI 7)) (float_extend:XF (match_dup 1)))]) @@ -3626,7 +3626,7 @@ (define_split [(set (match_operand:XF 0 "push_operand" "") (float_extend:XF (match_operand:DF 1 "fp_register_operand" "")))] - "!TARGET_64BIT" + "!TARGET_128BIT_LONG_DOUBLE" [(set (reg:SI 7) (plus:SI (reg:SI 7) (const_int -12))) (set (mem:DF (reg:SI 7)) (float_extend:XF (match_dup 1)))]) @@ -3708,7 +3708,7 @@ (define_expand "extendsfxf2" [(set (match_operand:XF 0 "nonimmediate_operand" "") (float_extend:XF (match_operand:SF 1 "general_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" { /* ??? Needed for compress_float_constant since all fp constants are LEGITIMATE_CONSTANT_P. */ @@ -3721,7 +3721,7 @@ (define_insn "*extendsfxf2_1" [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m") (float_extend:XF (match_operand:SF 1 "nonimmediate_operand" "fm,f")))] - "!TARGET_64BIT && TARGET_80387 + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)" { switch (which_alternative) @@ -3798,7 +3798,7 @@ (define_expand "extenddfxf2" [(set (match_operand:XF 0 "nonimmediate_operand" "") (float_extend:XF (match_operand:DF 1 "general_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" { /* ??? Needed for compress_float_constant since all fp constants are LEGITIMATE_CONSTANT_P. */ @@ -3811,7 +3811,7 @@ (define_insn "*extenddfxf2_1" [(set (match_operand:XF 0 "nonimmediate_operand" "=f,m") (float_extend:XF (match_operand:DF 1 "nonimmediate_operand" "fm,f")))] - "!TARGET_64BIT && TARGET_80387 + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && (GET_CODE (operands[0]) != MEM || GET_CODE (operands[1]) != MEM)" { switch (which_alternative) @@ -4130,7 +4130,7 @@ (float_truncate:SF (match_operand:XF 1 "register_operand" ""))) (clobber (match_dup 2))])] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "operands[2] = assign_386_stack_local (SFmode, 0);") (define_insn "*truncxfsf2_1" @@ -4138,7 +4138,7 @@ (float_truncate:SF (match_operand:XF 1 "register_operand" "f,f,f,f"))) (clobber (match_operand:SF 2 "memory_operand" "=X,m,m,m"))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" { switch (which_alternative) { @@ -4158,7 +4158,7 @@ [(set (match_operand:SF 0 "memory_operand" "=m") (float_truncate:SF (match_operand:XF 1 "register_operand" "f")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" { if (find_regno_note (insn, REG_DEAD, REGNO (operands[1]))) return "fstp%z0\t%y0"; @@ -4255,7 +4255,7 @@ (float_truncate:DF (match_operand:XF 1 "register_operand" ""))) (clobber (match_dup 2))])] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "operands[2] = assign_386_stack_local (DFmode, 0);") (define_insn "*truncxfdf2_1" @@ -4263,7 +4263,7 @@ (float_truncate:DF (match_operand:XF 1 "register_operand" "f,f,f,f"))) (clobber (match_operand:DF 2 "memory_operand" "=X,m,m,m"))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" { switch (which_alternative) { @@ -4284,7 +4284,7 @@ [(set (match_operand:DF 0 "memory_operand" "=m") (float_truncate:DF (match_operand:XF 1 "register_operand" "f")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" { if (find_regno_note (insn, REG_DEAD, REGNO (operands[1]))) return "fstp%z0\t%y0"; @@ -4384,7 +4384,7 @@ (define_expand "fix_truncxfdi2" [(set (match_operand:DI 0 "nonimmediate_operand" "") (fix:DI (match_operand:XF 1 "register_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "") (define_expand "fix_trunctfdi2" @@ -4551,7 +4551,7 @@ (define_expand "fix_truncxfsi2" [(set (match_operand:SI 0 "nonimmediate_operand" "") (fix:SI (match_operand:XF 1 "register_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "") (define_expand "fix_trunctfsi2" @@ -4712,7 +4712,7 @@ (define_expand "fix_truncxfhi2" [(set (match_operand:HI 0 "nonimmediate_operand" "") (fix:HI (match_operand:XF 1 "register_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "") (define_expand "fix_trunctfhi2" @@ -5064,7 +5064,7 @@ (define_insn "floathixf2" [(set (match_operand:XF 0 "register_operand" "=f,f") (float:XF (match_operand:HI 1 "nonimmediate_operand" "m,r")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "@ fild%z1\t%1 #" @@ -5086,7 +5086,7 @@ (define_insn "floatsixf2" [(set (match_operand:XF 0 "register_operand" "=f,f") (float:XF (match_operand:SI 1 "nonimmediate_operand" "m,r")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "@ fild%z1\t%1 #" @@ -5108,7 +5108,7 @@ (define_insn "floatdixf2" [(set (match_operand:XF 0 "register_operand" "=f,f") (float:XF (match_operand:DI 1 "nonimmediate_operand" "m,r")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "@ fild%z1\t%1 #" @@ -6819,7 +6819,7 @@ [(set (match_operand:XF 0 "register_operand" "") (plus:XF (match_operand:XF 1 "register_operand" "") (match_operand:XF 2 "register_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "") (define_expand "addtf3" @@ -7172,7 +7172,7 @@ [(set (match_operand:XF 0 "register_operand" "") (minus:XF (match_operand:XF 1 "register_operand" "") (match_operand:XF 2 "register_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "") (define_expand "subtf3" @@ -7690,7 +7690,7 @@ [(set (match_operand:XF 0 "register_operand" "") (mult:XF (match_operand:XF 1 "register_operand" "") (match_operand:XF 2 "register_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "") (define_expand "multf3" @@ -7744,7 +7744,7 @@ [(set (match_operand:XF 0 "register_operand" "") (div:XF (match_operand:XF 1 "register_operand" "") (match_operand:XF 2 "register_operand" "")))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "") (define_expand "divtf3" @@ -10157,7 +10157,7 @@ [(parallel [(set (match_operand:XF 0 "nonimmediate_operand" "") (neg:XF (match_operand:XF 1 "nonimmediate_operand" ""))) (clobber (reg:CC 17))])] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "ix86_expand_unary_operator (NEG, XFmode, operands); DONE;") (define_expand "negtf2" @@ -10174,7 +10174,7 @@ [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,rm#f") (neg:XF (match_operand:XF 1 "nonimmediate_operand" "0,0"))) (clobber (reg:CC 17))] - "!TARGET_64BIT && TARGET_80387 + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && ix86_unary_operator_ok (NEG, XFmode, operands)" "#") @@ -10262,7 +10262,7 @@ (define_insn "*negxf2_1" [(set (match_operand:XF 0 "register_operand" "=f") (neg:XF (match_operand:XF 1 "register_operand" "0")))] - "!TARGET_64BIT && TARGET_80387 && reload_completed" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && reload_completed" "fchs" [(set_attr "type" "fsgn") (set_attr "mode" "XF") @@ -10272,7 +10272,7 @@ [(set (match_operand:XF 0 "register_operand" "=f") (neg:XF (float_extend:XF (match_operand:DF 1 "register_operand" "0"))))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "fchs" [(set_attr "type" "fsgn") (set_attr "mode" "XF") @@ -10282,7 +10282,7 @@ [(set (match_operand:XF 0 "register_operand" "=f") (neg:XF (float_extend:XF (match_operand:SF 1 "register_operand" "0"))))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "fchs" [(set_attr "type" "fsgn") (set_attr "mode" "XF") @@ -10619,7 +10619,7 @@ [(parallel [(set (match_operand:XF 0 "nonimmediate_operand" "") (neg:XF (match_operand:XF 1 "nonimmediate_operand" ""))) (clobber (reg:CC 17))])] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "ix86_expand_unary_operator (ABS, XFmode, operands); DONE;") (define_expand "abstf2" @@ -10636,7 +10636,7 @@ [(set (match_operand:XF 0 "nonimmediate_operand" "=f#r,rm#f") (abs:XF (match_operand:XF 1 "nonimmediate_operand" "0,0"))) (clobber (reg:CC 17))] - "!TARGET_64BIT && TARGET_80387 + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && ix86_unary_operator_ok (ABS, XFmode, operands)" "#") @@ -10715,7 +10715,7 @@ (define_insn "*absxf2_1" [(set (match_operand:XF 0 "register_operand" "=f") (abs:XF (match_operand:XF 1 "register_operand" "0")))] - "!TARGET_64BIT && TARGET_80387 && reload_completed" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && reload_completed" "fabs" [(set_attr "type" "fsgn") (set_attr "mode" "DF")]) @@ -10724,7 +10724,7 @@ [(set (match_operand:XF 0 "register_operand" "=f") (abs:XF (float_extend:XF (match_operand:DF 1 "register_operand" "0"))))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "fabs" [(set_attr "type" "fsgn") (set_attr "mode" "XF")]) @@ -10733,7 +10733,7 @@ [(set (match_operand:XF 0 "register_operand" "=f") (abs:XF (float_extend:XF (match_operand:SF 1 "register_operand" "0"))))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "fabs" [(set_attr "type" "fsgn") (set_attr "mode" "XF")]) @@ -14803,7 +14803,7 @@ (match_operator:XF 3 "binary_fp_operator" [(match_operand:XF 1 "register_operand" "%0") (match_operand:XF 2 "register_operand" "f")]))] - "!TARGET_64BIT && TARGET_80387 + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && GET_RTX_CLASS (GET_CODE (operands[3])) == 'c'" "* return output_387_binary_op (insn, operands);" [(set (attr "type") @@ -15079,7 +15079,7 @@ (match_operator:XF 3 "binary_fp_operator" [(match_operand:XF 1 "register_operand" "0,f") (match_operand:XF 2 "register_operand" "f,0")]))] - "!TARGET_64BIT && TARGET_80387 + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && GET_RTX_CLASS (GET_CODE (operands[3])) != 'c'" "* return output_387_binary_op (insn, operands);" [(set (attr "type") @@ -15113,7 +15113,7 @@ (match_operator:XF 3 "binary_fp_operator" [(float:XF (match_operand:SI 1 "nonimmediate_operand" "m,?r")) (match_operand:XF 2 "register_operand" "0,0")]))] - "!TARGET_64BIT && TARGET_80387 && TARGET_USE_FIOP" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && TARGET_USE_FIOP" "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);" [(set (attr "type") (cond [(match_operand:XF 3 "mult_operator" "") @@ -15149,7 +15149,7 @@ (match_operator:XF 3 "binary_fp_operator" [(match_operand:XF 1 "register_operand" "0,0") (float:XF (match_operand:SI 2 "nonimmediate_operand" "m,?r"))]))] - "!TARGET_64BIT && TARGET_80387 && TARGET_USE_FIOP" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && TARGET_USE_FIOP" "* return which_alternative ? \"#\" : output_387_binary_op (insn, operands);" [(set (attr "type") (cond [(match_operand:XF 3 "mult_operator" "") @@ -15185,7 +15185,7 @@ (match_operator:XF 3 "binary_fp_operator" [(float_extend:XF (match_operand 1 "nonimmediate_operand" "fm,0")) (match_operand:XF 2 "register_operand" "0,f")]))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "* return output_387_binary_op (insn, operands);" [(set (attr "type") (cond [(match_operand:XF 3 "mult_operator" "") @@ -15218,7 +15218,7 @@ [(match_operand:XF 1 "register_operand" "0,f") (float_extend:XF (match_operand 2 "nonimmediate_operand" "fm,0"))]))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "* return output_387_binary_op (insn, operands);" [(set (attr "type") (cond [(match_operand:XF 3 "mult_operator" "") @@ -15253,7 +15253,7 @@ (match_operand 1 "register_operand" "0,f")) (float_extend:XF (match_operand 2 "nonimmediate_operand" "fm,0"))]))] - "!TARGET_64BIT && TARGET_80387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387" "* return output_387_binary_op (insn, operands);" [(set (attr "type") (cond [(match_operand:XF 3 "mult_operator" "") @@ -15419,7 +15419,7 @@ (define_insn "sqrtxf2" [(set (match_operand:XF 0 "register_operand" "=f") (sqrt:XF (match_operand:XF 1 "register_operand" "0")))] - "!TARGET_64BIT && TARGET_80387 && !TARGET_NO_FANCY_MATH_387 + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && !TARGET_NO_FANCY_MATH_387 && (TARGET_IEEE_FP || flag_unsafe_math_optimizations) " "fsqrt" [(set_attr "type" "fpspc") @@ -15440,7 +15440,7 @@ [(set (match_operand:XF 0 "register_operand" "=f") (sqrt:XF (float_extend:XF (match_operand:DF 1 "register_operand" "0"))))] - "!TARGET_64BIT && TARGET_80387 && !TARGET_NO_FANCY_MATH_387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && !TARGET_NO_FANCY_MATH_387" "fsqrt" [(set_attr "type" "fpspc") (set_attr "mode" "XF") @@ -15460,7 +15460,7 @@ [(set (match_operand:XF 0 "register_operand" "=f") (sqrt:XF (float_extend:XF (match_operand:SF 1 "register_operand" "0"))))] - "!TARGET_64BIT && TARGET_80387 && !TARGET_NO_FANCY_MATH_387" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && !TARGET_NO_FANCY_MATH_387" "fsqrt" [(set_attr "type" "fpspc") (set_attr "mode" "XF") @@ -15508,7 +15508,7 @@ (define_insn "sinxf2" [(set (match_operand:XF 0 "register_operand" "=f") (unspec:XF [(match_operand:XF 1 "register_operand" "0")] UNSPEC_SIN))] - "!TARGET_64BIT && TARGET_80387 && !TARGET_NO_FANCY_MATH_387 + "!TARGET_128BIT_LONG_DOUBLE && TARGET_80387 && !TARGET_NO_FANCY_MATH_387 && flag_unsafe_math_optimizations" "fsin" [(set_attr "type" "fpspc") @@ -15555,7 +15555,7 @@ (define_insn "cosxf2" [(set (match_operand:XF 0 "register_operand" "=f") (unspec:XF [(match_operand:XF 1 "register_operand" "0")] UNSPEC_COS))] - "!TARGET_64BIT && ! TARGET_NO_FANCY_MATH_387 && TARGET_80387 + "!TARGET_128BIT_LONG_DOUBLE && ! TARGET_NO_FANCY_MATH_387 && TARGET_80387 && flag_unsafe_math_optimizations" "fcos" [(set_attr "type" "fpspc") @@ -16975,7 +16975,7 @@ (if_then_else:XF (match_operand 1 "comparison_operator" "") (match_operand:XF 2 "register_operand" "") (match_operand:XF 3 "register_operand" "")))] - "!TARGET_64BIT && TARGET_CMOVE" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_CMOVE" "if (! ix86_expand_fp_movcc (operands)) FAIL; DONE;") (define_expand "movtfcc" @@ -16992,7 +16992,7 @@ [(reg 17) (const_int 0)]) (match_operand:XF 2 "register_operand" "f,0") (match_operand:XF 3 "register_operand" "0,f")))] - "!TARGET_64BIT && TARGET_CMOVE" + "!TARGET_128BIT_LONG_DOUBLE && TARGET_CMOVE" "@ fcmov%F1\t{%2, %0|%0, %2} fcmov%f1\t{%3, %0|%0, %3}" diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index b87d310..1a8f78d 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -8242,22 +8242,33 @@ the published application binary interface specifications for the 386 and will not be binary compatible with structures in code compiled without that switch. +@item -m96bit-long-double @item -m128bit-long-double +@opindex m96bit-long-double @opindex m128bit-long-double -Control the size of @code{long double} type. i386 application binary interface -specify the size to be 12 bytes, while modern architectures (Pentium and newer) -prefer @code{long double} aligned to 8 or 16 byte boundary. This is -impossible to reach with 12 byte long doubles in the array accesses. +These switches control the size of @code{long double} type. The i386 +application binary interface specifies the size to be 96 bits, +so @option{-m96bit-long-double} is the default in 32 bit mode. + +Modern architectures (Pentium and newer) would prefer @code{long double} +to be aligned to an 8 or 16 byte boundary. In arrays or structures +conforming to the ABI, this would not be possible. So specifying a +@option{-m128bit-long-double} will align @code{long double} +to a 16 byte boundary by padding the @code{long double} with an additional +32 bit zero. + +In the x86-64 compiler, @option{-m128bit-long-double} is the default choice as +its ABI specifies that @code{long double} is to be aligned on 16 byte boundary. + +Notice that neither of these options enable any extra precision over the x87 +standard of 80 bits for a @code{long double}. -@strong{Warning:} if you use the @option{-m128bit-long-double} switch, the +@strong{Warning:} if you override the default value for your target ABI, the structures and arrays containing @code{long double} will change their size as well as function calling convention for function taking @code{long double} -will be modified. +will be modified. Hence they will not be binary compatible with arrays or +structures in code compiled without that switch. -@item -m96bit-long-double -@opindex m96bit-long-double -Set the size of @code{long double} to 96 bits as required by the i386 -application binary interface. This is the default. @item -msvr3-shlib @itemx -mno-svr3-shlib |