gcc源代码分析,insn_extract()函数和recog_operand[]数组的关系

关于PATTERN (insn),在emit_call_insn()函数里面的make_insn_raw ()函数里就被赋值了。

/* The body of an insn.  */
#define PATTERN(INSN)    ((INSN)->fld[3].rtx)。


(call_insn 7 6 9 (set (reg:SI 0)
       (call (mem:QI (symbol_ref/v:SI ("printf")))
           (const_int 4))) -1 (nil)
   (nil))


recog_operand[0]意思是reg

recog_operand[1]意思是mem

recog_operand[2]意思是const_int


Insn-recog.c:23
rtx *recog_operand_loc[MAX_RECOG_OPERANDS];


VOID

extract_140 (insn)
     rtx insn;
{
  recog_operand[0] = *(recog_operand_loc[0]
    = &XEXP (insn, 0));
  recog_operand[1] = *(recog_operand_loc[1]
    = &XEXP (XEXP (insn, 1), 0));
  recog_operand[2] = *(recog_operand_loc[2]
    = &XEXP (XEXP (insn, 1), 1));

}



VOID (*insn_extract_fn[]) () =
{ extract_0, extract_1, extract_2, extract_3,
  extract_4, extract_5, extract_6, extract_7,
  extract_8, extract_9, extract_10, extract_11,
  extract_12, extract_13, extract_14, extract_15,
  extract_16, extract_17, extract_18, extract_19,
  extract_20, extract_21, extract_22, extract_23,
  extract_24, extract_25, extract_26, extract_27,
  extract_28, extract_29, extract_30, extract_31,
  extract_32, extract_33, extract_34, extract_35,
  extract_36, extract_37, extract_38, extract_39,
  extract_40, extract_41, extract_42, extract_43,
  extract_44, extract_45, extract_46, extract_47,
  extract_48, extract_49, extract_50, extract_51,
  extract_52, extract_53, extract_54, extract_55,
  extract_56, extract_57, extract_58, extract_59,
  extract_60, extract_61, extract_62, extract_63,
  extract_64, extract_65, extract_66, extract_67,
  extract_68, extract_69, extract_70, extract_71,
  extract_72, extract_73, extract_74, extract_75,
  extract_76, extract_77, extract_78, extract_79,
  extract_80, extract_81, extract_82, extract_83,
  extract_84, extract_85, extract_86, extract_87,
  extract_88, extract_89, extract_90, extract_91,
  extract_92, extract_93, extract_94, extract_95,
  extract_96, extract_97, extract_98, extract_99,
  extract_100, extract_101, extract_102, extract_103,
  extract_104, extract_105, extract_106, extract_107,
  extract_108, extract_109, extract_110, extract_111,
  extract_112, extract_113, extract_114, extract_115,
  extract_116, extract_117, extract_118, extract_119,
  extract_120, extract_121, extract_122, extract_123,
  extract_124, extract_125, extract_126, extract_127,
  extract_128, extract_129, extract_130, extract_131,
  extract_132, extract_133, extract_134, extract_135,
  extract_136, extract_137, extract_138, extract_139,
  extract_140, extract_141
};

void fatal_insn_not_found ();

void
insn_extract (insn)
     rtx insn;
{
  if (INSN_CODE (insn) == -1) fatal_insn_not_found (insn);
  (*insn_extract_fn[INSN_CODE (insn)]) ( PATTERN (insn));
}

你可能感兴趣的:(gcc,源代码,分析)