^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _ASM_M68K_SETUP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _ASM_M68K_SETUP_H
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) #include <asm/setup.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #include <linux/linkage.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) /* Status Register bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) /* accrued exception bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #define FPSR_AEXC_INEX 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #define FPSR_AEXC_DZ 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #define FPSR_AEXC_UNFL 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #define FPSR_AEXC_OVFL 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #define FPSR_AEXC_IOP 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) /* exception status bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #define FPSR_EXC_INEX1 8
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #define FPSR_EXC_INEX2 9
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #define FPSR_EXC_DZ 10
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #define FPSR_EXC_UNFL 11
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define FPSR_EXC_OVFL 12
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define FPSR_EXC_OPERR 13
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define FPSR_EXC_SNAN 14
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define FPSR_EXC_BSUN 15
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) /* quotient byte, assumes big-endian, of course */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define FPSR_QUOTIENT(fpsr) (*((signed char *) &(fpsr) + 1))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) /* condition code bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define FPSR_CC_NAN 24
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define FPSR_CC_INF 25
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define FPSR_CC_Z 26
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) #define FPSR_CC_NEG 27
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) /* Control register bits */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) /* rounding mode */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define FPCR_ROUND_RN 0 /* round to nearest/even */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define FPCR_ROUND_RZ 1 /* round to zero */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define FPCR_ROUND_RM 2 /* minus infinity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define FPCR_ROUND_RP 3 /* plus infinity */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) /* rounding precision */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) #define FPCR_PRECISION_X 0 /* long double */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #define FPCR_PRECISION_S 1 /* double */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define FPCR_PRECISION_D 2 /* float */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) /* Flags to select the debugging output */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define PDECODE 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define PEXECUTE 1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #define PCONV 2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) #define PNORM 3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #define PREGISTER 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define PINSTR 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #define PUNIMPL 6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) #define PMOVEM 7
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define PMDECODE (1<<PDECODE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #define PMEXECUTE (1<<PEXECUTE)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define PMCONV (1<<PCONV)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define PMNORM (1<<PNORM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define PMREGISTER (1<<PREGISTER)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #define PMINSTR (1<<PINSTR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) #define PMUNIMPL (1<<PUNIMPL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #define PMMOVEM (1<<PMOVEM)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #ifndef __ASSEMBLY__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) union fp_mant64 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) unsigned long long m64;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) unsigned long m32[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) union fp_mant128 {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) unsigned long long m64[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) unsigned long m32[4];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) /* internal representation of extended fp numbers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) struct fp_ext {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) unsigned char lowmant;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) unsigned char sign;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) unsigned short exp;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) union fp_mant64 mant;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) /* C representation of FPU registers */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) /* NOTE: if you change this, you have to change the assembler offsets
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) below and the size in <asm/fpu.h>, too */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) struct fp_data {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) struct fp_ext fpreg[8];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) unsigned int fpcr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) unsigned int fpsr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) unsigned int fpiar;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) unsigned short prec;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) unsigned short rnd;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) struct fp_ext temp[2];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) #ifdef FPU_EMU_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) extern unsigned int fp_debugprint;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) #define dprint(bit, fmt, ...) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) if (fp_debugprint & (1 << (bit))) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) pr_info(fmt, ##__VA_ARGS__); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) #define dprint(bit, fmt, ...) no_printk(fmt, ##__VA_ARGS__)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) #define uprint(str) ({ \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) static int __count = 3; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) if (__count > 0) { \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) pr_err("You just hit an unimplemented " \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) "fpu instruction (%s)\n", str); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) pr_err("Please report this to ....\n"); \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) __count--; \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) } \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) })
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #define FPDATA ((struct fp_data *)current->thread.fp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #else /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) #define FPDATA %a2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /* offsets from the base register to the floating point data in the task struct */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) #define FPD_FPREG (TASK_THREAD+THREAD_FPREG+0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) #define FPD_FPCR (TASK_THREAD+THREAD_FPREG+96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) #define FPD_FPSR (TASK_THREAD+THREAD_FPREG+100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) #define FPD_FPIAR (TASK_THREAD+THREAD_FPREG+104)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #define FPD_PREC (TASK_THREAD+THREAD_FPREG+108)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) #define FPD_RND (TASK_THREAD+THREAD_FPREG+110)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) #define FPD_TEMPFP1 (TASK_THREAD+THREAD_FPREG+112)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) #define FPD_TEMPFP2 (TASK_THREAD+THREAD_FPREG+124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) #define FPD_SIZEOF (TASK_THREAD+THREAD_FPREG+136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /* offsets on the stack to access saved registers,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * these are only used during instruction decoding
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) * where we always know how deep we're on the stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #define FPS_DO (PT_OFF_D0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) #define FPS_D1 (PT_OFF_D1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #define FPS_D2 (PT_OFF_D2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #define FPS_A0 (PT_OFF_A0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #define FPS_A1 (PT_OFF_A1)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #define FPS_A2 (PT_OFF_A2)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #define FPS_SR (PT_OFF_SR)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) #define FPS_PC (PT_OFF_PC)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) #define FPS_EA (PT_OFF_PC+6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #define FPS_PC2 (PT_OFF_PC+10)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) .macro fp_get_fp_reg
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) lea (FPD_FPREG,FPDATA,%d0.w*4),%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) lea (%a0,%d0.w*8),%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /* Macros used to get/put the current program counter.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * 020/030 use a different stack frame then 040/060, for the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * 040/060 the return pc points already to the next location,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * so this only needs to be modified for jump instructions.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) .macro fp_get_pc dest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) move.l (FPS_PC+4,%sp),\dest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) .macro fp_put_pc src,jump=0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) move.l \src,(FPS_PC+4,%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) .macro fp_get_instr_data f,s,dest,label
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) getuser \f,%sp@(FPS_PC+4)@(0),\dest,\label,%sp@(FPS_PC+4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) addq.l #\s,%sp@(FPS_PC+4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) .macro fp_get_instr_word dest,label,addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) fp_get_instr_data w,2,\dest,\label,\addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) .macro fp_get_instr_long dest,label,addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) fp_get_instr_data l,4,\dest,\label,\addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) /* These macros are used to read from/write to user space
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) * on error we jump to the fixup section, load the fault
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) * address into %a0 and jump to the exit.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) * (derived from <asm/uaccess.h>)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) .macro getuser size,src,dest,label,addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) | printf ,"[\size<%08x]",1,\addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) .Lu1\@: moves\size \src,\dest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) .section .fixup,"ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) .even
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) .Lu2\@: move.l \addr,%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) jra \label
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) .section __ex_table,"a"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) .long .Lu1\@,.Lu2\@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) .macro putuser size,src,dest,label,addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) | printf ,"[\size>%08x]",1,\addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) .Lu1\@: moves\size \src,\dest
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) .Lu2\@:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) .section .fixup,"ax"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) .even
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) .Lu3\@: move.l \addr,%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) jra \label
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) .section __ex_table,"a"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) .align 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) .long .Lu1\@,.Lu3\@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) .long .Lu2\@,.Lu3\@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) /* work around binutils idiocy */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) old_gas=-1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) .irp gas_ident.x .x
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) old_gas=old_gas+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) .endr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) .if !old_gas
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) .irp m b,w,l
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) .macro getuser.\m src,dest,label,addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) getuser .\m,\src,\dest,\label,\addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) .macro putuser.\m src,dest,label,addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) putuser .\m,\src,\dest,\label,\addr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) .endr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) .endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) .macro movestack nr,arg1,arg2,arg3,arg4,arg5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) .if \nr
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) movestack (\nr-1),\arg2,\arg3,\arg4,\arg5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) move.l \arg1,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) .endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) .macro printf bit=-1,string,nr=0,arg1,arg2,arg3,arg4,arg5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) #ifdef FPU_EMU_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) .data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) .Lpdata\@:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) .string "\string"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) .previous
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) movem.l %d0/%d1/%a0/%a1,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) .if \bit+1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) moveq #\bit,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) andw #7,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) btst %d0,fp_debugprint+((31-\bit)/8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) btst #\bit,fp_debugprint+((31-\bit)/8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) jeq .Lpskip\@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) .endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) movestack \nr,\arg1,\arg2,\arg3,\arg4,\arg5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) pea .Lpdata\@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) jsr printk
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) lea ((\nr+1)*4,%sp),%sp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) .Lpskip\@:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276) movem.l (%sp)+,%d0/%d1/%a0/%a1
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) .macro printx bit,fp
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) #ifdef FPU_EMU_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282) movem.l %d0/%a0,-(%sp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) lea \fp,%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) #if 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) moveq #'+',%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286) tst.w (%a0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) jeq .Lx1\@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) moveq #'-',%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) .Lx1\@: printf \bit," %c",1,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) move.l (4,%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291) bclr #31,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) jne .Lx2\@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) printf \bit,"0."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294) jra .Lx3\@
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) .Lx2\@: printf \bit,"1."
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) .Lx3\@: printf \bit,"%08x%08x",2,%d0,%a0@(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297) move.w (2,%a0),%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) ext.l %d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) printf \bit,"E%04x",1,%d0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) printf \bit," %08x%08x%08x",3,%a0@,%a0@(4),%a0@(8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) movem.l (%sp)+,%d0/%a0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) .macro debug instr,args
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) #ifdef FPU_EMU_DEBUG
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) \instr \args
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) .endm
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) #endif /* __ASSEMBLY__ */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316) #endif /* _ASM_M68K_SETUP_H */