📄 rs6000.md
字号:
(const_int 0))) (set (match_operand:DI 0 "gpc_reg_operand" "=r") (zero_extend:DI (match_dup 1)))] "TARGET_POWERPC64" "rldicl. %0,%1,0,32" [(set_attr "type" "compare")])(define_expand "extendsidi2" [(set (match_operand:DI 0 "gpc_reg_operand" "") (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "")))] "TARGET_POWERPC64" "")(define_insn "" [(set (match_operand:DI 0 "gpc_reg_operand" "=r,r") (sign_extend:DI (match_operand:SI 1 "lwa_operand" "m,r")))] "TARGET_POWERPC64" "@ lwa%U1%X1 %0,%1 extsw %0,%1" [(set_attr "type" "load,*")])(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x") (compare:CC (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r")) (const_int 0))) (clobber (match_scratch:DI 2 "=r"))] "TARGET_POWERPC64" "extsw. %2,%1" [(set_attr "type" "compare")])(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x") (compare:CC (sign_extend:DI (match_operand:SI 1 "gpc_reg_operand" "r")) (const_int 0))) (set (match_operand:DI 0 "gpc_reg_operand" "=r") (sign_extend:DI (match_dup 1)))] "TARGET_POWERPC64" "extsw. %0,%1" [(set_attr "type" "compare")])(define_expand "zero_extendqisi2" [(set (match_operand:SI 0 "gpc_reg_operand" "") (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (zero_extend:SI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))] "" "@ lbz%U1%X1 %0,%1 {rlinm|rlwinm} %0,%1,0,0xff" [(set_attr "type" "load,*")])(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x") (compare:CC (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")) (const_int 0))) (clobber (match_scratch:SI 2 "=r"))] "" "{andil.|andi.} %2,%1,0xff" [(set_attr "type" "compare")])(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x") (compare:CC (zero_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r") (zero_extend:SI (match_dup 1)))] "" "{andil.|andi.} %0,%1,0xff" [(set_attr "type" "compare")])(define_expand "extendqisi2" [(use (match_operand:SI 0 "gpc_reg_operand" "")) (use (match_operand:QI 1 "gpc_reg_operand" ""))] "" "{ if (TARGET_POWERPC) emit_insn (gen_extendqisi2_ppc (operands[0], operands[1])); else if (TARGET_POWER) emit_insn (gen_extendqisi2_power (operands[0], operands[1])); else emit_insn (gen_extendqisi2_no_power (operands[0], operands[1])); DONE;}")(define_insn "extendqisi2_ppc" [(set (match_operand:SI 0 "gpc_reg_operand" "=r") (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")))] "TARGET_POWERPC" "extsb %0,%1")(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x") (compare:CC (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")) (const_int 0))) (clobber (match_scratch:SI 2 "=r"))] "TARGET_POWERPC" "extsb. %2,%1" [(set_attr "type" "compare")])(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x") (compare:CC (sign_extend:SI (match_operand:QI 1 "gpc_reg_operand" "r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r") (sign_extend:SI (match_dup 1)))] "TARGET_POWERPC" "extsb. %0,%1" [(set_attr "type" "compare")])(define_expand "extendqisi2_power" [(parallel [(set (match_dup 2) (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "") (const_int 24))) (clobber (scratch:SI))]) (parallel [(set (match_operand:SI 0 "gpc_reg_operand" "") (ashiftrt:SI (match_dup 2) (const_int 24))) (clobber (scratch:SI))])] "TARGET_POWER" "{ operands[1] = gen_lowpart (SImode, operands[1]); operands[2] = gen_reg_rtx (SImode); }")(define_expand "extendqisi2_no_power" [(set (match_dup 2) (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "") (const_int 24))) (set (match_operand:SI 0 "gpc_reg_operand" "") (ashiftrt:SI (match_dup 2) (const_int 24)))] "! TARGET_POWER && ! TARGET_POWERPC" "{ operands[1] = gen_lowpart (SImode, operands[1]); operands[2] = gen_reg_rtx (SImode); }")(define_expand "zero_extendqihi2" [(set (match_operand:HI 0 "gpc_reg_operand" "") (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "")))] "" "")(define_insn "" [(set (match_operand:HI 0 "gpc_reg_operand" "=r,r") (zero_extend:HI (match_operand:QI 1 "reg_or_mem_operand" "m,r")))] "" "@ lbz%U1%X1 %0,%1 {rlinm|rlwinm} %0,%1,0,0xff" [(set_attr "type" "load,*")])(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x") (compare:CC (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")) (const_int 0))) (clobber (match_scratch:HI 2 "=r"))] "" "{andil.|andi.} %2,%1,0xff" [(set_attr "type" "compare")])(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x") (compare:CC (zero_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")) (const_int 0))) (set (match_operand:HI 0 "gpc_reg_operand" "=r") (zero_extend:HI (match_dup 1)))] "" "{andil.|andi.} %0,%1,0xff" [(set_attr "type" "compare")])(define_expand "extendqihi2" [(use (match_operand:HI 0 "gpc_reg_operand" "")) (use (match_operand:QI 1 "gpc_reg_operand" ""))] "" "{ if (TARGET_POWERPC) emit_insn (gen_extendqihi2_ppc (operands[0], operands[1])); else if (TARGET_POWER) emit_insn (gen_extendqihi2_power (operands[0], operands[1])); else emit_insn (gen_extendqihi2_no_power (operands[0], operands[1])); DONE;}")(define_insn "extendqihi2_ppc" [(set (match_operand:HI 0 "gpc_reg_operand" "=r") (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")))] "TARGET_POWERPC" "extsb %0,%1")(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x") (compare:CC (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")) (const_int 0))) (clobber (match_scratch:HI 2 "=r"))] "TARGET_POWERPC" "extsb. %2,%1" [(set_attr "type" "compare")])(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x") (compare:CC (sign_extend:HI (match_operand:QI 1 "gpc_reg_operand" "r")) (const_int 0))) (set (match_operand:HI 0 "gpc_reg_operand" "=r") (sign_extend:HI (match_dup 1)))] "TARGET_POWERPC" "extsb. %0,%1" [(set_attr "type" "compare")])(define_expand "extendqihi2_power" [(parallel [(set (match_dup 2) (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "") (const_int 24))) (clobber (scratch:SI))]) (parallel [(set (match_operand:HI 0 "gpc_reg_operand" "") (ashiftrt:SI (match_dup 2) (const_int 24))) (clobber (scratch:SI))])] "TARGET_POWER" "{ operands[0] = gen_lowpart (SImode, operands[0]); operands[1] = gen_lowpart (SImode, operands[1]); operands[2] = gen_reg_rtx (SImode); }")(define_expand "extendqihi2_no_power" [(set (match_dup 2) (ashift:SI (match_operand:QI 1 "gpc_reg_operand" "") (const_int 24))) (set (match_operand:HI 0 "gpc_reg_operand" "") (ashiftrt:SI (match_dup 2) (const_int 24)))] "! TARGET_POWER && ! TARGET_POWERPC" "{ operands[0] = gen_lowpart (SImode, operands[0]); operands[1] = gen_lowpart (SImode, operands[1]); operands[2] = gen_reg_rtx (SImode); }")(define_expand "zero_extendhisi2" [(set (match_operand:SI 0 "gpc_reg_operand" "") (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "")))] "" "")(define_insn "" [(set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (zero_extend:SI (match_operand:HI 1 "reg_or_mem_operand" "m,r")))] "" "@ lhz%U1%X1 %0,%1 {rlinm|rlwinm} %0,%1,0,0xffff" [(set_attr "type" "load,*")])(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x") (compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r")) (const_int 0))) (clobber (match_scratch:SI 2 "=r"))] "" "{andil.|andi.} %2,%1,0xffff" [(set_attr "type" "compare")])(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x") (compare:CC (zero_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r") (zero_extend:SI (match_dup 1)))] "" "{andil.|andi.} %0,%1,0xffff" [(set_attr "type" "compare")])(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,*")])(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x") (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r")) (const_int 0))) (clobber (match_scratch:SI 2 "=r"))] "" "{exts.|extsh.} %2,%1" [(set_attr "type" "compare")])(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x") (compare:CC (sign_extend:SI (match_operand:HI 1 "gpc_reg_operand" "r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r") (sign_extend:SI (match_dup 1)))] "" "{exts.|extsh.} %0,%1" [(set_attr "type" "compare")]);; Fixed-point arithmetic insns.;; Discourage ai/addic because of carry but provide it in an alternative;; allowing register zero as source.(define_insn "addsi3" [(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,J")))] "" "@ {cax|add} %0,%1,%2 {cal %0,%2(%1)|addi %0,%1,%2} {ai|addic} %0,%1,%2 {cau|addis} %0,%1,%u2")(define_insn "" [(set (match_operand:CC 0 "cc_reg_operand" "=x,x") (compare:CC (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r") (match_operand:SI 2 "reg_or_short_operand" "r,I")) (const_int 0))) (clobber (match_scratch:SI 3 "=r,r"))] "" "@ {cax.|add.} %3,%1,%2 {ai.|addic.} %3,%1,%2" [(set_attr "type" "compare")])(define_insn "" [(set (match_operand:CC 3 "cc_reg_operand" "=x,x") (compare:CC (plus:SI (match_operand:SI 1 "gpc_reg_operand" "%r,r") (match_operand:SI 2 "reg_or_short_operand" "r,I")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r,r") (plus:SI (match_dup 1) (match_dup 2)))] "" "@ {cax.|add.} %0,%1,%2 {ai.|addic.} %0,%1,%2" [(set_attr "type" "compare")]);; 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)))]"{ int low = INTVAL (operands[2]) & 0xffff; int high = (unsigned) INTVAL (operands[2]) >> 16; if (low & 0x8000) high++, low |= 0xffff0000; operands[3] = gen_rtx (CONST_INT, VOIDmode, high << 16); operands[4] = gen_rtx (CONST_INT, VOIDmode, 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") (compare:CC (not:SI (match_operand:SI 1 "gpc_reg_operand" "r")) (const_int 0))) (clobber (match_scratch:SI 2 "=r"))] "" "nor. %2,%1,%1" [(set_attr "type" "compare")])(define_insn "" [(set (match_operand:CC 2 "cc_reg_operand" "=x") (compare:CC (not:SI (match_operand:SI 1 "gpc_reg_operand" "r")) (const_int 0))) (set (match_operand:SI 0 "gpc_reg_operand" "=r") (not:SI (match_dup 1)))] "" "nor. %0,%2,%1" [(set_attr "type" "compare")])(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") (compare:CC (minus:SI (match_operand:SI 1 "gpc_reg_operand" "r") (match_operand:SI 2 "gpc_reg_operand" "r")) (const_int 0)))
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -