* config/aarch64/aarch64 (addti3, subti3): New expanders. (add<GPI>3_compare0): Remove leading * from name. (add<GPI>3_carryin): Likewise. (sub<GPI>3_compare0): Likewise. (sub<GPI>3_carryin): Likewise. --- gcc/config/aarch64/aarch64.md | 45 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 41 insertions(+), 4 deletions(-)
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 4e838ee..c4acdfc 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -1102,7 +1102,26 @@ (set_attr "simd" "*,*,*,yes")] ) -(define_insn "*add<mode>3_compare0" +(define_expand "addti3" + [(set (match_operand:TI 0 "register_operand" "") + (plus:TI (match_operand:TI 1 "register_operand" "") + (match_operand:TI 2 "register_operand" "")))] + "" +{ + rtx low = gen_reg_rtx (DImode); + emit_insn (gen_adddi3_compare0 (low, gen_lowpart (DImode, operands[1]), + gen_lowpart (DImode, operands[2]))); + + rtx high = gen_reg_rtx (DImode); + emit_insn (gen_adddi3_carryin (high, gen_highpart (DImode, operands[1]), + gen_highpart (DImode, operands[2]))); + + emit_move_insn (gen_lowpart (DImode, operands[0]), low); + emit_move_insn (gen_highpart (DImode, operands[0]), high); + DONE; +}) + +(define_insn "add<mode>3_compare0" [(set (reg:CC_NZ CC_REGNUM) (compare:CC_NZ (plus:GPI (match_operand:GPI 1 "register_operand" "%r,r,r") @@ -1386,7 +1405,7 @@ [(set_attr "type" "alu_ext")] ) -(define_insn "*add<mode>3_carryin" +(define_insn "add<mode>3_carryin" [(set (match_operand:GPI 0 "register_operand" "=r") (plus:GPI (geu:GPI (reg:CC CC_REGNUM) (const_int 0)) @@ -1554,8 +1573,26 @@ (set_attr "simd" "*,yes")] ) +(define_expand "subti3" + [(set (match_operand:TI 0 "register_operand" "") + (minus:TI (match_operand:TI 1 "register_operand" "") + (match_operand:TI 2 "register_operand" "")))] + "" +{ + rtx low = gen_reg_rtx (DImode); + emit_insn (gen_subdi3_compare0 (low, gen_lowpart (DImode, operands[1]), + gen_lowpart (DImode, operands[2]))); + + rtx high = gen_reg_rtx (DImode); + emit_insn (gen_subdi3_carryin (high, gen_highpart (DImode, operands[1]), + gen_highpart (DImode, operands[2]))); + + emit_move_insn (gen_lowpart (DImode, operands[0]), low); + emit_move_insn (gen_highpart (DImode, operands[0]), high); + DONE; +}) -(define_insn "*sub<mode>3_compare0" +(define_insn "sub<mode>3_compare0" [(set (reg:CC_NZ CC_REGNUM) (compare:CC_NZ (minus:GPI (match_operand:GPI 1 "register_operand" "r") (match_operand:GPI 2 "register_operand" "r")) @@ -1702,7 +1739,7 @@ [(set_attr "type" "alu_ext")] ) -(define_insn "*sub<mode>3_carryin" +(define_insn "sub<mode>3_carryin" [(set (match_operand:GPI 0 "register_operand" "=r") (minus:GPI (minus:GPI -- 1.8.4.2