Otherwise the builtin reads the FPSCR, masks the current decimal rounding
mode bits out and OR's in the new value.
+_Decimal64 __builtin_dfp_quantize (_Decimal64, _Decimal64, const int);
+_Decimal64 __builtin_dfp_quantize (const int, _Decimal64, const int);
+_Decimal128 __builtin_dfp_quantize (_Decimal128, _Decimal128, const int);
+_Decimal128 __builtin_dfp_quantize (const int, _Decimal128, const int);
+
+The @code{__builtin_dfp_quantize} built-in, converts and rounds the second
+argument to the form with the exponent as specified by the first
+argument based on the rounding mode specified by the third argument.
+If the first argument is a decimal floating point value, its exponent is used
+for converting and rounding of the second argument. If the first argument is a
+5-bit constant integer value, then the value specifies the exponent to be used
+when rounding and converting the second argument. The third argument is a
+two bit constant integer that specifies the rounding mode. The possible modes
+are: 00 Round to nearest, ties to even; 01 Round toward 0; 10 Round to nearest,
+ties away from 0; 11 Round according to DRN where DRN is the Decimal Floating
+point field of the FPSCR.
+
@end smallexample
The following functions require @option{-mhard-float},
--- /dev/null
+/* { dg-do run } */
+/* { dg-require-effective-target dfp_hw } */
+/* { dg-require-effective-target has_arch_pwr6 } */
+/* { dg-options "-mhard-float -O2 -save-temps" } */
+
+/* Test the decimal floating point quantize built-ins. */
+
+#define DEBUG 0
+
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+#include <float.h>
+
+void abort (void);
+
+int main()
+{
+#define IMM2 2
+#define IMM3 3
+#define IMM4 4
+
+ _Decimal64 srcA_dfp64, srcB_dfp64;
+ _Decimal64 result_dfp64;
+ _Decimal64 expected_result_dfp64;
+ _Decimal128 srcA_dfp128, srcB_dfp128;
+ _Decimal128 result_dfp128;
+ _Decimal128 expected_result_dfp128;
+
+ /* Third argument of quantize built-ins is the rounding mode value (RMC).
+
+ RMC Rounding Mode
+ 00 Round to nearest, ties to even
+ 01 Round toward 0
+ 10 Round to nearest, ties toward 0
+ 11 Round according to DRN */
+
+
+ /* Tests for quantize with 64-bit DFP variable. */
+ srcA_dfp64 = 100.0df;
+ srcB_dfp64 = 300.456789df;
+ expected_result_dfp64 = 300.5df;
+
+ result_dfp64 = __builtin_dfp_quantize (srcA_dfp64, srcB_dfp64, 0x0);
+
+ if (result_dfp64 != expected_result_dfp64)
+#if DEBUG
+ printf("DFP 64-bit quantize of variable, RMC = 0 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ srcA_dfp64 = 100.00df;
+ srcB_dfp64 = 300.456789df;
+ expected_result_dfp64 = 300.45df;
+
+ result_dfp64 = __builtin_dfp_quantize (srcA_dfp64, srcB_dfp64, 0x1);
+
+ if (result_dfp64 != expected_result_dfp64)
+#if DEBUG
+ printf("DFP 64-bit quantize of variable, RMC = 1 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ srcA_dfp64 = 100.001df;
+ srcB_dfp64 = 3001.456789df;
+ expected_result_dfp64 = 3001.457df;
+
+ result_dfp64 = __builtin_dfp_quantize (srcA_dfp64, srcB_dfp64, 0x2);
+
+ if (result_dfp64 != expected_result_dfp64)
+#if DEBUG
+ printf("DFP 64-bit quantize of variable, RMC = 2 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ /* Tests for 64-bit quantize with immediate value. */
+
+ srcB_dfp64 = 10.4567df;
+ expected_result_dfp64 = 000.0df;
+
+ result_dfp64 = __builtin_dfp_quantize (IMM2, srcB_dfp64, 0x0);
+
+ if (result_dfp64 != expected_result_dfp64)
+#if DEBUG
+ printf("DFP 64-bit quantize immediate, RMC = 0 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ srcB_dfp64 = 104567.891df;
+ expected_result_dfp64 = 100000.0df;
+
+ result_dfp64 = __builtin_dfp_quantize (IMM4, srcB_dfp64, 0x1);
+
+ if (result_dfp64 != expected_result_dfp64)
+#if DEBUG
+ printf("DFP 64-bit quantize immediate, RMC = 1 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ srcB_dfp64 = 109876.54321df;
+ expected_result_dfp64 = 109900.0df;
+
+ result_dfp64 = __builtin_dfp_quantize (IMM2, srcB_dfp64, 0x2);
+
+ if (result_dfp64 != expected_result_dfp64)
+#if DEBUG
+ printf("DFP 64-bit quantize immediate, RMC = 2 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ /* Tests for quantize 128-bit DFP variable. */
+ srcA_dfp128 = 0.018df;
+ srcB_dfp128 = 50000.18345df;
+ expected_result_dfp128 = 50000.180df;
+
+ result_dfp128 = __builtin_dfp_quantize (srcA_dfp128, srcB_dfp128, 0x0);
+
+ if (result_dfp128 != expected_result_dfp128)
+#if DEBUG
+ printf("DFP 128-bit quantize variable, RMC = 0 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ srcA_dfp128 = 8.01df;
+ srcB_dfp128 = 50000.18345df;
+ expected_result_dfp128 = 50000.18df;
+
+ result_dfp128 = __builtin_dfp_quantize (srcA_dfp128, srcB_dfp128, 0x1);
+
+ if (result_dfp128 != expected_result_dfp128)
+#if DEBUG
+ printf("DFP 128-bit quantize variable, RMC = 1 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ srcA_dfp128 = 0.1234df;
+ srcB_dfp128 = 50000.18346789df;
+ expected_result_dfp128 = 50000.1800df;
+
+ result_dfp128 = __builtin_dfp_quantize (srcA_dfp128, srcB_dfp128, 0x2);
+
+ if (result_dfp128 != expected_result_dfp128)
+#if DEBUG
+ printf("DFP 128-bit quantize variable, RMC = 2 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ /* Tests for 128-bit quantize with immediate value. */
+ srcB_dfp128 = 1234.18345df;
+ expected_result_dfp128 = 1200.0df;
+
+ result_dfp128 = __builtin_dfp_quantize (IMM2, srcB_dfp128, 0x0);
+
+ if (result_dfp128 != expected_result_dfp128)
+#if DEBUG
+ printf("DFP 128-bit quantize immediate, RMC = 0 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ srcB_dfp128 = 123456.18345df;
+ expected_result_dfp128 = 120000.0df;
+
+ result_dfp128 = __builtin_dfp_quantize (IMM4, srcB_dfp128, 0x1);
+
+ if (result_dfp128 != expected_result_dfp128)
+#if DEBUG
+ printf("DFP 128-bit quantize immediate, RMC = 1 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ srcB_dfp128 = 12361834.5df;
+ expected_result_dfp128 = 12362000.0df;
+
+ result_dfp128 = __builtin_dfp_quantize (IMM3, srcB_dfp128, 0x2);
+
+ if (result_dfp128 != expected_result_dfp128)
+#if DEBUG
+ printf("DFP 128-bit quantize immediate, RMC = 2 result does not match expected result\n");
+#else
+ abort();
+#endif
+
+ return 0;
+}
+
+/* { dg-final { scan-assembler-times {\mdqua\M} 3 } } */
+/* { dg-final { scan-assembler-times {\mdquai\M} 3 } } */
+/* { dg-final { scan-assembler-times {\mdquaq\M} 3 } } */
+/* { dg-final { scan-assembler-times {\mdquaiq\M} 3 } } */