📄 pa.md
字号:
"cmp%I2clr,*%B3 %2,%1,%0\;ldi -1,%0" [(set_attr "type" "binary") (set_attr "length" "8")]);; Patterns for adding/subtracting the result of a boolean expression from;; a register. First we have special patterns that make use of the carry;; bit, and output only two instructions. For the cases we can't in;; general do in two instructions, the incscc pattern at the end outputs;; two or three instructions.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (leu:SI (match_operand:SI 2 "register_operand" "r") (match_operand:SI 3 "arith11_operand" "rI")) (match_operand:SI 1 "register_operand" "r")))] "" "sub%I3 %3,%2,%%r0\;{addc|add,c} %%r0,%1,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (leu:DI (match_operand:DI 2 "register_operand" "r") (match_operand:DI 3 "arith11_operand" "rI")) (match_operand:DI 1 "register_operand" "r")))] "TARGET_64BIT" "sub%I3 %3,%2,%%r0\;add,dc %%r0,%1,%0" [(set_attr "type" "binary") (set_attr "length" "8")]); This need only accept registers for op3, since canonicalization; replaces geu with gtu when op3 is an integer.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (geu:SI (match_operand:SI 2 "register_operand" "r") (match_operand:SI 3 "register_operand" "r")) (match_operand:SI 1 "register_operand" "r")))] "" "sub %2,%3,%%r0\;{addc|add,c} %%r0,%1,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (geu:DI (match_operand:DI 2 "register_operand" "r") (match_operand:DI 3 "register_operand" "r")) (match_operand:DI 1 "register_operand" "r")))] "TARGET_64BIT" "sub %2,%3,%%r0\;add,dc %%r0,%1,%0" [(set_attr "type" "binary") (set_attr "length" "8")]); Match only integers for op3 here. This is used as canonical form of the; geu pattern when op3 is an integer. Don't match registers since we can't; make better code than the general incscc pattern.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (gtu:SI (match_operand:SI 2 "register_operand" "r") (match_operand:SI 3 "int11_operand" "I")) (match_operand:SI 1 "register_operand" "r")))] "" "addi %k3,%2,%%r0\;{addc|add,c} %%r0,%1,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (plus:DI (gtu:DI (match_operand:DI 2 "register_operand" "r") (match_operand:DI 3 "int11_operand" "I")) (match_operand:DI 1 "register_operand" "r")))] "TARGET_64BIT" "addi %k3,%2,%%r0\;add,dc %%r0,%1,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "incscc" [(set (match_operand:SI 0 "register_operand" "=r,r") (plus:SI (match_operator:SI 4 "comparison_operator" [(match_operand:SI 2 "register_operand" "r,r") (match_operand:SI 3 "arith11_operand" "rI,rI")]) (match_operand:SI 1 "register_operand" "0,?r")))] "" "@ {com%I3clr|cmp%I3clr},%B4 %3,%2,%%r0\;addi 1,%0,%0 {com%I3clr|cmp%I3clr},%B4 %3,%2,%%r0\;addi,tr 1,%1,%0\;copy %1,%0" [(set_attr "type" "binary,binary") (set_attr "length" "8,12")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r,r") (plus:DI (match_operator:DI 4 "comparison_operator" [(match_operand:DI 2 "register_operand" "r,r") (match_operand:DI 3 "arith11_operand" "rI,rI")]) (match_operand:DI 1 "register_operand" "0,?r")))] "TARGET_64BIT" "@ cmp%I3clr,*%B4 %3,%2,%%r0\;addi 1,%0,%0 cmp%I3clr,*%B4 %3,%2,%%r0\;addi,tr 1,%1,%0\;copy %1,%0" [(set_attr "type" "binary,binary") (set_attr "length" "8,12")])(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "r") (gtu:SI (match_operand:SI 2 "register_operand" "r") (match_operand:SI 3 "arith11_operand" "rI"))))] "" "sub%I3 %3,%2,%%r0\;{subb|sub,b} %1,%%r0,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (match_operand:DI 1 "register_operand" "r") (gtu:DI (match_operand:DI 2 "register_operand" "r") (match_operand:DI 3 "arith11_operand" "rI"))))] "TARGET_64BIT" "sub%I3 %3,%2,%%r0\;sub,db %1,%%r0,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r") (gtu:SI (match_operand:SI 2 "register_operand" "r") (match_operand:SI 3 "arith11_operand" "rI"))) (match_operand:SI 4 "register_operand" "r")))] "" "sub%I3 %3,%2,%%r0\;{subb|sub,b} %1,%4,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (minus:DI (match_operand:DI 1 "register_operand" "r") (gtu:DI (match_operand:DI 2 "register_operand" "r") (match_operand:DI 3 "arith11_operand" "rI"))) (match_operand:DI 4 "register_operand" "r")))] "TARGET_64BIT" "sub%I3 %3,%2,%%r0\;sub,db %1,%4,%0" [(set_attr "type" "binary") (set_attr "length" "8")]); This need only accept registers for op3, since canonicalization; replaces ltu with leu when op3 is an integer.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "r") (ltu:SI (match_operand:SI 2 "register_operand" "r") (match_operand:SI 3 "register_operand" "r"))))] "" "sub %2,%3,%%r0\;{subb|sub,b} %1,%%r0,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (match_operand:DI 1 "register_operand" "r") (ltu:DI (match_operand:DI 2 "register_operand" "r") (match_operand:DI 3 "register_operand" "r"))))] "TARGET_64BIT" "sub %2,%3,%%r0\;sub,db %1,%%r0,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r") (ltu:SI (match_operand:SI 2 "register_operand" "r") (match_operand:SI 3 "register_operand" "r"))) (match_operand:SI 4 "register_operand" "r")))] "" "sub %2,%3,%%r0\;{subb|sub,b} %1,%4,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (minus:DI (match_operand:DI 1 "register_operand" "r") (ltu:DI (match_operand:DI 2 "register_operand" "r") (match_operand:DI 3 "register_operand" "r"))) (match_operand:DI 4 "register_operand" "r")))] "TARGET_64BIT" "sub %2,%3,%%r0\;sub,db %1,%4,%0" [(set_attr "type" "binary") (set_attr "length" "8")]); Match only integers for op3 here. This is used as canonical form of the; ltu pattern when op3 is an integer. Don't match registers since we can't; make better code than the general incscc pattern.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "r") (leu:SI (match_operand:SI 2 "register_operand" "r") (match_operand:SI 3 "int11_operand" "I"))))] "" "addi %k3,%2,%%r0\;{subb|sub,b} %1,%%r0,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (match_operand:DI 1 "register_operand" "r") (leu:DI (match_operand:DI 2 "register_operand" "r") (match_operand:DI 3 "int11_operand" "I"))))] "TARGET_64BIT" "addi %k3,%2,%%r0\;sub,db %1,%%r0,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (minus:SI (match_operand:SI 1 "register_operand" "r") (leu:SI (match_operand:SI 2 "register_operand" "r") (match_operand:SI 3 "int11_operand" "I"))) (match_operand:SI 4 "register_operand" "r")))] "" "addi %k3,%2,%%r0\;{subb|sub,b} %1,%4,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r") (minus:DI (minus:DI (match_operand:DI 1 "register_operand" "r") (leu:DI (match_operand:DI 2 "register_operand" "r") (match_operand:DI 3 "int11_operand" "I"))) (match_operand:DI 4 "register_operand" "r")))] "TARGET_64BIT" "addi %k3,%2,%%r0\;sub,db %1,%4,%0" [(set_attr "type" "binary") (set_attr "length" "8")])(define_insn "decscc" [(set (match_operand:SI 0 "register_operand" "=r,r") (minus:SI (match_operand:SI 1 "register_operand" "0,?r") (match_operator:SI 4 "comparison_operator" [(match_operand:SI 2 "register_operand" "r,r") (match_operand:SI 3 "arith11_operand" "rI,rI")])))] "" "@ {com%I3clr|cmp%I3clr},%B4 %3,%2,%%r0\;addi -1,%0,%0 {com%I3clr|cmp%I3clr},%B4 %3,%2,%%r0\;addi,tr -1,%1,%0\;copy %1,%0" [(set_attr "type" "binary,binary") (set_attr "length" "8,12")])(define_insn "" [(set (match_operand:DI 0 "register_operand" "=r,r") (minus:DI (match_operand:DI 1 "register_operand" "0,?r") (match_operator:DI 4 "comparison_operator" [(match_operand:DI 2 "register_operand" "r,r") (match_operand:DI 3 "arith11_operand" "rI,rI")])))] "TARGET_64BIT" "@ cmp%I3clr,*%B4 %3,%2,%%r0\;addi -1,%0,%0 cmp%I3clr,*%B4 %3,%2,%%r0\;addi,tr -1,%1,%0\;copy %1,%0" [(set_attr "type" "binary,binary") (set_attr "length" "8,12")]); Patterns for max and min. (There is no need for an earlyclobber in the; last alternative since the middle alternative will match if op0 == op1.)(define_insn "sminsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,r") (smin:SI (match_operand:SI 1 "register_operand" "%0,0,r") (match_operand:SI 2 "arith11_operand" "r,I,M")))] "" "@ {comclr|cmpclr},> %2,%0,%%r0\;copy %2,%0 {comiclr|cmpiclr},> %2,%0,%%r0\;ldi %2,%0 {comclr|cmpclr},> %1,%r2,%0\;copy %1,%0"[(set_attr "type" "multi,multi,multi") (set_attr "length" "8,8,8")])(define_insn "smindi3" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (smin:DI (match_operand:DI 1 "register_operand" "%0,0,r") (match_operand:DI 2 "arith11_operand" "r,I,M")))] "TARGET_64BIT" "@ cmpclr,*> %2,%0,%%r0\;copy %2,%0 cmpiclr,*> %2,%0,%%r0\;ldi %2,%0 cmpclr,*> %1,%r2,%0\;copy %1,%0"[(set_attr "type" "multi,multi,multi") (set_attr "length" "8,8,8")])(define_insn "uminsi3" [(set (match_operand:SI 0 "register_operand" "=r,r") (umin:SI (match_operand:SI 1 "register_operand" "%0,0") (match_operand:SI 2 "arith11_operand" "r,I")))] "" "@ {comclr|cmpclr},>> %2,%0,%%r0\;copy %2,%0 {comiclr|cmpiclr},>> %2,%0,%%r0\;ldi %2,%0"[(set_attr "type" "multi,multi") (set_attr "length" "8,8")])(define_insn "umindi3" [(set (match_operand:DI 0 "register_operand" "=r,r") (umin:DI (match_operand:DI 1 "register_operand" "%0,0") (match_operand:DI 2 "arith11_operand" "r,I")))] "TARGET_64BIT" "@ cmpclr,*>> %2,%0,%%r0\;copy %2,%0 cmpiclr,*>> %2,%0,%%r0\;ldi %2,%0"[(set_attr "type" "multi,multi") (set_attr "length" "8,8")])(define_insn "smaxsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,r") (smax:SI (match_operand:SI 1 "register_operand" "%0,0,r") (match_operand:SI 2 "arith11_operand" "r,I,M")))] "" "@ {comclr|cmpclr},< %2,%0,%%r0\;copy %2,%0 {comiclr|cmpiclr},< %2,%0,%%r0\;ldi %2,%0 {comclr|cmpclr},< %1,%r2,%0\;copy %1,%0"[(set_attr "type" "multi,multi,multi") (set_attr "length" "8,8,8")])(define_insn "smaxdi3" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (smax:DI (match_operand:DI 1 "register_operand" "%0,0,r") (match_operand:DI 2 "arith11_operand" "r,I,M")))] "TARGET_64BIT" "@ cmpclr,*< %2,%0,%%r0\;copy %2,%0 cmpiclr,*< %2,%0,%%r0\;ldi %2,%0 cmpclr,*< %1,%r2,%0\;copy %1,%0"[(set_attr "type" "multi,multi,multi") (set_attr "length" "8,8,8")])(define_insn "umaxsi3" [(set (match_operand:SI 0 "register_operand" "=r,r") (umax:SI (match_operand:SI 1 "register_operand" "%0,0") (match_operand:SI 2 "arith11_operand" "r,I")))] "" "@ {comclr|cmpclr},<< %2,%0,%%r0\;copy %2,%0 {comiclr|cmpiclr},<< %2,%0,%%r0\;ldi %2,%0"[(set_attr "type" "multi,multi") (set_attr "length" "8,8")])(define_insn "umaxdi3" [(set (match_operand:DI 0 "register_operand" "=r,r") (umax:DI (match_operand:DI 1 "register_operand" "%0,0") (match_operand:DI 2 "arith11_operand" "r,I")))] "TARGET_64BIT" "@ cmpclr,*<< %2,%0,%%r0\;copy %2,%0 cmpiclr,*<< %2,%0,%%r0\;ldi %2,%0"[(set_attr "type" "multi,multi") (set_attr "length" "8,8")])(define_insn "abssi2" [(set (match_operand:SI 0 "register_operand" "=r") (abs:SI (match_operand:SI 1 "register_operand" "r")))] "" "or,>= %%r0,%1,%0\;subi 0,%0,%0" [(set_attr "type" "multi") (set_attr "length" "8")])(define_insn "absdi2" [(set (match_operand:DI 0 "register_operand" "=r") (abs:DI (match_operand:DI 1 "register_operand" "r")))] "TARGET_64BIT" "or,*>= %%r0,%1,%0\;subi 0,%0,%0" [(set_attr "type" "multi") (set_attr "length" "8")]);;; Experimental conditional move patterns(define_expand "movsicc" [(set (match_operand:SI 0 "register_operand" "") (if_then_else:SI (match_operator 1 "comparison_operator" [(match_dup 4) (match_dup 5)]) (match_operand:SI 2 "reg_or_cint_move_operand" "") (match_operand:SI 3 "reg_or_cint_move_operand" "")))] "" "{ enum rtx_code code = GET_CODE (operands[1]); if (hppa_branch_type != CMP_SI) FAIL; if (GET_MODE (hppa_compare_op0) != GET_MODE (hppa_compare_op1) || GET_MODE (hppa_compare_op0) != GET_MODE (operands[0])) FAIL; /* operands[1] is currently the result of compare_from_rtx. We want to emit a compare of the original operands. */ operands[1] = gen_rtx_fmt_ee (code, SImode, hppa_compare_op0, hppa_compare_op1); operands[4] = hppa_compare_op0; operands[5] = hppa_compare_op1;}");; We used to accept any register for op1.;;;; However, it loses sometimes because the compiler will end up using;; different registers for op0 and op1 in some critical cases. local-alloc;; will not tie op0 and op1 because op0 is used in multiple basic blocks.;;;; If/when global register allocation supports tying we should allow any;; register for op1 again.(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") (if_then_else:SI (match_operator 2 "comparison_operator" [(match_operand:SI 3 "register_operand" "r,r,r,r") (match_operand:SI 4 "arith11_operand" "rI,rI,rI,rI")]) (match_operand:SI 1 "reg_or_cint_move_operand" "0,J,N,K") (const_int 0)))] "" "@ {com%I4clr|cmp%I4clr},%S2 %4,%3,%%r0\;ldi 0,%0 {com%I4clr|cmp%I4clr},%B2 %4,%3,%0\;ldi %1,%0 {com%I4clr|cmp%I4clr},%B2 %4,%3,%0\;ldil L'%1,%0 {com%I4clr|cmp%I4clr},%B2 %4,%3,%0\;{zdepi|depwi,z} %Z1,%0" [(set_attr "type" "multi,multi,multi,nullshift") (set_attr "length" "8,8,8,8")])(define_insn "" [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,r,r,r") (if_then_else:SI (match_operator 5 "comparison_operator" [(match_operand:SI 3 "register_operand" "r,r,r,r,r,r,r,r") (match_operand:SI 4 "arith11_operand" "rI,rI,rI,rI,rI,rI,rI,rI")]) (match_operand:SI 1 "reg_or_cint_move_operand" "0,0,0,0,r,J,N,K") (match_operand:SI 2 "reg_or_cint_move_operand" "r,J,N,K,0,0,0,0")))] "" "@ {com%I4clr|cmp%I4clr},%S5 %4,%3,%%r0\;copy %2,%0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -