From mboxrd@z Thu Jan 1 00:00:00 1970 From: hjl@lucon.org (H.J. Lu) To: law@cygnus.com Cc: egcs@egcs.cygnus.com, john@feith.com Subject: Re: egcs-1.2 stuff Date: Wed, 31 Mar 1999 23:46:00 -0000 Message-ID: References: <20303.921863639@hurl.cygnus.com> X-SW-Source: 1999-03n/msg00684.html Message-ID: <19990331234600.u-hBxm00c2OfUE4WMLHI9dcmDkOqvg1S1FmcaIzofFo@z> > > > > In message < m10O2ic-000ErMC@ocean.lucon.org >you write: > > I enabled all TARGET_CMOVE and CC_FCOMI. I also optimized the fp > > cmove. > > > > What do you mean by that? I sent in patches months ago and you said > > you would take a look. What happened? > The FCOMI stuff I explicitly left with you and John to sort out. Last I > heard there were still technical problems with that patch. If you and John > think the patch is done, then send the final patch. > This is the latest patch I have been using. It seems ok. H.J. ---- Mon Jan 11 20:02:56 1999 H.J. Lu (hjl@gnu.org) * config/i386/i386.c (notice_update_cc): No need to check the INT mode for conditional moves since FLOAT conditional moves don't affect cc0. (output_fp_conditional_move): Abort for LT, LE, GE, and GT signed integer comparisons. (output_int_conditional_move): Use "enum rtx_code" for code type. (output_fp_cc0_set): Don't check the JUMP_INSN code for conditional move. * config/i386/i386.c (notice_update_cc, output_float_compare): Enable TARGET_CMOVE support. * config/i386/i386.c (output_float_compare): Fix the FLOAT comparison for IEEE math and CC_FCOMI. --- ../../../import/egcs/gcc/config/i386/i386.c Wed Jul 29 07:35:38 1998 +++ config/i386/i386.c Mon Jan 11 17:15:57 1999 @@ -3646,8 +3646,7 @@ notice_update_cc (exp) if (REG_P (SET_DEST (exp)) && (REG_P (SET_SRC (exp)) || GET_CODE (SET_SRC (exp)) == MEM || GET_RTX_CLASS (GET_CODE (SET_SRC (exp))) == '<' - || (GET_CODE (SET_SRC (exp)) == IF_THEN_ELSE - && GET_MODE_CLASS (GET_MODE (SET_DEST (exp))) == MODE_INT))) + || GET_CODE (SET_SRC (exp)) == IF_THEN_ELSE)) { if (cc_status.value1 && reg_overlap_mentioned_p (SET_DEST (exp), cc_status.value1)) @@ -3749,7 +3748,7 @@ notice_update_cc (exp) if (stack_regs_mentioned_p (SET_SRC (XVECEXP (exp, 0, 0)))) { cc_status.flags |= CC_IN_80387; - if (0 && TARGET_CMOVE && stack_regs_mentioned_p + if (TARGET_CMOVE && stack_regs_mentioned_p (XEXP (SET_SRC (XVECEXP (exp, 0, 0)), 1))) cc_status.flags |= CC_FCOMI; } @@ -4079,7 +4078,7 @@ output_float_compare (insn, operands) int unordered_compare = GET_MODE (SET_SRC (body)) == CCFPEQmode; rtx tmp; - if (0 && TARGET_CMOVE && STACK_REG_P (operands[1])) + if (TARGET_CMOVE && STACK_REG_P (operands[1])) { cc_status.flags |= CC_FCOMI; cc_prev_status.flags &= ~CC_TEST_AX; @@ -4113,7 +4112,8 @@ output_float_compare (insn, operands) { output_asm_insn (AS2 (fucomip,%y1,%0), operands); output_asm_insn (AS1 (fstp, %y0), operands); - return ""; + if (!TARGET_IEEE_FP) + return ""; } else output_asm_insn ("fucompp", operands); @@ -4124,7 +4124,8 @@ output_float_compare (insn, operands) { output_asm_insn (AS2 (fcomip, %y1,%0), operands); output_asm_insn (AS1 (fstp, %y0), operands); - return ""; + if (!TARGET_IEEE_FP) + return ""; } else output_asm_insn ("fcompp", operands); @@ -4154,7 +4155,8 @@ output_float_compare (insn, operands) else if (cc_status.flags & CC_FCOMI) { output_asm_insn (strcat (buf, AS2 (%z1,%y1,%0)), operands); - return ""; + if (!TARGET_IEEE_FP) + return ""; } else output_asm_insn (strcat (buf, AS1 (%z1,%y1)), operands); @@ -4178,17 +4180,19 @@ output_fp_cc0_set (insn) rtx next; enum rtx_code code; - xops[0] = gen_rtx_REG (HImode, 0); - output_asm_insn (AS1 (fnsts%W0,%0), xops); + if (!(cc_status.flags & CC_FCOMI)) + { + xops[0] = gen_rtx_REG (HImode, 0); + output_asm_insn (AS1 (fnsts%W0,%0), xops); + } if (! TARGET_IEEE_FP) { if (!(cc_status.flags & CC_REVERSED)) { next = next_cc0_user (insn); - - if (GET_CODE (next) == JUMP_INSN - && GET_CODE (PATTERN (next)) == SET + + if (GET_CODE (PATTERN (next)) == SET && SET_DEST (PATTERN (next)) == pc_rtx && GET_CODE (SET_SRC (PATTERN (next))) == IF_THEN_ELSE) code = GET_CODE (XEXP (SET_SRC (PATTERN (next)), 0)); @@ -4213,8 +4217,7 @@ output_fp_cc0_set (insn) if (next == NULL_RTX) abort (); - if (GET_CODE (next) == JUMP_INSN - && GET_CODE (PATTERN (next)) == SET + if (GET_CODE (PATTERN (next)) == SET && SET_DEST (PATTERN (next)) == pc_rtx && GET_CODE (SET_SRC (PATTERN (next))) == IF_THEN_ELSE) code = GET_CODE (XEXP (SET_SRC (PATTERN (next)), 0)); @@ -4237,61 +4240,103 @@ output_fp_cc0_set (insn) else abort (); - xops[0] = gen_rtx_REG (QImode, 0); + if (cc_status.flags & CC_FCOMI) + { + /* It is very tricky. We have to do it right. */ - switch (code) + xops [0] = gen_rtx_REG (QImode, 0); + + switch (code) + { + case GT: + case GE: + break; + + case LT: + output_asm_insn (AS1 (setb,%b0), xops); + output_asm_insn (AS1 (setp,%h0), xops); + output_asm_insn (AS2 (cmp%B0,%b0,%h0), xops); + break; + + case LE: + output_asm_insn (AS1 (setbe,%b0), xops); + output_asm_insn (AS1 (setnp,%h0), xops); + output_asm_insn (AS2 (xor%B0,%b0,%h0), xops); + break; + + case EQ: + case NE: + output_asm_insn (AS1 (setne,%b0), xops); + output_asm_insn (AS1 (setp,%h0), xops); + output_asm_insn (AS2 (or%B0,%b0,%h0), xops); + break; + + case GTU: + case LTU: + case GEU: + case LEU: + default: + abort (); + } + } + else { - case GT: - xops[1] = GEN_INT (0x45); - output_asm_insn (AS2 (and%B0,%1,%h0), xops); - /* je label */ - break; + xops[0] = gen_rtx_REG (QImode, 0); - case LT: - xops[1] = GEN_INT (0x45); - xops[2] = GEN_INT (0x01); - output_asm_insn (AS2 (and%B0,%1,%h0), xops); - output_asm_insn (AS2 (cmp%B0,%2,%h0), xops); - /* je label */ - break; + switch (code) + { + case GT: + xops[1] = GEN_INT (0x45); + output_asm_insn (AS2 (and%B0,%1,%h0), xops); + /* je label */ + break; - case GE: - xops[1] = GEN_INT (0x05); - output_asm_insn (AS2 (and%B0,%1,%h0), xops); - /* je label */ - break; + case LT: + xops[1] = GEN_INT (0x45); + xops[2] = GEN_INT (0x01); + output_asm_insn (AS2 (and%B0,%1,%h0), xops); + output_asm_insn (AS2 (cmp%B0,%2,%h0), xops); + /* je label */ + break; - case LE: - xops[1] = GEN_INT (0x45); - xops[2] = GEN_INT (0x40); - output_asm_insn (AS2 (and%B0,%1,%h0), xops); - output_asm_insn (AS1 (dec%B0,%h0), xops); - output_asm_insn (AS2 (cmp%B0,%2,%h0), xops); - /* jb label */ - break; + case GE: + xops[1] = GEN_INT (0x05); + output_asm_insn (AS2 (and%B0,%1,%h0), xops); + /* je label */ + break; - case EQ: - xops[1] = GEN_INT (0x45); - xops[2] = GEN_INT (0x40); - output_asm_insn (AS2 (and%B0,%1,%h0), xops); - output_asm_insn (AS2 (cmp%B0,%2,%h0), xops); - /* je label */ - break; + case LE: + xops[1] = GEN_INT (0x45); + xops[2] = GEN_INT (0x40); + output_asm_insn (AS2 (and%B0,%1,%h0), xops); + output_asm_insn (AS1 (dec%B0,%h0), xops); + output_asm_insn (AS2 (cmp%B0,%2,%h0), xops); + /* jb label */ + break; - case NE: - xops[1] = GEN_INT (0x44); - xops[2] = GEN_INT (0x40); - output_asm_insn (AS2 (and%B0,%1,%h0), xops); - output_asm_insn (AS2 (xor%B0,%2,%h0), xops); - /* jne label */ - break; + case EQ: + xops[1] = GEN_INT (0x45); + xops[2] = GEN_INT (0x40); + output_asm_insn (AS2 (and%B0,%1,%h0), xops); + output_asm_insn (AS2 (cmp%B0,%2,%h0), xops); + /* je label */ + break; - case GTU: - case LTU: - case GEU: - case LEU: - default: - abort (); + case NE: + xops[1] = GEN_INT (0x44); + xops[2] = GEN_INT (0x40); + output_asm_insn (AS2 (and%B0,%1,%h0), xops); + output_asm_insn (AS2 (xor%B0,%2,%h0), xops); + /* jne label */ + break; + + case GTU: + case LTU: + case GEU: + case LEU: + default: + abort (); + } } return ""; @@ -5196,6 +5241,13 @@ output_fp_conditional_move (which_altern int which_alternative; rtx operands[]; { + enum rtx_code code = GET_CODE (operands[1]); + + /* It should never happen. */ + if (!(cc_prev_status.flags & CC_IN_80387) + && (code == GT || code == LE || code == GE || code == LT)) + abort (); + switch (which_alternative) { case 0: @@ -5226,7 +5272,7 @@ output_int_conditional_move (which_alter int which_alternative; rtx operands[]; { - int code = GET_CODE (operands[1]); + enum rtx_code code = GET_CODE (operands[1]); enum machine_mode mode; rtx xops[4];