<!--
  Copyright (c) 2016 OpenPOWER Foundation
  
  Licensed under the GNU Free Documentation License, Version 1.3;
  with no Invariants Sections, with no Front-Cover Texts,
  and with no Back-Cover Texts (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

    http://www.gnu.org/licenses/fdl-1.3.txt

-->
<appendix xmlns="http://docbook.org/ns/docbook"
xmlns:xl="http://www.w3.org/1999/xlink" version="5.0" xml:lang="en"
xml:id="dbdoclet.50655245_pgfId-1450875">
  <title>Binary-Coded Decimal Built-In Functions</title>
    <para>Binary-coded decimal (BCD) values are compressed; each decimal digit
    and sign bit occupies 4 bits. Digits are ordered with the most significant
    on the left and the least on the right. The final 4 bits encode the sign.
    A valid encoding must have a value in the range 0&#8211;9 in each of its 31
    digits, and a value in the range 10&#8211;15 for the sign field.</para>
    <para>Source operands with sign codes of 0b1010, 0b1100, 0b1110, or 0b1111
    are interpreted as positive values. Source operands with sign codes of
    0b1011 or 0b1101 are interpreted as negative values.</para>
    <para>BCD arithmetic operations encode the sign of their result as follows:
    A value of 0b1101 indicates a negative value, while 0b1100 and 0b1111
    indicate positive values or zero, depending on the value of the positive
    sign (PS) bit.</para>
    <para>These built-in functions can operate on values of at most 31 digits.
    BCD values are stored in memory as contiguous arrays of 1&#8211;16
    bytes.</para>
      <note>
        <para>BCD built-in functions are valid only when -<emphasis role="bold">march</emphasis> or 
        -<emphasis role="bold">qarch</emphasis> is set to target POWER8 processors or
        later.</para>
      </note>
    <para>
    <xref linkend="dbdoclet.50655245_77606" /> summarizes the BCD built-in
    functions. Functions are grouped by type. Within type, functions are listed
    alphabetically. Prototypes are provided for each function.</para>
    <para> </para>
    <table frame="all" pgwide="1" xml:id="dbdoclet.50655245_77606">
      <title>Binary-Coded Decimal Built-In Functions</title>
      <tgroup cols="2">
        <colspec colname="c1" colwidth="30*" />
        <colspec colname="c2" colwidth="70*" />
        <thead>
          <row>
            <entry align="center">
              <para>
                <emphasis role="bold">Group</emphasis>
              </para>
            </entry>
            <entry align="center">
              <para>
                <emphasis role="bold">Description of Binary-Coded Decimal
                Built-In Functions (with Prototypes)</emphasis>
              </para>
            </entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry nameend="c2" namest="c1">
              <para>
                <emphasis role="bold">BCD Add and Subtract</emphasis>
              </para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDADD (a, b, ps)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Returns the result of the addition of the BCD values a and
              b.</para>
              <para>The sign of the result is determined as follows:</para>
              <itemizedlist>
                <listitem>
                  <para>If the result is a nonnegative value and
                  <emphasis>ps</emphasis> is 0, the sign is set to 0b1100
                  (0xC).</para>
                </listitem>
                <listitem>
                  <para>If the result is a nonnegative value and
                  <emphasis>ps</emphasis> is 1, the sign is set to 0b1111
                  (0xF).</para>
                </listitem>
                <listitem>
                  <para>If the result is a negative value, the sign is set to
                  0b1101 (0xD).</para>
                </listitem>
              </itemizedlist>
              <para>Parameters:</para>
              <para>The ps parameter selects the numeric format for the
              positive-signed BCD numbers. It must be set to one of the values
              defined in 
              <xref linkend="dbdoclet.50655245_32368" />.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>vector unsigned char __builtin_bcdadd (vector unsigned
              char, vector unsigned char, const int);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDSUB (a, b, ps)</para>
            </entry>
            <entry>
              <para>Purpose</para>
              <para>Returns the result of the subtraction of the BCD values a
              and b. Sets the sign of the nonnegative result to 0b1100 if 
              <emphasis>ps</emphasis> is 0. Otherwise, sets the sign of the
              nonnegative result to 0b1111.</para>
              <para>The sign of the result is determined as follows:</para>
              <itemizedlist>
                <listitem>
                  <para>If the result is a nonnegative value and
                  <emphasis>ps</emphasis> is 0, the sign is set to 0b1100
                  (0xC).</para>
                </listitem>
                <listitem>
                  <para>If the result is a nonnegative value and
                  <emphasis>L</emphasis> is 1, the sign is set to 0b1111
                  (0xF).</para>
                </listitem>
                <listitem>
                  <para>If the result is a negative value, the sign is set to
                  0b1101 (0xD).</para>
                </listitem>
              </itemizedlist>
              <para>Parameters:</para>
              <para>The ps parameter selects the numeric format for the
              positive-signed BCD numbers. It must be set to one of the values
              defined in 
              <xref linkend="dbdoclet.50655245_32368" /></para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>vector unsigned char __builtin_bcdsub (vector unsigned
              char, vector unsigned char, const int);</para>
            </entry>
          </row>
          <row>
            <entry nameend="c2" namest="c1">
              <para>
                <emphasis role="bold">BCD Predicates</emphasis>
              </para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDADD_OFL (a, b)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Returns one if the corresponding BCD add operation results
              in an overflow. Otherwise, returns zero.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>int __builtin_bcdadd_ofl (vector unsigned char, vector
              unsigned char);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDSUB_OFL (a, b)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Returns one if the corresponding BCD subtract operation
              results in an overflow. Otherwise, returns zero.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>int __builtin_bcdsub_ofl (vector unsigned char, vector
              unsigned char);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCD_INVALID (a)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Returns one if
              <emphasis>a</emphasis> is an invalid encoding of a BCD value.
              Otherwise, returns zero.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>int __builtin_bcd_invalid (vector unsigned char);</para>
            </entry>
          </row>
          <row>
            <entry nameend="c2" namest="c1">
              <para>
                <emphasis role="bold">BCD Comparison</emphasis>
              </para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDCMPEQ (a, b)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Returns one if the BCD value
              <emphasis>a</emphasis> is equal to 
              <emphasis>b</emphasis>. Otherwise, returns zero.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>int __builtin_bcdcmpeq (vector unsigned char, vector
              unsigned char);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDCMPGE (a, b)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Returns one if the BCD value
              <emphasis>a</emphasis> is greater than or equal to 
              <emphasis>b</emphasis>. Otherwise, returns zero.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>int __builtin_bcdcmpge (vector unsigned char, vector
              unsigned char);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDCMPGT (a, b)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Returns one if the BCD value
              <emphasis>a</emphasis> is greater than 
              <emphasis>b</emphasis>. Otherwise, returns zero.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>int __builtin_bcdcmpgt (vector unsigned char, vector
              unsigned char);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDCMPLE (a, b)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Returns one if the BCD value
              <emphasis>a</emphasis> is less than or equal to 
              <emphasis>b</emphasis>. Otherwise, returns zero.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>int __builtin_bcdcmple (vector unsigned char, vector
              unsigned char);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDCMPLT (a, b)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Returns one if the BCD value
              <emphasis>a</emphasis> is less than 
              <emphasis>b</emphasis>. Otherwise, returns zero.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>int __builtin_bcdcmplt (vector unsigned char, vector
              unsigned char);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>
                <emphasis role="bold">BCD Load and Store</emphasis>
              </para>
            </entry>
            <entry>
              <para> </para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCD2DFP (a)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Converts a signed BCD value stored as a vector of unsigned
              characters to a 128-bit decimal floating-point format.</para>
              <itemizedlist>
                <listitem>
                  <para>Parameter value a is a 128-bit vector that is treated
                  as a signed BCD 31-digit value.</para>
                </listitem>
                <listitem>
                  <para>The return value is a doubleword floating-point pair in
                  a decimal 128 floating-point format.</para>
                </listitem>
              </itemizedlist>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>_Decimal128 __builtin_bcd2dfp (vector unsigned
              char);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDMUL10 (ARG1)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Multiplies the BCD number in ARG1 by 10. The sign indicator
              remains unmodified.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>vector unsigned char __builtin_bcdmul10 (vector unsigned
              char);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BUILTIN_BCDDIV10 (ARG1)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Divides the BCD number in ARG1 by 10. The sign indicator
              remains unmodified.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>vector unsigned char __builtin_bcddiv10 (vector unsigned
              char);</para>
            </entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <para> </para>
  <section xml:id="dbdoclet.50655245_25759">
    <title>BCD Header Functions</title>
    <note>
        <para>These functions are being phased in for POWER8, and might
        not be available on all implementations. Phased-in functions are
        optional for the current generation of compliant systems.</para>
    </note>
    <para>The bcd.h header file defines a BCD data type and the interfaces to
    efficiently compute the BCD functions listed in 
    <xref linkend="dbdoclet.50655245_12427" />. These interfaces can be
    implemented as macros or by another method, such as static inline
    functions. 
    <xref linkend="dbdoclet.50655245_12427" /> shows one suggested
    implementation using macros and the built-in operators shown in 
    <xref linkend="dbdoclet.50655245_77606" />. A sample bcd.h listing is shown
    in 
    <xref linkend="dbdoclet.50655245_48437" />.</para>
    <para>The bcd data type is defined as follows in the bcd.h:</para>
    <programlisting>typedef bcd vector unsigned char;</programlisting>
    <para>The header file also defines a bcd_default_format as follows:</para>
    <programlisting>#ifndef bcd_default_format
#define bcd_default_format __BCD_FORMAT_IBM
#endif</programlisting>
    <table frame="all" pgwide="1" xml:id="dbdoclet.50655245_12427">
      <title>BCD Functions Defined by bcd.h</title>
      <tgroup cols="2">
        <colspec colname="c1" colwidth="30*" />
        <colspec colname="c2" colwidth="80*" />
        <thead>
          <row>
            <entry align="center">
              <para>
                <emphasis role="bold">Macro<footnote xml:id="tabb2fna"><para>Or static inline function.</para></footnote></emphasis>
              </para>
            </entry>
            <entry>
              <para>
                <emphasis role="bold">Macro Definition</emphasis>
              </para>
            </entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>
              <para>bcd_add(a,b)</para>
            </entry>
            <entry>
              <para>(bcd)__builtin_bcdadd (a,b, bcd_default_format)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_sub(a,b)</para>
            </entry>
            <entry>
              <para>(bcd)__builtin_bcdsub (a,b, bcd_default_format)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_add_ofl(a,b)</para>
            </entry>
            <entry>
              <para>(_Bool)__builtin_bcdadd_ofl (a,b)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_sub_ofl(a,b)</para>
            </entry>
            <entry>
              <para>(_Bool)__builtin_bcdsub_ofl (a,b)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_invalid(a)</para>
            </entry>
            <entry>
              <para>(_Bool)__builtin_bcd_invalid (a)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_cmpeq(a,b)</para>
            </entry>
            <entry>
              <para>(_Bool)__builtin_bcdcmpeq (a,b)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_cmpge(a,b)</para>
            </entry>
            <entry>
              <para>(_Bool)__builtin_bcdcmpge (a,b)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_cmpgt(a,b)</para>
            </entry>
            <entry>
              <para>(_Bool)__builtin_bcdcmpgt (a,b)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_cmple(a,b)</para>
            </entry>
            <entry>
              <para>(_Bool)__builtin_bcdcmple (a,b)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_cmplt(a,b)</para>
            </entry>
            <entry>
              <para>(_Bool)__builtin_bcdcmplt (a,b)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_cmpne(a,b)</para>
            </entry>
            <entry>
              <para>!(_Bool)__builtin_bcdcmpeq (a,b)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_xl(a,b)</para>
            </entry>
            <entry>
              <para>(bcd)vec_xl_len_r(a,b)<footnote xml:id="tabb2fnb"><para>Optionally, __builtin_ldrmb (a,b) for previous 
              generations of XL compilers.</para></footnote>
              </para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_xst(a,b)</para>
            </entry>
            <entry>
              <para>(bcd)vec_xst_len_r(a,b)<footnote xml:id="tabb2fnc"><para>Optionally, __builtin_strmb (a,b) for previous 
              generations of XL compilers.</para></footnote>
              </para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_quantize(d)</para>
            </entry>
            <entry>
              <para>__builtin_bcdquantize (d)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_dfp(a)</para>
            </entry>
            <entry>
              <para>__builtin_bcd2dfp (a)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_dfp2bcd(dfp)</para>
            </entry>
            <entry>
              <para>(bcd)__builtin_vec_DFP2BCD (_Decimal128 dfp)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_string2bcd(string)</para>
            </entry>
            <entry>
              <para>(bcd) __bcd_string2bcd (string, bcd_default_format)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_mul10(a)</para>
            </entry>
            <entry>
              <para>(bcd) __builtin_bcdmul10 (a)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_div10(a)</para>
            </entry>
            <entry>
              <para>(bcd) __builtin_bcddiv10 (a)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_mul(a,b)</para>
            </entry>
            <entry>
              <para>(bcd) __bcd_mul (a,b,bcd_default_format)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>bcd_div(a,b)</para>
            </entry>
            <entry>
              <para>(bcd) __bcd_div (a,b,bcd_default_format)</para>
            </entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <para>In addition, the bcd.h file provides access to the library functions
    shown in 
    <xref linkend="dbdoclet.50655245_92773" />. These functions may be provided
    either as a static inline function by bcd.h or in a system library that is
    linked with an application which uses such functions.</para>
    <para> </para>
    <table frame="all" pgwide="1" xml:id="dbdoclet.50655245_92773">
      <title>BCD Support Functions</title>
      <tgroup cols="2">
        <colspec colname="c1" colwidth="30*" align="center"/>
        <colspec colname="c2" colwidth="80*" />
        <thead>
          <row>
            <entry>
              <para>
                <emphasis role="bold">Function Name</emphasis>
              </para>
            </entry>
            <entry align="center">
              <para>
                <emphasis role="bold">Description of BCD Support Functions
                (with Prototypes)</emphasis>
              </para>
            </entry>
          </row>
        </thead>
        <tbody>
          <row>
            <entry>
              <para>__BCD_MUL (A,B,F)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>Two signed 31-digit values are multiplied, and the lower 31
              digits of the product are returned. Overflow is ignored.</para>
              <itemizedlist>
                <listitem>
                  <para>Parameter A is a 128-bit vector that is treated as a
                  signed BCD 31-digit value.</para>
                </listitem>
                <listitem>
                  <para>Parameter B is a 128-bit vector that is treated as a
                  signed BCD 31-digit value.</para>
                </listitem>
                <listitem>
                  <para>Parameter F specifies the format of the BCD number
                  result.</para>
                </listitem>
              </itemizedlist>
              <para>This function returns a 128-bit vector that is the lower 31
              digits of (a × b).</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>bcd __bcd_mul (bcd, bcd, const int)</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BCD_DIV (A,B,F)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>One signed 31-digit value is divided by a second 31-digit
              value. The quotient is returned.</para>
              <itemizedlist>
                <listitem>
                  <para>Parameter A is a 128-bit vector that is treated as a
                  signed BCD 31-digit value.</para>
                </listitem>
                <listitem>
                  <para>Parameter B is a 128-bit vector that is treated as a
                  signed BCD 31-digit value.</para>
                </listitem>
                <listitem>
                  <para>Parameter F specifies the format of the BCD number
                  result.</para>
                </listitem>
              </itemizedlist>
              <para>This function returns a 128-bit vector that is the lower 31
              digits of (a / b).</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>bcd __builtin_bcddiv (bcd, bcd, const int);</para>
            </entry>
          </row>
          <row>
            <entry>
              <para>__BCD_STRING2BCD(S,F)</para>
            </entry>
            <entry>
              <para>Purpose:</para>
              <para>The received ASCII string is converted to a BCD number and
              returned as a BCD type.</para>
              <itemizedlist>
                <listitem>
                  <para>Parameter S is the string to be converted.</para>
                </listitem>
                <listitem>
                  <para>Parameter F specifies the format of the BCD number
                  result.</para>
                </listitem>
              </itemizedlist>
              <para>This function returns a 128-bit vector that consists of 31
              BCD digits and a sign.</para>
            </entry>
          </row>
          <row>
            <entry>
              <para> </para>
            </entry>
            <entry>
              <para>bcd __bcd_string2bcd (char *, const int);</para>
            </entry>
          </row>
        </tbody>
      </tgroup>
    </table>
    <para> </para>
    <section xml:id="dbdoclet.50655245_32368">
      <title>BCD API Named Constants</title>
      <para>The BCD header file, bcd.h, defines named constants. 
      <xref linkend="dbdoclet.50655245_46767" /> defines constants for use in
      conjunction with the BCD format representation. They can be used for
      format specification and to set the bcd_default_format.</para>
      <para> </para>
      <table frame="all" pgwide="1" xml:id="dbdoclet.50655245_46767">
        <title>Constants Used with BCD_FORMAT</title>
        <tgroup cols="1">
          <colspec colname="c1" colwidth="100*" />
          <thead>
            <row>
              <entry>
                <para>
                  <emphasis role="bold">Constants</emphasis>
                </para>
              </entry>
            </row>
          </thead>
          <tbody>
            <row>
              <entry>
                <para>#define BCD_FORMAT_IBM 0</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>#define BCD_FORMAT_Z 0</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>#define BCD_FORMAT_POWER 0</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>#define BCD_FORMAT_IBMi 1</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>#define BCD_FORMAT_I 1</para>
              </entry>
            </row>
            <row>
              <entry>
                <para>#define BCD_FORMAT_NCR 1</para>
              </entry>
            </row>
          </tbody>
        </tgroup>
      </table>
    </section>
    <section xml:id="dbdoclet.50655245_48437">
      <title>Exemplary Implementation for bcd.h</title>
      <para>
      <xref linkend="dbdoclet.50655245_52184" /> shows an exemplary
      implementation of the bcd.h with the interfaces shown in 
      <xref linkend="dbdoclet.50655245_12427" />, using the macros and the
      built-in operators shown in 
      <xref linkend="dbdoclet.50655245_77606" />, and the functions shown in 
      <xref linkend="dbdoclet.50655245_92773" />.</para>
    </section>
    <section xml:id="dbdoclet.50655245_52184">
      <title>Sample bcd.h Listing</title>
      <programlisting>#ifndef __BCD_H
#define __BCD_H

typedef bcd vector unsigned char;

#define BCD_FORMAT_IBM 0
#define BCD_FORMAT_Z 0
#define BCD_FORMAT_POWER 0
#define BCD_FORMAT_IBMi 1
#define BCD_FORMAT_I 1
#define BCD_FORMAT_NCR 1

#ifndef bcd_default_format
#define bcd_default_format __BCD_FORMAT_IBM
#endif

#define bcd_add(a,b) ((bcd)__builtin_bcdadd (a,b,bcd_default_format))
#define bcd_sub(A,b) ((bcd)__builtin_bcdsub (a,b,bcd_default_format))
#define bcd_add_ofl(a,b) ((_Bool)__builtin_bcdadd_ofl (a,b))
#define bcd_sub_ofl(a,b) ((_Bool)__builtin_bcdsub_ofl (a,b))
#define bcd_invalid(a) ((_Bool)__builtin_bcd_invalid (a))
#define bcd_cmpeq(a,b) ((_Bool)__builtin_bcdcmpeq (a,b))
#define bcd_cmpge(a,b) ((_Bool)__builtin_bcdcmpge (a,b))
#define bcd_cmpgt(a,b) ((_Bool)__builtin_bcdcmpgt (a,b))
#define bcd_cmple(a,b) ((_Bool)__builtin_bcdcmple (a,b))
#define bcd_cmplt(a,b) ((_Bool)__builtin_bcdcmplt (a,b))
#define bcd_cmpne(a,b) (!(_Bool)__builtin_bcdcmpeq (a,b))
#define bcd_xl(a,b) ((bcd)vec_xl_len_r(a,b))
#define bcd_xst(a,b) ((bcd)vec_xst_len_r(a,b))
#define bcd_quantize(d) (__builtin_bcdquantize(d))
#define bcd_dfp(a) (__builtin_bcd2dfp (a))
#define bcd_dfp2bcd(DFP) ((bcd)__builtin_vec_DFP2BCD (_Decimal128 dfp))
#define bcd_string2bcd(string) ((bcd) __bcd_string2bcd (string, bcd_default_format)
#define bcd_mul10(a) ((bcd) __builtin_bcdmul10 (a))
#define bcd_div10(a) ((bcd) __builtin_bcddiv10 (a))
#define bcd_mul(a,b) ((bcd) __bcd_mul (a,b,bcd_default_format))
#define bcd_div(a,b) ((bcd) __bcd_div (a,b,bcd_default_format))  

#endif /* __BCD_H */</programlisting>
    </section>
  </section>
</appendix>
