Hi
I am working on IA-64 and GCC-4.1.1
I modify ia64.md to support tnat instruction. More specifically, I add
the following define_insn:
        
        (define_insn "shift_tnat"
          [(set (match_operand:BI 0 "register_operand" "=c")
                (unspec:BI [(match_operand:DI 1 "gr_register_operand" "r")]
                           UNSPEC_TNAT))]
          ""
          "tnat.nz %0, %I0 = %1"
          [(set_attr "itanium_class" "tnat")])

add one line in
        define_attr "type" "unknown,A,I,M,F,B,L,X,S"
thus:
        ;; chk_s has an I and an M form; use type A for convenience.
        (define_attr "type" "unknown,A,I,M,F,B,L,X,S"
          (cond [(eq_attr "itanium_class" "ld,st,fld,fldp,stf,sem,nop_m")
(const_string "M")
                 (eq_attr "itanium_class" "rse_m,syst_m,syst_m0") (const_string 
"M")
                 (eq_attr "itanium_class" "frar_m,toar_m,frfr,tofr") 
(const_string "M")
                 (eq_attr "itanium_class" "lfetch") (const_string "M")
                 (eq_attr "itanium_class" "chk_s,ialu,icmp,ilog,mmalua") 
(const_string "A")
                 (eq_attr "itanium_class" "fmisc,fmac,fcmp,xmpy") (const_string 
"F")
                 (eq_attr "itanium_class" "fcvtfx,nop_f") (const_string "F")
                 (eq_attr "itanium_class" "tnat") (const_string "I")
                ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ tnat instruction is 
emit
on Integer unit.
                 (eq_attr "itanium_class" "frar_i,toar_i,frbr,tobr") 
(const_string "I")
                 (eq_attr "itanium_class" "frpr,topr,ishf,xtd,tbit") 
(const_string "I")
                 (eq_attr "itanium_class" "mmmul,mmshf,mmshfi,nop_i") 
(const_string "I")
                 (eq_attr "itanium_class" "br,scall,nop_b") (const_string "B")
                 (eq_attr "itanium_class" "stop_bit") (const_string "S")
                 (eq_attr "itanium_class" "nop_x") (const_string "X")
                 (eq_attr "itanium_class" "long_i") (const_string "L")]
                (const_string "unknown")))

and one value in attribute "itanium_class"
thus:
        (define_attr "itanium_class" 
"unknown,ignore,stop_bit,br,fcmp,fcvtfx,fld,
                
fldp,fmac,fmisc,frar_i,frar_m,frbr,frfr,frpr,ialu,icmp,ilog,ishf,
                
ld,chk_s,tnat,long_i,mmalua,mmmul,mmshf,mmshfi,rse_m,scall,sem,stf,
                                ~~~~
                st,syst_m0, 
syst_m,tbit,toar_i,toar_m,tobr,tofr,topr,xmpy,xtd,nop,
                nop_b,nop_f,nop_i,nop_m,nop_x,lfetch,pre_cycle"
          (const_string "unknown"))
        
I also modify ia64.c to support UNSPEC_TNAT, in function rtx_needs_barrier.
        case UNSPEC_FR_SPILL:
        case UNSPEC_FR_RESTORE:
        case UNSPEC_GETF_EXP:
        case UNSPEC_SETF_EXP:
            case UNSPEC_ADDP4:
            case UNSPEC_FR_SQRT_RECIP_APPROX:
             case UNSPEC_TNAT:           /* support tnat instruction */
            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
            if(XINT(x, 1) == UNSPEC_TNAT)
           {
               print_rtl_single (stderr, x);
               fflush(stderr);
           }

          need_barrier = rtx_needs_barrier (XVECEXP (x, 0, 0), flags, pred);
          break;
However, when I use the new GCC to compile the following function
        
        long      ga[20] = {0, };
        int        gb[20] = {0, };
        char     gc[20] = {0, };
        short    gd[20] = {0, };
        
        void test_leaf_function()
        {
          fprintf(stderr, "in function test_leaf_function\n");
        
          if(ga[0] != 0)
          {
            ga[0] = 20;
            ga[0] = gd[1];
          }
        
          ga[0] = 100;
          ga[0] = 0;
        
          if (gb[0] != 5)
            ga[0] = gb[0];
          else
            ga[0] = gb[1];
        
          ga[3] = ga[2]+gc[1];
        
          gc[0] = 0;
          gd[0] = 0;
        }
        

it reports the error:
        error insn:
        (insn 163 185 312 0 giftlib_test.c:90 (set (reg:BI 263 p7)
                (unspec:BI [
                        (reg/f:DI 14 r14 [376])
                    ] 32)) 300 {shift_tnat} (insn_list:REG_DEP_ANTI 187
(insn_list:REG_DEP_ANTI 178 (insn_list:REG_DEP_ANTI 179
(insn_list:REG_DEP_ANTI 181 (insn_list:REG_DEP_ANTI 186
(insn_list:REG_DEP_OUTPUT 176 (insn_list:REG_DEP_TRUE 77 (nil))))))))
            (nil))
        giftlib_test.c: In function  "foo"
        giftlib_test.c:99: internal compiler error: in bundling, at
config/ia64/ia64.c:7457
        Please submit a full bug report,
        with preprocessed source if appropriate.
        See <URL:http://gcc.gnu.org/bugs.html> for instructions.
        
I follow the error at ia64.c: 7457,  a assertion fails
        /* Move the position backward in the window.  Group barrier has
                 no slot.  Asm insn takes all bundle.  */
              if (INSN_CODE (insn) != CODE_FOR_insn_group_barrier
                  && GET_CODE (PATTERN (insn)) != ASM_INPUT
                  && asm_noperands (PATTERN (insn)) < 0)
                pos--;
              /* Long insn takes 2 slots.  */
              if (ia64_safe_type (insn) == TYPE_L)
                pos--;
        
              if(pos < 0)
              {
                fprintf(stderr, "error insn:\n");
                print_rtl_single (stderr, insn);
              }
        
              gcc_assert (pos >= 0);
            ~~~~~~~~~~~~~~~~~~~~~~~~
        
I have no idea about this error. Is there any thing I miss to support
the tnat instruction ?


Any help is truly appreciated.

Thanks

Reply via email to