linux/arch/m68k/fpsp040/slog2.S
<<
>>
Prefs
   1|
   2|       slog2.sa 3.1 12/10/90
   3|
   4|       The entry point slog10 computes the base-10
   5|       logarithm of an input argument X.
   6|       slog10d does the same except the input value is a
   7|       denormalized number.
   8|       sLog2 and sLog2d are the base-2 analogues.
   9|
  10|       INPUT:  Double-extended value in memory location pointed to
  11|               by address register a0.
  12|
  13|       OUTPUT: log_10(X) or log_2(X) returned in floating-point
  14|               register fp0.
  15|
  16|       ACCURACY and MONOTONICITY: The returned result is within 1.7
  17|               ulps in 64 significant bit, i.e. within 0.5003 ulp
  18|               to 53 bits if the result is subsequently rounded
  19|               to double precision. The result is provably monotonic
  20|               in double precision.
  21|
  22|       SPEED:  Two timings are measured, both in the copy-back mode.
  23|               The first one is measured when the function is invoked
  24|               the first time (so the instructions and data are not
  25|               in cache), and the second one is measured when the
  26|               function is reinvoked at the same input argument.
  27|
  28|       ALGORITHM and IMPLEMENTATION NOTES:
  29|
  30|       slog10d:
  31|
  32|       Step 0.   If X < 0, create a NaN and raise the invalid operation
  33|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
  34|       Notes:    Default means round-to-nearest mode, no floating-point
  35|                 traps, and precision control = double extended.
  36|
  37|       Step 1.   Call slognd to obtain Y = log(X), the natural log of X.
  38|       Notes:    Even if X is denormalized, log(X) is always normalized.
  39|
  40|       Step 2.   Compute log_10(X) = log(X) * (1/log(10)).
  41|            2.1  Restore the user FPCR
  42|            2.2  Return ans := Y * INV_L10.
  43|
  44|
  45|       slog10:
  46|
  47|       Step 0.   If X < 0, create a NaN and raise the invalid operation
  48|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
  49|       Notes:    Default means round-to-nearest mode, no floating-point
  50|                 traps, and precision control = double extended.
  51|
  52|       Step 1.   Call sLogN to obtain Y = log(X), the natural log of X.
  53|
  54|       Step 2.   Compute log_10(X) = log(X) * (1/log(10)).
  55|            2.1  Restore the user FPCR
  56|            2.2  Return ans := Y * INV_L10.
  57|
  58|
  59|       sLog2d:
  60|
  61|       Step 0.   If X < 0, create a NaN and raise the invalid operation
  62|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
  63|       Notes:    Default means round-to-nearest mode, no floating-point
  64|                 traps, and precision control = double extended.
  65|
  66|       Step 1.   Call slognd to obtain Y = log(X), the natural log of X.
  67|       Notes:    Even if X is denormalized, log(X) is always normalized.
  68|
  69|       Step 2.   Compute log_10(X) = log(X) * (1/log(2)).
  70|            2.1  Restore the user FPCR
  71|            2.2  Return ans := Y * INV_L2.
  72|
  73|
  74|       sLog2:
  75|
  76|       Step 0.   If X < 0, create a NaN and raise the invalid operation
  77|                 flag. Otherwise, save FPCR in D1; set FpCR to default.
  78|       Notes:    Default means round-to-nearest mode, no floating-point
  79|                 traps, and precision control = double extended.
  80|
  81|       Step 1.   If X is not an integer power of two, i.e., X != 2^k,
  82|                 go to Step 3.
  83|
  84|       Step 2.   Return k.
  85|            2.1  Get integer k, X = 2^k.
  86|            2.2  Restore the user FPCR.
  87|            2.3  Return ans := convert-to-double-extended(k).
  88|
  89|       Step 3.   Call sLogN to obtain Y = log(X), the natural log of X.
  90|
  91|       Step 4.   Compute log_2(X) = log(X) * (1/log(2)).
  92|            4.1  Restore the user FPCR
  93|            4.2  Return ans := Y * INV_L2.
  94|
  95
  96|               Copyright (C) Motorola, Inc. 1990
  97|                       All Rights Reserved
  98|
  99|       For details on the license for this file, please see the
 100|       file, README, in this same directory.
 101
 102|SLOG2    idnt    2,1 | Motorola 040 Floating Point Software Package
 103
 104        |section        8
 105
 106        |xref   t_frcinx
 107        |xref   t_operr
 108        |xref   slogn
 109        |xref   slognd
 110
 111INV_L10:  .long 0x3FFD0000,0xDE5BD8A9,0x37287195,0x00000000
 112
 113INV_L2:   .long 0x3FFF0000,0xB8AA3B29,0x5C17F0BC,0x00000000
 114
 115        .global slog10d
 116slog10d:
 117|--entry point for Log10(X), X is denormalized
 118        movel           (%a0),%d0
 119        blt             invalid
 120        movel           %d1,-(%sp)
 121        clrl            %d1
 122        bsr             slognd                  | ...log(X), X denorm.
 123        fmovel          (%sp)+,%fpcr
 124        fmulx           INV_L10,%fp0
 125        bra             t_frcinx
 126
 127        .global slog10
 128slog10:
 129|--entry point for Log10(X), X is normalized
 130
 131        movel           (%a0),%d0
 132        blt             invalid
 133        movel           %d1,-(%sp)
 134        clrl            %d1
 135        bsr             slogn                   | ...log(X), X normal.
 136        fmovel          (%sp)+,%fpcr
 137        fmulx           INV_L10,%fp0
 138        bra             t_frcinx
 139
 140
 141        .global slog2d
 142slog2d:
 143|--entry point for Log2(X), X is denormalized
 144
 145        movel           (%a0),%d0
 146        blt             invalid
 147        movel           %d1,-(%sp)
 148        clrl            %d1
 149        bsr             slognd                  | ...log(X), X denorm.
 150        fmovel          (%sp)+,%fpcr
 151        fmulx           INV_L2,%fp0
 152        bra             t_frcinx
 153
 154        .global slog2
 155slog2:
 156|--entry point for Log2(X), X is normalized
 157        movel           (%a0),%d0
 158        blt             invalid
 159
 160        movel           8(%a0),%d0
 161        bnes            continue                | ...X is not 2^k
 162
 163        movel           4(%a0),%d0
 164        andl            #0x7FFFFFFF,%d0
 165        tstl            %d0
 166        bnes            continue
 167
 168|--X = 2^k.
 169        movew           (%a0),%d0
 170        andl            #0x00007FFF,%d0
 171        subl            #0x3FFF,%d0
 172        fmovel          %d1,%fpcr
 173        fmovel          %d0,%fp0
 174        bra             t_frcinx
 175
 176continue:
 177        movel           %d1,-(%sp)
 178        clrl            %d1
 179        bsr             slogn                   | ...log(X), X normal.
 180        fmovel          (%sp)+,%fpcr
 181        fmulx           INV_L2,%fp0
 182        bra             t_frcinx
 183
 184invalid:
 185        bra             t_operr
 186
 187        |end
 188