ia64.md

来自「linux下编程用 编译软件」· Markdown 代码 · 共 2,017 行 · 第 1/5 页

MD
2,017
字号
  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (reg:DI 1) (match_operand 1 "sdata_symbolic_operand" "s")))]  "reload_completed"  "addl %0 = @gprel(%1), gp"  [(set_attr "itanium_class" "ialu")])(define_insn "*gprel64_offset"  [(set (match_operand:DI 0 "register_operand" "=r")	(minus:DI (match_operand:DI 1 "symbolic_operand" "") (reg:DI 1)))]  "reload_completed"  "movl %0 = @gprel(%1)"  [(set_attr "itanium_class" "long_i")])(define_expand "load_gprel64"  [(set (match_operand:DI 0 "register_operand" "")	(minus:DI (match_operand:DI 1 "symbolic_operand" "") (match_dup 2)))   (set (match_dup 0)	(plus:DI (match_dup 2) (match_dup 0)))]  "reload_completed"{  operands[2] = pic_offset_table_rtx;});; This is used as a placeholder for the return address during early;; compilation.  We won't know where we've placed this until during;; reload, at which point it can wind up in b0, a general register,;; or memory.  The only safe destination under these conditions is a;; general register.(define_insn_and_split "*movdi_ret_addr"  [(set (match_operand:DI 0 "register_operand" "=r")	(unspec:DI [(const_int 0)] UNSPEC_RET_ADDR))]  ""  "#"  "reload_completed"  [(const_int 0)]{  ia64_split_return_addr_rtx (operands[0]);  DONE;}  [(set_attr "itanium_class" "ialu")])(define_insn "*load_symptr_high"  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (high:DI (match_operand 1 "got_symbolic_operand" "s"))		 (match_operand:DI 2 "register_operand" "a")))]  "reload_completed"{  if (HAVE_AS_LTOFFX_LDXMOV_RELOCS)    return "%,addl %0 = @ltoffx(%1), %2";  else    return "%,addl %0 = @ltoff(%1), %2";}  [(set_attr "itanium_class" "ialu")])(define_insn "*load_symptr_low"  [(set (match_operand:DI 0 "register_operand" "=r")	(lo_sum:DI (match_operand:DI 1 "register_operand" "r")		   (match_operand 2 "got_symbolic_operand" "s")))]  "reload_completed"{  if (HAVE_AS_LTOFFX_LDXMOV_RELOCS)    return "%,ld8.mov %0 = [%1], %2";  else    return "%,ld8 %0 = [%1]";}  [(set_attr "itanium_class" "ld")])(define_insn_and_split "load_dtpmod"  [(set (match_operand:DI 0 "register_operand" "=r")	(unspec:DI [(match_operand 1 "tls_symbolic_operand" "")]		   UNSPEC_DTPMOD))]  ""  "#"  "reload_completed"  [(set (match_dup 0)	(plus:DI (unspec:DI [(match_dup 1)] UNSPEC_LTOFF_DTPMOD)		 (match_dup 2)))   (set (match_dup 0) (match_dup 3))]{  operands[2] = pic_offset_table_rtx;  operands[3] = gen_const_mem (DImode, operands[0]);})(define_insn "*load_ltoff_dtpmod"  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")]			    UNSPEC_LTOFF_DTPMOD)		 (match_operand:DI 2 "register_operand" "a")))]  "reload_completed"  "addl %0 = @ltoff(@dtpmod(%1)), %2"  [(set_attr "itanium_class" "ialu")])(define_expand "load_dtprel"  [(set (match_operand:DI 0 "register_operand" "")	(unspec:DI [(match_operand 1 "tls_symbolic_operand" "")]		   UNSPEC_DTPREL))]  ""  "")(define_insn "*load_dtprel64"  [(set (match_operand:DI 0 "register_operand" "=r")	(unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")]		   UNSPEC_DTPREL))]  "TARGET_TLS64"  "movl %0 = @dtprel(%1)"  [(set_attr "itanium_class" "long_i")])(define_insn "*load_dtprel22"  [(set (match_operand:DI 0 "register_operand" "=r")	(unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")]		   UNSPEC_DTPREL))]  ""  "addl %0 = @dtprel(%1), r0"  [(set_attr "itanium_class" "ialu")])(define_insn_and_split "*load_dtprel_gd"  [(set (match_operand:DI 0 "register_operand" "=r")	(unspec:DI [(match_operand 1 "tls_symbolic_operand" "")]		   UNSPEC_DTPREL))]  ""  "#"  "reload_completed"  [(set (match_dup 0)	(plus:DI (unspec:DI [(match_dup 1)] UNSPEC_LTOFF_DTPREL)		 (match_dup 2)))   (set (match_dup 0) (match_dup 3))]{  operands[2] = pic_offset_table_rtx;  operands[3] = gen_const_mem (DImode, operands[0]);})(define_insn "*load_ltoff_dtprel"  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (unspec:DI [(match_operand 1 "tls_symbolic_operand" "")]			    UNSPEC_LTOFF_DTPREL)		 (match_operand:DI 2 "register_operand" "a")))]  ""  "addl %0 = @ltoff(@dtprel(%1)), %2"  [(set_attr "itanium_class" "ialu")])(define_expand "add_dtprel"  [(set (match_operand:DI 0 "register_operand" "")	(plus:DI (unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")]			    UNSPEC_DTPREL)		 (match_operand:DI 2 "register_operand" "")))]  "!TARGET_TLS64"  "")(define_insn "*add_dtprel14"  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")]			    UNSPEC_DTPREL)		 (match_operand:DI 2 "register_operand" "r")))]  "TARGET_TLS14"  "adds %0 = @dtprel(%1), %2"  [(set_attr "itanium_class" "ialu")])(define_insn "*add_dtprel22"  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (unspec:DI [(match_operand 1 "ld_tls_symbolic_operand" "")]			    UNSPEC_DTPREL)		 (match_operand:DI 2 "register_operand" "a")))]  "TARGET_TLS22"  "addl %0 = @dtprel(%1), %2"  [(set_attr "itanium_class" "ialu")])(define_expand "load_tprel"  [(set (match_operand:DI 0 "register_operand" "")	(unspec:DI [(match_operand 1 "tls_symbolic_operand" "")]		   UNSPEC_TPREL))]  ""  "")(define_insn "*load_tprel64"  [(set (match_operand:DI 0 "register_operand" "=r")	(unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")]		   UNSPEC_TPREL))]  "TARGET_TLS64"  "movl %0 = @tprel(%1)"  [(set_attr "itanium_class" "long_i")])(define_insn "*load_tprel22"  [(set (match_operand:DI 0 "register_operand" "=r")	(unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")]		   UNSPEC_TPREL))]  ""  "addl %0 = @tprel(%1), r0"  [(set_attr "itanium_class" "ialu")])(define_insn_and_split "*load_tprel_ie"  [(set (match_operand:DI 0 "register_operand" "=r")	(unspec:DI [(match_operand 1 "ie_tls_symbolic_operand" "")]		   UNSPEC_TPREL))]  ""  "#"  "reload_completed"  [(set (match_dup 0)	(plus:DI (unspec:DI [(match_dup 1)] UNSPEC_LTOFF_TPREL)		 (match_dup 2)))   (set (match_dup 0) (match_dup 3))]{  operands[2] = pic_offset_table_rtx;  operands[3] = gen_const_mem (DImode, operands[0]);})(define_insn "*load_ltoff_tprel"  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (unspec:DI [(match_operand 1 "ie_tls_symbolic_operand" "")]			    UNSPEC_LTOFF_TPREL)		 (match_operand:DI 2 "register_operand" "a")))]  ""  "addl %0 = @ltoff(@tprel(%1)), %2"  [(set_attr "itanium_class" "ialu")])(define_expand "add_tprel"  [(set (match_operand:DI 0 "register_operand" "")	(plus:DI (unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")]			    UNSPEC_TPREL)		 (match_operand:DI 2 "register_operand" "")))]  "!TARGET_TLS64"  "")(define_insn "*add_tprel14"  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")]			    UNSPEC_TPREL)		 (match_operand:DI 2 "register_operand" "r")))]  "TARGET_TLS14"  "adds %0 = @tprel(%1), %2"  [(set_attr "itanium_class" "ialu")])(define_insn "*add_tprel22"  [(set (match_operand:DI 0 "register_operand" "=r")	(plus:DI (unspec:DI [(match_operand 1 "le_tls_symbolic_operand" "")]			    UNSPEC_TPREL)		 (match_operand:DI 2 "register_operand" "a")))]  "TARGET_TLS22"  "addl %0 = @tprel(%1), %2"  [(set_attr "itanium_class" "ialu")]);; With no offsettable memory references, we've got to have a scratch;; around to play with the second word.  However, in order to avoid a;; reload nightmare we lie, claim we don't need one, and fix it up;; in ia64_split_tmode_move.(define_expand "movti"  [(set (match_operand:TI 0 "general_operand" "")	(match_operand:TI 1 "general_operand" ""))]  ""{  rtx op1 = ia64_expand_move (operands[0], operands[1]);  if (!op1)    DONE;  operands[1] = op1;})(define_insn_and_split "*movti_internal"  [(set (match_operand:TI 0 "destination_operand" "=r,   *fm,*x,*f,  Q")	(match_operand:TI 1 "general_operand"     "r*fim,r,  Q, *fOQ,*f"))]  "ia64_move_ok (operands[0], operands[1])"  "@   #   #   ldfp8 %X0 = %1%P1   #   #"  "reload_completed && !ia64_load_pair_ok(operands[0], operands[1])"  [(const_int 0)]{  ia64_split_tmode_move (operands);  DONE;}  [(set_attr "itanium_class" "unknown,unknown,fldp,unknown,unknown")]);; Floating Point Moves;;;; Note - Patterns for SF mode moves are compulsory, but;; patterns for DF are optional, as GCC can synthesize them.(define_expand "movsf"  [(set (match_operand:SF 0 "general_operand" "")	(match_operand:SF 1 "general_operand" ""))]  ""{  rtx op1 = ia64_expand_move (operands[0], operands[1]);  if (!op1)    DONE;  operands[1] = op1;})(define_insn "*movsf_internal"  [(set (match_operand:SF 0 "destination_operand" "=f,f, Q,*r, f,*r,*r, m")	(match_operand:SF 1 "general_operand"     "fG,Q,fG,fG,*r,*r, m,*r"))]  "ia64_move_ok (operands[0], operands[1])"  "@   mov %0 = %F1   ldfs %0 = %1%P1   stfs %0 = %F1%P0   getf.s %0 = %F1   setf.s %0 = %1   mov %0 = %1   ld4%O1 %0 = %1%P1   st4%Q0 %0 = %1%P0"  [(set_attr "itanium_class" "fmisc,fld,stf,frfr,tofr,ialu,ld,st")])(define_expand "movdf"  [(set (match_operand:DF 0 "general_operand" "")	(match_operand:DF 1 "general_operand" ""))]  ""{  rtx op1 = ia64_expand_move (operands[0], operands[1]);  if (!op1)    DONE;  operands[1] = op1;})(define_insn "*movdf_internal"  [(set (match_operand:DF 0 "destination_operand" "=f,f, Q,*r, f,*r,*r, m")	(match_operand:DF 1 "general_operand"     "fG,Q,fG,fG,*r,*r, m,*r"))]  "ia64_move_ok (operands[0], operands[1])"  "@   mov %0 = %F1   ldfd %0 = %1%P1   stfd %0 = %F1%P0   getf.d %0 = %F1   setf.d %0 = %1   mov %0 = %1   ld8%O1 %0 = %1%P1   st8%Q0 %0 = %1%P0"  [(set_attr "itanium_class" "fmisc,fld,stf,frfr,tofr,ialu,ld,st")]);; With no offsettable memory references, we've got to have a scratch;; around to play with the second word if the variable winds up in GRs.(define_expand "movxf"  [(set (match_operand:XF 0 "general_operand" "")	(match_operand:XF 1 "general_operand" ""))]  ""{  if (ia64_expand_movxf_movrf (XFmode, operands))    DONE;});; ??? There's no easy way to mind volatile acquire/release semantics.(define_insn "*movxf_internal"  [(set (match_operand:XF 0 "destination_operand" "=f,f, m")	(match_operand:XF 1 "general_operand"     "fG,m,fG"))]  "ia64_move_ok (operands[0], operands[1])"  "@   mov %0 = %F1   ldfe %0 = %1%P1   stfe %0 = %F1%P0"  [(set_attr "itanium_class" "fmisc,fld,stf")]);; Same as for movxf, but for RFmode.(define_expand "movrf"  [(set (match_operand:RF 0 "general_operand" "")	(match_operand:RF 1 "general_operand" ""))]  ""{  if (ia64_expand_movxf_movrf (RFmode, operands))    DONE;})(define_insn "*movrf_internal"  [(set (match_operand:RF 0 "destination_operand" "=f,f, m")	(match_operand:RF 1 "general_operand"     "fG,m,fG"))]  "ia64_move_ok (operands[0], operands[1])"  "@   mov %0 = %F1   ldf.fill %0 = %1%P1   stf.spill %0 = %F1%P0"  [(set_attr "itanium_class" "fmisc,fld,stf")]);; Better code generation via insns that deal with TFmode register pairs;; directly.  Same concerns apply as for TImode.(define_expand "movtf"  [(set (match_operand:TF 0 "general_operand" "")	(match_operand:TF 1 "general_operand" ""))]  ""{  rtx op1 = ia64_expand_move (operands[0], operands[1]);  if (!op1)    DONE;  operands[1] = op1;})(define_insn_and_split "*movtf_internal"  [(set (match_operand:TF 0 "destination_operand"  "=r,r,m")	(match_operand:TF 1 "general_operand"      "ri,m,r"))]  "ia64_move_ok (operands[0], operands[1])"  "#"  "reload_completed"  [(const_int 0)]{  ia64_split_tmode_move (operands);  DONE;}  [(set_attr "itanium_class" "unknown")   (set_attr "predicable" "no")]);; ::::::::::::::::::::;; ::

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?