public inbox for gcc@gcc.gnu.org
 help / color / mirror / Atom feed
From: "Paulo J. Matos" <paulo@matos-sorge.com>
To: gcc@gcc.gnu.org
Subject: Re: Expanding instructions with condition codes inter-deps
Date: Fri, 21 Oct 2011 21:42:00 -0000	[thread overview]
Message-ID: <j7s9am$tp3$1@dough.gmane.org> (raw)
In-Reply-To: <09787EF419216C41A903FD14EE5506DD030CD64EDB@AUSX7MCPC103.AMER.DELL.COM>

On 19/10/11 01:48, Paul_Koning@Dell.com wrote:
>> From: gcc-owner@gcc.gnu.org [mailto:gcc-owner@gcc.gnu.org] On Behalf Of Richard Henderson
>> On 10/17/2011 03:50 AM, Paulo J. Matos wrote:
>>> ...
>>> (for example, it would be ok to output negqi2, xorqi3 and
>>> addc_internal since xorqi3 only sets N and Z, not the Carry bit)
>>
>> For that you'd have to model all of the flags bits independently.
>> I don't believe any target has found that level of complexity to be worth the trouble.
>
> Something like that shows up in the pdp11, where "mov" does not touch C.  And C matters for multi-word arithmetic, and also for unsigned compares.  So I think a CCmode implementation there would  model C separately from the other three flag bits.  So not 4 separate elements but two.  Right now it's a cc0 target but I figure on changing that at some point.  The reasons Paulo mentioned are one of the main reasons for that.
>
> 	paul
>
>

I have several CC modes depending on which flags are set by each 
instruction:
CC - all flags set
CC_C - Carry flag set
CC_NZ - Negative and Zero flags set

For neghi2 mode which transforms into an xor, nadd and addc in my arch I 
need to establish that the addc adds the carry produced by the nadd.

So I have implemented the nadd and addc as:

(define_insn "negqi2"
   [(set (match_operand:QI 0 "register_operand" "=c")
         (neg:QI (match_operand:QI 1 "register_operand" "0")))
    (set (reg:CC_C RCC) (eq (match_dup 1) (const_int 0)))
    (clobber (reg:CC RCC))]
   ""
{
     operands[2] = const0_rtx;
     return  "nadd\\t%0,%2";
})

(define_insn "*negqi2_flags"
   [(set (match_operand:QI 0 "register_operand" "=c")
         (neg:QI (match_operand:QI 1 "register_operand" "0")))
    (set (reg RCC)
         (compare (neg:QI (match_dup 1))
                  (const_int 0)))]
   "reload_completed && xap_match_ccmode(insn, CCmode)"
{
     operands[2] = const0_rtx;
     return  "nadd\\t%0,%2";
})

(define_insn "addc_internal"
   [(set (match_operand:QI 0 "nonimmediate_operand" "=c")
         (plus:QI
           (plus:QI
             (ltu:QI (reg:CC RCC) (const_int 0))
             (match_operand:QI 1 "nonimmediate_operand" "%0"))
           (match_operand:QI 2 "general_operand" "cwmi")))
    (use (reg:CC_C RCC))
    (clobber (reg:CC RCC))]
   ""
   "addc\\t%0,%f2")

(define_insn "*addc_internal_flags"
   [(set (match_operand:QI 0 "nonimmediate_operand" "=c")
         (plus:QI
           (plus:QI
             (ltu:QI (reg:CC RCC) (const_int 0))
             (match_operand:QI 1 "nonimmediate_operand" "%0"))
           (match_operand:QI 2 "general_operand" "cwmi")))
    (use (reg:CC_C RCC))
    (set (reg RCC)
         (compare
           (plus:QI
             (plus:QI
               (ltu:QI (reg:CC RCC) (const_int 0))
               (match_dup 1))
             (match_dup 2))
           (const_int 0)))]
   "reload_completed && xap_match_ccmode(insn, CCmode)"
   "addc\\t%0,%f2")

A couple of things to note:
* negqi (which generates the nadd x, y equivalent to -x + y) has a set 
RCC in C mode followed by a clobber. The set in C mode doesn't show up 
in the _flags variant which is used only for the compare-elim since it 
doesn't really matter and it already contains a set RCC anyway.
* the addc internal specifically says that it uses the RCC in C mode

Now, some things still remain a mistery:
* is this enough for GCC to understand that anything that clobbers RCC 
or specifically touches the RCC in C mode shouldn't go in between these 
two instructions? Also, do I need to specify in the RCC clobber, exactly 
which flags are clobbered, or should I use a set instead?
* in the case of using sets, it was easy in the case of the negqi of 
findind the source of the set RCC, however, it's not so easy for the 
general case. Is unspec the answer? Is unspec the way of saying: "hey, I 
am setting RCC in Cmode here, you shouldn't bother about the value that 
I put there. Just know that RCC is going to be set."

-- 
PMatos

  parent reply	other threads:[~2011-10-21 17:15 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-10-17 15:58 Paulo J. Matos
2011-10-17 17:23 ` Andrew Pinski
2011-10-18 13:44   ` Paulo J. Matos
2011-10-19  5:22 ` Richard Henderson
2011-10-19  5:45   ` Paul_Koning
     [not found]     ` <CAPOJ94M2XrqM_kG98v1dC1=K2fEkHpuNLSkZBrQyzJ9ncmaQXg@mail.gmail.com>
2011-10-21 20:57       ` Richard Henderson
2011-10-21 21:42     ` Paulo J. Matos [this message]
2011-10-22  0:13       ` Richard Henderson
2011-10-22  5:13         ` Peter Bigot
2011-10-22  5:21         ` Paul_Koning
2011-10-24  7:04           ` Richard Henderson
2011-10-24 12:12             ` Paulo J. Matos
2011-10-24 12:07         ` Paulo J. Matos
2011-10-20 12:46   ` Paulo J. Matos

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to='j7s9am$tp3$1@dough.gmane.org' \
    --to=paulo@matos-sorge.com \
    --cc=gcc@gcc.gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).