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
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.