⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i386.md

📁 gcc编译工具没有什么特别
💻 MD
📖 第 1 页 / 共 5 页
字号:
  if (TARGET_ZERO_EXTEND_WITH_AND)    {      xops[0] = operands[0];      xops[1] = GEN_INT (0xffff);      if (i386_aligned_p (operands[1]))	output_asm_insn (AS2 (mov%L0,%k1,%k0),operands);      else	output_asm_insn (AS2 (mov%W0,%1,%w0),operands);      output_asm_insn (AS2 (and%L0,%1,%k0), xops);      RET;    }#ifdef INTEL_SYNTAX  return AS2 (movzx,%1,%0);#else  return AS2 (movz%W0%L0,%1,%0);#endif}")(define_split  [(set (match_operand:SI 0 "register_operand" "")	(zero_extend:SI (match_operand:HI 1 "nonimmediate_operand" "")))] "reload_completed && TARGET_ZERO_EXTEND_WITH_AND && !reg_overlap_mentioned_p (operands[0], operands[1])" [(set (match_dup 0)       (const_int 0))  (set (strict_low_part (match_dup 2))       (match_dup 1))] "operands[2] = gen_rtx_REG (HImode, true_regnum (operands[0]));")(define_split  [(set (match_operand:SI 0 "register_operand" "")	(zero_extend:SI (match_operand:HI 1 "memory_operand" "")))] "reload_completed && TARGET_ZERO_EXTEND_WITH_AND && reg_overlap_mentioned_p (operands[0], operands[1])" [(set (strict_low_part (match_dup 2))       (match_dup 1))  (set (match_dup 0)       (and:SI (match_dup 0)	       (const_int 65535)))]  "operands[2] = gen_rtx_REG (HImode, true_regnum (operands[0]));")(define_expand "zero_extendqihi2"  [(set (match_operand:HI 0 "register_operand" "")	(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))]  ""  "")(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=r")	(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "qm")))]  "optimize_size || (int)ix86_cpu == (int)PROCESSOR_PENTIUMPRO"  "*  return AS2 (movz%B0%W0,%1,%0);")(define_insn ""  [(set (match_operand:HI 0 "register_operand" "=q,&q,?r")	(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "0,qm,qm")))]  "! (optimize_size || (int)ix86_cpu == (int)PROCESSOR_PENTIUMPRO)"  "*  {  rtx xops[2];  if ((TARGET_ZERO_EXTEND_WITH_AND || REGNO (operands[0]) == 0)      && REG_P (operands[1])       && REGNO (operands[0]) == REGNO (operands[1]))    {      xops[0] = operands[0];      xops[1] = GEN_INT (0xff);      output_asm_insn (AS2 (and%L0,%1,%k0), xops);      RET;    }  if (TARGET_ZERO_EXTEND_WITH_AND && QI_REG_P (operands[0]))    {      if(!reg_overlap_mentioned_p(operands[0],operands[1]))	{	  output_asm_insn (AS2 (xor%L0,%k0,%k0), operands);	  output_asm_insn (AS2 (mov%B0,%1,%b0), operands);	}      else	{	  xops[0] = operands[0];	  xops[1] = GEN_INT (0xff);	  output_asm_insn (AS2 (mov%B0,%1,%b0),operands);	  output_asm_insn (AS2 (and%L0,%1,%k0), xops);	}      RET;    }  #ifdef INTEL_SYNTAX  return AS2 (movzx,%1,%0);#else  return AS2 (movz%B0%W0,%1,%0);#endif}")(define_split  [(set (match_operand:HI 0 "register_operand" "")	(zero_extend:HI (match_operand:QI 1 "nonimmediate_operand" "")))] "reload_completed && QI_REG_P (operands[0]) && TARGET_ZERO_EXTEND_WITH_AND  && !reg_overlap_mentioned_p (operands[0], operands[1])" [(set (match_dup 0)       (const_int 0))  (set (strict_low_part (match_dup 2))       (match_dup 1))] "operands[2] = gen_rtx_REG (QImode, REGNO (operands[0]));")(define_split  [(set (match_operand:HI 0 "register_operand" "")	(zero_extend:HI (match_operand:QI 1 "memory_operand" "")))] "reload_completed && QI_REG_P (operands[0]) && TARGET_ZERO_EXTEND_WITH_AND  && reg_overlap_mentioned_p (operands[0], operands[1])" [(set (strict_low_part (match_dup 2))       (match_dup 1))  (set (match_dup 0)       (and:HI (match_dup 0)	       (const_int 255)))] "operands[2] = gen_rtx_REG (QImode, REGNO (operands[0]));")(define_split  [(set (match_operand:HI 0 "register_operand" "")	(zero_extend:HI (match_operand:QI 1 "register_operand" "")))] "reload_completed && TARGET_ZERO_EXTEND_WITH_AND" [(set (match_dup 0)       (match_dup 2))  (set (match_dup 0)       (and:HI (match_dup 0)	       (const_int 255)))] "if (GET_CODE (operands[1]) == SUBREG && SUBREG_WORD (operands[1]) == 0)    operands[1] = SUBREG_REG (operands[1]);  if (GET_CODE (operands[0]) != REG || GET_CODE (operands[1]) != REG      || REGNO (operands[0]) == REGNO (operands[1]))    FAIL;  operands[2] = gen_rtx_REG (HImode, REGNO (operands[1]));")(define_expand "zero_extendqisi2"  [(set (match_operand:SI 0 "register_operand" "")	(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))]  ""  "")(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=r")	(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm")))]  "optimize_size || (int)ix86_cpu == (int)PROCESSOR_PENTIUMPRO"  "* return AS2 (movz%B0%L0,%1,%0);")(define_insn ""  [(set (match_operand:SI 0 "register_operand" "=q,&q,?r")	(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "0,qm,qm")))]  "! (optimize_size || (int)ix86_cpu == (int)PROCESSOR_PENTIUMPRO)"  "*  {  rtx xops[2];  if ((TARGET_ZERO_EXTEND_WITH_AND || REGNO (operands[0]) == 0)      && REG_P (operands[1])       && REGNO (operands[0]) == REGNO (operands[1]))    {      xops[0] = operands[0];      xops[1] = GEN_INT (0xff);      output_asm_insn (AS2 (and%L0,%1,%k0), xops);      RET;    }  if (TARGET_ZERO_EXTEND_WITH_AND && QI_REG_P (operands[0]))    {      if(!reg_overlap_mentioned_p (operands[0], operands[1]))	{	  output_asm_insn (AS2 (xor%L0,%0,%0),operands);	  output_asm_insn (AS2 (mov%B0,%1,%b0),operands);	}      else	{	  xops[0] = operands[0];	  xops[1] = GEN_INT (0xff);	  output_asm_insn (AS2 (mov%B0,%1,%b0), operands);	  output_asm_insn (AS2 (and%L0,%1,%k0), xops);	}      RET;    }  if (TARGET_ZERO_EXTEND_WITH_AND && GET_CODE (operands[1]) == REG)    {      xops[0] = operands[0];      xops[1] = GEN_INT (0xff);      operands[1] = gen_rtx_REG (SImode, REGNO (operands[1]));      output_asm_insn (AS2 (mov%L0,%1,%0), operands);      output_asm_insn (AS2 (and%L0,%1,%k0), xops);      RET;    }#ifdef INTEL_SYNTAX  return AS2 (movzx,%1,%0);#else  return AS2 (movz%B0%L0,%1,%0);#endif}")(define_split  [(set (match_operand:SI 0 "register_operand" "")	(zero_extend:SI (match_operand:QI 1 "nonimmediate_operand" "")))] "reload_completed && QI_REG_P (operands[0]) && TARGET_ZERO_EXTEND_WITH_AND  && !reg_overlap_mentioned_p (operands[0], operands[1])" [(set (match_dup 0)       (const_int 0))  (set (strict_low_part (match_dup 2))       (match_dup 1))] "operands[2] = gen_rtx_REG (QImode, REGNO (operands[0]));")(define_split  [(set (match_operand:SI 0 "register_operand" "")	(zero_extend:SI (match_operand:QI 1 "memory_operand" "")))] "reload_completed && QI_REG_P (operands[0]) && TARGET_ZERO_EXTEND_WITH_AND  && reg_overlap_mentioned_p (operands[0], operands[1])" [(set (strict_low_part (match_dup 2))       (match_dup 1))  (set (match_dup 0)       (and:SI (match_dup 0)	       (const_int 255)))] "operands[2] = gen_rtx_REG (QImode, REGNO (operands[0]));")(define_split  [(set (match_operand:SI 0 "register_operand" "")	(zero_extend:SI (match_operand:QI 1 "register_operand" "")))] "reload_completed && TARGET_ZERO_EXTEND_WITH_AND  && ! reg_overlap_mentioned_p (operands[0], operands[1])" [(set (match_dup 0)       (match_dup 2))  (set (match_dup 0)       (and:SI (match_dup 0)	       (const_int 255)))] "operands[2] = gen_rtx_REG (SImode, true_regnum (operands[1]));")(define_insn "zero_extendsidi2"  [(set (match_operand:DI 0 "nonimmediate_operand" "=r,?r,?*o")	(zero_extend:DI (match_operand:SI 1 "general_operand" "0,rm,r")))]  ""  "#")(define_split   [(set (match_operand:DI 0 "register_operand" "")	(zero_extend:DI (match_operand:SI 1 "register_operand" "")))]  "reload_completed && true_regnum (operands[0]) == true_regnum (operands[1])"  [(set (match_dup 4) (const_int 0))]  "split_di (&operands[0], 1, &operands[3], &operands[4]);")(define_split   [(set (match_operand:DI 0 "nonimmediate_operand" "")	(zero_extend:DI (match_operand:SI 1 "general_operand" "")))]  "reload_completed"  [(set (match_dup 3) (match_dup 1))   (set (match_dup 4) (const_int 0))]  "split_di (&operands[0], 1, &operands[3], &operands[4]);");;- sign extension instructions(define_insn "extendsidi2"  [(set (match_operand:DI 0 "nonimmediate_operand" "=A,?r,?Ar,*o")	(sign_extend:DI (match_operand:SI 1 "register_operand" "0,0,r,*r")))   (clobber (match_scratch:SI 2 "=X,X,X,&r"))]  ""  "#");; Extend to memory case when source register does die.(define_split   [(set (match_operand:DI 0 "memory_operand" "")	(sign_extend:DI (match_operand:SI 1 "register_operand" "")))   (clobber (match_operand:SI 2 "register_operand" ""))]  "(flow2_completed    && dead_or_set_p (insn, operands[1])    && !reg_mentioned_p (operands[1], operands[0]))"  [(set (match_dup 3) (match_dup 1))   (set (match_dup 1) (ashiftrt:SI (match_dup 1) (const_int 31)))   (set (match_dup 4) (match_dup 1))]  "split_di (&operands[0], 1, &operands[3], &operands[4]);");; Extend to memory case when source register does not die.(define_split   [(set (match_operand:DI 0 "memory_operand" "")	(sign_extend:DI (match_operand:SI 1 "register_operand" "")))   (clobber (match_operand:SI 2 "register_operand" ""))]  "flow2_completed"  [(const_int 0)]  "{  split_di (&operands[0], 1, &operands[3], &operands[4]);  emit_move_insn (operands[3], operands[1]);  /* Generate a cltd if possible and doing so it profitable.  */  if (true_regnum (operands[1]) == 0      && true_regnum (operands[2]) == 1      && (optimize_size || !TARGET_PENTIUM))    {      emit_insn (gen_ashrsi3_31 (operands[2], operands[1]));    }  else    {      emit_move_insn (operands[2], operands[1]);      emit_insn (gen_ashrsi3_31 (operands[2], operands[2]));    }  emit_move_insn (operands[4], operands[2]);  DONE;}");; Extend to register case.  Optimize case where source and destination;; registers match and cases where we can use cltd.(define_split   [(set (match_operand:DI 0 "register_operand" "")	(sign_extend:DI (match_operand:SI 1 "register_operand" "")))   (clobber (match_scratch:SI 2 ""))]  "reload_completed"  [(const_int 0)]  "{  split_di (&operands[0], 1, &operands[3], &operands[4]);  if (true_regnum (operands[3]) != true_regnum (operands[1]))    emit_move_insn (operands[3], operands[1]);  /* Generate a cltd if possible and doing so it profitable.  */  if (true_regnum (operands[3]) == 0      && (optimize_size || !TARGET_PENTIUM))    {      emit_insn (gen_ashrsi3_31 (operands[4], operands[3]));      DONE;    }  if (true_regnum (operands[4]) != true_regnum (operands[1]))    emit_move_insn (operands[4], operands[1]);  emit_insn (gen_ashrsi3_31 (operands[4], operands[4]));  DONE;}");; Note that the i386 programmers' manual says that the opcodes;; are named movsx..., but the assembler on Unix does not accept that.;; We use what the Unix assembler expects.(define_insn "extendhisi2"  [(set (match_operand:SI 0 "register_operand" "=r")	(sign_extend:SI (match_operand:HI 1 "nonimmediate_operand" "rm")))]  ""  "*{  if (REGNO (operands[0]) == 0      && REG_P (operands[1]) && REGNO (operands[1]) == 0      && (optimize_size || ix86_cpu != PROCESSOR_K6))#ifdef INTEL_SYNTAX    return \"cwde\";#else    return \"cwtl\";#endif#ifdef INTEL_SYNTAX  return AS2 (movsx,%1,%0);#else  return AS2 (movs%W0%L0,%1,%0);#endif}")(define_insn "extendqihi2"  [(set (match_operand:HI 0 "register_operand" "=r")	(sign_extend:HI (match_operand:QI 1 "nonimmediate_operand" "qm")))]  ""  "*{  if (REGNO (operands[0]) == 0      && REG_P (operands[1]) && REGNO (operands[1]) == 0      && (optimize_size || ix86_cpu != PROCESSOR_K6))    return \"cbtw\";#ifdef INTEL_SYNTAX  return AS2 (movsx,%1,%0);#else  return AS2 (movs%B0%W0,%1,%0);#endif}")(define_insn "extendqisi2"  [(set (match_operand:SI 0 "register_operand" "=r")	(sign_extend:SI (match_operand:QI 1 "nonimmediate_operand" "qm")))]  ""  "*{#ifdef INTEL_SYNTAX  return AS2 (movsx,%1,%0);#else  return AS2 (movs%B0%L0,%1,%0);#endif}");; Truncation of long long -> 32 bit(define_expand "truncdisi2"  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,m")	(truncate:SI (match_operand:DI 1 "nonimmediate_operand" "ro,r")))]  ""  "{  /* Don't generate memory->memory moves, go through a register */  if (TARGET_MOVE      && (reload_in_progress | reload_completed) == 0      && GET_CODE (operands[0]) == MEM      && GET_CODE (operands[1]) == MEM)    {      rtx target = gen_reg_rtx (SImode);      emit_insn (gen_truncdisi2 (target, operands[1]));      emit_move_insn (operands[0], target);      DONE;    }}")(define_insn ""  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,m")	(truncate:SI (match_operand:DI 1 "nonimmediate_operand" "ro,r")))]  "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)"  "*{  rtx low[2], high[2], xops[2];  split_di (&operands[1], 1, low, high);  xops[0] = operands[0];  xops[1] = low[0];  if (!rtx_equal_p (xops[0], xops[1]))    output_asm_insn (AS2 (mov%L0,%1,%0), xops);  RET;}")(define_insn ""  [(set (match_operand:SI 0 "nonimmediate_operand" "=r,m")	(truncate:SI (lshiftrt:DI (match_operand:DI 1 "nonimmediate_operand" "ro,r")				  (const_int 32))))]  "(!TARGET_MOVE || GET_CODE (operands[0]) != MEM) || (GET_CODE (operands[1]) != MEM)"  "*{  rtx low[2], high[2], xops[2];  split_di (&operands[1], 1, low, high);  xops[0] = operands

⌨️ 快捷键说明

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