162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * fp_decode.h 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Copyright Roman Zippel, 1997. All rights reserved. 562306a36Sopenharmony_ci * 662306a36Sopenharmony_ci * Redistribution and use in source and binary forms, with or without 762306a36Sopenharmony_ci * modification, are permitted provided that the following conditions 862306a36Sopenharmony_ci * are met: 962306a36Sopenharmony_ci * 1. Redistributions of source code must retain the above copyright 1062306a36Sopenharmony_ci * notice, and the entire permission notice in its entirety, 1162306a36Sopenharmony_ci * including the disclaimer of warranties. 1262306a36Sopenharmony_ci * 2. Redistributions in binary form must reproduce the above copyright 1362306a36Sopenharmony_ci * notice, this list of conditions and the following disclaimer in the 1462306a36Sopenharmony_ci * documentation and/or other materials provided with the distribution. 1562306a36Sopenharmony_ci * 3. The name of the author may not be used to endorse or promote 1662306a36Sopenharmony_ci * products derived from this software without specific prior 1762306a36Sopenharmony_ci * written permission. 1862306a36Sopenharmony_ci * 1962306a36Sopenharmony_ci * ALTERNATIVELY, this product may be distributed under the terms of 2062306a36Sopenharmony_ci * the GNU General Public License, in which case the provisions of the GPL are 2162306a36Sopenharmony_ci * required INSTEAD OF the above restrictions. (This clause is 2262306a36Sopenharmony_ci * necessary due to a potential bad interaction between the GPL and 2362306a36Sopenharmony_ci * the restrictions contained in a BSD-style copyright.) 2462306a36Sopenharmony_ci * 2562306a36Sopenharmony_ci * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED 2662306a36Sopenharmony_ci * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 2762306a36Sopenharmony_ci * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 2862306a36Sopenharmony_ci * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, 2962306a36Sopenharmony_ci * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 3062306a36Sopenharmony_ci * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 3162306a36Sopenharmony_ci * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 3262306a36Sopenharmony_ci * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 3362306a36Sopenharmony_ci * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 3462306a36Sopenharmony_ci * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 3562306a36Sopenharmony_ci * OF THE POSSIBILITY OF SUCH DAMAGE. 3662306a36Sopenharmony_ci */ 3762306a36Sopenharmony_ci 3862306a36Sopenharmony_ci#ifndef _FP_DECODE_H 3962306a36Sopenharmony_ci#define _FP_DECODE_H 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci/* These macros do the dirty work of the instr decoding, several variables 4262306a36Sopenharmony_ci * can be defined in the source file to modify the work of these macros, 4362306a36Sopenharmony_ci * currently the following variables are used: 4462306a36Sopenharmony_ci * ... 4562306a36Sopenharmony_ci * The register usage: 4662306a36Sopenharmony_ci * d0 - will contain source operand for data direct mode, 4762306a36Sopenharmony_ci * otherwise scratch register 4862306a36Sopenharmony_ci * d1 - upper 16bit are reserved for caller 4962306a36Sopenharmony_ci * lower 16bit may contain further arguments, 5062306a36Sopenharmony_ci * is destroyed during decoding 5162306a36Sopenharmony_ci * d2 - contains first two instruction words, 5262306a36Sopenharmony_ci * first word will be used for extension word 5362306a36Sopenharmony_ci * a0 - will point to source/dest operand for any indirect mode 5462306a36Sopenharmony_ci * otherwise scratch register 5562306a36Sopenharmony_ci * a1 - scratch register 5662306a36Sopenharmony_ci * a2 - base addr to the task structure 5762306a36Sopenharmony_ci * 5862306a36Sopenharmony_ci * the current implementation doesn't check for every disallowed 5962306a36Sopenharmony_ci * addressing mode (e.g. pc relative modes as destination), as long 6062306a36Sopenharmony_ci * as it only means a new addressing mode, which should not appear 6162306a36Sopenharmony_ci * in a program and that doesn't crash the emulation, I think it's 6262306a36Sopenharmony_ci * not a problem to allow these modes. 6362306a36Sopenharmony_ci */ 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_cido_fmovem=0 6662306a36Sopenharmony_cido_fmovem_cr=0 6762306a36Sopenharmony_cido_no_pc_mode=0 6862306a36Sopenharmony_cido_fscc=0 6962306a36Sopenharmony_ci 7062306a36Sopenharmony_ci| first decoding of the instr type 7162306a36Sopenharmony_ci| this separates the conditional instr 7262306a36Sopenharmony_ci.macro fp_decode_cond_instr_type 7362306a36Sopenharmony_ci bfextu %d2{#8,#2},%d0 7462306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ci .align 4 7762306a36Sopenharmony_ci0: 7862306a36Sopenharmony_ci| .long "f<op>","fscc/fdbcc" 7962306a36Sopenharmony_ci| .long "fbccw","fbccl" 8062306a36Sopenharmony_ci.endm 8162306a36Sopenharmony_ci 8262306a36Sopenharmony_ci| second decoding of the instr type 8362306a36Sopenharmony_ci| this separates most move instr 8462306a36Sopenharmony_ci.macro fp_decode_move_instr_type 8562306a36Sopenharmony_ci bfextu %d2{#16,#3},%d0 8662306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci .align 4 8962306a36Sopenharmony_ci0: 9062306a36Sopenharmony_ci| .long "f<op> fpx,fpx","invalid instr" 9162306a36Sopenharmony_ci| .long "f<op> <ea>,fpx","fmove fpx,<ea>" 9262306a36Sopenharmony_ci| .long "fmovem <ea>,fpcr","fmovem <ea>,fpx" 9362306a36Sopenharmony_ci| .long "fmovem fpcr,<ea>","fmovem fpx,<ea>" 9462306a36Sopenharmony_ci.endm 9562306a36Sopenharmony_ci 9662306a36Sopenharmony_ci| extract the source specifier, specifies 9762306a36Sopenharmony_ci| either source fp register or data format 9862306a36Sopenharmony_ci.macro fp_decode_sourcespec 9962306a36Sopenharmony_ci bfextu %d2{#19,#3},%d0 10062306a36Sopenharmony_ci.endm 10162306a36Sopenharmony_ci 10262306a36Sopenharmony_ci| decode destination format for fmove reg,ea 10362306a36Sopenharmony_ci.macro fp_decode_dest_format 10462306a36Sopenharmony_ci bfextu %d2{#19,#3},%d0 10562306a36Sopenharmony_ci.endm 10662306a36Sopenharmony_ci 10762306a36Sopenharmony_ci| decode source register for fmove reg,ea 10862306a36Sopenharmony_ci.macro fp_decode_src_reg 10962306a36Sopenharmony_ci bfextu %d2{#22,#3},%d0 11062306a36Sopenharmony_ci.endm 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_ci| extract the addressing mode 11362306a36Sopenharmony_ci| it depends on the instr which of the modes is valid 11462306a36Sopenharmony_ci.macro fp_decode_addr_mode 11562306a36Sopenharmony_ci bfextu %d2{#10,#3},%d0 11662306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 11762306a36Sopenharmony_ci 11862306a36Sopenharmony_ci .align 4 11962306a36Sopenharmony_ci0: 12062306a36Sopenharmony_ci| .long "data register direct","addr register direct" 12162306a36Sopenharmony_ci| .long "addr register indirect" 12262306a36Sopenharmony_ci| .long "addr register indirect postincrement" 12362306a36Sopenharmony_ci| .long "addr register indirect predecrement" 12462306a36Sopenharmony_ci| .long "addr register + index16" 12562306a36Sopenharmony_ci| .long "extension mode1","extension mode2" 12662306a36Sopenharmony_ci.endm 12762306a36Sopenharmony_ci 12862306a36Sopenharmony_ci| extract the register for the addressing mode 12962306a36Sopenharmony_ci.macro fp_decode_addr_reg 13062306a36Sopenharmony_ci bfextu %d2{#13,#3},%d0 13162306a36Sopenharmony_ci.endm 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ci| decode the 8bit displacement from the brief extension word 13462306a36Sopenharmony_ci.macro fp_decode_disp8 13562306a36Sopenharmony_ci move.b %d2,%d0 13662306a36Sopenharmony_ci ext.w %d0 13762306a36Sopenharmony_ci.endm 13862306a36Sopenharmony_ci 13962306a36Sopenharmony_ci| decode the index of the brief/full extension word 14062306a36Sopenharmony_ci.macro fp_decode_index 14162306a36Sopenharmony_ci bfextu %d2{#17,#3},%d0 | get the register nr 14262306a36Sopenharmony_ci btst #15,%d2 | test for data/addr register 14362306a36Sopenharmony_ci jne 1\@f 14462306a36Sopenharmony_ci printf PDECODE,"d%d",1,%d0 14562306a36Sopenharmony_ci jsr fp_get_data_reg 14662306a36Sopenharmony_ci jra 2\@f 14762306a36Sopenharmony_ci1\@: printf PDECODE,"a%d",1,%d0 14862306a36Sopenharmony_ci jsr fp_get_addr_reg 14962306a36Sopenharmony_ci move.l %a0,%d0 15062306a36Sopenharmony_ci2\@: 15162306a36Sopenharmony_cidebug lea "'l'.w,%a0" 15262306a36Sopenharmony_ci btst #11,%d2 | 16/32 bit size? 15362306a36Sopenharmony_ci jne 3\@f 15462306a36Sopenharmony_cidebug lea "'w'.w,%a0" 15562306a36Sopenharmony_ci ext.l %d0 15662306a36Sopenharmony_ci3\@: printf PDECODE,":%c",1,%a0 15762306a36Sopenharmony_ci move.w %d2,%d1 | scale factor 15862306a36Sopenharmony_ci rol.w #7,%d1 15962306a36Sopenharmony_ci and.w #3,%d1 16062306a36Sopenharmony_cidebug move.l "%d1,-(%sp)" 16162306a36Sopenharmony_cidebug ext.l "%d1" 16262306a36Sopenharmony_ci printf PDECODE,":%d",1,%d1 16362306a36Sopenharmony_cidebug move.l "(%sp)+,%d1" 16462306a36Sopenharmony_ci lsl.l %d1,%d0 16562306a36Sopenharmony_ci.endm 16662306a36Sopenharmony_ci 16762306a36Sopenharmony_ci| decode the base displacement size 16862306a36Sopenharmony_ci.macro fp_decode_basedisp 16962306a36Sopenharmony_ci bfextu %d2{#26,#2},%d0 17062306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 17162306a36Sopenharmony_ci 17262306a36Sopenharmony_ci .align 4 17362306a36Sopenharmony_ci0: 17462306a36Sopenharmony_ci| .long "reserved","null displacement" 17562306a36Sopenharmony_ci| .long "word displacement","long displacement" 17662306a36Sopenharmony_ci.endm 17762306a36Sopenharmony_ci 17862306a36Sopenharmony_ci.macro fp_decode_outerdisp 17962306a36Sopenharmony_ci bfextu %d2{#30,#2},%d0 18062306a36Sopenharmony_ci jmp ([0f:w,%pc,%d0*4]) 18162306a36Sopenharmony_ci 18262306a36Sopenharmony_ci .align 4 18362306a36Sopenharmony_ci0: 18462306a36Sopenharmony_ci| .long "no memory indirect action/reserved","null outer displacement" 18562306a36Sopenharmony_ci| .long "word outer displacement","long outer displacement" 18662306a36Sopenharmony_ci.endm 18762306a36Sopenharmony_ci 18862306a36Sopenharmony_ci| get the extension word and test for brief or full extension type 18962306a36Sopenharmony_ci.macro fp_get_test_extword label 19062306a36Sopenharmony_ci fp_get_instr_word %d2,fp_err_ua1 19162306a36Sopenharmony_ci btst #8,%d2 19262306a36Sopenharmony_ci jne \label 19362306a36Sopenharmony_ci.endm 19462306a36Sopenharmony_ci 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci| test if %pc is the base register for the indirect addr mode 19762306a36Sopenharmony_ci.macro fp_test_basereg_d16 label 19862306a36Sopenharmony_ci btst #20,%d2 19962306a36Sopenharmony_ci jeq \label 20062306a36Sopenharmony_ci.endm 20162306a36Sopenharmony_ci 20262306a36Sopenharmony_ci| test if %pc is the base register for one of the extended modes 20362306a36Sopenharmony_ci.macro fp_test_basereg_ext label 20462306a36Sopenharmony_ci btst #19,%d2 20562306a36Sopenharmony_ci jeq \label 20662306a36Sopenharmony_ci.endm 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci.macro fp_test_suppr_index label 20962306a36Sopenharmony_ci btst #6,%d2 21062306a36Sopenharmony_ci jne \label 21162306a36Sopenharmony_ci.endm 21262306a36Sopenharmony_ci 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci| addressing mode: data register direct 21562306a36Sopenharmony_ci.macro fp_mode_data_direct 21662306a36Sopenharmony_ci fp_decode_addr_reg 21762306a36Sopenharmony_ci printf PDECODE,"d%d",1,%d0 21862306a36Sopenharmony_ci.endm 21962306a36Sopenharmony_ci 22062306a36Sopenharmony_ci| addressing mode: address register indirect 22162306a36Sopenharmony_ci.macro fp_mode_addr_indirect 22262306a36Sopenharmony_ci fp_decode_addr_reg 22362306a36Sopenharmony_ci printf PDECODE,"(a%d)",1,%d0 22462306a36Sopenharmony_ci jsr fp_get_addr_reg 22562306a36Sopenharmony_ci.endm 22662306a36Sopenharmony_ci 22762306a36Sopenharmony_ci| adjust stack for byte moves from/to stack 22862306a36Sopenharmony_ci.macro fp_test_sp_byte_move 22962306a36Sopenharmony_ci .if !do_fmovem 23062306a36Sopenharmony_ci .if do_fscc 23162306a36Sopenharmony_ci move.w #6,%d1 23262306a36Sopenharmony_ci .endif 23362306a36Sopenharmony_ci cmp.w #7,%d0 23462306a36Sopenharmony_ci jne 1\@f 23562306a36Sopenharmony_ci .if !do_fscc 23662306a36Sopenharmony_ci cmp.w #6,%d1 23762306a36Sopenharmony_ci jne 1\@f 23862306a36Sopenharmony_ci .endif 23962306a36Sopenharmony_ci move.w #4,%d1 24062306a36Sopenharmony_ci1\@: 24162306a36Sopenharmony_ci .endif 24262306a36Sopenharmony_ci.endm 24362306a36Sopenharmony_ci 24462306a36Sopenharmony_ci| addressing mode: address register indirect with postincrement 24562306a36Sopenharmony_ci.macro fp_mode_addr_indirect_postinc 24662306a36Sopenharmony_ci fp_decode_addr_reg 24762306a36Sopenharmony_ci printf PDECODE,"(a%d)+",1,%d0 24862306a36Sopenharmony_ci fp_test_sp_byte_move 24962306a36Sopenharmony_ci jsr fp_get_addr_reg 25062306a36Sopenharmony_ci move.l %a0,%a1 | save addr 25162306a36Sopenharmony_ci .if do_fmovem 25262306a36Sopenharmony_ci lea (%a0,%d1.w*4),%a0 25362306a36Sopenharmony_ci .if !do_fmovem_cr 25462306a36Sopenharmony_ci lea (%a0,%d1.w*8),%a0 25562306a36Sopenharmony_ci .endif 25662306a36Sopenharmony_ci .else 25762306a36Sopenharmony_ci add.w (fp_datasize,%d1.w*2),%a0 25862306a36Sopenharmony_ci .endif 25962306a36Sopenharmony_ci jsr fp_put_addr_reg 26062306a36Sopenharmony_ci move.l %a1,%a0 26162306a36Sopenharmony_ci.endm 26262306a36Sopenharmony_ci 26362306a36Sopenharmony_ci| addressing mode: address register indirect with predecrement 26462306a36Sopenharmony_ci.macro fp_mode_addr_indirect_predec 26562306a36Sopenharmony_ci fp_decode_addr_reg 26662306a36Sopenharmony_ci printf PDECODE,"-(a%d)",1,%d0 26762306a36Sopenharmony_ci fp_test_sp_byte_move 26862306a36Sopenharmony_ci jsr fp_get_addr_reg 26962306a36Sopenharmony_ci .if do_fmovem 27062306a36Sopenharmony_ci .if !do_fmovem_cr 27162306a36Sopenharmony_ci lea (-12,%a0),%a1 | setup to addr of 1st reg to move 27262306a36Sopenharmony_ci neg.w %d1 27362306a36Sopenharmony_ci lea (%a0,%d1.w*4),%a0 27462306a36Sopenharmony_ci add.w %d1,%d1 27562306a36Sopenharmony_ci lea (%a0,%d1.w*4),%a0 27662306a36Sopenharmony_ci jsr fp_put_addr_reg 27762306a36Sopenharmony_ci move.l %a1,%a0 27862306a36Sopenharmony_ci .else 27962306a36Sopenharmony_ci neg.w %d1 28062306a36Sopenharmony_ci lea (%a0,%d1.w*4),%a0 28162306a36Sopenharmony_ci jsr fp_put_addr_reg 28262306a36Sopenharmony_ci .endif 28362306a36Sopenharmony_ci .else 28462306a36Sopenharmony_ci sub.w (fp_datasize,%d1.w*2),%a0 28562306a36Sopenharmony_ci jsr fp_put_addr_reg 28662306a36Sopenharmony_ci .endif 28762306a36Sopenharmony_ci.endm 28862306a36Sopenharmony_ci 28962306a36Sopenharmony_ci| addressing mode: address register/programm counter indirect 29062306a36Sopenharmony_ci| with 16bit displacement 29162306a36Sopenharmony_ci.macro fp_mode_addr_indirect_disp16 29262306a36Sopenharmony_ci .if !do_no_pc_mode 29362306a36Sopenharmony_ci fp_test_basereg_d16 1f 29462306a36Sopenharmony_ci printf PDECODE,"pc" 29562306a36Sopenharmony_ci fp_get_pc %a0 29662306a36Sopenharmony_ci jra 2f 29762306a36Sopenharmony_ci .endif 29862306a36Sopenharmony_ci1: fp_decode_addr_reg 29962306a36Sopenharmony_ci printf PDECODE,"a%d",1,%d0 30062306a36Sopenharmony_ci jsr fp_get_addr_reg 30162306a36Sopenharmony_ci2: fp_get_instr_word %a1,fp_err_ua1 30262306a36Sopenharmony_ci printf PDECODE,"@(%x)",1,%a1 30362306a36Sopenharmony_ci add.l %a1,%a0 30462306a36Sopenharmony_ci.endm 30562306a36Sopenharmony_ci 30662306a36Sopenharmony_ci| perform preindex (if I/IS == 0xx and xx != 00) 30762306a36Sopenharmony_ci.macro fp_do_preindex 30862306a36Sopenharmony_ci moveq #3,%d0 30962306a36Sopenharmony_ci and.w %d2,%d0 31062306a36Sopenharmony_ci jeq 1f 31162306a36Sopenharmony_ci btst #2,%d2 31262306a36Sopenharmony_ci jne 1f 31362306a36Sopenharmony_ci printf PDECODE,")@(" 31462306a36Sopenharmony_ci getuser.l (%a1),%a1,fp_err_ua1,%a1 31562306a36Sopenharmony_cidebug jra "2f" 31662306a36Sopenharmony_ci1: printf PDECODE,"," 31762306a36Sopenharmony_ci2: 31862306a36Sopenharmony_ci.endm 31962306a36Sopenharmony_ci 32062306a36Sopenharmony_ci| perform postindex (if I/IS == 1xx) 32162306a36Sopenharmony_ci.macro fp_do_postindex 32262306a36Sopenharmony_ci btst #2,%d2 32362306a36Sopenharmony_ci jeq 1f 32462306a36Sopenharmony_ci printf PDECODE,")@(" 32562306a36Sopenharmony_ci getuser.l (%a1),%a1,fp_err_ua1,%a1 32662306a36Sopenharmony_cidebug jra "2f" 32762306a36Sopenharmony_ci1: printf PDECODE,"," 32862306a36Sopenharmony_ci2: 32962306a36Sopenharmony_ci.endm 33062306a36Sopenharmony_ci 33162306a36Sopenharmony_ci| all other indirect addressing modes will finally end up here 33262306a36Sopenharmony_ci.macro fp_mode_addr_indirect_extmode0 33362306a36Sopenharmony_ci .if !do_no_pc_mode 33462306a36Sopenharmony_ci fp_test_basereg_ext 1f 33562306a36Sopenharmony_ci printf PDECODE,"pc" 33662306a36Sopenharmony_ci fp_get_pc %a0 33762306a36Sopenharmony_ci jra 2f 33862306a36Sopenharmony_ci .endif 33962306a36Sopenharmony_ci1: fp_decode_addr_reg 34062306a36Sopenharmony_ci printf PDECODE,"a%d",1,%d0 34162306a36Sopenharmony_ci jsr fp_get_addr_reg 34262306a36Sopenharmony_ci2: move.l %a0,%a1 34362306a36Sopenharmony_ci swap %d2 34462306a36Sopenharmony_ci fp_get_test_extword 3f 34562306a36Sopenharmony_ci | addressing mode: address register/programm counter indirect 34662306a36Sopenharmony_ci | with index and 8bit displacement 34762306a36Sopenharmony_ci fp_decode_disp8 34862306a36Sopenharmony_cidebug ext.l "%d0" 34962306a36Sopenharmony_ci printf PDECODE,"@(%x,",1,%d0 35062306a36Sopenharmony_ci add.w %d0,%a1 35162306a36Sopenharmony_ci fp_decode_index 35262306a36Sopenharmony_ci add.l %d0,%a1 35362306a36Sopenharmony_ci printf PDECODE,")" 35462306a36Sopenharmony_ci jra 9f 35562306a36Sopenharmony_ci3: | addressing mode: address register/programm counter memory indirect 35662306a36Sopenharmony_ci | with base and/or outer displacement 35762306a36Sopenharmony_ci btst #7,%d2 | base register suppressed? 35862306a36Sopenharmony_ci jeq 1f 35962306a36Sopenharmony_ci printf PDECODE,"!" 36062306a36Sopenharmony_ci sub.l %a1,%a1 36162306a36Sopenharmony_ci1: printf PDECODE,"@(" 36262306a36Sopenharmony_ci fp_decode_basedisp 36362306a36Sopenharmony_ci 36462306a36Sopenharmony_ci .long fp_ill,1f 36562306a36Sopenharmony_ci .long 2f,3f 36662306a36Sopenharmony_ci 36762306a36Sopenharmony_ci#ifdef FPU_EMU_DEBUG 36862306a36Sopenharmony_ci1: printf PDECODE,"0" | null base displacement 36962306a36Sopenharmony_ci jra 1f 37062306a36Sopenharmony_ci#endif 37162306a36Sopenharmony_ci2: fp_get_instr_word %a0,fp_err_ua1 | 16bit base displacement 37262306a36Sopenharmony_ci printf PDECODE,"%x:w",1,%a0 37362306a36Sopenharmony_ci jra 4f 37462306a36Sopenharmony_ci3: fp_get_instr_long %a0,fp_err_ua1 | 32bit base displacement 37562306a36Sopenharmony_ci printf PDECODE,"%x:l",1,%a0 37662306a36Sopenharmony_ci4: add.l %a0,%a1 37762306a36Sopenharmony_ci1: 37862306a36Sopenharmony_ci fp_do_postindex 37962306a36Sopenharmony_ci fp_test_suppr_index 1f 38062306a36Sopenharmony_ci fp_decode_index 38162306a36Sopenharmony_ci add.l %d0,%a1 38262306a36Sopenharmony_ci1: fp_do_preindex 38362306a36Sopenharmony_ci 38462306a36Sopenharmony_ci fp_decode_outerdisp 38562306a36Sopenharmony_ci 38662306a36Sopenharmony_ci .long 5f,1f 38762306a36Sopenharmony_ci .long 2f,3f 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ci#ifdef FPU_EMU_DEBUG 39062306a36Sopenharmony_ci1: printf PDECODE,"0" | null outer displacement 39162306a36Sopenharmony_ci jra 1f 39262306a36Sopenharmony_ci#endif 39362306a36Sopenharmony_ci2: fp_get_instr_word %a0,fp_err_ua1 | 16bit outer displacement 39462306a36Sopenharmony_ci printf PDECODE,"%x:w",1,%a0 39562306a36Sopenharmony_ci jra 4f 39662306a36Sopenharmony_ci3: fp_get_instr_long %a0,fp_err_ua1 | 32bit outer displacement 39762306a36Sopenharmony_ci printf PDECODE,"%x:l",1,%a0 39862306a36Sopenharmony_ci4: add.l %a0,%a1 39962306a36Sopenharmony_ci1: 40062306a36Sopenharmony_ci5: printf PDECODE,")" 40162306a36Sopenharmony_ci9: move.l %a1,%a0 40262306a36Sopenharmony_ci swap %d2 40362306a36Sopenharmony_ci.endm 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci| get the absolute short address from user space 40662306a36Sopenharmony_ci.macro fp_mode_abs_short 40762306a36Sopenharmony_ci fp_get_instr_word %a0,fp_err_ua1 40862306a36Sopenharmony_ci printf PDECODE,"%x.w",1,%a0 40962306a36Sopenharmony_ci.endm 41062306a36Sopenharmony_ci 41162306a36Sopenharmony_ci| get the absolute long address from user space 41262306a36Sopenharmony_ci.macro fp_mode_abs_long 41362306a36Sopenharmony_ci fp_get_instr_long %a0,fp_err_ua1 41462306a36Sopenharmony_ci printf PDECODE,"%x.l",1,%a0 41562306a36Sopenharmony_ci.endm 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ci#endif /* _FP_DECODE_H */ 418