On Tue, Sep 17, 2013 at 10:41 AM, Ilya Enkovich <enkovich....@gmail.com> wrote:
>> >> The x86 part looks mostly OK (I have a couple of comments bellow), but >> >> please first get target-independent changes reviewed and committed. >> > >> > Do you mean I should move bound type and mode declaration into a separate >> > patch? >> >> Yes, target-independent part (middle end) has to go through the >> separate review to check if this part is OK. The target-dependent part >> uses the infrastructure from the middle end, so it can go into the >> code base only after target-independent parts are committed. > > I sent a separate patch for bound type and mode class > (http://gcc.gnu.org/ml/gcc-patches/2013-09/msg01268.html). Here is target > part of the patch with fixes you mentioned. Does it look OK? > > Bootstrapped and checked on linux-x86_64. Still shows incorrect length > attribute computation (described here > http://gcc.gnu.org/ml/gcc/2013-07/msg00311.html). Please look at the attached patch that solves length computation problem. The patch also implements length calculation in a generic way, as proposed earlier. The idea is to calculate total insn length via generic "length" attribute calculation from "length_nobnd" attribute, but iff length_attribute is non-null. This way, we are able to decorate bnd-prefixed instructions by "lenght_nobnd" attribute, and generic part will automatically call ix86_bnd_prefixed_insn_p predicate with current insn pattern. I also belive that this approach is most flexible to decorate future patterns. The patch adds new attribute to a couple of patterns to illustrate its usage. Please test this approach. Modulo length calculations, improved by the patch in this message, I have no further comments, but please repost complete (target part) of your patch. Uros.
Index: config/i386/i386.md =================================================================== --- config/i386/i386.md (revision 202953) +++ config/i386/i386.md (working copy) @@ -562,12 +562,19 @@ ] (const_int 1))) +;; When this attribute is set, calculate total insn length from +;; length_nobnd attribute, prefixed with eventual bnd prefix byte +(define_attr "length_nobnd" "" (const_int 0)) + ;; The (bounding maximum) length of an instruction in bytes. ;; ??? fistp and frndint are in fact fldcw/{fistp,frndint}/fldcw sequences. ;; Later we may want to split them and compute proper length as for ;; other insns. (define_attr "length" "" - (cond [(eq_attr "type" "other,multi,fistp,frndint") + (cond [(eq_attr "length_nobnd" "!0") + (plus (symbol_ref ("ix86_bnd_prefixed_insn_p (insn)")) + (attr "length_nobnd")) + (eq_attr "type" "other,multi,fistp,frndint") (const_int 16) (eq_attr "type" "fcmp") (const_int 4) @@ -10683,7 +10690,7 @@ "%+j%C1\t%l0" [(set_attr "type" "ibr") (set_attr "modrm" "0") - (set (attr "length") + (set (attr "length_nobnd") (if_then_else (and (ge (minus (match_dup 0) (pc)) (const_int -126)) (lt (minus (match_dup 0) (pc)) @@ -10701,7 +10708,7 @@ "%+j%c1\t%l0" [(set_attr "type" "ibr") (set_attr "modrm" "0") - (set (attr "length") + (set (attr "length_nobnd") (if_then_else (and (ge (minus (match_dup 0) (pc)) (const_int -126)) (lt (minus (match_dup 0) (pc)) @@ -11623,7 +11630,7 @@ [(simple_return)] "reload_completed" "ret" - [(set_attr "length" "1") + [(set_attr "length_nobnd" "1") (set_attr "atom_unit" "jeu") (set_attr "length_immediate" "0") (set_attr "modrm" "0")])