===================================================================
@@ -2872,8 +2872,21 @@
DONE;
}")
+(define_expand "mul<mode>3"
+ [(set (match_operand:GPR 0 "gpc_reg_operand" "")
+ (mult:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
+ (match_operand:GPR 2 "reg_or_short_operand" "")))]
+ ""
+{
+ if (<MODE>mode == DImode && !TARGET_POWERPC64)
+ {
+ rtx ret = expand_mult (DImode, operands[1], operands[2], NULL, 0, false);
+ emit_move_insn (operands[0], ret);
+ DONE;
+ }
+})
-(define_insn "mul<mode>3"
+(define_insn "*mul<mode>3"
[(set (match_operand:GPR 0 "gpc_reg_operand" "=r,r")
(mult:GPR (match_operand:GPR 1 "gpc_reg_operand" "%r,r")
(match_operand:GPR 2 "reg_or_short_operand" "r,I")))]
@@ -3040,7 +3053,25 @@
"maddld %0,%1,%2,%3"
[(set_attr "type" "mul")])
-(define_insn "udiv<mode>3"
+(define_expand "udiv<mode>3"
+ [(set (match_operand:GPR 0 "gpc_reg_operand" "")
+ (udiv:GPR (match_operand:GPR 1 "gpc_reg_operand" "")
+ (match_operand:GPR 2 "gpc_reg_operand" "")))]
+ ""
+{
+ if (<MODE>mode == DImode && !TARGET_POWERPC64)
+ {
+ rtx libfunc = optab_libfunc (udiv_optab, <MODE>mode);
+ rtx target = emit_library_call_value (libfunc,
+ operands[0], LCT_NORMAL, <MODE>mode,
+ operands[1], <MODE>mode,
+ operands[2], <MODE>mode);
+ emit_move_insn (operands[0], target);
+ DONE;
+ }
+})
+
+(define_insn "*udiv<mode>3"
[(set (match_operand:GPR 0 "gpc_reg_operand" "=r")
(udiv:GPR (match_operand:GPR 1 "gpc_reg_operand" "r")
(match_operand:GPR 2 "gpc_reg_operand" "r")))]
@@ -3066,7 +3097,16 @@
emit_insn (gen_div<mode>3_sra (operands[0], operands[1], operands[2]));
DONE;
}
-
+ else if (<MODE>mode == DImode && !TARGET_POWERPC64)
+ {
+ rtx libfunc = optab_libfunc (sdiv_optab, <MODE>mode);
+ rtx target = emit_library_call_value (libfunc,
+ operands[0], LCT_NORMAL, <MODE>mode,
+ operands[1], <MODE>mode,
+ operands[2], <MODE>mode);
+ emit_move_insn (operands[0], target);
+ DONE;
+ }
operands[2] = force_reg (<MODE>mode, operands[2]);
})
===================================================================
@@ -0,0 +1,22 @@
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-options "-O2 -mcpu=power8 -mno-fold-gimple" } */
+
+__attribute__ ((altivec(vector__))) long long
+sdiv (__attribute__ ((altivec(vector__))) long long a,
+ __attribute__ ((altivec(vector__))) long long b)
+{
+ return __builtin_vsx_div_2di (a, b);
+}
+__attribute__ ((altivec(vector__))) unsigned long long
+udiv (__attribute__ ((altivec(vector__))) unsigned long long a,
+ __attribute__ ((altivec(vector__))) unsigned long long b)
+{
+ return __builtin_vsx_udiv_2di (a, b);
+}
+__attribute__ ((altivec(vector__))) long long
+smul (__attribute__ ((altivec(vector__))) long long a,
+ __attribute__ ((altivec(vector__))) long long b)
+{
+ return __builtin_vsx_mul_2di (a, b);
+}