diff options
Diffstat (limited to 'gcc/config/pa/pa.md')
-rw-r--r-- | gcc/config/pa/pa.md | 93 |
1 files changed, 75 insertions, 18 deletions
diff --git a/gcc/config/pa/pa.md b/gcc/config/pa/pa.md index 779b1d6565b..0ea6cb277bc 100644 --- a/gcc/config/pa/pa.md +++ b/gcc/config/pa/pa.md @@ -2290,12 +2290,41 @@ (define_insn "" [(set (match_operand:SI 0 "move_dest_operand" + "=r,r,r,r,r,r,Q,!*q,!r,!*f,*f,T,!r,!f") + (match_operand:SI 1 "move_src_operand" + "A,r,J,N,K,RQ,rM,!rM,!*q,!*fM,RT,*f,!f,!r"))] + "(register_operand (operands[0], SImode) + || reg_or_0_operand (operands[1], SImode)) + && !TARGET_SOFT_FLOAT + && !TARGET_64BIT" + "@ + ldw RT'%A1,%0 + copy %1,%0 + ldi %1,%0 + ldil L'%1,%0 + {zdepi|depwi,z} %Z1,%0 + ldw%M1 %1,%0 + stw%M0 %r1,%0 + mtsar %r1 + {mfctl|mfctl,w} %%sar,%0 + fcpy,sgl %f1,%0 + fldw%F1 %1,%0 + fstw%F0 %1,%0 + {fstws|fstw} %1,-16(%%sp)\n\t{ldws|ldw} -16(%%sp),%0 + {stws|stw} %1,-16(%%sp)\n\t{fldws|fldw} -16(%%sp),%0" + [(set_attr "type" "load,move,move,move,shift,load,store,move,move,fpalu,fpload,fpstore,move,move") + (set_attr "pa_combine_type" "addmove") + (set_attr "length" "4,4,4,4,4,4,4,4,4,4,4,4,8,8")]) + +(define_insn "" + [(set (match_operand:SI 0 "move_dest_operand" "=r,r,r,r,r,r,Q,!*q,!r,!*f,*f,T") (match_operand:SI 1 "move_src_operand" "A,r,J,N,K,RQ,rM,!rM,!*q,!*fM,RT,*f"))] "(register_operand (operands[0], SImode) || reg_or_0_operand (operands[1], SImode)) - && !TARGET_SOFT_FLOAT" + && !TARGET_SOFT_FLOAT + && TARGET_64BIT" "@ ldw RT'%A1,%0 copy %1,%0 @@ -3822,9 +3851,9 @@ (define_insn "" [(set (match_operand:DF 0 "move_dest_operand" - "=f,*r,Q,?o,?Q,f,*r,*r") + "=f,*r,Q,?o,?Q,f,*r,*r,!r,!f") (match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand" - "fG,*rG,f,*r,*r,RQ,o,RQ"))] + "fG,*rG,f,*r,*r,RQ,o,RQ,!f,!r"))] "(register_operand (operands[0], DFmode) || reg_or_0_operand (operands[1], DFmode)) && !(GET_CODE (operands[1]) == CONST_DOUBLE @@ -3833,13 +3862,15 @@ && !TARGET_SOFT_FLOAT" "* { - if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]) - || operands[1] == CONST0_RTX (DFmode)) + if ((FP_REG_P (operands[0]) || FP_REG_P (operands[1]) + || operands[1] == CONST0_RTX (DFmode)) + && !(REG_P (operands[0]) && REG_P (operands[1]) + && FP_REG_P (operands[0]) ^ FP_REG_P (operands[1]))) return output_fp_move_double (operands); return output_move_double (operands); }" - [(set_attr "type" "fpalu,move,fpstore,store,store,fpload,load,load") - (set_attr "length" "4,8,4,8,16,4,8,16")]) + [(set_attr "type" "fpalu,move,fpstore,store,store,fpload,load,load,move,move") + (set_attr "length" "4,8,4,8,16,4,8,16,12,12")]) (define_insn "" [(set (match_operand:DF 0 "indexed_memory_operand" "=R") @@ -3994,9 +4025,9 @@ (define_insn "" [(set (match_operand:DF 0 "move_dest_operand" - "=r,?o,?Q,r,r") + "=r,?o,?Q,r,r,!r,!f") (match_operand:DF 1 "reg_or_0_or_nonsymb_mem_operand" - "rG,r,r,o,RQ"))] + "rG,r,r,o,RQ,!f,!r"))] "(register_operand (operands[0], DFmode) || reg_or_0_operand (operands[1], DFmode)) && !TARGET_64BIT @@ -4005,8 +4036,8 @@ { return output_move_double (operands); }" - [(set_attr "type" "move,store,store,load,load") - (set_attr "length" "8,8,16,8,16")]) + [(set_attr "type" "move,store,store,load,load,move,move") + (set_attr "length" "8,8,16,8,16,12,12")]) (define_insn "" [(set (match_operand:DF 0 "move_dest_operand" @@ -4116,22 +4147,25 @@ (define_insn "" [(set (match_operand:DI 0 "move_dest_operand" - "=r,o,Q,r,r,r,*f,*f,T") + "=r,o,Q,r,r,r,*f,*f,T,!r,!f") (match_operand:DI 1 "general_operand" - "rM,r,r,o*R,Q,i,*fM,RT,*f"))] + "rM,r,r,o*R,Q,i,*fM,RT,*f,!f,!r"))] "(register_operand (operands[0], DImode) || reg_or_0_operand (operands[1], DImode)) && !TARGET_64BIT && !TARGET_SOFT_FLOAT" "* { - if (FP_REG_P (operands[0]) || FP_REG_P (operands[1]) - || (operands[1] == CONST0_RTX (DImode))) + if ((FP_REG_P (operands[0]) || FP_REG_P (operands[1]) + || operands[1] == CONST0_RTX (DFmode)) + && !(REG_P (operands[0]) && REG_P (operands[1]) + && FP_REG_P (operands[0]) ^ FP_REG_P (operands[1]))) return output_fp_move_double (operands); return output_move_double (operands); }" - [(set_attr "type" "move,store,store,load,load,multi,fpalu,fpload,fpstore") - (set_attr "length" "8,8,16,8,16,16,4,4,4")]) + [(set_attr "type" + "move,store,store,load,load,multi,fpalu,fpload,fpstore,move,move") + (set_attr "length" "8,8,16,8,16,16,4,4,4,12,12")]) (define_insn "" [(set (match_operand:DI 0 "move_dest_operand" @@ -4341,12 +4375,35 @@ (define_insn "" [(set (match_operand:SF 0 "move_dest_operand" + "=f,!*r,f,*r,Q,Q,!r,!f") + (match_operand:SF 1 "reg_or_0_or_nonsymb_mem_operand" + "fG,!*rG,RQ,RQ,f,*rG,!f,!r"))] + "(register_operand (operands[0], SFmode) + || reg_or_0_operand (operands[1], SFmode)) + && !TARGET_SOFT_FLOAT + && !TARGET_64BIT" + "@ + fcpy,sgl %f1,%0 + copy %r1,%0 + fldw%F1 %1,%0 + ldw%M1 %1,%0 + fstw%F0 %1,%0 + stw%M0 %r1,%0 + {fstws|fstw} %1,-16(%%sp)\n\t{ldws|ldw} -16(%%sp),%0 + {stws|stw} %1,-16(%%sp)\n\t{fldws|fldw} -16(%%sp),%0" + [(set_attr "type" "fpalu,move,fpload,load,fpstore,store,move,move") + (set_attr "pa_combine_type" "addmove") + (set_attr "length" "4,4,4,4,4,4,8,8")]) + +(define_insn "" + [(set (match_operand:SF 0 "move_dest_operand" "=f,!*r,f,*r,Q,Q") (match_operand:SF 1 "reg_or_0_or_nonsymb_mem_operand" "fG,!*rG,RQ,RQ,f,*rG"))] "(register_operand (operands[0], SFmode) || reg_or_0_operand (operands[1], SFmode)) - && !TARGET_SOFT_FLOAT" + && !TARGET_SOFT_FLOAT + && TARGET_64BIT" "@ fcpy,sgl %f1,%0 copy %r1,%0 |