diff mbox

[rs6000] Add support for Power9 DFP Test Significance Immediate instruction

Message ID 577166C8.20506@linux.vnet.ibm.com
State New
Headers show

Commit Message

Kelvin Nilsen June 27, 2016, 5:47 p.m. UTC
This patch adds built-in function support for the new Power9 dtstsfi
instruction.

This has bootstrapped and regression tested on
powerpc64le-unknown-linux-gnu without regressions.  Is this ok for the
trunk?  Is this patch ok for gcc-6 after some burn-in time on the trunk?

Thanks.

gcc/testsuite/ChangeLog:

2016-06-27  Kelvin Nilsen  <kelvin@gcc.gnu.org>

	* gcc.target/powerpc/dtstsfi-0.c: New test.
	* gcc.target/powerpc/dtstsfi-1.c: New test.
	* gcc.target/powerpc/dtstsfi-10.c: New test.
	* gcc.target/powerpc/dtstsfi-11.c: New test.
	* gcc.target/powerpc/dtstsfi-12.c: New test.
	* gcc.target/powerpc/dtstsfi-13.c: New test.
	* gcc.target/powerpc/dtstsfi-14.c: New test.
	* gcc.target/powerpc/dtstsfi-15.c: New test.
	* gcc.target/powerpc/dtstsfi-16.c: New test.
	* gcc.target/powerpc/dtstsfi-17.c: New test.
	* gcc.target/powerpc/dtstsfi-18.c: New test.
	* gcc.target/powerpc/dtstsfi-19.c: New test.
	* gcc.target/powerpc/dtstsfi-2.c: New test.
	* gcc.target/powerpc/dtstsfi-20.c: New test.
	* gcc.target/powerpc/dtstsfi-21.c: New test.
	* gcc.target/powerpc/dtstsfi-22.c: New test.
	* gcc.target/powerpc/dtstsfi-23.c: New test.
	* gcc.target/powerpc/dtstsfi-24.c: New test.
	* gcc.target/powerpc/dtstsfi-25.c: New test.
	* gcc.target/powerpc/dtstsfi-26.c: New test.
	* gcc.target/powerpc/dtstsfi-27.c: New test.
	* gcc.target/powerpc/dtstsfi-28.c: New test.
	* gcc.target/powerpc/dtstsfi-29.c: New test.
	* gcc.target/powerpc/dtstsfi-3.c: New test.
	* gcc.target/powerpc/dtstsfi-30.c: New test.
	* gcc.target/powerpc/dtstsfi-31.c: New test.
	* gcc.target/powerpc/dtstsfi-32.c: New test.
	* gcc.target/powerpc/dtstsfi-33.c: New test.
	* gcc.target/powerpc/dtstsfi-34.c: New test.
	* gcc.target/powerpc/dtstsfi-35.c: New test.
	* gcc.target/powerpc/dtstsfi-36.c: New test.
	* gcc.target/powerpc/dtstsfi-37.c: New test.
	* gcc.target/powerpc/dtstsfi-38.c: New test.
	* gcc.target/powerpc/dtstsfi-39.c: New test.
	* gcc.target/powerpc/dtstsfi-4.c: New test.
	* gcc.target/powerpc/dtstsfi-40.c: New test.
	* gcc.target/powerpc/dtstsfi-41.c: New test.
	* gcc.target/powerpc/dtstsfi-42.c: New test.
	* gcc.target/powerpc/dtstsfi-43.c: New test.
	* gcc.target/powerpc/dtstsfi-44.c: New test.
	* gcc.target/powerpc/dtstsfi-45.c: New test.
	* gcc.target/powerpc/dtstsfi-46.c: New test.
	* gcc.target/powerpc/dtstsfi-47.c: New test.
	* gcc.target/powerpc/dtstsfi-48.c: New test.
	* gcc.target/powerpc/dtstsfi-49.c: New test.
	* gcc.target/powerpc/dtstsfi-5.c: New test.
	* gcc.target/powerpc/dtstsfi-50.c: New test.
	* gcc.target/powerpc/dtstsfi-51.c: New test.
	* gcc.target/powerpc/dtstsfi-52.c: New test.
	* gcc.target/powerpc/dtstsfi-53.c: New test.
	* gcc.target/powerpc/dtstsfi-54.c: New test.
	* gcc.target/powerpc/dtstsfi-55.c: New test.
	* gcc.target/powerpc/dtstsfi-56.c: New test.
	* gcc.target/powerpc/dtstsfi-57.c: New test.
	* gcc.target/powerpc/dtstsfi-58.c: New test.
	* gcc.target/powerpc/dtstsfi-59.c: New test.
	* gcc.target/powerpc/dtstsfi-6.c: New test.
	* gcc.target/powerpc/dtstsfi-60.c: New test.
	* gcc.target/powerpc/dtstsfi-61.c: New test.
	* gcc.target/powerpc/dtstsfi-62.c: New test.
	* gcc.target/powerpc/dtstsfi-63.c: New test.
	* gcc.target/powerpc/dtstsfi-64.c: New test.
	* gcc.target/powerpc/dtstsfi-65.c: New test.
	* gcc.target/powerpc/dtstsfi-66.c: New test.
	* gcc.target/powerpc/dtstsfi-67.c: New test.
	* gcc.target/powerpc/dtstsfi-68.c: New test.
	* gcc.target/powerpc/dtstsfi-69.c: New test.
	* gcc.target/powerpc/dtstsfi-7.c: New test.
	* gcc.target/powerpc/dtstsfi-70.c: New test.
	* gcc.target/powerpc/dtstsfi-71.c: New test.
	* gcc.target/powerpc/dtstsfi-72.c: New test.
	* gcc.target/powerpc/dtstsfi-73.c: New test.
	* gcc.target/powerpc/dtstsfi-74.c: New test.
	* gcc.target/powerpc/dtstsfi-75.c: New test.
	* gcc.target/powerpc/dtstsfi-76.c: New test.
	* gcc.target/powerpc/dtstsfi-77.c: New test.
	* gcc.target/powerpc/dtstsfi-78.c: New test.
	* gcc.target/powerpc/dtstsfi-79.c: New test.
	* gcc.target/powerpc/dtstsfi-8.c: New test.
	* gcc.target/powerpc/dtstsfi-9.c: New test.


thingcc/ChangeLog:

2016-06-27  Kelvin Nilsen  <kelvin@gcc.gnu.org>

	* config/rs6000/altivec.md (darn_32): Change the condition to
	TARGET_P9_MISC instead of TARGET_MODULO.
	(darn_raw): Replace TARGET_MODULO with TARGET_P9_MISC in the
	condition expression.
	(darn): Replace TARGET_MODULO with TARGET_P9_MISC in the
	condition expression.
	* config/rs6000/dfp.md (UNSPEC_DTSTSFI): New unspec constant.
	(DFP_TEST): New code iterator.
	(dfptstsfi_<code>_mode>): New define_expand.
	(*dfp_sgnfcnc_<mode>): New define_insn.
	* config/rs6000/rs6000-builtin.def (BU_P9_MISC_0): Move this macro
	definition next to BU_P9_MISC_1 definition and change the MASK
	value to RS6000_BTM_P9_MISC.
	(BU_P9_MISC_1): Change the MASK value to RS6000_BTM_P9_MISC.
	(BU_P9_64BIT_MISC_0): Likewise.
	(BU_P9_DFP_MISC_0): New macro definition.
	(BU_P9_DFP_MISC_1): New macro definition.
	(BU_P9_DFP_MISC_2): New macro definition.
	(BU_P9_DFP_OVERLOAD_1): New macro definition.
	(BU_P9_DFP_OVERLOAD_2): New macro definition.
	(BU_P9_DFP_OVERLOAD_3): New macro definition.
	(TSTSFI_LT_DD): New BU_P9_DFP_MISC_2.
	(TSTSFI_LT_TD): Likewise.
	(TSTSFI_EQ_DD): Likewise.
	(TSTSFI_EQ_TD): Likewise.
	(TSTSFI_GT_DD): Likewise.
	(TSTSFI_GT_TD): Likewise.
	(TSTSFI_OV_DD): Likewise.
	(TSTSFI_OV_TD): Likewise.
	(TSTSFI_LT): New BU_P9_DFP_OVERLOAD_2.
	(TSTSFI_LT_DD): Likewise.
	(TSTSFI_LT_TD): Likewise.
	(TSTSFI_EQ): Likewise.
	(TSTSFI_EQ_DD): Likewise.
	(TSTSFI_EQ_TD): Likewise.
	(TSTSFI_GT): Likewise.
	(TSTSFI_GT_DD): Likewise.
	(TSTSFI_GT_TD): Likewise.
	(TSTSFI_OV): Likewise.
	(TSTSFI_OV_DD): Likewise.
	(TSTSFI_OV_TD): Likewise.
	* config/rs6000/rs6000-c.c (altivec_overloaded_builtins): Add
	overloaded test significance functions.
	* config/rs6000/rs6000-cpus.def (ISA_3_0_MASKS_SERVER): Add
	OPTION_MASK_P9_MISC into the representation of this mask.
	(POWERPC_MASKS): Add OPTION_MASK_P9_MISC into the representation
	of this mask.
	* config/rs6000/rs6000.c (rs6000_builtin_mask_calculate): Set the
	RS6000_BTM_P9_MISC flag in the return value if TARGET_P9_MISC is
	non-zero.
	(rs6000_expand_binop_builtin): Enforce that argument 0 of the exp
	argument is a 6-bit unsigned literal value if  the icode argument
	represents a DFP test significance built-in call.
	(rs6000_invalid_builtin): Add support for the RS6000_BTM_P9_MISC
	flag used independently and in combination with the
	RS6000_BTM_64BIT flag.
	(rs6000_opt_masks): Add entry for power9-misc command-line option.
	(rs6000_builtin_mask_names): Add entry for power9-misc
	command-line option.
	* config/rs6000/rs6000.h: Redefine TARGET_P9_MISC as 0 if
	HAVE_AS_POWER9 is not a defined macro.  Define MASK_P9_MISC and
	RS6000_BTM_P9_MISC macros.
	* config/rs6000/rs6000.opt: Add support for the -mpower9-misc
	option and change the description of the -mpower9-vector option to
	enable only vector instructions, removing its erroneously claimed
	support for scalar instructions.
	* doc/extend.texi (PowerPC AltiVec Built-in Functions): Document
	the ISA 3.0 digital floating point test significance built-in
	functions.

Comments

Segher Boessenkool June 27, 2016, 9:30 p.m. UTC | #1
Hi Kelvin,

On Mon, Jun 27, 2016 at 11:47:52AM -0600, Kelvin Nilsen wrote:
> 
> This patch adds built-in function support for the new Power9 dtstsfi
> instruction.
> 
> This has bootstrapped and regression tested on
> powerpc64le-unknown-linux-gnu without regressions.  Is this ok for the
> trunk?  Is this patch ok for gcc-6 after some burn-in time on the trunk?

Okay for trunk with the fixes below.  Okay for 6 later, too.


> 	* gcc.target/powerpc/dtstsfi-0.c: New test.
..
> 	* gcc.target/powerpc/dtstsfi-79.c: New test.

If you have this many tests, please use a subdir.

> 	(rs6000_expand_binop_builtin): Enforce that argument 0 of the exp
> 	argument is a 6-bit unsigned literal value if  the icode argument

Duplicated space.

> +(define_expand "dfptstsfi_<code>_<mode>"
> +  [(set (match_dup 3)
> +	(compare:CCFP
> +         (unspec:D64_D128 

Trailing space.

> +	  [(match_operand:SI 1 "const_int_operand" "n")
> +	   (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
> +	  UNSPEC_DTSTSFI)
> +	 (match_dup 4)))
> +   (set (match_operand:SI 0 "register_operand" "")
> +   	(DFP_TEST:SI (match_dup 3) 

Trailing space.

> +		     (const_int 0)))
> +  ]
> +  "TARGET_P9_MISC"
> +{
> +  operands[3] = gen_reg_rtx (CCFPmode);
> +  operands[4] = CONST0_RTX (SImode);

That's just const0_rtx.

> +(define_insn "*dfp_sgnfcnc_<mode>"
> +  [(set (match_operand:CCFP 0 "" "=y")
> +        (compare:CCFP
> +	 (unspec:D64_D128 [(match_operand:SI 1 "const_int_operand" "n")
> +	 	           (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
> +          UNSPEC_DTSTSFI)
> +	 (match_operand:SI 3 "zero_constant" "j")))]
> +  "TARGET_P9_MISC"
> +  {

Please left-align the {} block.

> +    /* If immediate operand is greater than 63, it will behave as if
> +     * the value had been 63.  The code generator does not support 
> +     * immediate operand values greater than 63. */

No leading * on comment continuation lines.  Two spaces after full stop.
Trailing space.

> +  else if (icode == CODE_FOR_dfptstsfi_eq_dd
> +      || icode == CODE_FOR_dfptstsfi_lt_dd
> +      || icode == CODE_FOR_dfptstsfi_gt_dd 
> +      || icode == CODE_FOR_dfptstsfi_unordered_dd
> +      || icode == CODE_FOR_dfptstsfi_eq_td 
> +      || icode == CODE_FOR_dfptstsfi_lt_td 
> +      || icode == CODE_FOR_dfptstsfi_gt_td 
> +      || icode == CODE_FOR_dfptstsfi_unordered_td)

Many trailing spaces.

> +    {
> +      /* Only allow 6-bit unsigned literals.  */
> +      STRIP_NOPS (arg0);
> +      if (TREE_CODE (arg0) != INTEGER_CST
> +	  || TREE_INT_CST_LOW (arg0) & ~0x3f)

Use IN_RANGE instead?  This only tests the bits that fit in a host int.

> +/* Miscellaneous builtins for decimal floating point instructions
> +   added in ISA 3.0.  These instructions don't require the VSX
> +   options, just the basic ISA 3.0 enablement since they operate on
> +   general purpose registers.  */ 

Trailing space.

Thanks,


Segher
diff mbox

Patch

Index: gcc/doc/extend.texi
===================================================================
--- gcc/doc/extend.texi	(revision 237668)
+++ gcc/doc/extend.texi	(working copy)
@@ -14804,12 +14804,31 @@  The @code{__builtin_divde}, @code{__builtin_divdeo
 64-bit environment support ISA 2.06 or later.
 
 The following built-in functions are available for the PowerPC family
-of processors, starting with ISA 3.0 or later (@option{-mcpu=power9})
-or with @option{-mmodulo}:
+of processors, starting with ISA 3.0 or later (@option{-mcpu=power9}):
 @smallexample
 long long __builtin_darn (void);
 long long __builtin_darn_raw (void);
 int __builtin_darn_32 (void);
+
+int __builtin_dfp_dtstsfi_lt (unsigned int comparison, _Decimal64 value);
+int __builtin_dfp_dtstsfi_lt (unsigned int comparison, _Decimal128 value);
+int __builtin_dfp_dtstsfi_lt_dd (unsigned int comparison, _Decimal64 value);
+int __builtin_dfp_dtstsfi_lt_td (unsigned int comparison, _Decimal128 value);
+
+int __builtin_dfp_dtstsfi_gt (unsigned int comparison, _Decimal64 value);
+int __builtin_dfp_dtstsfi_gt (unsigned int comparison, _Decimal128 value);
+int __builtin_dfp_dtstsfi_gt_dd (unsigned int comparison, _Decimal64 value);
+int __builtin_dfp_dtstsfi_gt_td (unsigned int comparison, _Decimal128 value);
+
+int __builtin_dfp_dtstsfi_eq (unsigned int comparison, _Decimal64 value);
+int __builtin_dfp_dtstsfi_eq (unsigned int comparison, _Decimal128 value);
+int __builtin_dfp_dtstsfi_eq_dd (unsigned int comparison, _Decimal64 value);
+int __builtin_dfp_dtstsfi_eq_td (unsigned int comparison, _Decimal128 value);
+
+int __builtin_dfp_dtstsfi_ov (unsigned int comparison, _Decimal64 value);
+int __builtin_dfp_dtstsfi_ov (unsigned int comparison, _Decimal128 value);
+int __builtin_dfp_dtstsfi_ov_dd (unsigned int comparison, _Decimal64 value);
+int __builtin_dfp_dtstsfi_ov_td (unsigned int comparison, _Decimal128 value);
 @end smallexample
 
 The @code{__builtin_darn} and @code{__builtin_darn_raw}
@@ -14820,6 +14839,38 @@  random number.  The @code{__builtin_darn_raw} func
 64-bit raw random number.  The @code{__builtin_darn_32} function
 provides a 32-bit random number.
 
+The @code{__builtin_dfp_dtstsfi_lt} function returns a non-zero value
+if and only if the number of signficant digits of its @code{value} argument
+is less than its @code{comparison} argument.  The
+@code{__builtin_dfp_dtstsfi_lt_dd} and
+@code{__builtin_dfp_dtstsfi_lt_td} functions behave similarly, but
+require that the type of the @code{value} argument be
+@code{__Decimal64} and @code{__Decimal128} respectively.
+
+The @code{__builtin_dfp_dtstsfi_gt} function returns a non-zero value
+if and only if the number of signficant digits of its @code{value} argument
+is greater than its @code{comparison} argument.  The
+@code{__builtin_dfp_dtstsfi_gt_dd} and
+@code{__builtin_dfp_dtstsfi_gt_td} functions behave similarly, but
+require that the type of the @code{value} argument be
+@code{__Decimal64} and @code{__Decimal128} respectively.
+
+The @code{__builtin_dfp_dtstsfi_eq} function returns a non-zero value
+if and only if the number of signficant digits of its @code{value} argument
+equals its @code{comparison} argument.  The
+@code{__builtin_dfp_dtstsfi_eq_dd} and
+@code{__builtin_dfp_dtstsfi_eq_td} functions behave similarly, but
+require that the type of the @code{value} argument be
+@code{__Decimal64} and @code{__Decimal128} respectively.
+
+The @code{__builtin_dfp_dtstsfi_ov} function returns a non-zero value
+if and only if its @code{value} argument has an undefined number of
+significant digits, such as when @code{value} is an encoding of @code{NaN}.
+The @code{__builtin_dfp_dtstsfi_ov_dd} and
+@code{__builtin_dfp_dtstsfi_ov_td} functions behave similarly, but
+require that the type of the @code{value} argument be
+@code{__Decimal64} and @code{__Decimal128} respectively.
+
 The following built-in functions are available for the PowerPC family
 of processors when hardware decimal floating point
 (@option{-mhard-dfp}) is available:
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-0.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-0.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-0.c	(revision 237800)
@@ -0,0 +1,17 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-1.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-1.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-1.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_lt_dd requires" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-10.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-10.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-10.c	(revision 237800)
@@ -0,0 +1,17 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt_dd (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-11.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-11.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-11.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt_dd (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_lt_dd requires" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-12.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-12.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-12.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt_dd (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-13.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-13.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-13.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  if (__builtin_dfp_dtstsfi_lt_dd (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-14.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-14.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-14.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt_dd (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-15.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-15.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-15.c	(revision 237800)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt_td (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-16.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-16.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-16.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt_td (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_lt_td requires" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-17.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-17.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-17.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt_td (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-18.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-18.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-18.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  if (__builtin_dfp_dtstsfi_lt_td (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-19.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-19.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-19.c	(revision 237800)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt_td (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-2.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-2.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-2.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-20.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-20.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-20.c	(revision 237800)
@@ -0,0 +1,17 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-21.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-21.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-21.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_gt_dd requires" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-22.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-22.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-22.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-23.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-23.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-23.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  if (__builtin_dfp_dtstsfi_gt (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-24.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-24.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-24.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-25.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-25.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-25.c	(revision 237800)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-26.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-26.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-26.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_gt_td requires" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-27.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-27.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-27.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-28.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-28.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-28.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  if (__builtin_dfp_dtstsfi_gt (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-29.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-29.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-29.c	(revision 237800)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-3.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-3.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-3.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  if (__builtin_dfp_dtstsfi_lt (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-30.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-30.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-30.c	(revision 237800)
@@ -0,0 +1,17 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt_dd (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-31.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-31.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-31.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt_dd (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_gt_dd requires" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-32.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-32.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-32.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt_dd (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-33.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-33.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-33.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  if (__builtin_dfp_dtstsfi_gt_dd (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-34.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-34.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-34.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt_dd (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-35.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-35.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-35.c	(revision 237800)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt_td (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-36.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-36.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-36.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt_td (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_gt_td requires" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-37.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-37.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-37.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt_td (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-38.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-38.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-38.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  if (__builtin_dfp_dtstsfi_gt_td (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-39.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-39.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-39.c	(revision 237800)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_gt_td (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-4.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-4.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-4.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-40.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-40.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-40.c	(revision 237800)
@@ -0,0 +1,17 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-41.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-41.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-41.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_eq_dd requires" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-42.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-42.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-42.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-43.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-43.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-43.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  if (__builtin_dfp_dtstsfi_eq (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-44.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-44.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-44.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-45.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-45.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-45.c	(revision 237800)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-46.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-46.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-46.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_eq_td requires" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-47.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-47.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-47.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-48.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-48.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-48.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  if (__builtin_dfp_dtstsfi_eq (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-49.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-49.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-49.c	(revision 237800)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-5.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-5.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-5.c	(revision 237800)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-50.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-50.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-50.c	(revision 237800)
@@ -0,0 +1,17 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq_dd (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-51.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-51.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-51.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq_dd (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_eq_dd requires" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-52.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-52.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-52.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq_dd (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-53.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-53.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-53.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  if (__builtin_dfp_dtstsfi_eq_dd (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-54.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-54.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-54.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq_dd (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-55.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-55.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-55.c	(revision 237800)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq_td (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-56.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-56.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-56.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq_td (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_eq_td requires" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-57.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-57.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-57.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq_td (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-58.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-58.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-58.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  if (__builtin_dfp_dtstsfi_eq_td (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-59.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-59.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-59.c	(revision 237800)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_eq_td (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-6.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-6.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-6.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_lt_td requires" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-60.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-60.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-60.c	(revision 237800)
@@ -0,0 +1,17 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-61.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-61.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-61.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_ov_dd requires" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-62.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-62.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-62.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-63.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-63.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-63.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  if (__builtin_dfp_dtstsfi_ov (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-64.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-64.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-64.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-65.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-65.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-65.c	(revision 237800)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-66.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-66.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-66.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_ov_td requires" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-67.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-67.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-67.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-68.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-68.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-68.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  if (__builtin_dfp_dtstsfi_ov (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-69.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-69.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-69.c	(revision 237800)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-7.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-7.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-7.c	(revision 237800)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-70.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-70.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-70.c	(revision 237800)
@@ -0,0 +1,17 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov_dd (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-71.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-71.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-71.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov_dd (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_ov_dd requires" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-72.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-72.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-72.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov_dd (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-73.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-73.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-73.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p)
+{
+  _Decimal64 source = *p;
+
+  if (__builtin_dfp_dtstsfi_ov_dd (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfi" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-74.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-74.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-74.c	(revision 237800)
@@ -0,0 +1,15 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal64 *p, unsigned int significance)
+{
+  _Decimal64 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov_dd (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-75.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-75.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-75.c	(revision 237800)
@@ -0,0 +1,18 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+/* This test should succeed on both 32- and 64-bit configurations.  */
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov_td (5, source);
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-76.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-76.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-76.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power8" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power8" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov_td (5, source);	/* { dg-error "Builtin function __builtin_dtstsfi_ov_td requires" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-77.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-77.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-77.c	(revision 237800)
@@ -0,0 +1,16 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov_td (65, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
+
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-78.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-78.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-78.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  if (__builtin_dfp_dtstsfi_ov_td (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-79.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-79.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-79.c	(revision 237800)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_ov_td (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-8.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-8.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-8.c	(revision 237800)
@@ -0,0 +1,20 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p)
+{
+  _Decimal128 source = *p;
+
+  if (__builtin_dfp_dtstsfi_lt (63, source))
+    return 3;
+  else
+    return 5;
+}
+
+/* { dg-final { scan-assembler	   "dtstsfiq" } } */
+
Index: gcc/testsuite/gcc.target/powerpc/dtstsfi-9.c
===================================================================
--- gcc/testsuite/gcc.target/powerpc/dtstsfi-9.c	(revision 0)
+++ gcc/testsuite/gcc.target/powerpc/dtstsfi-9.c	(revision 237800)
@@ -0,0 +1,14 @@ 
+/* { dg-do compile { target { powerpc*-*-* } } } */
+/* { dg-skip-if "do not override -mcpu" { powerpc*-*-* } { "-mcpu=*" } { "-mcpu=power9" } } */
+/* { dg-require-effective-target powerpc_p9vector_ok } */
+/* { dg-skip-if "" { powerpc*-*-aix* } } */
+/* { dg-options "-mcpu=power9" } */
+
+#include <altivec.h>
+
+int doTestBCDSignificance (_Decimal128 *p, unsigned int significance)
+{
+  _Decimal128 source = *p;
+
+  return __builtin_dfp_dtstsfi_lt (significance, source);	/* { dg-error "argument 1 must be a 6-bit unsigned literal" } */
+}
Index: gcc/config/rs6000/dfp.md
===================================================================
--- gcc/config/rs6000/dfp.md	(revision 237668)
+++ gcc/config/rs6000/dfp.md	(working copy)
@@ -319,8 +319,11 @@ 
    UNSPEC_DXEX
    UNSPEC_DIEX
    UNSPEC_DSCLI
+   UNSPEC_DTSTSFI
    UNSPEC_DSCRI])
 
+(define_code_iterator DFP_TEST [eq lt gt unordered])
+
 (define_mode_iterator D64_D128 [DD TD])
 
 (define_mode_attr dfp_suffix [(DD "")
@@ -352,6 +355,42 @@ 
   "dxex<dfp_suffix> %0,%1"
   [(set_attr "type" "fp")])
 
+(define_expand "dfptstsfi_<code>_<mode>"
+  [(set (match_dup 3)
+	(compare:CCFP
+         (unspec:D64_D128 
+	  [(match_operand:SI 1 "const_int_operand" "n")
+	   (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
+	  UNSPEC_DTSTSFI)
+	 (match_dup 4)))
+   (set (match_operand:SI 0 "register_operand" "")
+   	(DFP_TEST:SI (match_dup 3) 
+		     (const_int 0)))
+  ]
+  "TARGET_P9_MISC"
+{
+  operands[3] = gen_reg_rtx (CCFPmode);
+  operands[4] = CONST0_RTX (SImode);
+})
+
+(define_insn "*dfp_sgnfcnc_<mode>"
+  [(set (match_operand:CCFP 0 "" "=y")
+        (compare:CCFP
+	 (unspec:D64_D128 [(match_operand:SI 1 "const_int_operand" "n")
+	 	           (match_operand:D64_D128 2 "gpc_reg_operand" "d")]
+          UNSPEC_DTSTSFI)
+	 (match_operand:SI 3 "zero_constant" "j")))]
+  "TARGET_P9_MISC"
+  {
+    /* If immediate operand is greater than 63, it will behave as if
+     * the value had been 63.  The code generator does not support 
+     * immediate operand values greater than 63. */
+    if (!(IN_RANGE (INTVAL (operands[1]), 0, 63)))
+      operands[1] = GEN_INT (63);
+    return "dtstsfi<dfp_suffix> %0,%1,%2";
+  }
+  [(set_attr "type" "fp")])
+
 (define_insn "dfp_diex_<mode>"
   [(set (match_operand:D64_D128 0 "gpc_reg_operand" "=d")
 	(unspec:D64_D128 [(match_operand:D64_D128 1 "gpc_reg_operand" "d")
Index: gcc/config/rs6000/rs6000.c
===================================================================
--- gcc/config/rs6000/rs6000.c	(revision 237668)
+++ gcc/config/rs6000/rs6000.c	(working copy)
@@ -3676,6 +3676,7 @@  rs6000_builtin_mask_calculate (void)
 	  | ((rs6000_cpu == PROCESSOR_CELL) ? RS6000_BTM_CELL      : 0)
 	  | ((TARGET_P8_VECTOR)		    ? RS6000_BTM_P8_VECTOR : 0)
 	  | ((TARGET_P9_VECTOR)		    ? RS6000_BTM_P9_VECTOR : 0)
+	  | ((TARGET_P9_MISC)		    ? RS6000_BTM_P9_MISC   : 0)
 	  | ((TARGET_MODULO)		    ? RS6000_BTM_MODULO    : 0)
 	  | ((TARGET_64BIT)		    ? RS6000_BTM_64BIT     : 0)
 	  | ((TARGET_CRYPTO)		    ? RS6000_BTM_CRYPTO	   : 0)
@@ -13398,7 +13399,27 @@  rs6000_expand_binop_builtin (enum insn_code icode,
 	  return const0_rtx;
 	}
     }
+  else if (icode == CODE_FOR_dfptstsfi_eq_dd
+      || icode == CODE_FOR_dfptstsfi_lt_dd
+      || icode == CODE_FOR_dfptstsfi_gt_dd 
+      || icode == CODE_FOR_dfptstsfi_unordered_dd
+      || icode == CODE_FOR_dfptstsfi_eq_td 
+      || icode == CODE_FOR_dfptstsfi_lt_td 
+      || icode == CODE_FOR_dfptstsfi_gt_td 
+      || icode == CODE_FOR_dfptstsfi_unordered_td)
+    {
+      /* Only allow 6-bit unsigned literals.  */
+      STRIP_NOPS (arg0);
+      if (TREE_CODE (arg0) != INTEGER_CST
+	  || TREE_INT_CST_LOW (arg0) & ~0x3f)
+	{
+	  error ("argument 1 must be a 6-bit unsigned literal");
+	  return CONST0_RTX (tmode);
+	}
+    }
 
+
+
   if (target == 0
       || GET_MODE (target) != tmode
       || ! (*insn_data[icode].operand[0].predicate) (target, tmode))
@@ -15504,6 +15525,12 @@  rs6000_invalid_builtin (enum rs6000_builtins fncod
     error ("Builtin function %s requires the -mpower8-vector option", name);
   else if ((fnmask & RS6000_BTM_P9_VECTOR) != 0)
     error ("Builtin function %s requires the -mpower9-vector option", name);
+  else if ((fnmask & (RS6000_BTM_P9_MISC | RS6000_BTM_64BIT)) 
+	   == (RS6000_BTM_P9_MISC | RS6000_BTM_64BIT))
+    error ("Builtin function %s requires the -mpower9-misc and"
+	   " -m64 options", name);
+  else if ((fnmask & RS6000_BTM_P9_MISC) == RS6000_BTM_P9_MISC)
+    error ("Builtin function %s requires the -mpower9-misc option", name);
   else if ((fnmask & (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128))
 	   == (RS6000_BTM_HARD_FLOAT | RS6000_BTM_LDBL128))
     error ("Builtin function %s requires the -mhard-float and"
@@ -35508,6 +35535,7 @@  static struct rs6000_opt_mask const rs6000_opt_mas
   { "power9-dform-vector",	OPTION_MASK_P9_DFORM_VECTOR,	false, true  },
   { "power9-fusion",		OPTION_MASK_P9_FUSION,		false, true  },
   { "power9-minmax",		OPTION_MASK_P9_MINMAX,		false, true  },
+  { "power9-misc",		OPTION_MASK_P9_MISC,		false, true  },
   { "power9-vector",		OPTION_MASK_P9_VECTOR,		false, true  },
   { "powerpc-gfxopt",		OPTION_MASK_PPC_GFXOPT,		false, true  },
   { "powerpc-gpopt",		OPTION_MASK_PPC_GPOPT,		false, true  },
@@ -35564,6 +35592,7 @@  static struct rs6000_opt_mask const rs6000_builtin
   { "cell",		 RS6000_BTM_CELL,	false, false },
   { "power8-vector",	 RS6000_BTM_P8_VECTOR,	false, false },
   { "power9-vector",	 RS6000_BTM_P9_VECTOR,	false, false },
+  { "power9-misc",	 RS6000_BTM_P9_MISC,	false, false },
   { "crypto",		 RS6000_BTM_CRYPTO,	false, false },
   { "htm",		 RS6000_BTM_HTM,	false, false },
   { "hard-dfp",		 RS6000_BTM_DFP,	false, false },
Index: gcc/config/rs6000/rs6000.h
===================================================================
--- gcc/config/rs6000/rs6000.h	(revision 237668)
+++ gcc/config/rs6000/rs6000.h	(working copy)
@@ -314,6 +314,7 @@  extern const char *host_detect_local_cpu (int argc
 #undef  TARGET_P9_MINMAX
 #undef  TARGET_P9_DFORM_SCALAR
 #undef  TARGET_P9_DFORM_VECTOR
+#undef  TARGET_P9_MISC
 #define TARGET_FLOAT128_HW 0
 #define TARGET_MODULO 0
 #define TARGET_P9_VECTOR 0
@@ -320,6 +321,7 @@  extern const char *host_detect_local_cpu (int argc
 #define TARGET_P9_MINMAX 0
 #define TARGET_P9_DFORM_SCALAR 0
 #define TARGET_P9_DFORM_VECTOR 0
+#define TARGET_P9_MISC 0
 #endif
 
 /* Define TARGET_LWSYNC_INSTRUCTION if the assembler knows about lwsync.  If
@@ -645,6 +647,7 @@  extern int rs6000_vector_align[];
 #define MASK_NO_UPDATE			OPTION_MASK_NO_UPDATE
 #define MASK_P8_VECTOR			OPTION_MASK_P8_VECTOR
 #define MASK_P9_VECTOR			OPTION_MASK_P9_VECTOR
+#define MASK_P9_MISC			OPTION_MASK_P9_MISC
 #define MASK_POPCNTB			OPTION_MASK_POPCNTB
 #define MASK_POPCNTD			OPTION_MASK_POPCNTD
 #define MASK_PPC_GFXOPT			OPTION_MASK_PPC_GFXOPT
@@ -2695,6 +2698,7 @@  extern int frame_pointer_needed;
 #define RS6000_BTM_VSX		MASK_VSX	/* VSX (vector/scalar).  */
 #define RS6000_BTM_P8_VECTOR	MASK_P8_VECTOR	/* ISA 2.07 vector.  */
 #define RS6000_BTM_P9_VECTOR	MASK_P9_VECTOR	/* ISA 3.0 vector.  */
+#define RS6000_BTM_P9_MISC	MASK_P9_MISC	/* ISA 3.0 misc. non-vector */
 #define RS6000_BTM_CRYPTO	MASK_CRYPTO	/* crypto funcs.  */
 #define RS6000_BTM_HTM		MASK_HTM	/* hardware TM funcs.  */
 #define RS6000_BTM_SPE		MASK_STRING	/* E500 */
@@ -2714,6 +2718,7 @@  extern int frame_pointer_needed;
 				 | RS6000_BTM_VSX			\
 				 | RS6000_BTM_P8_VECTOR			\
 				 | RS6000_BTM_P9_VECTOR			\
+				 | RS6000_BTM_P9_MISC			\
 				 | RS6000_BTM_MODULO                    \
 				 | RS6000_BTM_CRYPTO			\
 				 | RS6000_BTM_FRE			\
Index: gcc/config/rs6000/rs6000.opt
===================================================================
--- gcc/config/rs6000/rs6000.opt	(revision 237668)
+++ gcc/config/rs6000/rs6000.opt	(working copy)
@@ -609,9 +609,13 @@  mpower9-fusion
 Target Report Mask(P9_FUSION) Var(rs6000_isa_flags)
 Fuse certain operations together for better performance on power9.
 
+mpower9-misc
+Target Undocumented Report Mask(P9_MISC) Var(rs6000_isa_flags)
+Use/do not use certain scalar instructions added in ISA 3.0.
+
 mpower9-vector
 Target Report Mask(P9_VECTOR) Var(rs6000_isa_flags)
-Use/do not use vector and scalar instructions added in ISA 3.0.
+Use/do not use vector instructions added in ISA 3.0.
 
 mpower9-dform-scalar
 Target Undocumented Mask(P9_DFORM_SCALAR) Var(rs6000_isa_flags)
Index: gcc/config/rs6000/rs6000-c.c
===================================================================
--- gcc/config/rs6000/rs6000-c.c	(revision 237668)
+++ gcc/config/rs6000/rs6000-c.c	(working copy)
@@ -4203,6 +4203,46 @@  const struct altivec_builtin_types altivec_overloa
   { P8V_BUILTIN_VEC_VCLZD, P8V_BUILTIN_VCLZD,
     RS6000_BTI_unsigned_V2DI, RS6000_BTI_unsigned_V2DI, 0, 0 },
 
+  { P9_BUILTIN_DFP_TSTSFI_LT, MISC_BUILTIN_TSTSFI_LT_TD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
+  { P9_BUILTIN_DFP_TSTSFI_LT, MISC_BUILTIN_TSTSFI_LT_DD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
+
+  { P9_BUILTIN_DFP_TSTSFI_LT_TD, MISC_BUILTIN_TSTSFI_LT_TD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
+  { P9_BUILTIN_DFP_TSTSFI_LT_DD, MISC_BUILTIN_TSTSFI_LT_DD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
+
+  { P9_BUILTIN_DFP_TSTSFI_EQ, MISC_BUILTIN_TSTSFI_EQ_TD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
+  { P9_BUILTIN_DFP_TSTSFI_EQ, MISC_BUILTIN_TSTSFI_EQ_DD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
+
+  { P9_BUILTIN_DFP_TSTSFI_EQ_TD, MISC_BUILTIN_TSTSFI_EQ_TD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
+  { P9_BUILTIN_DFP_TSTSFI_EQ_DD, MISC_BUILTIN_TSTSFI_EQ_DD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
+
+  { P9_BUILTIN_DFP_TSTSFI_GT, MISC_BUILTIN_TSTSFI_GT_TD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
+  { P9_BUILTIN_DFP_TSTSFI_GT, MISC_BUILTIN_TSTSFI_GT_DD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
+
+  { P9_BUILTIN_DFP_TSTSFI_GT_TD, MISC_BUILTIN_TSTSFI_GT_TD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
+  { P9_BUILTIN_DFP_TSTSFI_GT_DD, MISC_BUILTIN_TSTSFI_GT_DD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
+
+  { P9_BUILTIN_DFP_TSTSFI_OV, MISC_BUILTIN_TSTSFI_OV_TD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
+  { P9_BUILTIN_DFP_TSTSFI_OV, MISC_BUILTIN_TSTSFI_OV_DD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
+
+  { P9_BUILTIN_DFP_TSTSFI_OV_TD, MISC_BUILTIN_TSTSFI_OV_TD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat128, 0 },
+  { P9_BUILTIN_DFP_TSTSFI_OV_DD, MISC_BUILTIN_TSTSFI_OV_DD,
+    RS6000_BTI_INTSI, RS6000_BTI_UINTSI, RS6000_BTI_dfloat64, 0 },
+
   { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZB,
     RS6000_BTI_V16QI, RS6000_BTI_V16QI, 0, 0 },
   { P9V_BUILTIN_VEC_VCTZ, P9V_BUILTIN_VCTZB,
Index: gcc/config/rs6000/rs6000-builtin.def
===================================================================
--- gcc/config/rs6000/rs6000-builtin.def	(revision 237668)
+++ gcc/config/rs6000/rs6000-builtin.def	(working copy)
@@ -656,10 +656,18 @@ 
 /* Miscellaneous builtins for instructions added in ISA 3.0.  These
    instructions don't require either the DFP or VSX options, just the basic
    ISA 3.0 enablement since they operate on general purpose registers.  */
+#define BU_P9_MISC_0(ENUM, NAME, ATTR, ICODE)                      \
+  RS6000_BUILTIN_0 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
+		    "__builtin_" NAME,			/* NAME */	\
+		    RS6000_BTM_P9_MISC,			/* MASK */	\
+		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
+		     | RS6000_BTC_SPECIAL),				\
+		    CODE_FOR_ ## ICODE)			/* ICODE */
+
 #define BU_P9_MISC_1(ENUM, NAME, ATTR, ICODE)				\
   RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
 		    "__builtin_" NAME,			/* NAME */	\
-		    RS6000_BTM_MODULO,			/* MASK */	\
+		    RS6000_BTM_P9_MISC,			/* MASK */	\
 		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
 		     | RS6000_BTC_UNARY),				\
 		    CODE_FOR_ ## ICODE)			/* ICODE */
@@ -671,23 +679,65 @@ 
 #define BU_P9_64BIT_MISC_0(ENUM, NAME, ATTR, ICODE)			\
   RS6000_BUILTIN_0 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
 		    "__builtin_" NAME,			/* NAME */	\
-		    RS6000_BTM_MODULO                                   \
+		    RS6000_BTM_P9_MISC					\
                      | RS6000_BTM_64BIT,		/* MASK */	\
 		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
 		     | RS6000_BTC_SPECIAL),				\
 		    CODE_FOR_ ## ICODE)			/* ICODE */
 
-/* Miscellaneous builtins for instructions added in ISA 3.0.  These
-   instructions don't require either the DFP or VSX options, just the basic
-   ISA 3.0 enablement since they operate on general purpose registers.  */
-#define BU_P9_MISC_0(ENUM, NAME, ATTR, ICODE)                      \
+/* Miscellaneous builtins for decimal floating point instructions
+   added in ISA 3.0.  These instructions don't require the VSX
+   options, just the basic ISA 3.0 enablement since they operate on
+   general purpose registers.  */ 
+#define BU_P9_DFP_MISC_0(ENUM, NAME, ATTR, ICODE)			\
   RS6000_BUILTIN_0 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
 		    "__builtin_" NAME,			/* NAME */	\
-		    RS6000_BTM_MODULO,			/* MASK */	\
+		    RS6000_BTM_P9_MISC,			/* MASK */	\
 		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
 		     | RS6000_BTC_SPECIAL),				\
 		    CODE_FOR_ ## ICODE)			/* ICODE */
 
+#define BU_P9_DFP_MISC_1(ENUM, NAME, ATTR, ICODE)			\
+  RS6000_BUILTIN_1 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
+		    "__builtin_" NAME,			/* NAME */	\
+		    RS6000_BTM_P9_MISC,			/* MASK */	\
+		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
+		     | RS6000_BTC_SPECIAL),				\
+		    CODE_FOR_ ## ICODE)			/* ICODE */
+
+#define BU_P9_DFP_MISC_2(ENUM, NAME, ATTR, ICODE)			\
+  RS6000_BUILTIN_2 (MISC_BUILTIN_ ## ENUM,		/* ENUM */	\
+		    "__builtin_" NAME,			/* NAME */	\
+		    RS6000_BTM_P9_MISC,			/* MASK */	\
+		    (RS6000_BTC_ ## ATTR		/* ATTR */	\
+		     | RS6000_BTC_SPECIAL),				\
+		    CODE_FOR_ ## ICODE)			/* ICODE */
+
+/* Decimal floating point overloaded functions added in ISA 3.0 */
+#define BU_P9_DFP_OVERLOAD_1(ENUM, NAME)				\
+  RS6000_BUILTIN_1 (P9_BUILTIN_DFP_ ## ENUM,		/* ENUM */	\
+		    "__builtin_dfp_" NAME,		/* NAME */	\
+		    RS6000_BTM_P9_MISC,			/* MASK */	\
+		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
+		     | RS6000_BTC_UNARY),				\
+		    CODE_FOR_nothing)			/* ICODE */
+
+#define BU_P9_DFP_OVERLOAD_2(ENUM, NAME)				\
+  RS6000_BUILTIN_2 (P9_BUILTIN_DFP_ ## ENUM,		/* ENUM */	\
+		    "__builtin_dfp_" NAME,		/* NAME */	\
+		    RS6000_BTM_P9_MISC,			/* MASK */	\
+		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
+		     | RS6000_BTC_BINARY),				\
+		    CODE_FOR_nothing)			/* ICODE */
+
+#define BU_P9_DFP_OVERLOAD_3(ENUM, NAME)				\
+  RS6000_BUILTIN_3 (P9_BUILTIN_DFP_ ## ENUM,		/* ENUM */	\
+		    "__builtin_dfp_" NAME,		/* NAME */	\
+		    RS6000_BTM_P9_MISC,			/* MASK */	\
+		    (RS6000_BTC_OVERLOADED		/* ATTR */	\
+		     | RS6000_BTC_TERNARY),				\
+		    CODE_FOR_nothing)			/* ICODE */
+
 /* ISA 3.0 (power9) vector convenience macros.  */
 /* For the instructions that are encoded as altivec instructions use
    __builtin_altivec_ as the builtin name.  */
@@ -1794,6 +1844,36 @@  BU_LDBL128_2 (UNPACK_TF,	"unpack_longdouble",	CONS
 BU_P7_MISC_2 (PACK_V1TI,	"pack_vector_int128",	CONST,	packv1ti)
 BU_P7_MISC_2 (UNPACK_V1TI,	"unpack_vector_int128",	CONST,	unpackv1ti)
 
+/* 2 argument DFP (Decimal Floating Point) functions added in ISA 3.0.  */
+BU_P9_DFP_MISC_2 (TSTSFI_LT_DD, "dtstsfi_lt_dd", CONST, dfptstsfi_lt_dd)
+BU_P9_DFP_MISC_2 (TSTSFI_LT_TD, "dtstsfi_lt_td", CONST, dfptstsfi_lt_td)
+
+BU_P9_DFP_MISC_2 (TSTSFI_EQ_DD, "dtstsfi_eq_dd", CONST, dfptstsfi_eq_dd)
+BU_P9_DFP_MISC_2 (TSTSFI_EQ_TD, "dtstsfi_eq_td", CONST, dfptstsfi_eq_td)
+
+BU_P9_DFP_MISC_2 (TSTSFI_GT_DD, "dtstsfi_gt_dd", CONST, dfptstsfi_gt_dd)
+BU_P9_DFP_MISC_2 (TSTSFI_GT_TD, "dtstsfi_gt_td", CONST, dfptstsfi_gt_td)
+
+BU_P9_DFP_MISC_2 (TSTSFI_OV_DD, "dtstsfi_ov_dd", CONST, dfptstsfi_unordered_dd)
+BU_P9_DFP_MISC_2 (TSTSFI_OV_TD, "dtstsfi_ov_td", CONST, dfptstsfi_unordered_td)
+
+/* 2 argument overloaded DFP functions added in ISA 3.0.  */
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_LT,	"dtstsfi_lt")
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_LT_DD,	"dtstsfi_lt_dd")
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_LT_TD,	"dtstsfi_lt_td")
+
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_EQ,	"dtstsfi_eq")
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_EQ_DD,	"dtstsfi_eq_dd")
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_EQ_TD,	"dtstsfi_eq_td")
+
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_GT,	"dtstsfi_gt")
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_GT_DD,	"dtstsfi_gt_dd")
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_GT_TD,	"dtstsfi_gt_td")
+
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_OV,	"dtstsfi_ov")
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_OV_DD,	"dtstsfi_ov_dd")
+BU_P9_DFP_OVERLOAD_2 (TSTSFI_OV_TD,	"dtstsfi_ov_td")
+
 /* 1 argument vector functions added in ISA 3.0 (power9).  */
 BU_P9V_AV_1 (VCTZB,		"vctzb",		CONST,  ctzv16qi2)
 BU_P9V_AV_1 (VCTZH,		"vctzh",		CONST,  ctzv8hi2)
Index: gcc/config/rs6000/altivec.md
===================================================================
--- gcc/config/rs6000/altivec.md	(revision 237668)
+++ gcc/config/rs6000/altivec.md	(working copy)
@@ -3680,7 +3680,7 @@ 
 (define_insn "darn_32"
   [(set (match_operand:SI 0 "register_operand" "=r")
         (unspec:SI [(const_int 0)] UNSPEC_DARN_32))]
-  "TARGET_MODULO"
+  "TARGET_P9_MISC"
   "darn %0,0"
   [(set_attr "type" "integer")])
 
@@ -3687,7 +3687,7 @@ 
 (define_insn "darn_raw"
   [(set (match_operand:DI 0 "register_operand" "=r")
         (unspec:DI [(const_int 0)] UNSPEC_DARN_RAW))]
-  "TARGET_MODULO && TARGET_64BIT"
+  "TARGET_P9_MISC && TARGET_64BIT"
   "darn %0,2"
   [(set_attr "type" "integer")])
 
@@ -3694,7 +3694,7 @@ 
 (define_insn "darn"
   [(set (match_operand:DI 0 "register_operand" "=r")
         (unspec:DI [(const_int 0)] UNSPEC_DARN))]
-  "TARGET_MODULO && TARGET_64BIT"
+  "TARGET_P9_MISC && TARGET_64BIT"
   "darn %0,1"
   [(set_attr "type" "integer")])
 
Index: gcc/config/rs6000/rs6000-cpus.def
===================================================================
--- gcc/config/rs6000/rs6000-cpus.def	(revision 237668)
+++ gcc/config/rs6000/rs6000-cpus.def	(working copy)
@@ -69,6 +69,7 @@ 
 				 | OPTION_MASK_MODULO			\
 				 | OPTION_MASK_P9_FUSION		\
 				 | OPTION_MASK_P9_DFORM_SCALAR		\
+				 | OPTION_MASK_P9_MISC			\
 				 | OPTION_MASK_P9_VECTOR)
 
 #define POWERPC_7400_MASK	(OPTION_MASK_PPC_GFXOPT | OPTION_MASK_ALTIVEC)
@@ -108,6 +109,7 @@ 
 				 | OPTION_MASK_P9_DFORM_VECTOR		\
 				 | OPTION_MASK_P9_FUSION		\
 				 | OPTION_MASK_P9_MINMAX		\
+				 | OPTION_MASK_P9_MISC			\
 				 | OPTION_MASK_P9_VECTOR		\
 				 | OPTION_MASK_POPCNTB			\
 				 | OPTION_MASK_POPCNTD			\