Home | History | Annotate | Download | only in s390x
      1 #include <stdio.h>
      2 #include "opcodes.h"
      3 #include "dfp_utils.h"
      4 
      5 volatile _Decimal64 d64_1, d64_2, result_64;
      6 volatile _Decimal128 d128_1, d128_2, result_128;
      7 
      8 #define DFP_BINOP(insn, op1, op2, type, round, cc)                      \
      9   ({                                                                    \
     10     register type d1 asm("f0") =  op1;                                  \
     11     register type d2 asm("f1") =  op2;                                  \
     12     /* d1 = d1 (op) d2    */                                            \
     13     asm volatile(insn(1,round,0,0)                                      \
     14                  "ipm %1\n\t"                                           \
     15                  "srl %1,28\n\t"                                        \
     16                  :"+f" (d1), "=d" (cc)                                  \
     17                  :"f"(d2)                                               \
     18                  );                                                     \
     19     d1;                                                                 \
     20   })
     21 
     22 int main() {
     23   int cc;
     24 
     25   printf("Decimal floating point arithmetic\n");
     26 
     27     /* 64-bit ADD */
     28   printf("64-bit ADD\n");
     29   /* case 1: cc = 2 */
     30   d64_1 = 3.14DD;
     31   d64_2 = 0.005DD;
     32   result_64 = DFP_BINOP(ADTRA, d64_1, d64_2, _Decimal64, 1, cc);
     33   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "+", cc);
     34   /* case 2: cc = 1 */
     35   d64_1 = -3.14DD;
     36   d64_2 = 0.005DD;
     37   result_64 = DFP_BINOP(ADTRA, d64_1, d64_2, _Decimal64, 1, cc);
     38   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "+", cc);
     39   /* case 2: cc = 0 */
     40   d64_1 = 3.14DD;
     41   d64_2 = -d64_1;
     42   result_64 = DFP_BINOP(ADTRA, d64_1, d64_2, _Decimal64, 3, cc);
     43   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "+", cc);
     44 
     45 
     46     /* 64-bit SUBTRACT */
     47   printf("64-bit SUBTRACT\n");
     48   /* case 1: cc = 2 */
     49   d64_1 = 3.14DD;
     50   d64_2 = 0.005DD;
     51   result_64 = DFP_BINOP(SDTRA, d64_1, d64_2, _Decimal64, 4, cc);
     52   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "-", cc);
     53   /* case 2: cc = 1 */
     54   d64_1 = -3.14DD;
     55   d64_2 = 0.005DD;
     56   result_64 = DFP_BINOP(SDTRA, d64_1, d64_2, _Decimal64, 5, cc);
     57   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "-", cc);
     58   /* case 3: cc = 0 */
     59   d64_1 = 3.14DD;
     60   d64_2 = d64_1;
     61   result_64 = DFP_BINOP(SDTRA, d64_1, d64_2, _Decimal64, 5, cc);
     62   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "-", cc);
     63 
     64     /* 64-bit MULTIPLY */
     65   printf("64-bit MULTIPLY\n");
     66   /* case 1: cc = 2 */
     67   d64_1 = 3.14DD;
     68   d64_2 = 7.DD;
     69   result_64 = DFP_BINOP(MDTRA, d64_1, d64_2, _Decimal64, 6, cc);
     70   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "*", cc);
     71   /* case 2: cc = 1 */
     72   d64_1 = -3.14DD;
     73   d64_2 = 7.DD;
     74   result_64 = DFP_BINOP(MDTRA, d64_1, d64_2, _Decimal64, 7, cc);
     75   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "*", cc);
     76   /* case 3: cc = 0 */
     77   d64_1 = -3.14DD;
     78   d64_2 = 0.DD;
     79   result_64 = DFP_BINOP(MDTRA, d64_1, d64_2, _Decimal64, 7, cc);
     80   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "*", cc);
     81 
     82     /* 64-bit DIVIDE */
     83   printf("64-bit DIVIDE\n");
     84   /* case 1: cc = 2 */
     85   d64_1 = 22.DD;
     86   d64_2 = 7.DD;
     87   result_64 = DFP_BINOP(DDTRA, d64_1, d64_2, _Decimal64, d, cc);
     88   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "/", cc);
     89   /* case 2: cc = 1 */
     90   d64_1 = -22.DD;
     91   d64_2 = 7.DD;
     92   result_64 = DFP_BINOP(DDTRA, d64_1, d64_2, _Decimal64, e, cc);
     93   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "/", cc);
     94   /* case 3: cc = 0 */
     95   d64_1 = 0.DD;
     96   d64_2 = 7.DD;
     97   result_64 = DFP_BINOP(DDTRA, d64_1, d64_2, _Decimal64, e, cc);
     98   DFP_BINOP_PRINT(d64_1, d64_2, result_64, _Decimal64, "/", cc);
     99 
    100     /* 128-bit ADD */
    101   printf("128-bit ADD\n");
    102   /* case 1: cc = 2 */
    103   d128_1 = 3.14DL;
    104   d128_2 = 0.005DL;
    105   result_128 = DFP_BINOP(AXTRA, d128_1, d128_2, _Decimal128, 1, cc);
    106   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "+", cc);
    107   /* case 2: cc = 1 */
    108   d128_1 = -3.14DL;
    109   d128_2 = 0.005DL;
    110   result_128 = DFP_BINOP(AXTRA, d128_1, d128_2, _Decimal128, 1, cc);
    111   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "+", cc);
    112   /* case 3: cc = 0 */
    113   d128_1 = 3.14DL;
    114   d128_2 = -d128_1;
    115   result_128 = DFP_BINOP(AXTRA, d128_1, d128_2, _Decimal128, 3, cc);
    116   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "+", cc);
    117 
    118     /* 128-bit SUBTRACT */
    119   printf("128-bit SUBTRACT\n");
    120   /* case 1: cc = 2 */
    121   d128_1 = 3.14DL;
    122   d128_2 = 0.005DL;
    123   result_128 = DFP_BINOP(SXTRA, d128_1, d128_2, _Decimal128, 4, cc);
    124   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "-", cc);
    125   /* case 2: cc = 1 */
    126   d128_1 = -3.14DL;
    127   d128_2 = 0.005DL;
    128   result_128 = DFP_BINOP(SXTRA, d128_1, d128_2, _Decimal128, 5, cc);
    129   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "-", cc);
    130   /* case 3: cc = 0 */
    131   d128_1 = 3.14DL;
    132   d128_2 = d128_1;
    133   result_128 = DFP_BINOP(SXTRA, d128_1, d128_2, _Decimal128, 5, cc);
    134   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "-", cc);
    135 
    136     /* 128-bit MULTIPLY */
    137   printf("128-bit MULTIPLY\n");
    138   /* case 1: cc = 2 */
    139   d128_1 = 3.14DL;
    140   d128_2 = 7.DL;
    141   result_128 = DFP_BINOP(MXTRA, d128_1, d128_2, _Decimal128, 6, cc);
    142   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "*", cc);
    143   /* case 2: cc = 1 */
    144   d128_1 = -3.14DL;
    145   d128_2 = 7.DL;
    146   result_128 = DFP_BINOP(MXTRA, d128_1, d128_2, _Decimal128, 7, cc);
    147   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "*", cc);
    148   /* case 3: cc = 0 */
    149   d128_1 = 3.14DL;
    150   d128_2 = 0.DL;
    151   result_128 = DFP_BINOP(MXTRA, d128_1, d128_2, _Decimal128, 7, cc);
    152   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "*", cc);
    153 
    154     /* 128-bit DIVIDE */
    155   printf("128-bit DIVIDE\n");
    156   /* case 1: cc = 2 */
    157   d128_1 = 22.DL;
    158   d128_2 = 7.DL;
    159   result_128 = DFP_BINOP(DXTRA, d128_1, d128_2, _Decimal128, d, cc);
    160   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "/", cc);
    161   /* case 2: cc = 1 */
    162   d128_1 = -22.DL;
    163   d128_2 = 7.DL;
    164   result_128 = DFP_BINOP(DXTRA, d128_1, d128_2, _Decimal128, e, cc);
    165   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "/", cc);
    166   /* case 3: cc = 0 */
    167   d128_1 = 0.DL;
    168   d128_2 = 7.DL;
    169   result_128 = DFP_BINOP(DXTRA, d128_1, d128_2, _Decimal128, e, cc);
    170   DFP_BINOP_PRINT(d128_1, d128_2, result_128, _Decimal128, "/", cc);
    171 
    172   return 0;
    173 }
    174