📄 rs6000.md
字号:
[(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "") (compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")) (const_int 0))) (clobber (match_scratch:SI 2 ""))] "reload_completed" [(set (match_dup 2) (zero_extend:SI (match_dup 1))) (set (match_dup 0) (compare:CC (match_dup 2) (const_int 0)))] "")(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y") (compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r,r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (zero_extend:SI (match_dup 1)))] "" "@ {andil.|andi.} %0,%1,0xffff #" [(set_attr "type" "compare") (set_attr "length" "4,8")])(define_split [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "") (compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "") (zero_extend:SI (match_dup 1)))] "reload_completed" [(set (match_dup 0) (zero_extend:SI (match_dup 1))) (set (match_dup 2) (compare:CC (match_dup 0) (const_int 0)))] "")(define_expand "extendhisi2" [(set (match_operand:SI 0 "gpc_reg_operand" "") (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (sign_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))] "" "@ lha%U1%X1 %0,%1 {exts|extsh} %0,%1" [(set_attr "type" "load_ext,*")])(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y") (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r,r")) (const_int 0))) (clobber (match_scratch:SI 2 "=r,r"))] "" "@ {exts.|extsh.} %2,%1 #" [(set_attr "type" "compare") (set_attr "length" "4,8")])(define_split [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "") (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")) (const_int 0))) (clobber (match_scratch:SI 2 ""))] "reload_completed" [(set (match_dup 2) (sign_extend:SI (match_dup 1))) (set (match_dup 0) (compare:CC (match_dup 2) (const_int 0)))] "")(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y") (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r,r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (sign_extend:SI (match_dup 1)))] "" "@ {exts.|extsh.} %0,%1 #" [(set_attr "type" "compare") (set_attr "length" "4,8")])(define_split [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "") (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "") (sign_extend:SI (match_dup 1)))] "reload_completed" [(set (match_dup 0) (sign_extend:SI (match_dup 1))) (set (match_dup 2) (compare:CC (match_dup 0) (const_int 0)))] "");; Fixed-point arithmetic insns.;; Discourage ai/addic because of carry but provide it in an alternative;; allowing register zero as source.(define_expand "addsi3" [(set (match_operand:SI 0 "gpc_reg_operand" "") (plus:SI (match_operand:SI 1 "gpc_reg_operand" "") (match_operand:SI 2 "reg_or_arith_cint_operand" "")))] "" "{ if (GET_CODE (operands[2]) == CONST_INT && ! add_operand (operands[2], SImode)) { rtx tmp = ((no_new_pseudos || rtx_equal_p (operands[0], operands[1])) ? operands[0] : gen_reg_rtx (SImode)); HOST_WIDE_INT val = INTVAL (operands[2]); HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000; HOST_WIDE_INT rest = trunc_int_for_mode (val - low, SImode); /* The ordering here is important for the prolog expander. When space is allocated from the stack, adding 'low' first may produce a temporary deallocation (which would be bad). */ emit_insn (gen_addsi3 (tmp, operands[1], GEN_INT (rest))); emit_insn (gen_addsi3 (operands[0], tmp, GEN_INT (low))); DONE; }}")(define_insn "*addsi3_internal1" [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r,?r,r") (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,b,r,b") (match_operand:SI 2 "add_operand" "r,I,I,L")))] "" "@ {cax|add} %0,%1,%2 {cal %0,%2(%1)|addi %0,%1,%2} {ai|addic} %0,%1,%2 {cau|addis} %0,%1,%v2" [(set_attr "length" "4,4,4,4")])(define_insn "addsi3_high" [(set (match_operand:SI 0 "gpc_reg_operand" "=b") (plus:SI (match_operand:SI 1 "gpc_reg_operand" "b") (high:SI (match_operand 2 "" ""))))] "TARGET_MACHO && !TARGET_64BIT" "{cau|addis} %0,%1,ha16(%2)" [(set_attr "length" "4")])(define_insn "*addsi3_internal2" [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,?y,?y") (compare:CC (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r") (match_operand:SI 2 "reg_or_short_operand" "r,I,r,I")) (const_int 0))) (clobber (match_scratch:SI 3 "=r,r,r,r"))] "TARGET_32BIT" "@ {cax.|add.} %3,%1,%2 {ai.|addic.} %3,%1,%2 # #" [(set_attr "type" "fast_compare,compare,compare,compare") (set_attr "length" "4,4,8,8")])(define_split [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "") (compare:CC (plus:SI (match_operand:SI 1 "gpc_reg_operand" "") (match_operand:SI 2 "reg_or_short_operand" "")) (const_int 0))) (clobber (match_scratch:SI 3 ""))] "TARGET_32BIT && reload_completed" [(set (match_dup 3) (plus:SI (match_dup 1) (match_dup 2))) (set (match_dup 0) (compare:CC (match_dup 3) (const_int 0)))] "")(define_insn "*addsi3_internal3" [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,?y,?y") (compare:CC (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r,r,r") (match_operand:SI 2 "reg_or_short_operand" "r,I,r,I")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r,r,r,r") (plus:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT" "@ {cax.|add.} %0,%1,%2 {ai.|addic.} %0,%1,%2 # #" [(set_attr "type" "fast_compare,compare,compare,compare") (set_attr "length" "4,4,8,8")])(define_split [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "") (compare:CC (plus:SI (match_operand:SI 1 "gpc_reg_operand" "") (match_operand:SI 2 "reg_or_short_operand" "")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "") (plus:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT && reload_completed" [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 2))) (set (match_dup 3) (compare:CC (match_dup 0) (const_int 0)))] "");; Split an add that we can't do in one insn into two insns, each of which;; does one 16-bit part. This is used by combine. Note that the low-order;; add should be last in case the result gets used in an address.(define_split [(set (match_operand:SI 0 "gpc_reg_operand" "") (plus:SI (match_operand:SI 1 "gpc_reg_operand" "") (match_operand:SI 2 "non_add_cint_operand" "")))] "" [(set (match_dup 0) (plus:SI (match_dup 1) (match_dup 3))) (set (match_dup 0) (plus:SI (match_dup 0) (match_dup 4)))]"{ HOST_WIDE_INT val = INTVAL (operands[2]); HOST_WIDE_INT low = ((val & 0xffff) ^ 0x8000) - 0x8000; HOST_WIDE_INT rest = trunc_int_for_mode (val - low, SImode); operands[3] = GEN_INT (rest); operands[4] = GEN_INT (low);}")(define_insn "one_cmplsi2" [(set (match_operand:SI 0 "gpc_reg_operand" "=r") (not:SI (match_operand:SI 1 "gpc_reg_operand" "r")))] "" "nor %0,%1,%1")(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y") (compare:CC (not:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")) (const_int 0))) (clobber (match_scratch:SI 2 "=r,r"))] "TARGET_32BIT" "@ nor. %2,%1,%1 #" [(set_attr "type" "compare") (set_attr "length" "4,8")])(define_split [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "") (compare:CC (not:SI (match_operand:SI 1 "gpc_reg_operand" "")) (const_int 0))) (clobber (match_scratch:SI 2 ""))] "TARGET_32BIT && reload_completed" [(set (match_dup 2) (not:SI (match_dup 1))) (set (match_dup 0) (compare:CC (match_dup 2) (const_int 0)))] "")(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x,?y") (compare:CC (not:SI (match_operand:SI 1 "gpc_reg_operand" "r,r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (not:SI (match_dup 1)))] "TARGET_32BIT" "@ nor. %0,%1,%1 #" [(set_attr "type" "compare") (set_attr "length" "4,8")])(define_split [(set (match_operand:CC 2 "cc_reg_not_cr0_operand" "") (compare:CC (not:SI (match_operand:SI 1 "gpc_reg_operand" "")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "") (not:SI (match_dup 1)))] "TARGET_32BIT && reload_completed" [(set (match_dup 0) (not:SI (match_dup 1))) (set (match_dup 2) (compare:CC (match_dup 0) (const_int 0)))] "")(define_insn "" [(set (match_operand:SI 0 "gpc_reg_operand" "=r") (minus:SI (match_operand:SI 1 "reg_or_short_operand" "rI") (match_operand:SI 2 "gpc_reg_operand" "r")))] "! TARGET_POWERPC" "{sf%I1|subf%I1c} %0,%2,%1")(define_insn "" [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (minus:SI (match_operand:SI 1 "reg_or_short_operand" "r,I") (match_operand:SI 2 "gpc_reg_operand" "r,r")))] "TARGET_POWERPC" "@ subf %0,%2,%1 subfic %0,%2,%1")(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y") (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r,r") (match_operand:SI 2 "gpc_reg_operand" "r,r")) (const_int 0))) (clobber (match_scratch:SI 3 "=r,r"))] "! TARGET_POWERPC" "@ {sf.|subfc.} %3,%2,%1 #" [(set_attr "type" "compare") (set_attr "length" "4,8")])(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x,?y") (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r,r") (match_operand:SI 2 "gpc_reg_operand" "r,r")) (const_int 0))) (clobber (match_scratch:SI 3 "=r,r"))] "TARGET_POWERPC && TARGET_32BIT" "@ subf. %3,%2,%1 #" [(set_attr "type" "fast_compare") (set_attr "length" "4,8")])(define_split [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "") (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "") (match_operand:SI 2 "gpc_reg_operand" "")) (const_int 0))) (clobber (match_scratch:SI 3 ""))] "TARGET_32BIT && reload_completed" [(set (match_dup 3) (minus:SI (match_dup 1) (match_dup 2))) (set (match_dup 0) (compare:CC (match_dup 3) (const_int 0)))] "")(define_insn "" [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y") (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r,r") (match_operand:SI 2 "gpc_reg_operand" "r,r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (minus:SI (match_dup 1) (match_dup 2)))] "! TARGET_POWERPC" "@ {sf.|subfc.} %0,%2,%1 #" [(set_attr "type" "compare") (set_attr "length" "4,8")])(define_insn "" [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y") (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r,r") (match_operand:SI 2 "gpc_reg_operand" "r,r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (minus:SI (match_dup 1) (match_dup 2)))] "TARGET_POWERPC && TARGET_32BIT" "@ subf. %0,%2,%1 #" [(set_attr "type" "fast_compare") (set_attr "length" "4,8")])(define_split [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "") (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "") (match_operand:SI 2 "gpc_reg_operand" "")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "") (minus:SI (match_dup 1) (match_dup 2)))] "TARGET_32BIT && reload_completed" [(set (match_dup 0) (minus:SI (match_dup 1) (match_dup 2))) (set (match_dup 3) (compare:CC (match_dup 0) (const_int 0)))] "")(define_expand "subsi3" [(set (match_operand:SI 0 "gpc_reg_operand" "") (minus:SI (match_operand:SI 1 "reg_or_short_operand" "") (match_operand:SI 2 "reg_or_arith_cint_operand" "")))] "" "{ if (GET_CODE (operands[2]) == CONST_INT) { emit_insn (gen_addsi3 (operands[0], operands[1], negate_rtx (SImode, operands[2]))); DONE; }}");; For SMIN, SMAX, UMIN, and UMAX, we use DEFINE_EXPAND's that involve a doz[i];; instruction and some auxiliary computations. Then we just have a single;; DEFINE_INSN for doz[i] and the define_splits to make them if made by;; combine.(define_expand "sminsi3" [(set (match_dup 3) (if_then_else:SI (gt:SI (match_operand:SI 1 "gpc_reg_operand" "") (match_operand:SI 2 "reg_or_short_operand" "")) (const_int 0) (minus:SI (match_dup 2) (match_dup 1)))) (set (match_operand:SI 0 "gpc_reg_operand" "") (minus:SI (match_dup 2) (match_dup 3)))] "TARGET_POWER || TARGET_ISEL" "{ if (TARGET_ISEL) { operands[2] = force_reg (SImode, operands[2]);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -