📄 i386.md
字号:
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 + -