root/arch/m68k/math-emu/fp_cond.S

/* [<][>][^][v][top][bottom][index][help] */
   1 /*
   2  * fp_cond.S
   3  *
   4  * Copyright Roman Zippel, 1997.  All rights reserved.
   5  *
   6  * Redistribution and use in source and binary forms, with or without
   7  * modification, are permitted provided that the following conditions
   8  * are met:
   9  * 1. Redistributions of source code must retain the above copyright
  10  *    notice, and the entire permission notice in its entirety,
  11  *    including the disclaimer of warranties.
  12  * 2. Redistributions in binary form must reproduce the above copyright
  13  *    notice, this list of conditions and the following disclaimer in the
  14  *    documentation and/or other materials provided with the distribution.
  15  * 3. The name of the author may not be used to endorse or promote
  16  *    products derived from this software without specific prior
  17  *    written permission.
  18  *
  19  * ALTERNATIVELY, this product may be distributed under the terms of
  20  * the GNU General Public License, in which case the provisions of the GPL are
  21  * required INSTEAD OF the above restrictions.  (This clause is
  22  * necessary due to a potential bad interaction between the GPL and
  23  * the restrictions contained in a BSD-style copyright.)
  24  *
  25  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
  26  * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  27  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
  28  * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
  29  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
  30  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
  31  * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
  33  * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
  34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
  35  * OF THE POSSIBILITY OF SUCH DAMAGE.
  36  */
  37 
  38 #include "fp_emu.h"
  39 #include "fp_decode.h"
  40 
  41         .globl  fp_fscc, fp_fbccw, fp_fbccl
  42 
  43 #ifdef FPU_EMU_DEBUG
  44 fp_fnop:
  45         printf  PDECODE,"fnop\n"
  46         jra     fp_end
  47 #else
  48 #define fp_fnop fp_end
  49 #endif
  50 
  51 fp_fbccw:
  52         tst.w   %d2
  53         jeq     fp_fnop
  54         printf  PDECODE,"fbccw "
  55         fp_get_pc %a0
  56         lea     (-2,%a0,%d2.w),%a0
  57         jra     1f
  58 
  59 fp_fbccl:
  60         printf  PDECODE,"fbccl "
  61         fp_get_pc %a0
  62         move.l  %d2,%d0
  63         swap    %d0
  64         fp_get_instr_word %d0,fp_err_ua1
  65         lea     (-2,%a0,%d0.l),%a0
  66 1:      printf  PDECODE,"%x",1,%a0
  67         move.l  %d2,%d0
  68         swap    %d0
  69         jsr     fp_compute_cond
  70         tst.l   %d0
  71         jeq     1f
  72         fp_put_pc %a0,1
  73 1:      printf  PDECODE,"\n"
  74         jra     fp_end
  75 
  76 fp_fdbcc:
  77         printf  PDECODE,"fdbcc "
  78         fp_get_pc %a1                           | calculate new pc
  79         fp_get_instr_word %d0,fp_err_ua1
  80         add.w   %d0,%a1
  81         fp_decode_addr_reg
  82         printf  PDECODE,"d%d,%x\n",2,%d0,%a1
  83         swap    %d1                             | test condition in %d1
  84         tst.w   %d1
  85         jne     2f
  86         move.l  %d0,%d1
  87         jsr     fp_get_data_reg
  88         subq.w  #1,%d0
  89         jcs     1f
  90         fp_put_pc %a1,1
  91 1:      jsr     fp_put_data_reg
  92 2:      jra     fp_end
  93 
  94 | set flags for decode macros for fs<cc>
  95 do_fscc=1
  96 do_no_pc_mode=1
  97 
  98 fp_fscc:
  99         printf  PDECODE,"fscc "
 100         move.l  %d2,%d0
 101         jsr     fp_compute_cond
 102         move.w  %d0,%d1
 103         swap    %d1
 104 
 105         | decode addressing mode
 106         fp_decode_addr_mode
 107 
 108         .long   fp_data, fp_fdbcc
 109         .long   fp_indirect, fp_postinc
 110         .long   fp_predecr, fp_disp16
 111         .long   fp_extmode0, fp_extmode1
 112 
 113         | addressing mode: data register direct
 114 fp_data:
 115         fp_mode_data_direct
 116         move.w  %d0,%d1                 | save register nr
 117         jsr     fp_get_data_reg
 118         swap    %d1
 119         move.b  %d1,%d0
 120         swap    %d1
 121         jsr     fp_put_data_reg
 122         printf  PDECODE,"\n"
 123         jra     fp_end
 124 
 125 fp_indirect:
 126         fp_mode_addr_indirect
 127         jra     fp_do_scc
 128 
 129 fp_postinc:
 130         fp_mode_addr_indirect_postinc
 131         jra     fp_do_scc
 132 
 133 fp_predecr:
 134         fp_mode_addr_indirect_predec
 135         jra     fp_do_scc
 136 
 137 fp_disp16:
 138         fp_mode_addr_indirect_disp16
 139         jra     fp_do_scc
 140 
 141 fp_extmode0:
 142         fp_mode_addr_indirect_extmode0
 143         jra     fp_do_scc
 144 
 145 fp_extmode1:
 146         bfextu  %d2{#13,#3},%d0
 147         jmp     ([0f:w,%pc,%d0*4])
 148 
 149         .align  4
 150 0:
 151         .long   fp_absolute_short, fp_absolute_long
 152         .long   fp_ill, fp_ill          | NOTE: jump here to ftrap.x
 153         .long   fp_ill, fp_ill
 154         .long   fp_ill, fp_ill
 155 
 156 fp_absolute_short:
 157         fp_mode_abs_short
 158         jra     fp_do_scc
 159 
 160 fp_absolute_long:
 161         fp_mode_abs_long
 162 |       jra     fp_do_scc
 163 
 164 fp_do_scc:
 165         swap    %d1
 166         putuser.b %d1,(%a0),fp_err_ua1,%a0
 167         printf  PDECODE,"\n"
 168         jra     fp_end
 169 
 170 
 171 #define tst_NAN btst #24,%d1
 172 #define tst_Z   btst #26,%d1
 173 #define tst_N   btst #27,%d1
 174 
 175 fp_compute_cond:
 176         move.l  (FPD_FPSR,FPDATA),%d1
 177         btst    #4,%d0
 178         jeq     1f
 179         tst_NAN
 180         jeq     1f
 181         bset    #15,%d1
 182         bset    #7,%d1
 183         move.l  %d1,(FPD_FPSR,FPDATA)
 184 1:      and.w   #0xf,%d0
 185         jmp     ([0f:w,%pc,%d0.w*4])
 186 
 187         .align  4
 188 0:
 189         .long   fp_f  , fp_eq , fp_ogt, fp_oge
 190         .long   fp_olt, fp_ole, fp_ogl, fp_or
 191         .long   fp_un , fp_ueq, fp_ugt, fp_uge
 192         .long   fp_ult, fp_ule, fp_ne , fp_t
 193 
 194 fp_f:
 195         moveq   #0,%d0
 196         rts
 197 
 198 fp_eq:
 199         moveq   #0,%d0
 200         tst_Z
 201         jeq     1f
 202         moveq   #-1,%d0
 203 1:      rts
 204 
 205 fp_ogt:
 206         moveq   #0,%d0
 207         tst_NAN
 208         jne     1f
 209         tst_Z
 210         jne     1f
 211         tst_N
 212         jne     1f
 213         moveq   #-1,%d0
 214 1:      rts
 215 
 216 fp_oge:
 217         moveq   #-1,%d0
 218         tst_Z
 219         jne     2f
 220         tst_NAN
 221         jne     1f
 222         tst_N
 223         jeq     2f
 224 1:      moveq   #0,%d0
 225 2:      rts
 226 
 227 fp_olt:
 228         moveq   #0,%d0
 229         tst_NAN
 230         jne     1f
 231         tst_Z
 232         jne     1f
 233         tst_N
 234         jeq     1f
 235         moveq   #-1,%d0
 236 1:      rts
 237 
 238 fp_ole:
 239         moveq   #-1,%d0
 240         tst_Z
 241         jne     2f
 242         tst_NAN
 243         jne     1f
 244         tst_N
 245         jne     2f
 246 1:      moveq   #0,%d0
 247 2:      rts
 248 
 249 fp_ogl:
 250         moveq   #0,%d0
 251         tst_NAN
 252         jne     1f
 253         tst_Z
 254         jne     1f
 255         moveq   #-1,%d0
 256 1:      rts
 257 
 258 fp_or:
 259         moveq   #0,%d0
 260         tst_NAN
 261         jne     1f
 262         moveq   #-1,%d0
 263 1:      rts
 264 
 265 fp_un:
 266         moveq   #0,%d0
 267         tst_NAN
 268         jeq     1f
 269         moveq   #-1,%d0
 270         rts
 271 
 272 fp_ueq:
 273         moveq   #-1,%d0
 274         tst_NAN
 275         jne     1f
 276         tst_Z
 277         jne     1f
 278         moveq   #0,%d0
 279 1:      rts
 280 
 281 fp_ugt:
 282         moveq   #-1,%d0
 283         tst_NAN
 284         jne     2f
 285         tst_N
 286         jne     1f
 287         tst_Z
 288         jeq     2f
 289 1:      moveq   #0,%d0
 290 2:      rts
 291 
 292 fp_uge:
 293         moveq   #-1,%d0
 294         tst_NAN
 295         jne     1f
 296         tst_Z
 297         jne     1f
 298         tst_N
 299         jeq     1f
 300         moveq   #0,%d0
 301 1:      rts
 302 
 303 fp_ult:
 304         moveq   #-1,%d0
 305         tst_NAN
 306         jne     2f
 307         tst_Z
 308         jne     1f
 309         tst_N
 310         jne     2f
 311 1:      moveq   #0,%d0
 312 2:      rts
 313 
 314 fp_ule:
 315         moveq   #-1,%d0
 316         tst_NAN
 317         jne     1f
 318         tst_Z
 319         jne     1f
 320         tst_N
 321         jne     1f
 322         moveq   #0,%d0
 323 1:      rts
 324 
 325 fp_ne:
 326         moveq   #0,%d0
 327         tst_Z
 328         jne     1f
 329         moveq   #-1,%d0
 330 1:      rts
 331 
 332 fp_t:
 333         moveq   #-1,%d0
 334         rts

/* [<][>][^][v][top][bottom][index][help] */