Commit 6a1ae045 authored by Vojtech Pavlik's avatar Vojtech Pavlik

Merge bkbits:input into suse.cz:/home/vojtech/bk/input

parents 69990663 a0207f19
...@@ -76,9 +76,9 @@ config SUN3 ...@@ -76,9 +76,9 @@ config SUN3
select MMU_SUN3 if MMU select MMU_SUN3 if MMU
help help
This option enables support for the Sun 3 series of workstations This option enables support for the Sun 3 series of workstations
(3/50, 3/60, 3/1xx, 3/2xx systems). Enabling this option requires (3/50, 3/60, 3/1xx, 3/2xx systems). Enabling this option requires
that all other hardware types must be disabled, as Sun 3 kernels that all other hardware types must be disabled, as Sun 3 kernels
are incompatible with all other m68k targets (including Sun 3x!). are incompatible with all other m68k targets (including Sun 3x!).
If you don't want to compile a kernel exclusively for a Sun 3, say N. If you don't want to compile a kernel exclusively for a Sun 3, say N.
...@@ -687,7 +687,7 @@ config DEBUG_INFO ...@@ -687,7 +687,7 @@ config DEBUG_INFO
debugging info resulting in a larger kernel image. debugging info resulting in a larger kernel image.
Say Y here only if you plan to use gdb to debug the kernel. Say Y here only if you plan to use gdb to debug the kernel.
If you don't debug the kernel, you can say N. If you don't debug the kernel, you can say N.
endmenu endmenu
source "security/Kconfig" source "security/Kconfig"
......
...@@ -56,7 +56,7 @@ ifndef CONFIG_SUN3 ...@@ -56,7 +56,7 @@ ifndef CONFIG_SUN3
head-y := arch/m68k/kernel/head.o head-y := arch/m68k/kernel/head.o
else else
head-y := arch/m68k/kernel/sun3-head.o head-y := arch/m68k/kernel/sun3-head.o
endif endif
core-y += arch/m68k/kernel/ arch/m68k/mm/ core-y += arch/m68k/kernel/ arch/m68k/mm/
libs-y += arch/m68k/lib/ libs-y += arch/m68k/lib/
......
...@@ -88,7 +88,7 @@ void amiga_mksound( unsigned int hz, unsigned int ticks ) ...@@ -88,7 +88,7 @@ void amiga_mksound( unsigned int hz, unsigned int ticks )
custom.aud[2].audlen = sizeof(sine_data)/2; custom.aud[2].audlen = sizeof(sine_data)/2;
custom.aud[2].audper = (unsigned short)period; custom.aud[2].audper = (unsigned short)period;
custom.aud[2].audvol = 32; /* 50% of maxvol */ custom.aud[2].audvol = 32; /* 50% of maxvol */
if (ticks) { if (ticks) {
sound_timer.expires = jiffies + ticks; sound_timer.expires = jiffies + ticks;
add_timer( &sound_timer ); add_timer( &sound_timer );
......
...@@ -42,7 +42,7 @@ void __init amiga_chip_init(void) ...@@ -42,7 +42,7 @@ void __init amiga_chip_init(void)
chipavail = amiga_chip_size; chipavail = amiga_chip_size;
} }
void *amiga_chip_alloc(unsigned long size, const char *name) void *amiga_chip_alloc(unsigned long size, const char *name)
{ {
struct resource *res; struct resource *res;
......
...@@ -332,7 +332,7 @@ static void __init amiga_identify(void) ...@@ -332,7 +332,7 @@ static void __init amiga_identify(void)
case AMI_DRACO: case AMI_DRACO:
panic("No support for Draco yet"); panic("No support for Draco yet");
default: default:
panic("Unknown Amiga Model"); panic("Unknown Amiga Model");
} }
...@@ -426,7 +426,7 @@ void __init config_amiga(void) ...@@ -426,7 +426,7 @@ void __init config_amiga(void)
*/ */
mach_set_clock_mmss = amiga_set_clock_mmss; mach_set_clock_mmss = amiga_set_clock_mmss;
mach_get_ss = amiga_get_ss; mach_get_ss = amiga_get_ss;
#ifdef CONFIG_AMIGA_FLOPPY #ifdef CONFIG_AMIGA_FLOPPY
mach_floppy_setup = amiga_floppy_setup; mach_floppy_setup = amiga_floppy_setup;
#endif #endif
...@@ -679,13 +679,13 @@ static int amiga_set_clock_mmss (unsigned long nowtime) ...@@ -679,13 +679,13 @@ static int amiga_set_clock_mmss (unsigned long nowtime)
tod_3000.second2 = real_seconds % 10; tod_3000.second2 = real_seconds % 10;
tod_3000.minute1 = real_minutes / 10; tod_3000.minute1 = real_minutes / 10;
tod_3000.minute2 = real_minutes % 10; tod_3000.minute2 = real_minutes % 10;
tod_3000.cntrl1 = TOD3000_CNTRL1_FREE; tod_3000.cntrl1 = TOD3000_CNTRL1_FREE;
} else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ { } else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ {
int cnt = 5; int cnt = 5;
tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD; tod_2000.cntrl1 |= TOD2000_CNTRL1_HOLD;
while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt--) while ((tod_2000.cntrl1 & TOD2000_CNTRL1_BUSY) && cnt--)
{ {
tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD; tod_2000.cntrl1 &= ~TOD2000_CNTRL1_HOLD;
...@@ -715,7 +715,7 @@ static unsigned int amiga_get_ss( void ) ...@@ -715,7 +715,7 @@ static unsigned int amiga_get_ss( void )
tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD; tod_3000.cntrl1 = TOD3000_CNTRL1_HOLD;
s = tod_3000.second1 * 10 + tod_3000.second2; s = tod_3000.second1 * 10 + tod_3000.second2;
tod_3000.cntrl1 = TOD3000_CNTRL1_FREE; tod_3000.cntrl1 = TOD3000_CNTRL1_FREE;
} else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ { } else /* if (AMIGAHW_PRESENT(A2000_CLK)) */ {
s = tod_2000.second1 * 10 + tod_2000.second2; s = tod_2000.second1 * 10 + tod_2000.second2;
} }
return s; return s;
...@@ -758,7 +758,7 @@ static void amiga_reset (void) ...@@ -758,7 +758,7 @@ static void amiga_reset (void)
: "a" (jmp_addr)); : "a" (jmp_addr));
jmp_addr_label040: jmp_addr_label040:
/* disable translation on '040 now */ /* disable translation on '040 now */
__asm__ __volatile__ __asm__ __volatile__
("moveq #0,%/d0\n\t" ("moveq #0,%/d0\n\t"
".chip 68040\n\t" ".chip 68040\n\t"
"movec %%d0,%%tc\n\t" /* disable MMU */ "movec %%d0,%%tc\n\t" /* disable MMU */
...@@ -783,7 +783,7 @@ static void amiga_reset (void) ...@@ -783,7 +783,7 @@ static void amiga_reset (void)
"1:\n\t" "1:\n\t"
"reset\n\t" "reset\n\t"
"jmp %/a0@" : /* Just that gcc scans it for % escapes */ ); "jmp %/a0@" : /* Just that gcc scans it for % escapes */ );
for (;;); for (;;);
} }
......
...@@ -62,19 +62,19 @@ int apollo_parse_bootinfo(const struct bi_record *record) { ...@@ -62,19 +62,19 @@ int apollo_parse_bootinfo(const struct bi_record *record) {
const unsigned long *data = record->data; const unsigned long *data = record->data;
switch(record->tag) { switch(record->tag) {
case BI_APOLLO_MODEL: case BI_APOLLO_MODEL:
apollo_model=*data; apollo_model=*data;
break; break;
default: default:
unknown=1; unknown=1;
} }
return unknown; return unknown;
} }
void dn_setup_model(void) { void dn_setup_model(void) {
printk("Apollo hardware found: "); printk("Apollo hardware found: ");
printk("[%s]\n", apollo_models[apollo_model - APOLLO_DN3000]); printk("[%s]\n", apollo_models[apollo_model - APOLLO_DN3000]);
...@@ -85,19 +85,19 @@ void dn_setup_model(void) { ...@@ -85,19 +85,19 @@ void dn_setup_model(void) {
break; break;
case APOLLO_DN3000: case APOLLO_DN3000:
case APOLLO_DN3010: case APOLLO_DN3010:
sio01_physaddr=SAU8_SIO01_PHYSADDR; sio01_physaddr=SAU8_SIO01_PHYSADDR;
rtc_physaddr=SAU8_RTC_PHYSADDR; rtc_physaddr=SAU8_RTC_PHYSADDR;
pica_physaddr=SAU8_PICA; pica_physaddr=SAU8_PICA;
picb_physaddr=SAU8_PICB; picb_physaddr=SAU8_PICB;
cpuctrl_physaddr=SAU8_CPUCTRL; cpuctrl_physaddr=SAU8_CPUCTRL;
timer_physaddr=SAU8_TIMER; timer_physaddr=SAU8_TIMER;
break; break;
case APOLLO_DN4000: case APOLLO_DN4000:
sio01_physaddr=SAU7_SIO01_PHYSADDR; sio01_physaddr=SAU7_SIO01_PHYSADDR;
sio23_physaddr=SAU7_SIO23_PHYSADDR; sio23_physaddr=SAU7_SIO23_PHYSADDR;
rtc_physaddr=SAU7_RTC_PHYSADDR; rtc_physaddr=SAU7_RTC_PHYSADDR;
pica_physaddr=SAU7_PICA; pica_physaddr=SAU7_PICA;
picb_physaddr=SAU7_PICB; picb_physaddr=SAU7_PICB;
cpuctrl_physaddr=SAU7_CPUCTRL; cpuctrl_physaddr=SAU7_CPUCTRL;
timer_physaddr=SAU7_TIMER; timer_physaddr=SAU7_TIMER;
break; break;
...@@ -105,11 +105,11 @@ void dn_setup_model(void) { ...@@ -105,11 +105,11 @@ void dn_setup_model(void) {
panic("Apollo model not yet supported"); panic("Apollo model not yet supported");
break; break;
case APOLLO_DN3500: case APOLLO_DN3500:
sio01_physaddr=SAU7_SIO01_PHYSADDR; sio01_physaddr=SAU7_SIO01_PHYSADDR;
sio23_physaddr=SAU7_SIO23_PHYSADDR; sio23_physaddr=SAU7_SIO23_PHYSADDR;
rtc_physaddr=SAU7_RTC_PHYSADDR; rtc_physaddr=SAU7_RTC_PHYSADDR;
pica_physaddr=SAU7_PICA; pica_physaddr=SAU7_PICA;
picb_physaddr=SAU7_PICB; picb_physaddr=SAU7_PICB;
cpuctrl_physaddr=SAU7_CPUCTRL; cpuctrl_physaddr=SAU7_CPUCTRL;
timer_physaddr=SAU7_TIMER; timer_physaddr=SAU7_TIMER;
break; break;
...@@ -131,17 +131,17 @@ int dn_serial_console_wait_key(struct console *co) { ...@@ -131,17 +131,17 @@ int dn_serial_console_wait_key(struct console *co) {
void dn_serial_console_write (struct console *co, const char *str,unsigned int count) void dn_serial_console_write (struct console *co, const char *str,unsigned int count)
{ {
while(count--) { while(count--) {
if (*str == '\n') { if (*str == '\n') {
sio01.rhrb_thrb = (unsigned char)'\r'; sio01.rhrb_thrb = (unsigned char)'\r';
while (!(sio01.srb_csrb & 0x4)) while (!(sio01.srb_csrb & 0x4))
; ;
} }
sio01.rhrb_thrb = (unsigned char)*str++; sio01.rhrb_thrb = (unsigned char)*str++;
while (!(sio01.srb_csrb & 0x4)) while (!(sio01.srb_csrb & 0x4))
; ;
} }
} }
void dn_serial_print (const char *str) void dn_serial_print (const char *str)
{ {
while (*str) { while (*str) {
...@@ -160,7 +160,7 @@ void config_apollo(void) { ...@@ -160,7 +160,7 @@ void config_apollo(void) {
int i; int i;
dn_setup_model(); dn_setup_model();
mach_sched_init=dn_sched_init; /* */ mach_sched_init=dn_sched_init; /* */
mach_init_IRQ=dn_init_IRQ; mach_init_IRQ=dn_init_IRQ;
...@@ -180,24 +180,24 @@ void config_apollo(void) { ...@@ -180,24 +180,24 @@ void config_apollo(void) {
conswitchp = &dummy_con; conswitchp = &dummy_con;
#endif #endif
#ifdef CONFIG_HEARTBEAT #ifdef CONFIG_HEARTBEAT
mach_heartbeat = dn_heartbeat; mach_heartbeat = dn_heartbeat;
#endif #endif
mach_get_model = dn_get_model; mach_get_model = dn_get_model;
cpuctrl=0xaa00; cpuctrl=0xaa00;
/* clear DMA translation table */ /* clear DMA translation table */
for(i=0;i<0x400;i++) for(i=0;i<0x400;i++)
addr_xlat_map[i]=0; addr_xlat_map[i]=0;
} }
irqreturn_t dn_timer_int(int irq, void *dev_id, struct pt_regs *fp) { irqreturn_t dn_timer_int(int irq, void *dev_id, struct pt_regs *fp) {
volatile unsigned char x; volatile unsigned char x;
sched_timer_handler(irq,dev_id,fp); sched_timer_handler(irq,dev_id,fp);
x=*(volatile unsigned char *)(timer+3); x=*(volatile unsigned char *)(timer+3);
x=*(volatile unsigned char *)(timer+5); x=*(volatile unsigned char *)(timer+5);
...@@ -206,7 +206,7 @@ irqreturn_t dn_timer_int(int irq, void *dev_id, struct pt_regs *fp) { ...@@ -206,7 +206,7 @@ irqreturn_t dn_timer_int(int irq, void *dev_id, struct pt_regs *fp) {
void dn_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *)) { void dn_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *)) {
/* program timer 1 */ /* program timer 1 */
*(volatile unsigned char *)(timer+3)=0x01; *(volatile unsigned char *)(timer+3)=0x01;
*(volatile unsigned char *)(timer+1)=0x40; *(volatile unsigned char *)(timer+1)=0x40;
*(volatile unsigned char *)(timer+5)=0x09; *(volatile unsigned char *)(timer+5)=0x09;
...@@ -272,7 +272,7 @@ void dn_dummy_reset(void) { ...@@ -272,7 +272,7 @@ void dn_dummy_reset(void) {
for(;;); for(;;);
} }
void dn_dummy_waitbut(void) { void dn_dummy_waitbut(void) {
dn_serial_print("waitbut\n"); dn_serial_print("waitbut\n");
...@@ -291,7 +291,7 @@ static int dn_cpuctrl=0xff00; ...@@ -291,7 +291,7 @@ static int dn_cpuctrl=0xff00;
static void dn_heartbeat(int on) { static void dn_heartbeat(int on) {
if(on) { if(on) {
dn_cpuctrl&=~0x100; dn_cpuctrl&=~0x100;
cpuctrl=dn_cpuctrl; cpuctrl=dn_cpuctrl;
} }
......
...@@ -34,7 +34,7 @@ unsigned short dma_map_page(unsigned long phys_addr,int count,int type) { ...@@ -34,7 +34,7 @@ unsigned short dma_map_page(unsigned long phys_addr,int count,int type) {
next_free_xlat_entry+=2; next_free_xlat_entry+=2;
if(next_free_xlat_entry>125) if(next_free_xlat_entry>125)
next_free_xlat_entry=0; next_free_xlat_entry=0;
#if 0 #if 0
printk("next_free_xlat_entry: %d\n",next_free_xlat_entry); printk("next_free_xlat_entry: %d\n",next_free_xlat_entry);
#endif #endif
......
...@@ -14,9 +14,9 @@ int dn_deb_printf(const char *fmt, ...) { ...@@ -14,9 +14,9 @@ int dn_deb_printf(const char *fmt, ...) {
i=vsprintf(current_dbg_ptr,fmt,args); i=vsprintf(current_dbg_ptr,fmt,args);
va_end(args); va_end(args);
current_dbg_ptr+=i; current_dbg_ptr+=i;
return i; return i;
} }
else else
return 0; return 0;
} }
...@@ -40,7 +40,7 @@ void dn_init_IRQ(void) { ...@@ -40,7 +40,7 @@ void dn_init_IRQ(void) {
dn_irqs[i].dev_id=NULL; dn_irqs[i].dev_id=NULL;
dn_irqs[i].devname=NULL; dn_irqs[i].devname=NULL;
} }
} }
int dn_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id) { int dn_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, struct pt_regs *), unsigned long flags, const char *devname, void *dev_id) {
...@@ -79,7 +79,7 @@ void dn_free_irq(unsigned int irq, void *dev_id) { ...@@ -79,7 +79,7 @@ void dn_free_irq(unsigned int irq, void *dev_id) {
if(irq<8) if(irq<8)
*(volatile unsigned char *)(pica+1)|=(1<<irq); *(volatile unsigned char *)(pica+1)|=(1<<irq);
else else
*(volatile unsigned char *)(picb+1)|=(1<<(irq-8)); *(volatile unsigned char *)(picb+1)|=(1<<(irq-8));
dn_irqs[irq].handler=NULL; dn_irqs[irq].handler=NULL;
dn_irqs[irq].flags=IRQ_FLG_STD; dn_irqs[irq].flags=IRQ_FLG_STD;
......
...@@ -54,14 +54,14 @@ ...@@ -54,14 +54,14 @@
/* /*
* Atari interrupt handling scheme: * Atari interrupt handling scheme:
* -------------------------------- * --------------------------------
* *
* All interrupt source have an internal number (defined in * All interrupt source have an internal number (defined in
* <asm/atariints.h>): Autovector interrupts are 1..7, then follow ST-MFP, * <asm/atariints.h>): Autovector interrupts are 1..7, then follow ST-MFP,
* TT-MFP, SCC, and finally VME interrupts. Vector numbers for the latter can * TT-MFP, SCC, and finally VME interrupts. Vector numbers for the latter can
* be allocated by atari_register_vme_int(). * be allocated by atari_register_vme_int().
* *
* Each interrupt can be of three types: * Each interrupt can be of three types:
* *
* - SLOW: The handler runs with all interrupts enabled, except the one it * - SLOW: The handler runs with all interrupts enabled, except the one it
* was called by (to avoid reentering). This should be the usual method. * was called by (to avoid reentering). This should be the usual method.
* But it is currently possible only for MFP ints, since only the MFP * But it is currently possible only for MFP ints, since only the MFP
...@@ -179,16 +179,16 @@ __asm__ (__ALIGN_STR "\n" \ ...@@ -179,16 +179,16 @@ __asm__ (__ALIGN_STR "\n" \
" movew %%d1,%%sr\n" /* set IPL = previous value */ \ " movew %%d1,%%sr\n" /* set IPL = previous value */ \
" addql #1,%a0\n" \ " addql #1,%a0\n" \
" lea %a1,%%a0\n" \ " lea %a1,%%a0\n" \
" pea %%sp@\n" /* push addr of frame */ \ " pea %%sp@\n" /* push addr of frame */ \
" movel %%a0@(4),%%sp@-\n" /* push handler data */ \ " movel %%a0@(4),%%sp@-\n" /* push handler data */ \
" pea (%c3+8)\n" /* push int number */ \ " pea (%c3+8)\n" /* push int number */ \
" movel %%a0@,%%a0\n" \ " movel %%a0@,%%a0\n" \
" jbsr %%a0@\n" /* call the handler */ \ " jbsr %%a0@\n" /* call the handler */ \
" addql #8,%%sp\n" \ " addql #8,%%sp\n" \
" addql #4,%%sp\n" \ " addql #4,%%sp\n" \
" orw #0x0600,%%sr\n" \ " orw #0x0600,%%sr\n" \
" andw #0xfeff,%%sr\n" /* set IPL = 6 again */ \ " andw #0xfeff,%%sr\n" /* set IPL = 6 again */ \
" orb #(1<<(%c3&7)),%a4:w\n" /* now unmask the int again */ \ " orb #(1<<(%c3&7)),%a4:w\n" /* now unmask the int again */ \
" jbra ret_from_interrupt\n" \ " jbra ret_from_interrupt\n" \
: : "i" (&kstat_cpu(0).irqs[n+8]), "i" (&irq_handler[n+8]), \ : : "i" (&kstat_cpu(0).irqs[n+8]), "i" (&irq_handler[n+8]), \
"n" (PT_OFF_SR), "n" (n), \ "n" (PT_OFF_SR), "n" (n), \
...@@ -274,7 +274,7 @@ asmlinkage void atari_prio_irq_handler( void ); ...@@ -274,7 +274,7 @@ asmlinkage void atari_prio_irq_handler( void );
void atari_fast_prio_irq_dummy (void) { void atari_fast_prio_irq_dummy (void) {
__asm__ (__ALIGN_STR "\n" __asm__ (__ALIGN_STR "\n"
"atari_fast_irq_handler:\n\t" "atari_fast_irq_handler:\n\t"
"orw #0x700,%%sr\n" /* disable all interrupts */ "orw #0x700,%%sr\n" /* disable all interrupts */
"atari_prio_irq_handler:\n\t" "atari_prio_irq_handler:\n\t"
"addl %3,%2\n\t" /* preempt_count() += HARDIRQ_OFFSET */ "addl %3,%2\n\t" /* preempt_count() += HARDIRQ_OFFSET */
SAVE_ALL_INT "\n\t" SAVE_ALL_INT "\n\t"
...@@ -282,13 +282,13 @@ __asm__ (__ALIGN_STR "\n" ...@@ -282,13 +282,13 @@ __asm__ (__ALIGN_STR "\n"
/* get vector number from stack frame and convert to source */ /* get vector number from stack frame and convert to source */
"bfextu %%sp@(%c1){#4,#10},%%d0\n\t" "bfextu %%sp@(%c1){#4,#10},%%d0\n\t"
"subw #(0x40-8),%%d0\n\t" "subw #(0x40-8),%%d0\n\t"
"jpl 1f\n\t" "jpl 1f\n\t"
"addw #(0x40-8-0x18),%%d0\n" "addw #(0x40-8-0x18),%%d0\n"
"1:\tlea %a0,%%a0\n\t" "1:\tlea %a0,%%a0\n\t"
"addql #1,%%a0@(%%d0:l:4)\n\t" "addql #1,%%a0@(%%d0:l:4)\n\t"
"lea irq_handler,%%a0\n\t" "lea irq_handler,%%a0\n\t"
"lea %%a0@(%%d0:l:8),%%a0\n\t" "lea %%a0@(%%d0:l:8),%%a0\n\t"
"pea %%sp@\n\t" /* push frame address */ "pea %%sp@\n\t" /* push frame address */
"movel %%a0@(4),%%sp@-\n\t" /* push handler data */ "movel %%a0@(4),%%sp@-\n\t" /* push handler data */
"movel %%d0,%%sp@-\n\t" /* push int number */ "movel %%d0,%%sp@-\n\t" /* push int number */
"movel %%a0@,%%a0\n\t" "movel %%a0@,%%a0\n\t"
...@@ -395,7 +395,7 @@ void __init atari_init_IRQ(void) ...@@ -395,7 +395,7 @@ void __init atari_init_IRQ(void)
be in an atasound_init(), that doesn't exist yet. */ be in an atasound_init(), that doesn't exist yet. */
atari_microwire_cmd(MW_LM1992_PSG_HIGH); atari_microwire_cmd(MW_LM1992_PSG_HIGH);
} }
stdma_init(); stdma_init();
/* Initialize the PSG: all sounds off, both ports output */ /* Initialize the PSG: all sounds off, both ports output */
...@@ -460,7 +460,7 @@ int atari_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, stru ...@@ -460,7 +460,7 @@ int atari_request_irq(unsigned int irq, irqreturn_t (*handler)(int, void *, stru
__FUNCTION__, irq, devname); __FUNCTION__, irq, devname);
return -EINVAL; return -EINVAL;
} }
if (vectors[vector] == bad_interrupt) { if (vectors[vector] == bad_interrupt) {
/* int has no handler yet */ /* int has no handler yet */
irq_handler[irq].handler = handler; irq_handler[irq].handler = handler;
...@@ -594,7 +594,7 @@ unsigned long atari_register_vme_int(void) ...@@ -594,7 +594,7 @@ unsigned long atari_register_vme_int(void)
for(i = 0; i < 32; i++) for(i = 0; i < 32; i++)
if((free_vme_vec_bitmap & (1 << i)) == 0) if((free_vme_vec_bitmap & (1 << i)) == 0)
break; break;
if(i == 16) if(i == 16)
return 0; return 0;
...@@ -641,7 +641,7 @@ int show_atari_interrupts(struct seq_file *p, void *v) ...@@ -641,7 +641,7 @@ int show_atari_interrupts(struct seq_file *p, void *v)
} }
if (num_spurious) if (num_spurious)
seq_printf(p, "spurio.: %10u\n", num_spurious); seq_printf(p, "spurio.: %10u\n", num_spurious);
return 0; return 0;
} }
......
...@@ -70,7 +70,7 @@ void atari_mksound (unsigned int hz, unsigned int ticks) ...@@ -70,7 +70,7 @@ void atari_mksound (unsigned int hz, unsigned int ticks)
if (hz) { if (hz) {
/* Convert from frequency value to PSG period value (base /* Convert from frequency value to PSG period value (base
frequency 125 kHz). */ frequency 125 kHz). */
period = PSG_FREQ / hz; period = PSG_FREQ / hz;
if (period > 0xfff) period = 0xfff; if (period > 0xfff) period = 0xfff;
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
* Added setting of time_adj to get a better clock. * Added setting of time_adj to get a better clock.
* *
* 5/14/94 Roman Hodek: * 5/14/94 Roman Hodek:
* gettod() for TT * gettod() for TT
* *
* 5/15/94 Roman Hodek: * 5/15/94 Roman Hodek:
* hard_reset_now() for Atari (and others?) * hard_reset_now() for Atari (and others?)
...@@ -92,7 +92,7 @@ extern void atari_debug_init(void); ...@@ -92,7 +92,7 @@ extern void atari_debug_init(void);
* for posterity. * for posterity.
* -- Peter Maydell <pmaydell@chiark.greenend.org.uk>, 05/1998 * -- Peter Maydell <pmaydell@chiark.greenend.org.uk>, 05/1998
*/ */
#if 0 #if 0
static int __init static int __init
hwreg_present_bywrite(volatile void *regp, unsigned char val) hwreg_present_bywrite(volatile void *regp, unsigned char val)
...@@ -100,7 +100,7 @@ hwreg_present_bywrite(volatile void *regp, unsigned char val) ...@@ -100,7 +100,7 @@ hwreg_present_bywrite(volatile void *regp, unsigned char val)
int ret; int ret;
long save_sp, save_vbr; long save_sp, save_vbr;
static long tmp_vectors[3] = { [2] = (long)&&after_test }; static long tmp_vectors[3] = { [2] = (long)&&after_test };
__asm__ __volatile__ __asm__ __volatile__
( "movec %/vbr,%2\n\t" /* save vbr value */ ( "movec %/vbr,%2\n\t" /* save vbr value */
"movec %4,%/vbr\n\t" /* set up temporary vectors */ "movec %4,%/vbr\n\t" /* set up temporary vectors */
...@@ -141,14 +141,14 @@ static int __init scc_test( volatile char *ctla ) ...@@ -141,14 +141,14 @@ static int __init scc_test( volatile char *ctla )
*ctla = 2; MFPDELAY(); *ctla = 2; MFPDELAY();
*ctla = 0x40; MFPDELAY(); *ctla = 0x40; MFPDELAY();
*ctla = 2; MFPDELAY(); *ctla = 2; MFPDELAY();
if (*ctla != 0x40) return( 0 ); if (*ctla != 0x40) return( 0 );
MFPDELAY(); MFPDELAY();
*ctla = 2; MFPDELAY(); *ctla = 2; MFPDELAY();
*ctla = 0x60; MFPDELAY(); *ctla = 0x60; MFPDELAY();
*ctla = 2; MFPDELAY(); *ctla = 2; MFPDELAY();
if (*ctla != 0x60) return( 0 ); if (*ctla != 0x60) return( 0 );
...@@ -199,7 +199,7 @@ void __init atari_switches_setup( const char *str, unsigned len ) ...@@ -199,7 +199,7 @@ void __init atari_switches_setup( const char *str, unsigned len )
p += 3; p += 3;
ovsc_shift = ATARI_SWITCH_OVSC_SHIFT; ovsc_shift = ATARI_SWITCH_OVSC_SHIFT;
} }
if (strcmp( p, "ikbd" ) == 0) { if (strcmp( p, "ikbd" ) == 0) {
/* RTS line of IKBD ACIA */ /* RTS line of IKBD ACIA */
atari_switches |= ATARI_SWITCH_IKBD << ovsc_shift; atari_switches |= ATARI_SWITCH_IKBD << ovsc_shift;
...@@ -269,8 +269,8 @@ void __init config_atari(void) ...@@ -269,8 +269,8 @@ void __init config_atari(void)
((atari_switches&ATARI_SWITCH_SND6) ? 0x40 : 0) | ((atari_switches&ATARI_SWITCH_SND6) ? 0x40 : 0) |
((atari_switches&ATARI_SWITCH_SND7) ? 0x80 : 0); ((atari_switches&ATARI_SWITCH_SND7) ? 0x80 : 0);
} }
/* ++bjoern: /* ++bjoern:
* Determine hardware present * Determine hardware present
*/ */
...@@ -446,7 +446,7 @@ void __init config_atari(void) ...@@ -446,7 +446,7 @@ void __init config_atari(void)
: /* no outputs */ : /* no outputs */
: /* no inputs */ : /* no inputs */
: "d0"); : "d0");
/* allocator for memory that must reside in st-ram */ /* allocator for memory that must reside in st-ram */
atari_stram_init (); atari_stram_init ();
...@@ -507,7 +507,7 @@ static void atari_heartbeat( int on ) ...@@ -507,7 +507,7 @@ static void atari_heartbeat( int on )
if (atari_dont_touch_floppy_select) if (atari_dont_touch_floppy_select)
return; return;
local_irq_save(flags); local_irq_save(flags);
sound_ym.rd_data_reg_sel = 14; /* Select PSG Port A */ sound_ym.rd_data_reg_sel = 14; /* Select PSG Port A */
tmp = sound_ym.rd_data_reg_sel; tmp = sound_ym.rd_data_reg_sel;
...@@ -544,7 +544,7 @@ static void atari_heartbeat( int on ) ...@@ -544,7 +544,7 @@ static void atari_heartbeat( int on )
* address of a C label. No hope to compile this with another compiler * address of a C label. No hope to compile this with another compiler
* than GCC! * than GCC!
*/ */
/* ++andreas: no need for complicated code, just depend on prefetch */ /* ++andreas: no need for complicated code, just depend on prefetch */
static void atari_reset (void) static void atari_reset (void)
...@@ -563,7 +563,7 @@ static void atari_reset (void) ...@@ -563,7 +563,7 @@ static void atari_reset (void)
acia.key_ctrl = ACIA_RESET; acia.key_ctrl = ACIA_RESET;
if (atari_switches & ATARI_SWITCH_OVSC_MIDI) if (atari_switches & ATARI_SWITCH_OVSC_MIDI)
acia.mid_ctrl = ACIA_RESET; acia.mid_ctrl = ACIA_RESET;
/* processor independent: turn off interrupts and reset the VBR; /* processor independent: turn off interrupts and reset the VBR;
* the caches must be left enabled, else prefetching the final jump * the caches must be left enabled, else prefetching the final jump
* instruction doesn't work. */ * instruction doesn't work. */
...@@ -572,7 +572,7 @@ static void atari_reset (void) ...@@ -572,7 +572,7 @@ static void atari_reset (void)
("moveq #0,%/d0\n\t" ("moveq #0,%/d0\n\t"
"movec %/d0,%/vbr" "movec %/d0,%/vbr"
: : : "d0" ); : : : "d0" );
if (CPU_IS_040_OR_060) { if (CPU_IS_040_OR_060) {
unsigned long jmp_addr040 = virt_to_phys(&&jmp_addr_label040); unsigned long jmp_addr040 = virt_to_phys(&&jmp_addr_label040);
if (CPU_IS_060) { if (CPU_IS_060) {
...@@ -584,7 +584,7 @@ static void atari_reset (void) ...@@ -584,7 +584,7 @@ static void atari_reset (void)
".chip 68k" ".chip 68k"
: : : "d0" ); : : : "d0" );
} }
__asm__ __volatile__ __asm__ __volatile__
("movel %0,%/d0\n\t" ("movel %0,%/d0\n\t"
"andl #0xff000000,%/d0\n\t" "andl #0xff000000,%/d0\n\t"
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Atari debugging and serial console stuff * Atari debugging and serial console stuff
* *
* Assembled of parts of former atari/config.c 97-12-18 by Roman Hodek * Assembled of parts of former atari/config.c 97-12-18 by Roman Hodek
* *
* This file is subject to the terms and conditions of the GNU General Public * This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive * License. See the file COPYING in the main directory of this archive
* for more details. * for more details.
...@@ -99,7 +99,7 @@ static int ata_par_out (char c) ...@@ -99,7 +99,7 @@ static int ata_par_out (char c)
while( (mfp.par_dt_reg & 1) && --i ) /* wait for BUSY == L */ while( (mfp.par_dt_reg & 1) && --i ) /* wait for BUSY == L */
; ;
if (!i) return( 0 ); if (!i) return( 0 );
sound_ym.rd_data_reg_sel = 15; /* select port B */ sound_ym.rd_data_reg_sel = 15; /* select port B */
sound_ym.wd_data = c; /* put char onto port */ sound_ym.wd_data = c; /* put char onto port */
sound_ym.rd_data_reg_sel = 14; /* select port A */ sound_ym.rd_data_reg_sel = 14; /* select port A */
...@@ -177,7 +177,7 @@ void atari_init_mfp_port( int cflag ) ...@@ -177,7 +177,7 @@ void atari_init_mfp_port( int cflag )
if (baud < B1200 || baud > B38400+2) if (baud < B1200 || baud > B38400+2)
baud = B9600; /* use default 9600bps for non-implemented rates */ baud = B9600; /* use default 9600bps for non-implemented rates */
baud -= B1200; /* baud_table[] starts at 1200bps */ baud -= B1200; /* baud_table[] starts at 1200bps */
mfp.trn_stat &= ~0x01; /* disable TX */ mfp.trn_stat &= ~0x01; /* disable TX */
mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */ mfp.usart_ctr = parity | csize | 0x88; /* 1:16 clk mode, 1 stop bit */
mfp.tim_ct_cd &= 0x70; /* stop timer D */ mfp.tim_ct_cd &= 0x70; /* stop timer D */
...@@ -204,7 +204,7 @@ void atari_init_mfp_port( int cflag ) ...@@ -204,7 +204,7 @@ void atari_init_mfp_port( int cflag )
for( i = 100; i > 0; --i ) \ for( i = 100; i > 0; --i ) \
MFPDELAY(); \ MFPDELAY(); \
} while(0) } while(0)
#ifndef CONFIG_SERIAL_CONSOLE #ifndef CONFIG_SERIAL_CONSOLE
static void __init atari_init_scc_port( int cflag ) static void __init atari_init_scc_port( int cflag )
#else #else
...@@ -214,20 +214,20 @@ void atari_init_scc_port( int cflag ) ...@@ -214,20 +214,20 @@ void atari_init_scc_port( int cflag )
extern int atari_SCC_reset_done; extern int atari_SCC_reset_done;
static int clksrc_table[9] = static int clksrc_table[9] =
/* reg 11: 0x50 = BRG, 0x00 = RTxC, 0x28 = TRxC */ /* reg 11: 0x50 = BRG, 0x00 = RTxC, 0x28 = TRxC */
{ 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 }; { 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x50, 0x00, 0x00 };
static int brgsrc_table[9] = static int brgsrc_table[9] =
/* reg 14: 0 = RTxC, 2 = PCLK */ /* reg 14: 0 = RTxC, 2 = PCLK */
{ 2, 2, 2, 2, 2, 2, 0, 2, 2 }; { 2, 2, 2, 2, 2, 2, 0, 2, 2 };
static int clkmode_table[9] = static int clkmode_table[9] =
/* reg 4: 0x40 = x16, 0x80 = x32, 0xc0 = x64 */ /* reg 4: 0x40 = x16, 0x80 = x32, 0xc0 = x64 */
{ 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80 }; { 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0x40, 0xc0, 0x80 };
static int div_table[9] = static int div_table[9] =
/* reg12 (BRG low) */ /* reg12 (BRG low) */
{ 208, 138, 103, 50, 24, 11, 1, 0, 0 }; { 208, 138, 103, 50, 24, 11, 1, 0, 0 };
int baud = cflag & CBAUD; int baud = cflag & CBAUD;
int clksrc, clkmode, div, reg3, reg5; int clksrc, clkmode, div, reg3, reg5;
if (cflag & CBAUDEX) if (cflag & CBAUDEX)
baud += B38400; baud += B38400;
if (baud < B1200 || baud > B38400+2) if (baud < B1200 || baud > B38400+2)
...@@ -248,7 +248,7 @@ void atari_init_scc_port( int cflag ) ...@@ -248,7 +248,7 @@ void atari_init_scc_port( int cflag )
reg3 = (cflag & CSIZE) == CS8 ? 0xc0 : 0x40; reg3 = (cflag & CSIZE) == CS8 ? 0xc0 : 0x40;
reg5 = (cflag & CSIZE) == CS8 ? 0x60 : 0x20 | 0x82 /* assert DTR/RTS */; reg5 = (cflag & CSIZE) == CS8 ? 0x60 : 0x20 | 0x82 /* assert DTR/RTS */;
(void)scc.cha_b_ctrl; /* reset reg pointer */ (void)scc.cha_b_ctrl; /* reset reg pointer */
SCC_WRITE( 9, 0xc0 ); /* reset */ SCC_WRITE( 9, 0xc0 ); /* reset */
LONG_DELAY(); /* extra delay after WR9 access */ LONG_DELAY(); /* extra delay after WR9 access */
...@@ -267,12 +267,12 @@ void atari_init_scc_port( int cflag ) ...@@ -267,12 +267,12 @@ void atari_init_scc_port( int cflag )
SCC_WRITE( 14, brgsrc_table[baud] | (div ? 1 : 0) ); SCC_WRITE( 14, brgsrc_table[baud] | (div ? 1 : 0) );
SCC_WRITE( 3, reg3 | 1 ); SCC_WRITE( 3, reg3 | 1 );
SCC_WRITE( 5, reg5 | 8 ); SCC_WRITE( 5, reg5 | 8 );
atari_SCC_reset_done = 1; atari_SCC_reset_done = 1;
atari_SCC_init_done = 1; atari_SCC_init_done = 1;
} }
#ifndef CONFIG_SERIAL_CONSOLE #ifndef CONFIG_SERIAL_CONSOLE
static void __init atari_init_midi_port( int cflag ) static void __init atari_init_midi_port( int cflag )
#else #else
void atari_init_midi_port( int cflag ) void atari_init_midi_port( int cflag )
......
...@@ -97,7 +97,7 @@ void stdma_lock(irqreturn_t (*handler)(int, void *, struct pt_regs *), ...@@ -97,7 +97,7 @@ void stdma_lock(irqreturn_t (*handler)(int, void *, struct pt_regs *),
/* /*
* Function: void stdma_release( void ) * Function: void stdma_release( void )
* *
* Purpose: Releases the lock on the ST-DMA chip. * Purpose: Releases the lock on the ST-DMA chip.
* *
* Inputs: none * Inputs: none
* *
......
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
/* Pre-swapping comments: /* Pre-swapping comments:
* *
* ++roman: * ++roman:
* *
* New version of ST-Ram buffer allocation. Instead of using the * New version of ST-Ram buffer allocation. Instead of using the
* 1 MB - 4 KB that remain when the ST-Ram chunk starts at $1000 * 1 MB - 4 KB that remain when the ST-Ram chunk starts at $1000
* (1 MB granularity!), such buffers are reserved like this: * (1 MB granularity!), such buffers are reserved like this:
...@@ -60,14 +60,14 @@ ...@@ -60,14 +60,14 @@
* - If the kernel resides in ST-Ram anyway, we can take the buffer * - If the kernel resides in ST-Ram anyway, we can take the buffer
* from behind the current kernel data space the normal way * from behind the current kernel data space the normal way
* (incrementing start_mem). * (incrementing start_mem).
* *
* - If the kernel is in TT-Ram, stram_init() initializes start and * - If the kernel is in TT-Ram, stram_init() initializes start and
* end of the available region. Buffers are allocated from there * end of the available region. Buffers are allocated from there
* and mem_init() later marks the such used pages as reserved. * and mem_init() later marks the such used pages as reserved.
* Since each TT-Ram chunk is at least 4 MB in size, I hope there * Since each TT-Ram chunk is at least 4 MB in size, I hope there
* won't be an overrun of the ST-Ram region by normal kernel data * won't be an overrun of the ST-Ram region by normal kernel data
* space. * space.
* *
* For that, ST-Ram may only be allocated while kernel initialization * For that, ST-Ram may only be allocated while kernel initialization
* is going on, or exactly: before mem_init() is called. There is also * is going on, or exactly: before mem_init() is called. There is also
* no provision now for freeing ST-Ram buffers. It seems that isn't * no provision now for freeing ST-Ram buffers. It seems that isn't
...@@ -105,7 +105,7 @@ ...@@ -105,7 +105,7 @@
* visible on a TT, where the speed difference between ST- and TT-RAM isn't * visible on a TT, where the speed difference between ST- and TT-RAM isn't
* that dramatic, but it should on machines where TT-RAM is really much faster * that dramatic, but it should on machines where TT-RAM is really much faster
* (e.g. Afterburner). * (e.g. Afterburner).
* *
* [1]: __get_free_pages() does a fine job if you only want one page, but if * [1]: __get_free_pages() does a fine job if you only want one page, but if
* you want more (contiguous) pages, it can give you such a block only if * you want more (contiguous) pages, it can give you such a block only if
* there's already a free one. The algorithm can't try to free buffers or swap * there's already a free one. The algorithm can't try to free buffers or swap
...@@ -318,7 +318,7 @@ void __init atari_stram_reserve_pages(void *start_mem) ...@@ -318,7 +318,7 @@ void __init atari_stram_reserve_pages(void *start_mem)
swap_end = swap_start + max_swap_size; swap_end = swap_start + max_swap_size;
DPRINTK( "atari_stram_reserve_pages: swapping enabled; " DPRINTK( "atari_stram_reserve_pages: swapping enabled; "
"swap=%p-%p\n", swap_start, swap_end); "swap=%p-%p\n", swap_start, swap_end);
/* reserve some amount of memory for maintainance of /* reserve some amount of memory for maintainance of
* swapping itself: one page for each 2048 (PAGE_SIZE/2) * swapping itself: one page for each 2048 (PAGE_SIZE/2)
* swap pages. (2 bytes for each page) */ * swap pages. (2 bytes for each page) */
...@@ -328,7 +328,7 @@ void __init atari_stram_reserve_pages(void *start_mem) ...@@ -328,7 +328,7 @@ void __init atari_stram_reserve_pages(void *start_mem)
/* correct swap_start if necessary */ /* correct swap_start if necessary */
if (swap_start + PAGE_SIZE == swap_data) if (swap_start + PAGE_SIZE == swap_data)
swap_start = start_mem - PAGE_SIZE; swap_start = start_mem - PAGE_SIZE;
if (!swap_init( start_mem, swap_data )) { if (!swap_init( start_mem, swap_data )) {
printk( KERN_ERR "ST-RAM swap space initialization failed\n" ); printk( KERN_ERR "ST-RAM swap space initialization failed\n" );
max_swap_size = 0; max_swap_size = 0;
...@@ -368,13 +368,13 @@ void atari_stram_mem_init_hook (void) ...@@ -368,13 +368,13 @@ void atari_stram_mem_init_hook (void)
/* /*
* This is main public interface: somehow allocate a ST-RAM block * This is main public interface: somehow allocate a ST-RAM block
* There are three strategies: * There are three strategies:
* *
* - If we're before mem_init(), we have to make a static allocation. The * - If we're before mem_init(), we have to make a static allocation. The
* region is taken in the kernel data area (if the kernel is in ST-RAM) or * region is taken in the kernel data area (if the kernel is in ST-RAM) or
* from the start of ST-RAM (if the kernel is in TT-RAM) and added to the * from the start of ST-RAM (if the kernel is in TT-RAM) and added to the
* rsvd_stram_* region. The ST-RAM is somewhere in the middle of kernel * rsvd_stram_* region. The ST-RAM is somewhere in the middle of kernel
* address space in the latter case. * address space in the latter case.
* *
* - If mem_init() already has been called and ST-RAM swapping is enabled, * - If mem_init() already has been called and ST-RAM swapping is enabled,
* try to get the memory from the (pseudo) swap-space, either free already * try to get the memory from the (pseudo) swap-space, either free already
* or by moving some other pages out of the swap. * or by moving some other pages out of the swap.
...@@ -383,7 +383,7 @@ void atari_stram_mem_init_hook (void) ...@@ -383,7 +383,7 @@ void atari_stram_mem_init_hook (void)
* enabled, the only possibility is to try with __get_dma_pages(). This has * enabled, the only possibility is to try with __get_dma_pages(). This has
* the disadvantage that it's very hard to get more than 1 page, and it is * the disadvantage that it's very hard to get more than 1 page, and it is
* likely to fail :-( * likely to fail :-(
* *
*/ */
void *atari_stram_alloc(long size, const char *owner) void *atari_stram_alloc(long size, const char *owner)
{ {
...@@ -450,7 +450,7 @@ void atari_stram_free( void *addr ) ...@@ -450,7 +450,7 @@ void atari_stram_free( void *addr )
} }
DPRINTK( "atari_stram_free: found block (%p): size=%08lx, owner=%s, " DPRINTK( "atari_stram_free: found block (%p): size=%08lx, owner=%s, "
"flags=%02x\n", block, block->size, block->owner, block->flags ); "flags=%02x\n", block, block->size, block->owner, block->flags );
#ifdef CONFIG_STRAM_SWAP #ifdef CONFIG_STRAM_SWAP
if (!max_swap_size) { if (!max_swap_size) {
#endif #endif
...@@ -503,14 +503,14 @@ static int __init swap_init(void *start_mem, void *swap_data) ...@@ -503,14 +503,14 @@ static int __init swap_init(void *start_mem, void *swap_data)
DPRINTK("swap_init(start_mem=%p, swap_data=%p)\n", DPRINTK("swap_init(start_mem=%p, swap_data=%p)\n",
start_mem, swap_data); start_mem, swap_data);
/* need at least one page for swapping to (and this also isn't very /* need at least one page for swapping to (and this also isn't very
* much... :-) */ * much... :-) */
if (swap_end - swap_start < 2*PAGE_SIZE) { if (swap_end - swap_start < 2*PAGE_SIZE) {
printk( KERN_WARNING "stram_swap_init: swap space too small\n" ); printk( KERN_WARNING "stram_swap_init: swap space too small\n" );
return( 0 ); return( 0 );
} }
/* find free slot in swap_info */ /* find free slot in swap_info */
for( p = swap_info, type = 0; type < nr_swapfiles; type++, p++ ) for( p = swap_info, type = 0; type < nr_swapfiles; type++, p++ )
if (!(p->flags & SWP_USED)) if (!(p->flags & SWP_USED))
...@@ -531,7 +531,7 @@ static int __init swap_init(void *start_mem, void *swap_data) ...@@ -531,7 +531,7 @@ static int __init swap_init(void *start_mem, void *swap_data)
fake_dentry.d_name.name = "stram (internal)"; fake_dentry.d_name.name = "stram (internal)";
fake_dentry.d_name.len = 16; fake_dentry.d_name.len = 16;
fake_vfsmnt.mnt_parent = &fake_vfsmnt; fake_vfsmnt.mnt_parent = &fake_vfsmnt;
p->flags = SWP_USED; p->flags = SWP_USED;
p->swap_file = &fake_dentry; p->swap_file = &fake_dentry;
p->swap_vfsmnt = &fake_vfsmnt; p->swap_vfsmnt = &fake_vfsmnt;
...@@ -706,7 +706,7 @@ static void unswap_vma(struct vm_area_struct * vma, pgd_t *pgdir, ...@@ -706,7 +706,7 @@ static void unswap_vma(struct vm_area_struct * vma, pgd_t *pgdir,
} while (start < end); } while (start < end);
} }
static void unswap_process(struct mm_struct * mm, swp_entry_t entry, static void unswap_process(struct mm_struct * mm, swp_entry_t entry,
struct page *page) struct page *page)
{ {
struct vm_area_struct* vma; struct vm_area_struct* vma;
...@@ -799,7 +799,7 @@ static void *get_stram_region( unsigned long n_pages ) ...@@ -799,7 +799,7 @@ static void *get_stram_region( unsigned long n_pages )
unsigned long start, total_free, region_free; unsigned long start, total_free, region_free;
int err; int err;
void *ret = NULL; void *ret = NULL;
DPRINTK( "get_stram_region(n_pages=%lu)\n", n_pages ); DPRINTK( "get_stram_region(n_pages=%lu)\n", n_pages );
down(&stram_swap_sem); down(&stram_swap_sem);
...@@ -874,7 +874,7 @@ static void free_stram_region( unsigned long offset, unsigned long n_pages ) ...@@ -874,7 +874,7 @@ static void free_stram_region( unsigned long offset, unsigned long n_pages )
static int in_some_region(void *addr) static int in_some_region(void *addr)
{ {
BLOCK *p; BLOCK *p;
for( p = alloc_list; p; p = p->next ) { for( p = alloc_list; p; p = p->next ) {
if (p->start <= addr && addr < p->start + p->size) if (p->start <= addr && addr < p->start + p->size)
return( 1 ); return( 1 );
...@@ -920,7 +920,7 @@ static unsigned long find_free_region(unsigned long n_pages, ...@@ -920,7 +920,7 @@ static unsigned long find_free_region(unsigned long n_pages,
/* don't need more free pages... :-) */ /* don't need more free pages... :-) */
goto out; goto out;
} }
/* now shift the window and look for the area where as much pages as /* now shift the window and look for the area where as much pages as
* possible are free */ * possible are free */
while( tail < max ) { while( tail < max ) {
...@@ -1130,7 +1130,7 @@ static BLOCK *add_region( void *addr, unsigned long size ) ...@@ -1130,7 +1130,7 @@ static BLOCK *add_region( void *addr, unsigned long size )
static BLOCK *find_region( void *addr ) static BLOCK *find_region( void *addr )
{ {
BLOCK *p; BLOCK *p;
for( p = alloc_list; p; p = p->next ) { for( p = alloc_list; p; p = p->next ) {
if (p->start == addr) if (p->start == addr)
return( p ); return( p );
...@@ -1145,7 +1145,7 @@ static BLOCK *find_region( void *addr ) ...@@ -1145,7 +1145,7 @@ static BLOCK *find_region( void *addr )
static int remove_region( BLOCK *block ) static int remove_region( BLOCK *block )
{ {
BLOCK **p; BLOCK **p;
for( p = &alloc_list; *p; p = &((*p)->next) ) for( p = &alloc_list; *p; p = &((*p)->next) )
if (*p == block) break; if (*p == block) break;
if (!*p) if (!*p)
......
...@@ -4,7 +4,7 @@ ...@@ -4,7 +4,7 @@
* Atari time and real time clock stuff * Atari time and real time clock stuff
* *
* Assembled of parts of former atari/config.c 97-12-18 by Roman Hodek * Assembled of parts of former atari/config.c 97-12-18 by Roman Hodek
* *
* This file is subject to the terms and conditions of the GNU General Public * This file is subject to the terms and conditions of the GNU General Public
* License. See the file COPYING in the main directory of this archive * License. See the file COPYING in the main directory of this archive
* for more details. * for more details.
...@@ -25,7 +25,7 @@ atari_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *)) ...@@ -25,7 +25,7 @@ atari_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *))
/* set Timer C data Register */ /* set Timer C data Register */
mfp.tim_dt_c = INT_TICKS; mfp.tim_dt_c = INT_TICKS;
/* start timer C, div = 1:100 */ /* start timer C, div = 1:100 */
mfp.tim_ct_cd = (mfp.tim_ct_cd & 15) | 0x60; mfp.tim_ct_cd = (mfp.tim_ct_cd & 15) | 0x60;
/* install interrupt service routine for MFP Timer C */ /* install interrupt service routine for MFP Timer C */
request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW, request_irq(IRQ_MFP_TIMC, timer_routine, IRQ_TYPE_SLOW,
"timer", timer_routine); "timer", timer_routine);
...@@ -34,7 +34,7 @@ atari_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *)) ...@@ -34,7 +34,7 @@ atari_sched_init(irqreturn_t (*timer_routine)(int, void *, struct pt_regs *))
/* ++andreas: gettimeoffset fixed to check for pending interrupt */ /* ++andreas: gettimeoffset fixed to check for pending interrupt */
#define TICK_SIZE 10000 #define TICK_SIZE 10000
/* This is always executed with interrupts disabled. */ /* This is always executed with interrupts disabled. */
unsigned long atari_gettimeoffset (void) unsigned long atari_gettimeoffset (void)
{ {
...@@ -59,9 +59,9 @@ static void mste_read(struct MSTE_RTC *val) ...@@ -59,9 +59,9 @@ static void mste_read(struct MSTE_RTC *val)
{ {
#define COPY(v) val->v=(mste_rtc.v & 0xf) #define COPY(v) val->v=(mste_rtc.v & 0xf)
do { do {
COPY(sec_ones) ; COPY(sec_tens) ; COPY(min_ones) ; COPY(sec_ones) ; COPY(sec_tens) ; COPY(min_ones) ;
COPY(min_tens) ; COPY(hr_ones) ; COPY(hr_tens) ; COPY(min_tens) ; COPY(hr_ones) ; COPY(hr_tens) ;
COPY(weekday) ; COPY(day_ones) ; COPY(day_tens) ; COPY(weekday) ; COPY(day_ones) ; COPY(day_tens) ;
COPY(mon_ones) ; COPY(mon_tens) ; COPY(year_ones) ; COPY(mon_ones) ; COPY(mon_tens) ; COPY(year_ones) ;
COPY(year_tens) ; COPY(year_tens) ;
/* prevent from reading the clock while it changed */ /* prevent from reading the clock while it changed */
...@@ -73,9 +73,9 @@ static void mste_write(struct MSTE_RTC *val) ...@@ -73,9 +73,9 @@ static void mste_write(struct MSTE_RTC *val)
{ {
#define COPY(v) mste_rtc.v=val->v #define COPY(v) mste_rtc.v=val->v
do { do {
COPY(sec_ones) ; COPY(sec_tens) ; COPY(min_ones) ; COPY(sec_ones) ; COPY(sec_tens) ; COPY(min_ones) ;
COPY(min_tens) ; COPY(hr_ones) ; COPY(hr_tens) ; COPY(min_tens) ; COPY(hr_ones) ; COPY(hr_tens) ;
COPY(weekday) ; COPY(day_ones) ; COPY(day_tens) ; COPY(weekday) ; COPY(day_ones) ; COPY(day_tens) ;
COPY(mon_ones) ; COPY(mon_tens) ; COPY(year_ones) ; COPY(mon_ones) ; COPY(mon_tens) ; COPY(year_ones) ;
COPY(year_tens) ; COPY(year_tens) ;
/* prevent from writing the clock while it changed */ /* prevent from writing the clock while it changed */
...@@ -104,14 +104,14 @@ int atari_mste_hwclk( int op, struct rtc_time *t ) ...@@ -104,14 +104,14 @@ int atari_mste_hwclk( int op, struct rtc_time *t )
int hour, year; int hour, year;
int hr24=0; int hr24=0;
struct MSTE_RTC val; struct MSTE_RTC val;
mste_rtc.mode=(mste_rtc.mode | 1); mste_rtc.mode=(mste_rtc.mode | 1);
hr24=mste_rtc.mon_tens & 1; hr24=mste_rtc.mon_tens & 1;
mste_rtc.mode=(mste_rtc.mode & ~1); mste_rtc.mode=(mste_rtc.mode & ~1);
if (op) { if (op) {
/* write: prepare values */ /* write: prepare values */
val.sec_ones = t->tm_sec % 10; val.sec_ones = t->tm_sec % 10;
val.sec_tens = t->tm_sec / 10; val.sec_tens = t->tm_sec / 10;
val.min_ones = t->tm_min % 10; val.min_ones = t->tm_min % 10;
...@@ -160,8 +160,8 @@ int atari_mste_hwclk( int op, struct rtc_time *t ) ...@@ -160,8 +160,8 @@ int atari_mste_hwclk( int op, struct rtc_time *t )
int atari_tt_hwclk( int op, struct rtc_time *t ) int atari_tt_hwclk( int op, struct rtc_time *t )
{ {
int sec=0, min=0, hour=0, day=0, mon=0, year=0, wday=0; int sec=0, min=0, hour=0, day=0, mon=0, year=0, wday=0;
unsigned long flags; unsigned long flags;
unsigned char ctrl; unsigned char ctrl;
int pm = 0; int pm = 0;
...@@ -170,7 +170,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t ) ...@@ -170,7 +170,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t )
if (op) { if (op) {
/* write: prepare values */ /* write: prepare values */
sec = t->tm_sec; sec = t->tm_sec;
min = t->tm_min; min = t->tm_min;
hour = t->tm_hour; hour = t->tm_hour;
...@@ -178,7 +178,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t ) ...@@ -178,7 +178,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t )
mon = t->tm_mon + 1; mon = t->tm_mon + 1;
year = t->tm_year - atari_rtc_year_offset; year = t->tm_year - atari_rtc_year_offset;
wday = t->tm_wday + (t->tm_wday >= 0); wday = t->tm_wday + (t->tm_wday >= 0);
if (!(ctrl & RTC_24H)) { if (!(ctrl & RTC_24H)) {
if (hour > 11) { if (hour > 11) {
pm = 0x80; pm = 0x80;
...@@ -188,7 +188,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t ) ...@@ -188,7 +188,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t )
else if (hour == 0) else if (hour == 0)
hour = 12; hour = 12;
} }
if (!(ctrl & RTC_DM_BINARY)) { if (!(ctrl & RTC_DM_BINARY)) {
BIN_TO_BCD(sec); BIN_TO_BCD(sec);
BIN_TO_BCD(min); BIN_TO_BCD(min);
...@@ -199,7 +199,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t ) ...@@ -199,7 +199,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t )
if (wday >= 0) BIN_TO_BCD(wday); if (wday >= 0) BIN_TO_BCD(wday);
} }
} }
/* Reading/writing the clock registers is a bit critical due to /* Reading/writing the clock registers is a bit critical due to
* the regular update cycle of the RTC. While an update is in * the regular update cycle of the RTC. While an update is in
* progress, registers 0..9 shouldn't be touched. * progress, registers 0..9 shouldn't be touched.
...@@ -242,7 +242,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t ) ...@@ -242,7 +242,7 @@ int atari_tt_hwclk( int op, struct rtc_time *t )
if (!op) { if (!op) {
/* read: adjust values */ /* read: adjust values */
if (hour & 0x80) { if (hour & 0x80) {
hour &= ~0x80; hour &= ~0x80;
pm = 1; pm = 1;
...@@ -284,7 +284,7 @@ int atari_mste_set_clock_mmss (unsigned long nowtime) ...@@ -284,7 +284,7 @@ int atari_mste_set_clock_mmss (unsigned long nowtime)
struct MSTE_RTC val; struct MSTE_RTC val;
unsigned char rtc_minutes; unsigned char rtc_minutes;
mste_read(&val); mste_read(&val);
rtc_minutes= val.min_ones + val.min_tens * 10; rtc_minutes= val.min_ones + val.min_tens * 10;
if ((rtc_minutes < real_minutes if ((rtc_minutes < real_minutes
? real_minutes - rtc_minutes ? real_minutes - rtc_minutes
......
...@@ -44,7 +44,7 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ...@@ -44,7 +44,7 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE; volatile RtcPtr_t rtc = (RtcPtr_t)BVME_RTC_BASE;
unsigned char msr; unsigned char msr;
unsigned long flags; unsigned long flags;
struct rtc_time wtime; struct rtc_time wtime;
switch (cmd) { switch (cmd) {
case RTC_RD_TIME: /* Read the time/date from RTC */ case RTC_RD_TIME: /* Read the time/date from RTC */
...@@ -105,7 +105,7 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd, ...@@ -105,7 +105,7 @@ static int rtc_ioctl(struct inode *inode, struct file *file, unsigned int cmd,
if (yrs >= 2070) if (yrs >= 2070)
return -EINVAL; return -EINVAL;
local_irq_save(flags); local_irq_save(flags);
/* Ensure clock and real-time-mode-register are accessible */ /* Ensure clock and real-time-mode-register are accessible */
msr = rtc->msr & 0xc0; msr = rtc->msr & 0xc0;
......
...@@ -101,7 +101,7 @@ CONFIG_INET=y ...@@ -101,7 +101,7 @@ CONFIG_INET=y
# CONFIG_ATM is not set # CONFIG_ATM is not set
# #
# #
# #
# CONFIG_IPX is not set # CONFIG_IPX is not set
# CONFIG_ATALK is not set # CONFIG_ATALK is not set
......
...@@ -12,7 +12,7 @@ MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, ...@@ -12,7 +12,7 @@ MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A
PARTICULAR PURPOSE and any warranty against infringement with PARTICULAR PURPOSE and any warranty against infringement with
regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF) regard to the SOFTWARE (INCLUDING ANY MODIFIED VERSIONS THEREOF)
and any accompanying written materials. and any accompanying written materials.
To the maximum extent permitted by applicable law, To the maximum extent permitted by applicable law,
IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
...@@ -20,7 +20,7 @@ IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER ...@@ -20,7 +20,7 @@ IN NO EVENT SHALL MOTOROLA BE LIABLE FOR ANY DAMAGES WHATSOEVER
PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR
OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE OTHER PECUNIARY LOSS) ARISING OF THE USE OR INABILITY TO USE THE
SOFTWARE. Motorola assumes no responsibility for the maintenance SOFTWARE. Motorola assumes no responsibility for the maintenance
and support of the SOFTWARE. and support of the SOFTWARE.
You are hereby granted a copyright license to use, modify, and You are hereby granted a copyright license to use, modify, and
distribute the SOFTWARE so long as this entire notice is retained distribute the SOFTWARE so long as this entire notice is retained
......
This diff is collapsed.
...@@ -60,8 +60,8 @@ ...@@ -60,8 +60,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|BINSTR idnt 2,1 | Motorola 040 Floating Point Software Package |BINSTR idnt 2,1 | Motorola 040 Floating Point Software Package
......
...@@ -7,7 +7,7 @@ ...@@ -7,7 +7,7 @@
| |
| Fixes for bugs: 1238 | Fixes for bugs: 1238
| |
| Bug: 1238 | Bug: 1238
| |
| |
| /* The following dirty_bit clear should be left in | /* The following dirty_bit clear should be left in
...@@ -152,8 +152,8 @@ ...@@ -152,8 +152,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|BUGFIX idnt 2,1 | Motorola 040 Floating Point Software Package |BUGFIX idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -167,8 +167,8 @@ ...@@ -167,8 +167,8 @@
.global b1238_fix .global b1238_fix
b1238_fix: b1238_fix:
| |
| This code is entered only on completion of the handling of an | This code is entered only on completion of the handling of an
| nu-generated ovfl, unfl, or inex exception. If the version | nu-generated ovfl, unfl, or inex exception. If the version
| number of the fsave is not $40, this handler is not necessary. | number of the fsave is not $40, this handler is not necessary.
| Simply branch to fix_done and exit normally. | Simply branch to fix_done and exit normally.
| |
...@@ -180,11 +180,11 @@ b1238_fix: ...@@ -180,11 +180,11 @@ b1238_fix:
| |
moveb CU_SAVEPC(%a6),%d0 moveb CU_SAVEPC(%a6),%d0
andib #0xFE,%d0 andib #0xFE,%d0
beq fix_done |if zero, this is not bug #1238 beq fix_done |if zero, this is not bug #1238
| |
| Test the register conflict aspect. If opclass0, check for | Test the register conflict aspect. If opclass0, check for
| cu src equal to xu dest or equal to nu dest. If so, go to | cu src equal to xu dest or equal to nu dest. If so, go to
| op0. Else, or if opclass2, check for cu dest equal to | op0. Else, or if opclass2, check for cu dest equal to
| xu dest or equal to nu dest. If so, go to tst_opcl. Else, | xu dest or equal to nu dest. If so, go to tst_opcl. Else,
| exit, it is not the bug case. | exit, it is not the bug case.
...@@ -196,17 +196,17 @@ b1238_fix: ...@@ -196,17 +196,17 @@ b1238_fix:
bne op2sgl |not opclass 0, check op2 bne op2sgl |not opclass 0, check op2
| |
| Check for cu and nu register conflict. If one exists, this takes | Check for cu and nu register conflict. If one exists, this takes
| priority over a cu and xu conflict. | priority over a cu and xu conflict.
| |
bfextu CMDREG1B(%a6){#3:#3},%d0 |get 1st src bfextu CMDREG1B(%a6){#3:#3},%d0 |get 1st src
bfextu CMDREG3B(%a6){#6:#3},%d1 |get 3rd dest bfextu CMDREG3B(%a6){#6:#3},%d1 |get 3rd dest
cmpb %d0,%d1 cmpb %d0,%d1
beqs op0 |if equal, continue bugfix beqs op0 |if equal, continue bugfix
| |
| Check for cu dest equal to nu dest. If so, go and fix the | Check for cu dest equal to nu dest. If so, go and fix the
| bug condition. Otherwise, exit. | bug condition. Otherwise, exit.
| |
bfextu CMDREG1B(%a6){#6:#3},%d0 |get 1st dest bfextu CMDREG1B(%a6){#6:#3},%d0 |get 1st dest
cmpb %d0,%d1 |cmp 1st dest with 3rd dest cmpb %d0,%d1 |cmp 1st dest with 3rd dest
beqs op0 |if equal, continue bugfix beqs op0 |if equal, continue bugfix
| |
...@@ -215,7 +215,7 @@ b1238_fix: ...@@ -215,7 +215,7 @@ b1238_fix:
bfextu CMDREG2B(%a6){#6:#3},%d1 |get 2nd dest bfextu CMDREG2B(%a6){#6:#3},%d1 |get 2nd dest
cmpb %d0,%d1 |cmp 1st dest with 2nd dest cmpb %d0,%d1 |cmp 1st dest with 2nd dest
beqs op0_xu |if equal, continue bugfix beqs op0_xu |if equal, continue bugfix
bfextu CMDREG1B(%a6){#3:#3},%d0 |get 1st src bfextu CMDREG1B(%a6){#3:#3},%d0 |get 1st src
cmpb %d0,%d1 |cmp 1st src with 2nd dest cmpb %d0,%d1 |cmp 1st src with 2nd dest
beq op0_xu beq op0_xu
bne fix_done |if the reg checks fail, exit bne fix_done |if the reg checks fail, exit
...@@ -245,7 +245,7 @@ setete15: ...@@ -245,7 +245,7 @@ setete15:
| |
| We have the case in which a conflict exists between the cu src or | We have the case in which a conflict exists between the cu src or
| dest and the dest of the xu. We must clear the instruction in | dest and the dest of the xu. We must clear the instruction in
| the cu and restore the state, allowing the instruction in the | the cu and restore the state, allowing the instruction in the
| xu to complete. Remember, the instruction in the nu | xu to complete. Remember, the instruction in the nu
| was exceptional, and was completed by the appropriate handler. | was exceptional, and was completed by the appropriate handler.
...@@ -255,7 +255,7 @@ setete15: ...@@ -255,7 +255,7 @@ setete15:
| exceptional, we choose to kill the process. | exceptional, we choose to kill the process.
| |
| Items saved from the stack: | Items saved from the stack:
| |
| $3c stag - L_SCR1 | $3c stag - L_SCR1
| $40 cmdreg1b - L_SCR2 | $40 cmdreg1b - L_SCR2
| $44 dtag - L_SCR3 | $44 dtag - L_SCR3
...@@ -264,8 +264,8 @@ setete15: ...@@ -264,8 +264,8 @@ setete15:
| fpu. | fpu.
| |
op0_xu: op0_xu:
movel STAG(%a6),L_SCR1(%a6) movel STAG(%a6),L_SCR1(%a6)
movel CMDREG1B(%a6),L_SCR2(%a6) movel CMDREG1B(%a6),L_SCR2(%a6)
movel DTAG(%a6),L_SCR3(%a6) movel DTAG(%a6),L_SCR3(%a6)
andil #0xe0000000,L_SCR3(%a6) andil #0xe0000000,L_SCR3(%a6)
moveb #0,CU_SAVEPC(%a6) moveb #0,CU_SAVEPC(%a6)
...@@ -274,13 +274,13 @@ op0_xu: ...@@ -274,13 +274,13 @@ op0_xu:
fsave -(%a7) fsave -(%a7)
| |
| Check if the instruction which just completed was exceptional. | Check if the instruction which just completed was exceptional.
| |
cmpw #0x4060,(%a7) cmpw #0x4060,(%a7)
beq op0_xb beq op0_xb
| |
| It is necessary to isolate the result of the instruction in the | It is necessary to isolate the result of the instruction in the
| xu if it is to fp0 - fp3 and write that value to the USER_FPn | xu if it is to fp0 - fp3 and write that value to the USER_FPn
| locations on the stack. The correct destination register is in | locations on the stack. The correct destination register is in
| cmdreg2b. | cmdreg2b.
| |
bfextu CMDREG2B(%a6){#6:#3},%d0 |get dest register no bfextu CMDREG2B(%a6){#6:#3},%d0 |get dest register no
...@@ -339,7 +339,7 @@ op0_sete15: ...@@ -339,7 +339,7 @@ op0_sete15:
| |
| The frame returned is busy. It is not possible to reconstruct | The frame returned is busy. It is not possible to reconstruct
| the code sequence to allow completion. We will jump to | the code sequence to allow completion. We will jump to
| fpsp_fmt_error and allow the kernel to kill the process. | fpsp_fmt_error and allow the kernel to kill the process.
| |
op0_xb: op0_xb:
...@@ -354,20 +354,20 @@ op2sgl: ...@@ -354,20 +354,20 @@ op2sgl:
cmpiw #0x4400,%d0 |test for opclass 2 and size=sgl cmpiw #0x4400,%d0 |test for opclass 2 and size=sgl
bne fix_done |if not, it is not bug 1238 bne fix_done |if not, it is not bug 1238
| |
| Check for cu dest equal to nu dest or equal to xu dest, with | Check for cu dest equal to nu dest or equal to xu dest, with
| a cu and nu conflict taking priority an nu conflict. If either, | a cu and nu conflict taking priority an nu conflict. If either,
| go and fix the bug condition. Otherwise, exit. | go and fix the bug condition. Otherwise, exit.
| |
bfextu CMDREG1B(%a6){#6:#3},%d0 |get 1st dest bfextu CMDREG1B(%a6){#6:#3},%d0 |get 1st dest
bfextu CMDREG3B(%a6){#6:#3},%d1 |get 3rd dest bfextu CMDREG3B(%a6){#6:#3},%d1 |get 3rd dest
cmpb %d0,%d1 |cmp 1st dest with 3rd dest cmpb %d0,%d1 |cmp 1st dest with 3rd dest
beq op2_com |if equal, continue bugfix beq op2_com |if equal, continue bugfix
bfextu CMDREG2B(%a6){#6:#3},%d1 |get 2nd dest bfextu CMDREG2B(%a6){#6:#3},%d1 |get 2nd dest
cmpb %d0,%d1 |cmp 1st dest with 2nd dest cmpb %d0,%d1 |cmp 1st dest with 2nd dest
bne fix_done |if the reg checks fail, exit bne fix_done |if the reg checks fail, exit
| |
| We have the case in which a conflict exists between the cu src or | We have the case in which a conflict exists between the cu src or
| dest and the dest of the xu. We must clear the instruction in | dest and the dest of the xu. We must clear the instruction in
| the cu and restore the state, allowing the instruction in the | the cu and restore the state, allowing the instruction in the
| xu to complete. Remember, the instruction in the nu | xu to complete. Remember, the instruction in the nu
| was exceptional, and was completed by the appropriate handler. | was exceptional, and was completed by the appropriate handler.
...@@ -377,7 +377,7 @@ op2sgl: ...@@ -377,7 +377,7 @@ op2sgl:
| exceptional, we choose to kill the process. | exceptional, we choose to kill the process.
| |
| Items saved from the stack: | Items saved from the stack:
| |
| $3c stag - L_SCR1 | $3c stag - L_SCR1
| $40 cmdreg1b - L_SCR2 | $40 cmdreg1b - L_SCR2
| $44 dtag - L_SCR3 | $44 dtag - L_SCR3
...@@ -387,9 +387,9 @@ op2sgl: ...@@ -387,9 +387,9 @@ op2sgl:
| fpu. | fpu.
| |
op2_xu: op2_xu:
movel STAG(%a6),L_SCR1(%a6) movel STAG(%a6),L_SCR1(%a6)
movel CMDREG1B(%a6),L_SCR2(%a6) movel CMDREG1B(%a6),L_SCR2(%a6)
movel DTAG(%a6),L_SCR3(%a6) movel DTAG(%a6),L_SCR3(%a6)
andil #0xe0000000,L_SCR3(%a6) andil #0xe0000000,L_SCR3(%a6)
moveb #0,CU_SAVEPC(%a6) moveb #0,CU_SAVEPC(%a6)
movel ETEMP(%a6),FP_SCR2(%a6) movel ETEMP(%a6),FP_SCR2(%a6)
...@@ -400,13 +400,13 @@ op2_xu: ...@@ -400,13 +400,13 @@ op2_xu:
fsave -(%a7) fsave -(%a7)
| |
| Check if the instruction which just completed was exceptional. | Check if the instruction which just completed was exceptional.
| |
cmpw #0x4060,(%a7) cmpw #0x4060,(%a7)
beq op2_xb beq op2_xb
| |
| It is necessary to isolate the result of the instruction in the | It is necessary to isolate the result of the instruction in the
| xu if it is to fp0 - fp3 and write that value to the USER_FPn | xu if it is to fp0 - fp3 and write that value to the USER_FPn
| locations on the stack. The correct destination register is in | locations on the stack. The correct destination register is in
| cmdreg2b. | cmdreg2b.
| |
bfextu CMDREG2B(%a6){#6:#3},%d0 |get dest register no bfextu CMDREG2B(%a6){#6:#3},%d0 |get dest register no
...@@ -459,12 +459,12 @@ op2_com: ...@@ -459,12 +459,12 @@ op2_com:
bnes case2 bnes case2
movew #0x43FF,ETEMP_EX(%a6) |to double +max movew #0x43FF,ETEMP_EX(%a6) |to double +max
bra finish bra finish
case2: case2:
cmpw #0xC07F,ETEMP_EX(%a6) |single -max cmpw #0xC07F,ETEMP_EX(%a6) |single -max
bnes case3 bnes case3
movew #0xC3FF,ETEMP_EX(%a6) |to double -max movew #0xC3FF,ETEMP_EX(%a6) |to double -max
bra finish bra finish
case3: case3:
cmpw #0x3F80,ETEMP_EX(%a6) |single +min cmpw #0x3F80,ETEMP_EX(%a6) |single +min
bnes case4 bnes case4
movew #0x3C00,ETEMP_EX(%a6) |to double +min movew #0x3C00,ETEMP_EX(%a6) |to double +min
...@@ -480,7 +480,7 @@ case4: ...@@ -480,7 +480,7 @@ case4:
| an fline illegal instruction to be executed. | an fline illegal instruction to be executed.
| |
| You should replace the jump to fpsp_fmt_error with a jump | You should replace the jump to fpsp_fmt_error with a jump
| to the entry point used to kill a process. | to the entry point used to kill a process.
| |
op2_xb: op2_xb:
jmp fpsp_fmt_error jmp fpsp_fmt_error
......
...@@ -60,17 +60,17 @@ ...@@ -60,17 +60,17 @@
| it is negative. | it is negative.
| |
| Clean up and return. Check if the final mul or div resulted | Clean up and return. Check if the final mul or div resulted
| in an inex2 exception. If so, set inex1 in the fpsr and | in an inex2 exception. If so, set inex1 in the fpsr and
| check if the inex1 exception is enabled. If so, set d7 upper | check if the inex1 exception is enabled. If so, set d7 upper
| word to $0100. This will signal unimp.sa that an enabled inex1 | word to $0100. This will signal unimp.sa that an enabled inex1
| exception occurred. Unimp will fix the stack. | exception occurred. Unimp will fix the stack.
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|DECBIN idnt 2,1 | Motorola 040 Floating Point Software Package |DECBIN idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -107,12 +107,12 @@ RTABLE: .byte 0,0,0,0 ...@@ -107,12 +107,12 @@ RTABLE: .byte 0,0,0,0
.set FSTRT,0 .set FSTRT,0
| |
.set ESTRT,4 .set ESTRT,4
.set EDIGITS,2 | .set EDIGITS,2 |
| |
| Constants in single precision | Constants in single precision
FZERO: .long 0x00000000 FZERO: .long 0x00000000
FONE: .long 0x3F800000 FONE: .long 0x3F800000
FTEN: .long 0x41200000 FTEN: .long 0x41200000
.set TEN,10 .set TEN,10
...@@ -224,7 +224,7 @@ nextlw: ...@@ -224,7 +224,7 @@ nextlw:
addql #1,%d1 |inc lw pointer in mantissa addql #1,%d1 |inc lw pointer in mantissa
cmpl #2,%d1 |test for last lw cmpl #2,%d1 |test for last lw
ble loadlw |if not, get last one ble loadlw |if not, get last one
| |
| Check the sign of the mant and make the value in fp0 the same sign. | Check the sign of the mant and make the value in fp0 the same sign.
| |
...@@ -232,7 +232,7 @@ m_sign: ...@@ -232,7 +232,7 @@ m_sign:
btst #31,(%a0) |test sign of the mantissa btst #31,(%a0) |test sign of the mantissa
beq ap_st_z |if clear, go to append/strip zeros beq ap_st_z |if clear, go to append/strip zeros
fnegx %fp0 |if set, negate fp0 fnegx %fp0 |if set, negate fp0
| |
| Append/strip zeros: | Append/strip zeros:
| |
...@@ -407,7 +407,7 @@ ap_n_en: ...@@ -407,7 +407,7 @@ ap_n_en:
| |
| Pwrten calculates the exponent factor in the selected rounding mode | Pwrten calculates the exponent factor in the selected rounding mode
| according to the following table: | according to the following table:
| |
| Sign of Mant Sign of Exp Rounding Mode PWRTEN Rounding Mode | Sign of Mant Sign of Exp Rounding Mode PWRTEN Rounding Mode
| |
| ANY ANY RN RN | ANY ANY RN RN
...@@ -495,7 +495,7 @@ mul: ...@@ -495,7 +495,7 @@ mul:
| it will be inex2, but will be reported as inex1 by get_op. | it will be inex2, but will be reported as inex1 by get_op.
| |
end_dec: end_dec:
fmovel %FPSR,%d0 |get status register fmovel %FPSR,%d0 |get status register
bclrl #inex2_bit+8,%d0 |test for inex2 and clear it bclrl #inex2_bit+8,%d0 |test for inex2 and clear it
fmovel %d0,%FPSR |return status reg w/o inex2 fmovel %d0,%FPSR |return status reg w/o inex2
beqs no_exc |skip this if no exc beqs no_exc |skip this if no exc
......
...@@ -4,11 +4,11 @@ ...@@ -4,11 +4,11 @@
| Do_func performs the unimplemented operation. The operation | Do_func performs the unimplemented operation. The operation
| to be performed is determined from the lower 7 bits of the | to be performed is determined from the lower 7 bits of the
| extension word (except in the case of fmovecr and fsincos). | extension word (except in the case of fmovecr and fsincos).
| The opcode and tag bits form an index into a jump table in | The opcode and tag bits form an index into a jump table in
| tbldo.sa. Cases of zero, infinity and NaN are handled in | tbldo.sa. Cases of zero, infinity and NaN are handled in
| do_func by forcing the default result. Normalized and | do_func by forcing the default result. Normalized and
| denormalized (there are no unnormalized numbers at this | denormalized (there are no unnormalized numbers at this
| point) are passed onto the emulation code. | point) are passed onto the emulation code.
| |
| CMDREG1B and STAG are extracted from the fsave frame | CMDREG1B and STAG are extracted from the fsave frame
| and combined to form the table index. The function called | and combined to form the table index. The function called
...@@ -22,8 +22,8 @@ ...@@ -22,8 +22,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
DO_FUNC: |idnt 2,1 | Motorola 040 Floating Point Software Package DO_FUNC: |idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -35,7 +35,7 @@ DO_FUNC: |idnt 2,1 | Motorola 040 Floating Point Software Package ...@@ -35,7 +35,7 @@ DO_FUNC: |idnt 2,1 | Motorola 040 Floating Point Software Package
|xref t_dz2 |xref t_dz2
|xref t_operr |xref t_operr
|xref t_inx2 |xref t_inx2
|xref t_resdnrm |xref t_resdnrm
|xref dst_nan |xref dst_nan
|xref src_nan |xref src_nan
|xref nrm_set |xref nrm_set
...@@ -68,7 +68,7 @@ do_func: ...@@ -68,7 +68,7 @@ do_func:
| directly. | directly.
| |
bfextu CMDREG1B(%a6){#0:#6},%d0 |get opclass and src fields bfextu CMDREG1B(%a6){#0:#6},%d0 |get opclass and src fields
cmpil #0x17,%d0 |if op class and size fields are $17, cmpil #0x17,%d0 |if op class and size fields are $17,
| ;it is FMOVECR; if not, continue | ;it is FMOVECR; if not, continue
bnes not_fmovecr bnes not_fmovecr
jmp smovcr |fmovecr; jmp directly to emulation jmp smovcr |fmovecr; jmp directly to emulation
...@@ -76,7 +76,7 @@ do_func: ...@@ -76,7 +76,7 @@ do_func:
not_fmovecr: not_fmovecr:
movew CMDREG1B(%a6),%d0 movew CMDREG1B(%a6),%d0
andl #0x7F,%d0 andl #0x7F,%d0
cmpil #0x38,%d0 |if the extension is >= $38, cmpil #0x38,%d0 |if the extension is >= $38,
bge serror |it is illegal bge serror |it is illegal
bfextu STAG(%a6){#0:#3},%d1 bfextu STAG(%a6){#0:#3},%d1
lsll #3,%d0 |make room for STAG lsll #3,%d0 |make room for STAG
...@@ -111,7 +111,7 @@ ld_mzinx: ...@@ -111,7 +111,7 @@ ld_mzinx:
bsr ld_mzero |if neg, load neg zero, return here bsr ld_mzero |if neg, load neg zero, return here
bra t_inx2 |now, set the inx for the next inst bra t_inx2 |now, set the inx for the next inst
| |
| Load a signed zero to fp0; do not set inex2/ainex | Load a signed zero to fp0; do not set inex2/ainex
| |
.global szero .global szero
szero: szero:
...@@ -119,7 +119,7 @@ szero: ...@@ -119,7 +119,7 @@ szero:
bne ld_mzero |if neg, load neg zero bne ld_mzero |if neg, load neg zero
bra ld_pzero |load positive zero bra ld_pzero |load positive zero
| |
| Load a signed infinity to fp0; do not set inex2/ainex | Load a signed infinity to fp0; do not set inex2/ainex
| |
.global sinf .global sinf
sinf: sinf:
...@@ -127,7 +127,7 @@ sinf: ...@@ -127,7 +127,7 @@ sinf:
bne ld_minf |if negative branch bne ld_minf |if negative branch
bra ld_pinf bra ld_pinf
| |
| Load a signed one to fp0; do not set inex2/ainex | Load a signed one to fp0; do not set inex2/ainex
| |
.global sone .global sone
sone: sone:
...@@ -135,7 +135,7 @@ sone: ...@@ -135,7 +135,7 @@ sone:
bne ld_mone bne ld_mone
bra ld_pone bra ld_pone
| |
| Load a signed pi/2 to fp0; do not set inex2/ainex | Load a signed pi/2 to fp0; do not set inex2/ainex
| |
.global spi_2 .global spi_2
spi_2: spi_2:
...@@ -160,13 +160,13 @@ sopr_inf: ...@@ -160,13 +160,13 @@ sopr_inf:
bne t_operr bne t_operr
bra ld_pinf bra ld_pinf
| |
| FLOGNP1 | FLOGNP1
| |
.global sslognp1 .global sslognp1
sslognp1: sslognp1:
fmovemx (%a0),%fp0-%fp0 fmovemx (%a0),%fp0-%fp0
fcmpb #-1,%fp0 fcmpb #-1,%fp0
fbgt slognp1 fbgt slognp1
fbeq t_dz2 |if = -1, divide by zero exception fbeq t_dz2 |if = -1, divide by zero exception
fmovel #0,%FPSR |clr N flag fmovel #0,%FPSR |clr N flag
bra t_operr |take care of operands < -1 bra t_operr |take care of operands < -1
...@@ -186,7 +186,7 @@ setoxm1i: ...@@ -186,7 +186,7 @@ setoxm1i:
| |
.global sslogn .global sslogn
sslogn: sslogn:
btstb #sign_bit,LOCAL_EX(%a0) btstb #sign_bit,LOCAL_EX(%a0)
bne t_operr |take care of operands < 0 bne t_operr |take care of operands < 0
cmpiw #0x3fff,LOCAL_EX(%a0) |test for 1.0 input cmpiw #0x3fff,LOCAL_EX(%a0) |test for 1.0 input
bne slogn bne slogn
...@@ -199,7 +199,7 @@ sslogn: ...@@ -199,7 +199,7 @@ sslogn:
.global sslognd .global sslognd
sslognd: sslognd:
btstb #sign_bit,LOCAL_EX(%a0) btstb #sign_bit,LOCAL_EX(%a0)
beq slognd beq slognd
bra t_operr |take care of operands < 0 bra t_operr |take care of operands < 0
...@@ -221,7 +221,7 @@ sslog10: ...@@ -221,7 +221,7 @@ sslog10:
.global sslog10d .global sslog10d
sslog10d: sslog10d:
btstb #sign_bit,LOCAL_EX(%a0) btstb #sign_bit,LOCAL_EX(%a0)
beq slog10d beq slog10d
bra t_operr |take care of operands < 0 bra t_operr |take care of operands < 0
...@@ -243,7 +243,7 @@ sslog2: ...@@ -243,7 +243,7 @@ sslog2:
.global sslog2d .global sslog2d
sslog2d: sslog2d:
btstb #sign_bit,LOCAL_EX(%a0) btstb #sign_bit,LOCAL_EX(%a0)
beq slog2d beq slog2d
bra t_operr |take care of operands < 0 bra t_operr |take care of operands < 0
...@@ -310,7 +310,7 @@ smod_zsn: ...@@ -310,7 +310,7 @@ smod_zsn:
btstl #7,%d0 |test if + or - btstl #7,%d0 |test if + or -
beq ld_pzero |if pos then load +0 beq ld_pzero |if pos then load +0
bra ld_mzero |else neg load -0 bra ld_mzero |else neg load -0
smod_fpn: smod_fpn:
moveb ETEMP(%a6),%d1 |get sign of src op moveb ETEMP(%a6),%d1 |get sign of src op
moveb FPTEMP(%a6),%d0 |get sign of dst op moveb FPTEMP(%a6),%d0 |get sign of dst op
...@@ -327,7 +327,7 @@ smod_nrm: ...@@ -327,7 +327,7 @@ smod_nrm:
fmovel USER_FPCR(%a6),%fpcr |use user's rmode and precision fmovel USER_FPCR(%a6),%fpcr |use user's rmode and precision
fmovex FPTEMP(%a6),%fp0 |return dest to fp0 fmovex FPTEMP(%a6),%fp0 |return dest to fp0
rts rts
| |
| FREM | FREM
| |
...@@ -372,7 +372,7 @@ prem: ...@@ -372,7 +372,7 @@ prem:
lea premt,%a1 lea premt,%a1
movel (%a1,%d1.w*4),%a1 movel (%a1,%d1.w*4),%a1
jmp (%a1) jmp (%a1)
srem_snan: srem_snan:
bra src_nan bra src_nan
srem_dnan: srem_dnan:
...@@ -390,7 +390,7 @@ srem_zsn: ...@@ -390,7 +390,7 @@ srem_zsn:
btstl #7,%d0 |test if + or - btstl #7,%d0 |test if + or -
beq ld_pzero |if pos then load +0 beq ld_pzero |if pos then load +0
bra ld_mzero |else neg load -0 bra ld_mzero |else neg load -0
srem_fpn: srem_fpn:
moveb ETEMP(%a6),%d1 |get sign of src op moveb ETEMP(%a6),%d1 |get sign of src op
moveb FPTEMP(%a6),%d0 |get sign of dst op moveb FPTEMP(%a6),%d0 |get sign of dst op
...@@ -424,10 +424,10 @@ pscalet: ...@@ -424,10 +424,10 @@ pscalet:
.long scl_inf | 10,00 inf,norm = +-inf .long scl_inf | 10,00 inf,norm = +-inf
.long scl_inf | 10,01 inf,zero = +-inf .long scl_inf | 10,01 inf,zero = +-inf
.long scl_opr | 10,10 inf,inf = nan with operr .long scl_opr | 10,10 inf,inf = nan with operr
.long scl_snan | 10,11 inf,nan = nan .long scl_snan | 10,11 inf,nan = nan
.long scl_dnan | 11,00 nan,norm = nan .long scl_dnan | 11,00 nan,norm = nan
.long scl_dnan | 11,01 nan,zero = nan .long scl_dnan | 11,01 nan,zero = nan
.long scl_dnan | 11,10 nan,inf = nan .long scl_dnan | 11,10 nan,inf = nan
.long scl_dnan | 11,11 nan,nan = nan .long scl_dnan | 11,11 nan,nan = nan
.global pscale .global pscale
...@@ -478,7 +478,7 @@ ssincosz: ...@@ -478,7 +478,7 @@ ssincosz:
sincosp: sincosp:
fmovex PZERO,%fp0 fmovex PZERO,%fp0
sincoscom: sincoscom:
fmovemx PONE,%fp1-%fp1 |do not allow FPSR to be affected fmovemx PONE,%fp1-%fp1 |do not allow FPSR to be affected
bra sto_cos |store cosine result bra sto_cos |store cosine result
.global ssincosi .global ssincosi
...@@ -498,7 +498,7 @@ ssincosnan: ...@@ -498,7 +498,7 @@ ssincosnan:
bsr sto_cos bsr sto_cos
bra src_nan bra src_nan
| |
| This code forces default values for the zero, inf, and nan cases | This code forces default values for the zero, inf, and nan cases
| in the transcendentals code. The CC bits must be set in the | in the transcendentals code. The CC bits must be set in the
| stacked FPSR to be correctly reported. | stacked FPSR to be correctly reported.
| |
......
...@@ -5,15 +5,15 @@ ...@@ -5,15 +5,15 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
| fpsp.h --- stack frame offsets during FPSP exception handling | fpsp.h --- stack frame offsets during FPSP exception handling
| |
| These equates are used to access the exception frame, the fsave | These equates are used to access the exception frame, the fsave
| frame and any local variables needed by the FPSP package. | frame and any local variables needed by the FPSP package.
| |
| All FPSP handlers begin by executing: | All FPSP handlers begin by executing:
| |
| link a6,#-LOCAL_SIZE | link a6,#-LOCAL_SIZE
...@@ -90,13 +90,13 @@ ...@@ -90,13 +90,13 @@
.set USER_FP2,LV+40 | saved user FP2 .set USER_FP2,LV+40 | saved user FP2
.set USER_FP3,LV+52 | saved user FP3 .set USER_FP3,LV+52 | saved user FP3
.set USER_FPCR,LV+64 | saved user FPCR .set USER_FPCR,LV+64 | saved user FPCR
.set FPCR_ENABLE,USER_FPCR+2 | FPCR exception enable .set FPCR_ENABLE,USER_FPCR+2 | FPCR exception enable
.set FPCR_MODE,USER_FPCR+3 | FPCR rounding mode control .set FPCR_MODE,USER_FPCR+3 | FPCR rounding mode control
.set USER_FPSR,LV+68 | saved user FPSR .set USER_FPSR,LV+68 | saved user FPSR
.set FPSR_CC,USER_FPSR+0 | FPSR condition code .set FPSR_CC,USER_FPSR+0 | FPSR condition code
.set FPSR_QBYTE,USER_FPSR+1 | FPSR quotient .set FPSR_QBYTE,USER_FPSR+1 | FPSR quotient
.set FPSR_EXCEPT,USER_FPSR+2 | FPSR exception .set FPSR_EXCEPT,USER_FPSR+2 | FPSR exception
.set FPSR_AEXCEPT,USER_FPSR+3 | FPSR accrued exception .set FPSR_AEXCEPT,USER_FPSR+3 | FPSR accrued exception
.set USER_FPIAR,LV+72 | saved user FPIAR .set USER_FPIAR,LV+72 | saved user FPIAR
.set FP_SCR1,LV+76 | room for a temporary float value .set FP_SCR1,LV+76 | room for a temporary float value
.set FP_SCR2,LV+92 | room for a temporary float value .set FP_SCR2,LV+92 | room for a temporary float value
...@@ -143,8 +143,8 @@ ...@@ -143,8 +143,8 @@
.set CMDREG3B,LV-48 | cmd reg for E3 exceptions (2 bytes) .set CMDREG3B,LV-48 | cmd reg for E3 exceptions (2 bytes)
| |
.set NMNEXC,LV-44 | NMNEXC (unsup,snan bits only) .set NMNEXC,LV-44 | NMNEXC (unsup,snan bits only)
.set nmn_unsup_bit,1 | .set nmn_unsup_bit,1 |
.set nmn_snan_bit,0 | .set nmn_snan_bit,0 |
| |
.set NMCEXC,LV-43 | NMNEXC & NMCEXC .set NMCEXC,LV-43 | NMNEXC & NMCEXC
.set nmn_operr_bit,7 .set nmn_operr_bit,7
...@@ -249,7 +249,7 @@ ...@@ -249,7 +249,7 @@
.set inf_mask,0x02000000 .set inf_mask,0x02000000
.set nan_mask,0x01000000 .set nan_mask,0x01000000
| |
.set bsun_mask,0x00008000 | .set bsun_mask,0x00008000 |
.set snan_mask,0x00004000 .set snan_mask,0x00004000
.set operr_mask,0x00002000 .set operr_mask,0x00002000
.set ovfl_mask,0x00001000 .set ovfl_mask,0x00001000
...@@ -268,7 +268,7 @@ ...@@ -268,7 +268,7 @@
| |
.set dzinf_mask,inf_mask+dz_mask+adz_mask .set dzinf_mask,inf_mask+dz_mask+adz_mask
.set opnan_mask,nan_mask+operr_mask+aiop_mask .set opnan_mask,nan_mask+operr_mask+aiop_mask
.set nzi_mask,0x01ffffff | clears N, Z, and I .set nzi_mask,0x01ffffff | clears N, Z, and I
.set unfinx_mask,unfl_mask+inex2_mask+aunfl_mask+ainex_mask .set unfinx_mask,unfl_mask+inex2_mask+aunfl_mask+ainex_mask
.set unf2inx_mask,unfl_mask+inex2_mask+ainex_mask .set unf2inx_mask,unfl_mask+inex2_mask+ainex_mask
.set ovfinx_mask,ovfl_mask+inex2_mask+aovfl_mask+ainex_mask .set ovfinx_mask,ovfl_mask+inex2_mask+aovfl_mask+ainex_mask
......
...@@ -2,10 +2,10 @@ ...@@ -2,10 +2,10 @@
| gen_except.sa 3.7 1/16/92 | gen_except.sa 3.7 1/16/92
| |
| gen_except --- FPSP routine to detect reportable exceptions | gen_except --- FPSP routine to detect reportable exceptions
| |
| This routine compares the exception enable byte of the | This routine compares the exception enable byte of the
| user_fpcr on the stack with the exception status byte | user_fpcr on the stack with the exception status byte
| of the user_fpsr. | of the user_fpsr.
| |
| Any routine which may report an exceptions must load | Any routine which may report an exceptions must load
| the stack frame in memory with the exceptional operand(s). | the stack frame in memory with the exceptional operand(s).
...@@ -23,14 +23,14 @@ ...@@ -23,14 +23,14 @@
| |
| Note: The IEEE standard specifies that inex2 is to be | Note: The IEEE standard specifies that inex2 is to be
| reported if ovfl occurs and the ovfl enable bit is not | reported if ovfl occurs and the ovfl enable bit is not
| set but the inex2 enable bit is. | set but the inex2 enable bit is.
| |
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
GEN_EXCEPT: |idnt 2,1 | Motorola 040 Floating Point Software Package GEN_EXCEPT: |idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -70,12 +70,12 @@ gen_except: ...@@ -70,12 +70,12 @@ gen_except:
| |
movel ETEMP_EX(%a6),ETEMP_EX(%a1) |copy etemp from unimp movel ETEMP_EX(%a6),ETEMP_EX(%a1) |copy etemp from unimp
movel ETEMP_HI(%a6),ETEMP_HI(%a1) |frame to busy frame movel ETEMP_HI(%a6),ETEMP_HI(%a1) |frame to busy frame
movel ETEMP_LO(%a6),ETEMP_LO(%a1) movel ETEMP_LO(%a6),ETEMP_LO(%a1)
movel CMDREG1B(%a6),CMDREG1B(%a1) |set inst in frame to unimp movel CMDREG1B(%a6),CMDREG1B(%a1) |set inst in frame to unimp
movel CMDREG1B(%a6),%d0 |fix cmd1b to make it movel CMDREG1B(%a6),%d0 |fix cmd1b to make it
andl #0x03c30000,%d0 |work for cmd3b andl #0x03c30000,%d0 |work for cmd3b
bfextu CMDREG1B(%a6){#13:#1},%d1 |extract bit 2 bfextu CMDREG1B(%a6){#13:#1},%d1 |extract bit 2
lsll #5,%d1 lsll #5,%d1
swap %d1 swap %d1
orl %d1,%d0 |put it in the right place orl %d1,%d0 |put it in the right place
bfextu CMDREG1B(%a6){#10:#3},%d1 |extract bit 3,4,5 bfextu CMDREG1B(%a6){#10:#3},%d1 |extract bit 3,4,5
...@@ -86,7 +86,7 @@ gen_except: ...@@ -86,7 +86,7 @@ gen_except:
| |
| Or in the FPSR from the emulation with the USER_FPSR on the stack. | Or in the FPSR from the emulation with the USER_FPSR on the stack.
| |
fmovel %FPSR,%d0 fmovel %FPSR,%d0
orl %d0,USER_FPSR(%a6) orl %d0,USER_FPSR(%a6)
movel USER_FPSR(%a6),FPSR_SHADOW(%a1) |set exc bits movel USER_FPSR(%a6),FPSR_SHADOW(%a1) |set exc bits
orl #sx_mask,E_BYTE(%a1) orl #sx_mask,E_BYTE(%a1)
...@@ -108,7 +108,7 @@ test_rev: ...@@ -108,7 +108,7 @@ test_rev:
cmpib #UNIMP_41_SIZE-4,1(%a7) |test for rev unimp frame cmpib #UNIMP_41_SIZE-4,1(%a7) |test for rev unimp frame
bnel fpsp_fmt_error |if not $28 or $30 bnel fpsp_fmt_error |if not $28 or $30
leal UNIMP_41_SIZE+LOCAL_SIZE(%a7),%a1 leal UNIMP_41_SIZE+LOCAL_SIZE(%a7),%a1
unimp_con: unimp_con:
| |
| Fix up the new unimp frame with entries from the old unimp frame | Fix up the new unimp frame with entries from the old unimp frame
...@@ -117,23 +117,23 @@ unimp_con: ...@@ -117,23 +117,23 @@ unimp_con:
| |
| Or in the FPSR from the emulation with the USER_FPSR on the stack. | Or in the FPSR from the emulation with the USER_FPSR on the stack.
| |
fmovel %FPSR,%d0 fmovel %FPSR,%d0
orl %d0,USER_FPSR(%a6) orl %d0,USER_FPSR(%a6)
bra do_clean bra do_clean
| |
| Frame is idle, so check for exceptions reported through | Frame is idle, so check for exceptions reported through
| USER_FPSR and set the unimp frame accordingly. | USER_FPSR and set the unimp frame accordingly.
| A7 must be incremented to the point before the | A7 must be incremented to the point before the
| idle fsave vector to the unimp vector. | idle fsave vector to the unimp vector.
| |
do_check: do_check:
addl #4,%a7 |point A7 back to unimp frame addl #4,%a7 |point A7 back to unimp frame
| |
| Or in the FPSR from the emulation with the USER_FPSR on the stack. | Or in the FPSR from the emulation with the USER_FPSR on the stack.
| |
fmovel %FPSR,%d0 fmovel %FPSR,%d0
orl %d0,USER_FPSR(%a6) orl %d0,USER_FPSR(%a6)
| |
| On a busy frame, we must clear the nmnexc bits. | On a busy frame, we must clear the nmnexc bits.
...@@ -165,10 +165,10 @@ frame_com: ...@@ -165,10 +165,10 @@ frame_com:
bsun_exc: bsun_exc:
bra do_clean bra do_clean
| |
| The typical work to be done to the unimp frame to report an | The typical work to be done to the unimp frame to report an
| exception is to set the E1/E3 byte and clr the U flag. | exception is to set the E1/E3 byte and clr the U flag.
| commonE1 does this for E1 exceptions, which are snan, | commonE1 does this for E1 exceptions, which are snan,
| operr, and dz. commonE3 does this for E3 exceptions, which | operr, and dz. commonE3 does this for E3 exceptions, which
| are inex2 and inex1, and also clears the E1 exception bit | are inex2 and inex1, and also clears the E1 exception bit
| left over from the unimp exception. | left over from the unimp exception.
| |
...@@ -186,7 +186,7 @@ uniE3: ...@@ -186,7 +186,7 @@ uniE3:
unsE3: unsE3:
tstb RES_FLG(%a6) tstb RES_FLG(%a6)
bnes unsE3_0 bnes unsE3_0
unsE3_1: unsE3_1:
bsetb #E3,E_BYTE(%a6) |set E3 flag bsetb #E3,E_BYTE(%a6) |set E3 flag
unsE3_0: unsE3_0:
...@@ -194,7 +194,7 @@ unsE3_0: ...@@ -194,7 +194,7 @@ unsE3_0:
movel CMDREG1B(%a6),%d0 movel CMDREG1B(%a6),%d0
andl #0x03c30000,%d0 |work for cmd3b andl #0x03c30000,%d0 |work for cmd3b
bfextu CMDREG1B(%a6){#13:#1},%d1 |extract bit 2 bfextu CMDREG1B(%a6){#13:#1},%d1 |extract bit 2
lsll #5,%d1 lsll #5,%d1
swap %d1 swap %d1
orl %d1,%d0 |put it in the right place orl %d1,%d0 |put it in the right place
bfextu CMDREG1B(%a6){#10:#3},%d1 |extract bit 3,4,5 bfextu CMDREG1B(%a6){#10:#3},%d1 |extract bit 3,4,5
...@@ -218,8 +218,8 @@ no_match: ...@@ -218,8 +218,8 @@ no_match:
beqs no_exc |if clear, exit beqs no_exc |if clear, exit
bras ovfl_unfl |go to unfl_ovfl to determine if bras ovfl_unfl |go to unfl_ovfl to determine if
| ;it is an unsupp or unimp exc | ;it is an unsupp or unimp exc
| No exceptions are to be reported. If the instruction was | No exceptions are to be reported. If the instruction was
| unimplemented, no FPU restore is necessary. If it was | unimplemented, no FPU restore is necessary. If it was
| unsupported, we must perform the restore. | unsupported, we must perform the restore.
no_exc: no_exc:
...@@ -227,7 +227,7 @@ no_exc: ...@@ -227,7 +227,7 @@ no_exc:
beqs uni_no_exc beqs uni_no_exc
uns_no_exc: uns_no_exc:
tstb RES_FLG(%a6) |check if frestore is needed tstb RES_FLG(%a6) |check if frestore is needed
bne do_clean |if clear, no frestore needed bne do_clean |if clear, no frestore needed
uni_no_exc: uni_no_exc:
moveml USER_DA(%a6),%d0-%d1/%a0-%a1 moveml USER_DA(%a6),%d0-%d1/%a0-%a1
fmovemx USER_FP0(%a6),%fp0-%fp3 fmovemx USER_FP0(%a6),%fp0-%fp3
...@@ -243,13 +243,13 @@ uni_no_exc: ...@@ -243,13 +243,13 @@ uni_no_exc:
| |
| Unimplemented Instruction Handler: | Unimplemented Instruction Handler:
| Ovfl: | Ovfl:
| Only scosh, setox, ssinh, stwotox, and scale can set overflow in | Only scosh, setox, ssinh, stwotox, and scale can set overflow in
| this manner. | this manner.
| Unfl: | Unfl:
| Stwotox, setox, and scale can set underflow in this manner. | Stwotox, setox, and scale can set underflow in this manner.
| Any of the other Library Routines such that f(x)=x in which | Any of the other Library Routines such that f(x)=x in which
| x is an extended denorm can report an underflow exception. | x is an extended denorm can report an underflow exception.
| It is the responsibility of the exception-causing exception | It is the responsibility of the exception-causing exception
| to make sure that WBTEMP is correct. | to make sure that WBTEMP is correct.
| |
| The exceptional operand is in FP_SCR1. | The exceptional operand is in FP_SCR1.
...@@ -306,7 +306,7 @@ busy_fr: ...@@ -306,7 +306,7 @@ busy_fr:
movel CMDREG1B(%a6),%d0 |fix cmd1b to make it movel CMDREG1B(%a6),%d0 |fix cmd1b to make it
andl #0x03c30000,%d0 |work for cmd3b andl #0x03c30000,%d0 |work for cmd3b
bfextu CMDREG1B(%a6){#13:#1},%d1 |extract bit 2 bfextu CMDREG1B(%a6){#13:#1},%d1 |extract bit 2
lsll #5,%d1 lsll #5,%d1
swap %d1 swap %d1
orl %d1,%d0 |put it in the right place orl %d1,%d0 |put it in the right place
bfextu CMDREG1B(%a6){#10:#3},%d1 |extract bit 3,4,5 bfextu CMDREG1B(%a6){#10:#3},%d1 |extract bit 3,4,5
...@@ -318,10 +318,10 @@ busy_fr: ...@@ -318,10 +318,10 @@ busy_fr:
| |
| Check if the frame to be restored is busy or unimp. | Check if the frame to be restored is busy or unimp.
|** NOTE *** Bug fix for errata (0d43b #3) |** NOTE *** Bug fix for errata (0d43b #3)
| If the frame is unimp, we must create a busy frame to | If the frame is unimp, we must create a busy frame to
| fix the bug with the nmnexc bits in cases in which they | fix the bug with the nmnexc bits in cases in which they
| are set by a previous instruction and not cleared by | are set by a previous instruction and not cleared by
| the save. The frame will be unimp only if the final | the save. The frame will be unimp only if the final
| instruction in an emulation routine caused the exception | instruction in an emulation routine caused the exception
| by doing an fmove <ea>,fp0. The exception operand, in | by doing an fmove <ea>,fp0. The exception operand, in
| internal format, is in fptemp. | internal format, is in fptemp.
...@@ -353,7 +353,7 @@ loop2: ...@@ -353,7 +353,7 @@ loop2:
leal BUSY_SIZE+LOCAL_SIZE(%a7),%a1 |init a1 for new frame leal BUSY_SIZE+LOCAL_SIZE(%a7),%a1 |init a1 for new frame
moveb VER_TMP(%a6),(%a7) |write busy fmt word moveb VER_TMP(%a6),(%a7) |write busy fmt word
moveb #BUSY_SIZE-4,1(%a7) moveb #BUSY_SIZE-4,1(%a7)
movel FP_SCR1(%a6),WBTEMP_EX(%a1) |write movel FP_SCR1(%a6),WBTEMP_EX(%a1) |write
movel FP_SCR1+4(%a6),WBTEMP_HI(%a1) |exceptional op to movel FP_SCR1+4(%a6),WBTEMP_HI(%a1) |exceptional op to
movel FP_SCR1+8(%a6),WBTEMP_LO(%a1) |wbtemp movel FP_SCR1+8(%a6),WBTEMP_LO(%a1) |wbtemp
| btst.b #E1,E_BYTE(%a1) | btst.b #E1,E_BYTE(%a1)
...@@ -362,7 +362,7 @@ loop2: ...@@ -362,7 +362,7 @@ loop2:
bfins %d0,NMCEXC(%a1){#4:#4} |and insert them in nmcexc bfins %d0,NMCEXC(%a1){#4:#4} |and insert them in nmcexc
movel USER_FPSR(%a6),FPSR_SHADOW(%a1) |set exc bits movel USER_FPSR(%a6),FPSR_SHADOW(%a1) |set exc bits
orl #sx_mask,E_BYTE(%a1) orl #sx_mask,E_BYTE(%a1)
do_restore: do_restore:
moveml USER_DA(%a6),%d0-%d1/%a0-%a1 moveml USER_DA(%a6),%d0-%d1/%a0-%a1
fmovemx USER_FP0(%a6),%fp0-%fp3 fmovemx USER_FP0(%a6),%fp0-%fp3
...@@ -374,10 +374,10 @@ do_restore: ...@@ -374,10 +374,10 @@ do_restore:
cont: cont:
unlk %a6 unlk %a6
| |
| If trace mode enabled, then go to trace handler. This handler | If trace mode enabled, then go to trace handler. This handler
| cannot have any fp instructions. If there are fp inst's and an | cannot have any fp instructions. If there are fp inst's and an
| exception has been restored into the machine then the exception | exception has been restored into the machine then the exception
| will occur upon execution of the fp inst. This is not desirable | will occur upon execution of the fp inst. This is not desirable
| in the kernel (supervisor mode). See MC68040 manual Section 9.3.8. | in the kernel (supervisor mode). See MC68040 manual Section 9.3.8.
| |
finish_up: finish_up:
...@@ -436,12 +436,12 @@ loop40: clrl -(%sp) ...@@ -436,12 +436,12 @@ loop40: clrl -(%sp)
movel USER_D1(%a6),%d1 | restore d1 movel USER_D1(%a6),%d1 | restore d1
movel #0x40280000,-(%sp) movel #0x40280000,-(%sp)
frestore (%sp)+ frestore (%sp)+
unlk %a5 unlk %a5
rts rts
frame_41: frame_41:
tstb 1(%sp) | check to see if idle tstb 1(%sp) | check to see if idle
bne notidle bne notidle
idle41: idle41:
clrl (%sp) | get rid of old fsave frame clrl (%sp) | get rid of old fsave frame
movel %d1,USER_D1(%a6) | save d1 movel %d1,USER_D1(%a6) | save d1
...@@ -451,18 +451,18 @@ loop41: clrl -(%sp) ...@@ -451,18 +451,18 @@ loop41: clrl -(%sp)
movel USER_D1(%a6),%d1 | restore d1 movel USER_D1(%a6),%d1 | restore d1
movel #0x41300000,-(%sp) movel #0x41300000,-(%sp)
frestore (%sp)+ frestore (%sp)+
unlk %a5 unlk %a5
rts rts
notidle: notidle:
bclrb #etemp15_bit,-40(%a5) bclrb #etemp15_bit,-40(%a5)
frestore (%sp)+ frestore (%sp)+
unlk %a5 unlk %a5
rts rts
nofix: nofix:
frestore (%sp)+ frestore (%sp)+
unlk %a5 unlk %a5
rts rts
|end |end
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
| |
| - For unnormalized numbers (opclass 0, 2, or 3) the | - For unnormalized numbers (opclass 0, 2, or 3) the
| number(s) is normalized and the operand type tag is updated. | number(s) is normalized and the operand type tag is updated.
| |
| - For a packed number (opclass 2) the number is unpacked and the | - For a packed number (opclass 2) the number is unpacked and the
| operand type tag is updated. | operand type tag is updated.
| |
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
| the '040. The '040 then re-executes the fadd.x fpm,fpn with | the '040. The '040 then re-executes the fadd.x fpm,fpn with
| a normalized number in the source and the instruction is | a normalized number in the source and the instruction is
| successful. | successful.
| |
| Next consider if in the process of normalizing the un- | Next consider if in the process of normalizing the un-
| normalized number it becomes a denormalized number. The | normalized number it becomes a denormalized number. The
| routine which converts the unnorm to a norm (called mk_norm) | routine which converts the unnorm to a norm (called mk_norm)
...@@ -54,8 +54,8 @@ ...@@ -54,8 +54,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
GET_OP: |idnt 2,1 | Motorola 040 Floating Point Software Package GET_OP: |idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -194,7 +194,7 @@ uns_notpacked: ...@@ -194,7 +194,7 @@ uns_notpacked:
uni_getop: uni_getop:
bfextu CMDREG1B(%a6){#0:#6},%d0 |get opclass and src fields bfextu CMDREG1B(%a6){#0:#6},%d0 |get opclass and src fields
cmpil #0x17,%d0 |if op class and size fields are $17, cmpil #0x17,%d0 |if op class and size fields are $17,
| ;it is FMOVECR; if not, continue | ;it is FMOVECR; if not, continue
| |
| If the instruction is fmovecr, exit get_op. It is handled | If the instruction is fmovecr, exit get_op. It is handled
...@@ -226,21 +226,21 @@ dst_ex_dnrm: ...@@ -226,21 +226,21 @@ dst_ex_dnrm:
movew FPTEMP_EX(%a6),%d0 |get destination exponent movew FPTEMP_EX(%a6),%d0 |get destination exponent
andiw #0x7fff,%d0 |mask sign, check if exp = 0000 andiw #0x7fff,%d0 |mask sign, check if exp = 0000
beqs src_op_ck |if denorm then check source op. beqs src_op_ck |if denorm then check source op.
| ;denorms are taken care of in res_func | ;denorms are taken care of in res_func
| ;(unsupp) or do_func (unimp) | ;(unsupp) or do_func (unimp)
| ;else unnorm fall through | ;else unnorm fall through
leal FPTEMP(%a6),%a0 |point a0 to dop - used in mk_norm leal FPTEMP(%a6),%a0 |point a0 to dop - used in mk_norm
bsr mk_norm |go normalize - mk_norm returns: bsr mk_norm |go normalize - mk_norm returns:
| ;L_SCR1{7:5} = operand tag | ;L_SCR1{7:5} = operand tag
| ; (000 = norm, 100 = denorm) | ; (000 = norm, 100 = denorm)
| ;L_SCR1{4} = fpte15 or ete15 | ;L_SCR1{4} = fpte15 or ete15
| ; 0 = exp > $3fff | ; 0 = exp > $3fff
| ; 1 = exp <= $3fff | ; 1 = exp <= $3fff
| ;and puts the normalized num back | ;and puts the normalized num back
| ;on the fsave stack | ;on the fsave stack
| |
moveb L_SCR1(%a6),DTAG(%a6) |write the new tag & fpte15 moveb L_SCR1(%a6),DTAG(%a6) |write the new tag & fpte15
| ;to the fsave stack and fall | ;to the fsave stack and fall
| ;through to check source operand | ;through to check source operand
| |
src_op_ck: src_op_ck:
...@@ -255,19 +255,19 @@ src_op_ck: ...@@ -255,19 +255,19 @@ src_op_ck:
src_ex_dnrm: src_ex_dnrm:
movew ETEMP_EX(%a6),%d0 |get source exponent movew ETEMP_EX(%a6),%d0 |get source exponent
andiw #0x7fff,%d0 |mask sign, check if exp = 0000 andiw #0x7fff,%d0 |mask sign, check if exp = 0000
beq end_getop |if denorm then exit, denorms are beq end_getop |if denorm then exit, denorms are
| ;handled in do_func | ;handled in do_func
leal ETEMP(%a6),%a0 |point a0 to sop - used in mk_norm leal ETEMP(%a6),%a0 |point a0 to sop - used in mk_norm
bsr mk_norm |go normalize - mk_norm returns: bsr mk_norm |go normalize - mk_norm returns:
| ;L_SCR1{7:5} = operand tag | ;L_SCR1{7:5} = operand tag
| ; (000 = norm, 100 = denorm) | ; (000 = norm, 100 = denorm)
| ;L_SCR1{4} = fpte15 or ete15 | ;L_SCR1{4} = fpte15 or ete15
| ; 0 = exp > $3fff | ; 0 = exp > $3fff
| ; 1 = exp <= $3fff | ; 1 = exp <= $3fff
| ;and puts the normalized num back | ;and puts the normalized num back
| ;on the fsave stack | ;on the fsave stack
| |
moveb L_SCR1(%a6),STAG(%a6) |write the new tag & ete15 moveb L_SCR1(%a6),STAG(%a6) |write the new tag & ete15
rts |end_getop rts |end_getop
| |
...@@ -285,7 +285,7 @@ is_double: ...@@ -285,7 +285,7 @@ is_double:
movew #0x3c01,%d1 |write the bias for a dbl denorm movew #0x3c01,%d1 |write the bias for a dbl denorm
common: common:
btstb #sign_bit,ETEMP_EX(%a6) |grab sign bit of mantissa btstb #sign_bit,ETEMP_EX(%a6) |grab sign bit of mantissa
beqs pos beqs pos
bset #15,%d1 |set sign bit because it is negative bset #15,%d1 |set sign bit because it is negative
pos: pos:
movew %d1,ETEMP_EX(%a6) movew %d1,ETEMP_EX(%a6)
...@@ -297,7 +297,7 @@ pos: ...@@ -297,7 +297,7 @@ pos:
movew %d1,CMDREG1B(%a6) |write back to the command word in stack movew %d1,CMDREG1B(%a6) |write back to the command word in stack
| ;this is needed to fix unsupp data stack | ;this is needed to fix unsupp data stack
leal ETEMP(%a6),%a0 |point a0 to sop leal ETEMP(%a6),%a0 |point a0 to sop
bsr mk_norm |convert sgl/dbl denorm to norm bsr mk_norm |convert sgl/dbl denorm to norm
moveb L_SCR1(%a6),STAG(%a6) |put tag into source tag reg - d0 moveb L_SCR1(%a6),STAG(%a6) |put tag into source tag reg - d0
rts |end_getop rts |end_getop
...@@ -306,7 +306,7 @@ pos: ...@@ -306,7 +306,7 @@ pos:
| instruction is dyadic or monadic is still unknown | instruction is dyadic or monadic is still unknown
| |
pack_source: pack_source:
movel FPTEMP_LO(%a6),ETEMP(%a6) |write ms part of packed movel FPTEMP_LO(%a6),ETEMP(%a6) |write ms part of packed
| ;number to etemp slot | ;number to etemp slot
bsr chk_dy_mo |set dyadic/monadic flag bsr chk_dy_mo |set dyadic/monadic flag
bsr unpack bsr unpack
...@@ -325,7 +325,7 @@ pack_dya: ...@@ -325,7 +325,7 @@ pack_dya:
btstb #7,DTAG(%a6) |check dest tag for unnorm or denorm btstb #7,DTAG(%a6) |check dest tag for unnorm or denorm
bne dst_ex_dnrm |else, handle the unnorm or ext denorm bne dst_ex_dnrm |else, handle the unnorm or ext denorm
| |
| Dest is not denormalized. Check for norm, and set fpte15 | Dest is not denormalized. Check for norm, and set fpte15
| accordingly. | accordingly.
| |
moveb DTAG(%a6),%d0 moveb DTAG(%a6),%d0
...@@ -357,13 +357,13 @@ end_getop: ...@@ -357,13 +357,13 @@ end_getop:
| unsupported data type exception. Set if dyadic. | unsupported data type exception. Set if dyadic.
| |
chk_dy_mo: chk_dy_mo:
movew CMDREG1B(%a6),%d0 movew CMDREG1B(%a6),%d0
btstl #5,%d0 |testing extension command word btstl #5,%d0 |testing extension command word
beqs set_mon |if bit 5 = 0 then monadic beqs set_mon |if bit 5 = 0 then monadic
btstl #4,%d0 |know that bit 5 = 1 btstl #4,%d0 |know that bit 5 = 1
beqs set_dya |if bit 4 = 0 then dyadic beqs set_dya |if bit 4 = 0 then dyadic
andiw #0x007f,%d0 |get rid of all but extension bits {6:0} andiw #0x007f,%d0 |get rid of all but extension bits {6:0}
cmpiw #0x0038,%d0 |if extension = $38 then fcmp (dyadic) cmpiw #0x0038,%d0 |if extension = $38 then fcmp (dyadic)
bnes set_mon bnes set_mon
set_dya: set_dya:
st DY_MO_FLG(%a6) |set the inst flag type to dyadic st DY_MO_FLG(%a6) |set the inst flag type to dyadic
...@@ -406,7 +406,7 @@ set_mon: ...@@ -406,7 +406,7 @@ set_mon:
| L_SCR1{7:5} = operand tag (000 = norm, 100 = denorm) | L_SCR1{7:5} = operand tag (000 = norm, 100 = denorm)
| L_SCR1{4} = fpte15 or ete15 (0 = exp > $3fff, 1 = exp <=$3fff) | L_SCR1{4} = fpte15 or ete15 (0 = exp > $3fff, 1 = exp <=$3fff)
| the normalized operand is placed back on the fsave stack | the normalized operand is placed back on the fsave stack
mk_norm: mk_norm:
clrl L_SCR1(%a6) clrl L_SCR1(%a6)
bclrb #sign_bit,LOCAL_EX(%a0) bclrb #sign_bit,LOCAL_EX(%a0)
sne LOCAL_SGN(%a0) |transform into internal extended format sne LOCAL_SGN(%a0) |transform into internal extended format
...@@ -426,11 +426,11 @@ reload: ...@@ -426,11 +426,11 @@ reload:
cmpw #0x3fff,LOCAL_EX(%a0) |if exp > $3fff cmpw #0x3fff,LOCAL_EX(%a0) |if exp > $3fff
bgts end_mk | fpte15/ete15 already set to 0 bgts end_mk | fpte15/ete15 already set to 0
bsetb #4,L_SCR1(%a6) |else set fpte15/ete15 to 1 bsetb #4,L_SCR1(%a6) |else set fpte15/ete15 to 1
| ;calling routine actually sets the | ;calling routine actually sets the
| ;value on the stack (along with the | ;value on the stack (along with the
| ;tag), since this routine doesn't | ;tag), since this routine doesn't
| ;know if it should set ete15 or fpte15 | ;know if it should set ete15 or fpte15
| ;ie, it doesn't know if this is the | ;ie, it doesn't know if this is the
| ;src op or dest op. | ;src op or dest op.
end_mk: end_mk:
bfclr LOCAL_SGN(%a0){#0:#8} bfclr LOCAL_SGN(%a0){#0:#8}
...@@ -455,7 +455,7 @@ no_unfl: ...@@ -455,7 +455,7 @@ no_unfl:
| |
uns_opx: uns_opx:
bsr nrm_zero |normalize the number bsr nrm_zero |normalize the number
btstb #7,LOCAL_HI(%a0) |check if integer bit (j-bit) is set btstb #7,LOCAL_HI(%a0) |check if integer bit (j-bit) is set
beqs uns_den |if clear then now have a denorm beqs uns_den |if clear then now have a denorm
uns_nrm: uns_nrm:
orb #norm_tag,L_SCR1(%a6) |set tag to norm orb #norm_tag,L_SCR1(%a6) |set tag to norm
...@@ -468,7 +468,7 @@ uns_den: ...@@ -468,7 +468,7 @@ uns_den:
| |
uni_inst: uni_inst:
bsr nrm_zero bsr nrm_zero
btstb #7,LOCAL_HI(%a0) |check if integer bit (j-bit) is set btstb #7,LOCAL_HI(%a0) |check if integer bit (j-bit) is set
beqs uni_den |if clear then now have a denorm beqs uni_den |if clear then now have a denorm
uni_nrm: uni_nrm:
orb #norm_tag,L_SCR1(%a6) |set tag to norm orb #norm_tag,L_SCR1(%a6) |set tag to norm
...@@ -480,9 +480,9 @@ uni_den: ...@@ -480,9 +480,9 @@ uni_den:
| |
| Decimal to binary conversion | Decimal to binary conversion
| |
| Special cases of inf and NaNs are completed outside of decbin. | Special cases of inf and NaNs are completed outside of decbin.
| If the input is an snan, the snan bit is not set. | If the input is an snan, the snan bit is not set.
| |
| input: | input:
| ETEMP(a6) - points to packed decimal string in memory | ETEMP(a6) - points to packed decimal string in memory
| output: | output:
...@@ -610,16 +610,16 @@ mnot_spec: ...@@ -610,16 +610,16 @@ mnot_spec:
finish: finish:
movew CMDREG1B(%a6),%d0 |get the command word movew CMDREG1B(%a6),%d0 |get the command word
andw #0xfbff,%d0 |change the source specifier field to andw #0xfbff,%d0 |change the source specifier field to
| ;extended (was packed). | ;extended (was packed).
movew %d0,CMDREG1B(%a6) |write command word back to fsave stack movew %d0,CMDREG1B(%a6) |write command word back to fsave stack
| ;we need to do this so the 040 will | ;we need to do this so the 040 will
| ;re-execute the inst. without taking | ;re-execute the inst. without taking
| ;another packed trap. | ;another packed trap.
fix_stag: fix_stag:
|Converted result is now in etemp on fsave stack, now set the source |Converted result is now in etemp on fsave stack, now set the source
|tag (stag) |tag (stag)
| if (ete =$7fff) then INF or NAN | if (ete =$7fff) then INF or NAN
| if (etemp = $x.0----0) then | if (etemp = $x.0----0) then
| stag = INF | stag = INF
...@@ -632,12 +632,12 @@ fix_stag: ...@@ -632,12 +632,12 @@ fix_stag:
| stag = NORM | stag = NORM
| |
| Note also that the etemp_15 bit (just right of the stag) must | Note also that the etemp_15 bit (just right of the stag) must
| be set accordingly. | be set accordingly.
| |
movew ETEMP_EX(%a6),%d1 movew ETEMP_EX(%a6),%d1
andiw #0x7fff,%d1 |strip sign andiw #0x7fff,%d1 |strip sign
cmpw #0x7fff,%d1 cmpw #0x7fff,%d1
bnes z_or_nrm bnes z_or_nrm
movel ETEMP_HI(%a6),%d1 movel ETEMP_HI(%a6),%d1
bnes is_nan bnes is_nan
movel ETEMP_LO(%a6),%d1 movel ETEMP_LO(%a6),%d1
...@@ -651,7 +651,7 @@ is_nan: ...@@ -651,7 +651,7 @@ is_nan:
movel #0x60,%d0 movel #0x60,%d0
rts rts
z_or_nrm: z_or_nrm:
tstw %d1 tstw %d1
bnes is_nrm bnes is_nrm
is_zro: is_zro:
| For a zero, set etemp_15 | For a zero, set etemp_15
...@@ -670,7 +670,7 @@ end_is_nrm: ...@@ -670,7 +670,7 @@ end_is_nrm:
movel #0,%d0 movel #0,%d0
end_fix: end_fix:
rts rts
end_get: end_get:
rts rts
|end |end
| |
| kernel_ex.sa 3.3 12/19/90 | kernel_ex.sa 3.3 12/19/90
| |
| This file contains routines to force exception status in the | This file contains routines to force exception status in the
| fpu for exceptional cases detected or reported within the | fpu for exceptional cases detected or reported within the
| transcendental functions. Typically, the t_xx routine will | transcendental functions. Typically, the t_xx routine will
| set the appropriate bits in the USER_FPSR word on the stack. | set the appropriate bits in the USER_FPSR word on the stack.
| The bits are tested in gen_except.sa to determine if an exceptional | The bits are tested in gen_except.sa to determine if an exceptional
| situation needs to be created on return from the FPSP. | situation needs to be created on return from the FPSP.
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
KERNEL_EX: |idnt 2,1 | Motorola 040 Floating Point Software Package KERNEL_EX: |idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -31,7 +31,7 @@ huge: .long 0x7ffe0000,0xffffffff,0xffffffff ...@@ -31,7 +31,7 @@ huge: .long 0x7ffe0000,0xffffffff,0xffffffff
|xref unf_sub |xref unf_sub
|xref nrm_set |xref nrm_set
.global t_dz .global t_dz
.global t_dz2 .global t_dz2
.global t_operr .global t_operr
.global t_unfl .global t_unfl
...@@ -49,7 +49,7 @@ huge: .long 0x7ffe0000,0xffffffff,0xffffffff ...@@ -49,7 +49,7 @@ huge: .long 0x7ffe0000,0xffffffff,0xffffffff
| |
| if dz trap disabled | if dz trap disabled
| store properly signed inf (use sign of etemp) into fp0 | store properly signed inf (use sign of etemp) into fp0
| set FPSR exception status dz bit, condition code | set FPSR exception status dz bit, condition code
| inf bit, and accrued dz bit | inf bit, and accrued dz bit
| return | return
| frestore the frame into the machine (done by unimp_hd) | frestore the frame into the machine (done by unimp_hd)
...@@ -61,7 +61,7 @@ huge: .long 0x7ffe0000,0xffffffff,0xffffffff ...@@ -61,7 +61,7 @@ huge: .long 0x7ffe0000,0xffffffff,0xffffffff
| frestore the frame into the machine (done by unimp_hd) | frestore the frame into the machine (done by unimp_hd)
| |
| t_dz2 is used by monadic functions such as flogn (from do_func). | t_dz2 is used by monadic functions such as flogn (from do_func).
| t_dz is used by monadic functions such as satanh (from the | t_dz is used by monadic functions such as satanh (from the
| transcendental function). | transcendental function).
| |
t_dz2: t_dz2:
...@@ -104,10 +104,10 @@ dz_ena_end: ...@@ -104,10 +104,10 @@ dz_ena_end:
| OPERR exception | OPERR exception
| |
| if (operr trap disabled) | if (operr trap disabled)
| set FPSR exception status operr bit, condition code | set FPSR exception status operr bit, condition code
| nan bit; Store default NAN into fp0 | nan bit; Store default NAN into fp0
| frestore the frame into the machine (done by unimp_hd) | frestore the frame into the machine (done by unimp_hd)
| |
| else (operr trap enabled) | else (operr trap enabled)
| set FPSR exception status operr bit, accrued operr bit | set FPSR exception status operr bit, accrued operr bit
| set flag to disable sto_res from corrupting fp register | set flag to disable sto_res from corrupting fp register
...@@ -159,13 +159,13 @@ unfl_ena: ...@@ -159,13 +159,13 @@ unfl_ena:
unfl_dis: unfl_dis:
bfextu FPCR_MODE(%a6){#0:#2},%d0 |get round precision bfextu FPCR_MODE(%a6){#0:#2},%d0 |get round precision
bclrb #sign_bit,LOCAL_EX(%a0) bclrb #sign_bit,LOCAL_EX(%a0)
sne LOCAL_SGN(%a0) |convert to internal ext format sne LOCAL_SGN(%a0) |convert to internal ext format
bsr unf_sub |returns IEEE result at a0 bsr unf_sub |returns IEEE result at a0
| ;and sets FPSR_CC accordingly | ;and sets FPSR_CC accordingly
bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format
beqs unfl_fin beqs unfl_fin
...@@ -175,7 +175,7 @@ unfl_dis: ...@@ -175,7 +175,7 @@ unfl_dis:
unfl_fin: unfl_fin:
fmovemx (%a0),%fp0-%fp0 |store result in fp0 fmovemx (%a0),%fp0-%fp0 |store result in fp0
rts rts
| |
| t_ovfl2 --- OVFL exception (without inex2 returned) | t_ovfl2 --- OVFL exception (without inex2 returned)
...@@ -280,7 +280,7 @@ no_uacc1: ...@@ -280,7 +280,7 @@ no_uacc1:
| DST_NAN | DST_NAN
| |
| Determine if the destination nan is signalling or non-signalling, | Determine if the destination nan is signalling or non-signalling,
| and set the FPSR bits accordingly. See the MC68040 User's Manual | and set the FPSR bits accordingly. See the MC68040 User's Manual
| section 3.2.2.5 NOT-A-NUMBERS. | section 3.2.2.5 NOT-A-NUMBERS.
| |
dst_nan: dst_nan:
...@@ -288,7 +288,7 @@ dst_nan: ...@@ -288,7 +288,7 @@ dst_nan:
beqs dst_pos |if clr, it was positive beqs dst_pos |if clr, it was positive
bsetb #neg_bit,FPSR_CC(%a6) |set N bit bsetb #neg_bit,FPSR_CC(%a6) |set N bit
dst_pos: dst_pos:
btstb #signan_bit,FPTEMP_HI(%a6) |check if signalling btstb #signan_bit,FPTEMP_HI(%a6) |check if signalling
beqs dst_snan |branch if signalling beqs dst_snan |branch if signalling
fmovel %d1,%fpcr |restore user's rmode/prec fmovel %d1,%fpcr |restore user's rmode/prec
...@@ -300,14 +300,14 @@ dst_pos: ...@@ -300,14 +300,14 @@ dst_pos:
andib #0xe0,%d0 andib #0xe0,%d0
cmpib #0x60,%d0 cmpib #0x60,%d0
bnes no_snan bnes no_snan
btstb #signan_bit,ETEMP_HI(%a6) |check if signalling btstb #signan_bit,ETEMP_HI(%a6) |check if signalling
bnes no_snan bnes no_snan
orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP
no_snan: no_snan:
rts rts
dst_snan: dst_snan:
btstb #snan_bit,FPCR_ENABLE(%a6) |check if trap enabled btstb #snan_bit,FPCR_ENABLE(%a6) |check if trap enabled
beqs dst_dis |branch if disabled beqs dst_dis |branch if disabled
orb #nan_tag,DTAG(%a6) |set up dtag for nan orb #nan_tag,DTAG(%a6) |set up dtag for nan
...@@ -316,9 +316,9 @@ dst_snan: ...@@ -316,9 +316,9 @@ dst_snan:
rts rts
dst_dis: dst_dis:
bsetb #signan_bit,FPTEMP_HI(%a6) |set SNAN bit in sop bsetb #signan_bit,FPTEMP_HI(%a6) |set SNAN bit in sop
fmovel %d1,%fpcr |restore user's rmode/prec fmovel %d1,%fpcr |restore user's rmode/prec
fmovex FPTEMP(%a6),%fp0 |load non-sign. nan fmovex FPTEMP(%a6),%fp0 |load non-sign. nan
orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP
rts rts
...@@ -326,7 +326,7 @@ dst_dis: ...@@ -326,7 +326,7 @@ dst_dis:
| SRC_NAN | SRC_NAN
| |
| Determine if the source nan is signalling or non-signalling, | Determine if the source nan is signalling or non-signalling,
| and set the FPSR bits accordingly. See the MC68040 User's Manual | and set the FPSR bits accordingly. See the MC68040 User's Manual
| section 3.2.2.5 NOT-A-NUMBERS. | section 3.2.2.5 NOT-A-NUMBERS.
| |
src_nan: src_nan:
...@@ -334,16 +334,16 @@ src_nan: ...@@ -334,16 +334,16 @@ src_nan:
beqs src_pos |if clr, it was positive beqs src_pos |if clr, it was positive
bsetb #neg_bit,FPSR_CC(%a6) |set N bit bsetb #neg_bit,FPSR_CC(%a6) |set N bit
src_pos: src_pos:
btstb #signan_bit,ETEMP_HI(%a6) |check if signalling btstb #signan_bit,ETEMP_HI(%a6) |check if signalling
beqs src_snan |branch if signalling beqs src_snan |branch if signalling
fmovel %d1,%fpcr |restore user's rmode/prec fmovel %d1,%fpcr |restore user's rmode/prec
fmovex ETEMP(%a6),%fp0 |return the non-signalling nan fmovex ETEMP(%a6),%fp0 |return the non-signalling nan
rts rts
src_snan: src_snan:
btstb #snan_bit,FPCR_ENABLE(%a6) |check if trap enabled btstb #snan_bit,FPCR_ENABLE(%a6) |check if trap enabled
beqs src_dis |branch if disabled beqs src_dis |branch if disabled
bsetb #signan_bit,ETEMP_HI(%a6) |set SNAN bit in sop bsetb #signan_bit,ETEMP_HI(%a6) |set SNAN bit in sop
orb #norm_tag,DTAG(%a6) |set up dtag for norm orb #norm_tag,DTAG(%a6) |set up dtag for norm
orb #nan_tag,STAG(%a6) |set up stag for nan orb #nan_tag,STAG(%a6) |set up stag for nan
st STORE_FLG(%a6) |do not store a result st STORE_FLG(%a6) |do not store a result
...@@ -351,9 +351,9 @@ src_snan: ...@@ -351,9 +351,9 @@ src_snan:
rts rts
src_dis: src_dis:
bsetb #signan_bit,ETEMP_HI(%a6) |set SNAN bit in sop bsetb #signan_bit,ETEMP_HI(%a6) |set SNAN bit in sop
fmovel %d1,%fpcr |restore user's rmode/prec fmovel %d1,%fpcr |restore user's rmode/prec
fmovex ETEMP(%a6),%fp0 |load non-sign. nan fmovex ETEMP(%a6),%fp0 |load non-sign. nan
orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP orl #snaniop_mask,USER_FPSR(%a6) |set NAN, SNAN, AIOP
rts rts
...@@ -367,7 +367,7 @@ t_extdnrm: ...@@ -367,7 +367,7 @@ t_extdnrm:
bras xdnrm_con bras xdnrm_con
| |
| Entry point for scale with extended denorm. The function does | Entry point for scale with extended denorm. The function does
| not set inex2, aunfl, or ainex. | not set inex2, aunfl, or ainex.
| |
t_resdnrm: t_resdnrm:
orl #unfl_mask,USER_FPSR(%a6) orl #unfl_mask,USER_FPSR(%a6)
...@@ -402,7 +402,7 @@ xdnrm_dn: ...@@ -402,7 +402,7 @@ xdnrm_dn:
bfclr LOCAL_SGN(%a0){#0:#8} |change back to IEEE ext format bfclr LOCAL_SGN(%a0){#0:#8} |change back to IEEE ext format
beqs xdep beqs xdep
bsetb #sign_bit,LOCAL_EX(%a0) bsetb #sign_bit,LOCAL_EX(%a0)
xdep: xdep:
bfclr STAG(%a6){#5:#3} |clear wbtm66,wbtm1,wbtm0 bfclr STAG(%a6){#5:#3} |clear wbtm66,wbtm1,wbtm0
bsetb #wbtemp15_bit,WB_BYTE(%a6) |set wbtemp15 bsetb #wbtemp15_bit,WB_BYTE(%a6) |set wbtemp15
bclrb #sticky_bit,STICKY(%a6) |clear sticky bit bclrb #sticky_bit,STICKY(%a6) |clear sticky bit
...@@ -439,7 +439,7 @@ xdnrm_store: ...@@ -439,7 +439,7 @@ xdnrm_store:
| |
.global t_avoid_unsupp .global t_avoid_unsupp
t_avoid_unsupp: t_avoid_unsupp:
link %a2,#-LOCAL_SIZE |so that a2 fpsp.h negative link %a2,#-LOCAL_SIZE |so that a2 fpsp.h negative
| ;offsets may be used | ;offsets may be used
fsave -(%a7) fsave -(%a7)
tstb 1(%a7) |check if idle, exit if so tstb 1(%a7) |check if idle, exit if so
......
This diff is collapsed.
This diff is collapsed.
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
| |
| Accuracy and Monotonicity: The returned result is within 3 ulps in | Accuracy and Monotonicity: The returned result is within 3 ulps in
| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the | 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
| result is subsequently rounded to double precision. The | result is subsequently rounded to double precision. The
| result is provably monotonic in double precision. | result is provably monotonic in double precision.
| |
| Speed: The program sCOS takes approximately 310 cycles. | Speed: The program sCOS takes approximately 310 cycles.
...@@ -38,8 +38,8 @@ ...@@ -38,8 +38,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SACOS idnt 2,1 | Motorola 040 Floating Point Software Package |SACOS idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -74,17 +74,17 @@ sacos: ...@@ -74,17 +74,17 @@ sacos:
|--ACOS(X) = 2 * ATAN( SQRT( (1-X)/(1+X) ) ) |--ACOS(X) = 2 * ATAN( SQRT( (1-X)/(1+X) ) )
fmoves #0x3F800000,%fp1 fmoves #0x3F800000,%fp1
faddx %fp0,%fp1 | ...1+X faddx %fp0,%fp1 | ...1+X
fnegx %fp0 | ... -X fnegx %fp0 | ... -X
fadds #0x3F800000,%fp0 | ...1-X fadds #0x3F800000,%fp0 | ...1-X
fdivx %fp1,%fp0 | ...(1-X)/(1+X) fdivx %fp1,%fp0 | ...(1-X)/(1+X)
fsqrtx %fp0 | ...SQRT((1-X)/(1+X)) fsqrtx %fp0 | ...SQRT((1-X)/(1+X))
fmovemx %fp0-%fp0,(%a0) | ...overwrite input fmovemx %fp0-%fp0,(%a0) | ...overwrite input
movel %d1,-(%sp) |save original users fpcr movel %d1,-(%sp) |save original users fpcr
clrl %d1 clrl %d1
bsr satan | ...ATAN(SQRT([1-X]/[1+X])) bsr satan | ...ATAN(SQRT([1-X]/[1+X]))
fmovel (%sp)+,%fpcr |restore users exceptions fmovel (%sp)+,%fpcr |restore users exceptions
faddx %fp0,%fp0 | ...2 * ATAN( STUFF ) faddx %fp0,%fp0 | ...2 * ATAN( STUFF )
bra t_frcinx bra t_frcinx
ACOSBIG: ACOSBIG:
...@@ -110,6 +110,6 @@ ACOSBIG: ...@@ -110,6 +110,6 @@ ACOSBIG:
ACOSP1: ACOSP1:
fmovel %d1,%FPCR fmovel %d1,%FPCR
fmoves #0x00000000,%fp0 fmoves #0x00000000,%fp0
rts |Facos ; of +1 is exact rts |Facos ; of +1 is exact
|end |end
...@@ -12,7 +12,7 @@ ...@@ -12,7 +12,7 @@
| |
| Accuracy and Monotonicity: The returned result is within 3 ulps in | Accuracy and Monotonicity: The returned result is within 3 ulps in
| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the | 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
| result is subsequently rounded to double precision. The | result is subsequently rounded to double precision. The
| result is provably monotonic in double precision. | result is provably monotonic in double precision.
| |
| Speed: The program sASIN takes approximately 310 cycles. | Speed: The program sASIN takes approximately 310 cycles.
...@@ -38,8 +38,8 @@ ...@@ -38,8 +38,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SASIN idnt 2,1 | Motorola 040 Floating Point Software Package |SASIN idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -80,7 +80,7 @@ sasin: ...@@ -80,7 +80,7 @@ sasin:
fmulx %fp2,%fp1 | ...(1+X)(1-X) fmulx %fp2,%fp1 | ...(1+X)(1-X)
fmovemx (%a7)+,%fp2-%fp2 fmovemx (%a7)+,%fp2-%fp2
fsqrtx %fp1 | ...SQRT([1-X][1+X]) fsqrtx %fp1 | ...SQRT([1-X][1+X])
fdivx %fp1,%fp0 | ...X/SQRT([1-X][1+X]) fdivx %fp1,%fp0 | ...X/SQRT([1-X][1+X])
fmovemx %fp0-%fp0,(%a0) fmovemx %fp0-%fp0,(%a0)
bsr satan bsr satan
bra t_frcinx bra t_frcinx
...@@ -97,7 +97,7 @@ asinbig: ...@@ -97,7 +97,7 @@ asinbig:
andil #0x80000000,%d0 | ...SIGN BIT OF X andil #0x80000000,%d0 | ...SIGN BIT OF X
oril #0x3F800000,%d0 | ...+-1 IN SGL FORMAT oril #0x3F800000,%d0 | ...+-1 IN SGL FORMAT
movel %d0,-(%sp) | ...push SIGN(X) IN SGL-FMT movel %d0,-(%sp) | ...push SIGN(X) IN SGL-FMT
fmovel %d1,%FPCR fmovel %d1,%FPCR
fmuls (%sp)+,%fp0 fmuls (%sp)+,%fp0
bra t_frcinx bra t_frcinx
......
...@@ -43,8 +43,8 @@ ...@@ -43,8 +43,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|satan idnt 2,1 | Motorola 040 Floating Point Software Package |satan idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -52,7 +52,7 @@ ...@@ -52,7 +52,7 @@
|section 8 |section 8
#include "fpsp.h" #include "fpsp.h"
BOUNDS1: .long 0x3FFB8000,0x4002FFFF BOUNDS1: .long 0x3FFB8000,0x4002FFFF
ONE: .long 0x3F800000 ONE: .long 0x3F800000
...@@ -322,7 +322,7 @@ ATANMAIN: ...@@ -322,7 +322,7 @@ ATANMAIN:
|--THE REASON FOR THIS REARRANGEMENT IS TO MAKE THE INDEPENDENT |--THE REASON FOR THIS REARRANGEMENT IS TO MAKE THE INDEPENDENT
|--PARTS A1*U*V AND (A2 + ... STUFF) MORE LOAD-BALANCED |--PARTS A1*U*V AND (A2 + ... STUFF) MORE LOAD-BALANCED
fmovex %fp0,%fp1 fmovex %fp0,%fp1
fmulx %fp1,%fp1 fmulx %fp1,%fp1
fmoved ATANA3,%fp2 fmoved ATANA3,%fp2
...@@ -332,7 +332,7 @@ ATANMAIN: ...@@ -332,7 +332,7 @@ ATANMAIN:
faddd ATANA2,%fp2 | ...A2+V*(A3+V) faddd ATANA2,%fp2 | ...A2+V*(A3+V)
fmuld ATANA1,%fp1 | ...A1*U*V fmuld ATANA1,%fp1 | ...A1*U*V
fmulx %fp2,%fp1 | ...A1*U*V*(A2+V*(A3+V)) fmulx %fp2,%fp1 | ...A1*U*V*(A2+V*(A3+V))
faddx %fp1,%fp0 | ...ATAN(U), FP1 RELEASED faddx %fp1,%fp0 | ...ATAN(U), FP1 RELEASED
fmovel %d1,%FPCR |restore users exceptions fmovel %d1,%FPCR |restore users exceptions
faddx ATANF(%a6),%fp0 | ...ATAN(X) faddx ATANF(%a6),%fp0 | ...ATAN(X)
...@@ -356,7 +356,7 @@ ATANSM: ...@@ -356,7 +356,7 @@ ATANSM:
|--COMPUTE POLYNOMIAL |--COMPUTE POLYNOMIAL
fmulx %fp0,%fp0 | ...FP0 IS Y = X*X fmulx %fp0,%fp0 | ...FP0 IS Y = X*X
movew #0x0000,XDCARE(%a6) movew #0x0000,XDCARE(%a6)
fmovex %fp0,%fp1 fmovex %fp0,%fp1
...@@ -381,7 +381,7 @@ ATANSM: ...@@ -381,7 +381,7 @@ ATANSM:
fmulx X(%a6),%fp0 | ...X*Y fmulx X(%a6),%fp0 | ...X*Y
faddx %fp2,%fp1 | ...[B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))] faddx %fp2,%fp1 | ...[B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))]
fmulx %fp1,%fp0 | ...X*Y*([B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))]) fmulx %fp1,%fp0 | ...X*Y*([B1+Z*(B3+Z*B5)]+[Y*(B2+Z*(B4+Z*B6))])
...@@ -413,7 +413,7 @@ ATANBIG: ...@@ -413,7 +413,7 @@ ATANBIG:
fmoves #0xBF800000,%fp1 | ...LOAD -1 fmoves #0xBF800000,%fp1 | ...LOAD -1
fdivx %fp0,%fp1 | ...FP1 IS -1/X fdivx %fp0,%fp1 | ...FP1 IS -1/X
|--DIVIDE IS STILL CRANKING |--DIVIDE IS STILL CRANKING
fmovex %fp1,%fp0 | ...FP0 IS X' fmovex %fp1,%fp0 | ...FP0 IS X'
...@@ -439,14 +439,14 @@ ATANBIG: ...@@ -439,14 +439,14 @@ ATANBIG:
fmulx X(%a6),%fp0 | ...X'*Y fmulx X(%a6),%fp0 | ...X'*Y
faddx %fp2,%fp1 | ...[Y*(C2+Z*C4)]+[C1+Z*(C3+Z*C5)] faddx %fp2,%fp1 | ...[Y*(C2+Z*C4)]+[C1+Z*(C3+Z*C5)]
fmulx %fp1,%fp0 | ...X'*Y*([B1+Z*(B3+Z*B5)] fmulx %fp1,%fp0 | ...X'*Y*([B1+Z*(B3+Z*B5)]
| ... +[Y*(B2+Z*(B4+Z*B6))]) | ... +[Y*(B2+Z*(B4+Z*B6))])
faddx X(%a6),%fp0 faddx X(%a6),%fp0
fmovel %d1,%FPCR |restore users exceptions fmovel %d1,%FPCR |restore users exceptions
btstb #7,(%a0) btstb #7,(%a0)
beqs pos_big beqs pos_big
...@@ -474,5 +474,5 @@ pos_huge: ...@@ -474,5 +474,5 @@ pos_huge:
fmovel %d1,%fpcr fmovel %d1,%fpcr
fsubx PTINY,%fp0 fsubx PTINY,%fp0
bra t_frcinx bra t_frcinx
|end |end
...@@ -13,7 +13,7 @@ ...@@ -13,7 +13,7 @@
| |
| Accuracy and Monotonicity: The returned result is within 3 ulps in | Accuracy and Monotonicity: The returned result is within 3 ulps in
| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the | 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
| result is subsequently rounded to double precision. The | result is subsequently rounded to double precision. The
| result is provably monotonic in double precision. | result is provably monotonic in double precision.
| |
| Speed: The program satanh takes approximately 270 cycles. | Speed: The program satanh takes approximately 270 cycles.
...@@ -33,7 +33,7 @@ ...@@ -33,7 +33,7 @@
| 3. If |X| > 1, go to 5. | 3. If |X| > 1, go to 5.
| |
| 4. (|X| = 1) Generate infinity with an appropriate sign and | 4. (|X| = 1) Generate infinity with an appropriate sign and
| divide-by-zero by | divide-by-zero by
| sgn := sign(X) | sgn := sign(X)
| atan(X) := sgn / (+0). | atan(X) := sgn / (+0).
| Exit. | Exit.
...@@ -45,8 +45,8 @@ ...@@ -45,8 +45,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|satanh idnt 2,1 | Motorola 040 Floating Point Software Package |satanh idnt 2,1 | Motorola 040 Floating Point Software Package
......
...@@ -9,7 +9,7 @@ ...@@ -9,7 +9,7 @@
| The entry point sscale is called from do_func to emulate | The entry point sscale is called from do_func to emulate
| the fscale unimplemented instruction. | the fscale unimplemented instruction.
| |
| Input: Double-extended destination operand in FPTEMP, | Input: Double-extended destination operand in FPTEMP,
| double-extended source operand in ETEMP. | double-extended source operand in ETEMP.
| |
| Output: The function returns scale(X,Y) to fp0. | Output: The function returns scale(X,Y) to fp0.
...@@ -17,12 +17,12 @@ ...@@ -17,12 +17,12 @@
| Modifies: fp0. | Modifies: fp0.
| |
| Algorithm: | Algorithm:
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SCALE idnt 2,1 | Motorola 040 Floating Point Software Package |SCALE idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -147,7 +147,7 @@ nden_exit: ...@@ -147,7 +147,7 @@ nden_exit:
src_neg: src_neg:
addl %d0,%d1 |add src to dest addl %d0,%d1 |add src to dest
beqs denorm |if zero, result is denorm beqs denorm |if zero, result is denorm
blts fix_dnrm |if negative, result is blts fix_dnrm |if negative, result is
| ;needing denormalization | ;needing denormalization
tstb L_SCR1(%a6) tstb L_SCR1(%a6)
beqs sneg_pos beqs sneg_pos
...@@ -161,7 +161,7 @@ sneg_pos: ...@@ -161,7 +161,7 @@ sneg_pos:
| |
| The result exponent is below denorm value. Test for catastrophic | The result exponent is below denorm value. Test for catastrophic
| underflow and force zero if true. If not, try to shift the | underflow and force zero if true. If not, try to shift the
| mantissa right until a zero exponent exists. | mantissa right until a zero exponent exists.
| |
fix_dnrm: fix_dnrm:
...@@ -229,7 +229,7 @@ no_dir: ...@@ -229,7 +229,7 @@ no_dir:
rts rts
| |
| The rounding mode changed the zero to a smallest denorm. Call | The rounding mode changed the zero to a smallest denorm. Call
| t_resdnrm with exceptional operand in ETEMP. | t_resdnrm with exceptional operand in ETEMP.
| |
sm_dnrm: sm_dnrm:
...@@ -250,7 +250,7 @@ not_zero: ...@@ -250,7 +250,7 @@ not_zero:
fix_exit: fix_exit:
bras sm_dnrm bras sm_dnrm
| |
| The result has underflowed to zero. Return zero and set | The result has underflowed to zero. Return zero and set
| unfl, aunfl, and ainex. | unfl, aunfl, and ainex.
...@@ -284,7 +284,7 @@ neg_zero: ...@@ -284,7 +284,7 @@ neg_zero:
clrl FP_SCR1(%a6) |clear the exceptional operand clrl FP_SCR1(%a6) |clear the exceptional operand
clrl FP_SCR1+4(%a6) |for gen_except. clrl FP_SCR1+4(%a6) |for gen_except.
clrl FP_SCR1+8(%a6) clrl FP_SCR1+8(%a6)
fmoves #0x80000000,%fp0 fmoves #0x80000000,%fp0
rts rts
pos_zero: pos_zero:
clrl FP_SCR1(%a6) |clear the exceptional operand clrl FP_SCR1(%a6) |clear the exceptional operand
...@@ -299,7 +299,7 @@ pos_zero: ...@@ -299,7 +299,7 @@ pos_zero:
| then adding the remainder of the source to the exponent. | then adding the remainder of the source to the exponent.
| |
dst_dnrm: dst_dnrm:
moveml %d2/%d3,-(%a7) moveml %d2/%d3,-(%a7)
movew FPTEMP_EX(%a6),%d1 movew FPTEMP_EX(%a6),%d1
movel FPTEMP_HI(%a6),%d2 movel FPTEMP_HI(%a6),%d2
movel FPTEMP_LO(%a6),%d3 movel FPTEMP_LO(%a6),%d3
...@@ -313,7 +313,7 @@ dst_loop: ...@@ -313,7 +313,7 @@ dst_loop:
roxll #1,%d2 roxll #1,%d2
bras dst_loop bras dst_loop
| |
| Destination became normalized. Simply add the remaining | Destination became normalized. Simply add the remaining
| portion of the src to the exponent. | portion of the src to the exponent.
| |
dst_norm: dst_norm:
......
...@@ -49,8 +49,8 @@ ...@@ -49,8 +49,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SCOSH idnt 2,1 | Motorola 040 Floating Point Software Package |SCOSH idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -99,7 +99,7 @@ scosh: ...@@ -99,7 +99,7 @@ scosh:
movel (%sp)+,%d1 movel (%sp)+,%d1
fmoves #0x3E800000,%fp1 | ...(1/4) fmoves #0x3E800000,%fp1 | ...(1/4)
fdivx %fp0,%fp1 | ...1/(2 EXP(|X|)) fdivx %fp0,%fp1 | ...1/(2 EXP(|X|))
fmovel %d1,%FPCR fmovel %d1,%FPCR
faddx %fp1,%fp0 faddx %fp1,%fp0
......
...@@ -331,8 +331,8 @@ ...@@ -331,8 +331,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|setox idnt 2,1 | Motorola 040 Floating Point Software Package |setox idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -505,7 +505,7 @@ EXPCONT1: ...@@ -505,7 +505,7 @@ EXPCONT1:
fmovex %fp0,%fp2 fmovex %fp0,%fp2
fmuls #0xBC317218,%fp0 | ...N * L1, L1 = lead(-log2/64) fmuls #0xBC317218,%fp0 | ...N * L1, L1 = lead(-log2/64)
fmulx L2,%fp2 | ...N * L2, L1+L2 = -log2/64 fmulx L2,%fp2 | ...N * L2, L1+L2 = -log2/64
faddx %fp1,%fp0 | ...X + N*L1 faddx %fp1,%fp0 | ...X + N*L1
faddx %fp2,%fp0 | ...fp0 is R, reduced arg. faddx %fp2,%fp0 | ...fp0 is R, reduced arg.
| MOVE.W #$3FA5,EXPA3 ...load EXPA3 in cache | MOVE.W #$3FA5,EXPA3 ...load EXPA3 in cache
...@@ -516,46 +516,46 @@ EXPCONT1: ...@@ -516,46 +516,46 @@ EXPCONT1:
|--[R+R*S*(A2+S*A4)] + [S*(A1+S*(A3+S*A5))] |--[R+R*S*(A2+S*A4)] + [S*(A1+S*(A3+S*A5))]
fmovex %fp0,%fp1 fmovex %fp0,%fp1
fmulx %fp1,%fp1 | ...fp1 IS S = R*R fmulx %fp1,%fp1 | ...fp1 IS S = R*R
fmoves #0x3AB60B70,%fp2 | ...fp2 IS A5 fmoves #0x3AB60B70,%fp2 | ...fp2 IS A5
| MOVE.W #0,2(%a1) ...load 2^(J/64) in cache | MOVE.W #0,2(%a1) ...load 2^(J/64) in cache
fmulx %fp1,%fp2 | ...fp2 IS S*A5 fmulx %fp1,%fp2 | ...fp2 IS S*A5
fmovex %fp1,%fp3 fmovex %fp1,%fp3
fmuls #0x3C088895,%fp3 | ...fp3 IS S*A4 fmuls #0x3C088895,%fp3 | ...fp3 IS S*A4
faddd EXPA3,%fp2 | ...fp2 IS A3+S*A5 faddd EXPA3,%fp2 | ...fp2 IS A3+S*A5
faddd EXPA2,%fp3 | ...fp3 IS A2+S*A4 faddd EXPA2,%fp3 | ...fp3 IS A2+S*A4
fmulx %fp1,%fp2 | ...fp2 IS S*(A3+S*A5) fmulx %fp1,%fp2 | ...fp2 IS S*(A3+S*A5)
movew %d0,SCALE(%a6) | ...SCALE is 2^(M) in extended movew %d0,SCALE(%a6) | ...SCALE is 2^(M) in extended
clrw SCALE+2(%a6) clrw SCALE+2(%a6)
movel #0x80000000,SCALE+4(%a6) movel #0x80000000,SCALE+4(%a6)
clrl SCALE+8(%a6) clrl SCALE+8(%a6)
fmulx %fp1,%fp3 | ...fp3 IS S*(A2+S*A4) fmulx %fp1,%fp3 | ...fp3 IS S*(A2+S*A4)
fadds #0x3F000000,%fp2 | ...fp2 IS A1+S*(A3+S*A5) fadds #0x3F000000,%fp2 | ...fp2 IS A1+S*(A3+S*A5)
fmulx %fp0,%fp3 | ...fp3 IS R*S*(A2+S*A4) fmulx %fp0,%fp3 | ...fp3 IS R*S*(A2+S*A4)
fmulx %fp1,%fp2 | ...fp2 IS S*(A1+S*(A3+S*A5)) fmulx %fp1,%fp2 | ...fp2 IS S*(A1+S*(A3+S*A5))
faddx %fp3,%fp0 | ...fp0 IS R+R*S*(A2+S*A4), faddx %fp3,%fp0 | ...fp0 IS R+R*S*(A2+S*A4),
| ...fp3 released | ...fp3 released
fmovex (%a1)+,%fp1 | ...fp1 is lead. pt. of 2^(J/64) fmovex (%a1)+,%fp1 | ...fp1 is lead. pt. of 2^(J/64)
faddx %fp2,%fp0 | ...fp0 is EXP(R) - 1 faddx %fp2,%fp0 | ...fp0 is EXP(R) - 1
| ...fp2 released | ...fp2 released
|--Step 5 |--Step 5
|--final reconstruction process |--final reconstruction process
|--EXP(X) = 2^M * ( 2^(J/64) + 2^(J/64)*(EXP(R)-1) ) |--EXP(X) = 2^M * ( 2^(J/64) + 2^(J/64)*(EXP(R)-1) )
fmulx %fp1,%fp0 | ...2^(J/64)*(Exp(R)-1) fmulx %fp1,%fp0 | ...2^(J/64)*(Exp(R)-1)
fmovemx (%a7)+,%fp2-%fp2/%fp3 | ...fp2 restored fmovemx (%a7)+,%fp2-%fp2/%fp3 | ...fp2 restored
fadds (%a1),%fp0 | ...accurate 2^(J/64) fadds (%a1),%fp0 | ...accurate 2^(J/64)
faddx %fp1,%fp0 | ...2^(J/64) + 2^(J/64)*... faddx %fp1,%fp0 | ...2^(J/64) + 2^(J/64)*...
movel ADJFLAG(%a6),%d0 movel ADJFLAG(%a6),%d0
|--Step 6 |--Step 6
...@@ -564,7 +564,7 @@ EXPCONT1: ...@@ -564,7 +564,7 @@ EXPCONT1:
ADJUST: ADJUST:
fmulx ADJSCALE(%a6),%fp0 fmulx ADJSCALE(%a6),%fp0
NORMAL: NORMAL:
fmovel %d1,%FPCR | ...restore user FPCR fmovel %d1,%FPCR | ...restore user FPCR
fmulx SCALE(%a6),%fp0 | ...multiply 2^(M) fmulx SCALE(%a6),%fp0 | ...multiply 2^(M)
bra t_frcinx bra t_frcinx
......
| |
| sgetem.sa 3.1 12/10/90 | sgetem.sa 3.1 12/10/90
| |
| The entry point sGETEXP returns the exponent portion | The entry point sGETEXP returns the exponent portion
| of the input argument. The exponent bias is removed | of the input argument. The exponent bias is removed
| and the exponent value is returned as an extended | and the exponent value is returned as an extended
| precision number in fp0. sGETEXPD handles denormalized | precision number in fp0. sGETEXPD handles denormalized
| numbers. | numbers.
| |
| The entry point sGETMAN extracts the mantissa of the | The entry point sGETMAN extracts the mantissa of the
| input argument. The mantissa is converted to an | input argument. The mantissa is converted to an
| extended precision number and returned in fp0. The | extended precision number and returned in fp0. The
| range of the result is [1.0 - 2.0). | range of the result is [1.0 - 2.0).
| |
...@@ -24,8 +24,8 @@ ...@@ -24,8 +24,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SGETEM idnt 2,1 | Motorola 040 Floating Point Software Package |SGETEM idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -81,7 +81,7 @@ sgetman: ...@@ -81,7 +81,7 @@ sgetman:
fmovel %d0,%fpcr |this fpcr setting is used by the 882 fmovel %d0,%fpcr |this fpcr setting is used by the 882
movew LOCAL_EX(%a0),%d0 |get the exp (really just want sign bit) movew LOCAL_EX(%a0),%d0 |get the exp (really just want sign bit)
orw #0x7fff,%d0 |clear old exp orw #0x7fff,%d0 |clear old exp
bclrl #14,%d0 |make it the new exp +-3fff bclrl #14,%d0 |make it the new exp +-3fff
movew %d0,LOCAL_EX(%a0) |move the sign & exp back to fsave stack movew %d0,LOCAL_EX(%a0) |move the sign & exp back to fsave stack
fmovex (%a0),%fp0 |put new value back in fp0 fmovex (%a0),%fp0 |put new value back in fp0
rts rts
......
| |
| sint.sa 3.1 12/10/90 | sint.sa 3.1 12/10/90
| |
| The entry point sINT computes the rounded integer | The entry point sINT computes the rounded integer
| equivalent of the input argument, sINTRZ computes | equivalent of the input argument, sINTRZ computes
| the integer rounded to zero of the input argument. | the integer rounded to zero of the input argument.
| |
| Entry points sint and sintrz are called from do_func | Entry points sint and sintrz are called from do_func
...@@ -24,10 +24,10 @@ ...@@ -24,10 +24,10 @@
| |
| Algorithm: (sint and sintrz) | Algorithm: (sint and sintrz)
| |
| 1. If exp(X) >= 63, return X. | 1. If exp(X) >= 63, return X.
| If exp(X) < 0, return +/- 0 or +/- 1, according to | If exp(X) < 0, return +/- 0 or +/- 1, according to
| the rounding mode. | the rounding mode.
| |
| 2. (X is in range) set rsc = 63 - exp(X). Unnormalize the | 2. (X is in range) set rsc = 63 - exp(X). Unnormalize the
| result to the exponent $403e. | result to the exponent $403e.
| |
...@@ -51,8 +51,8 @@ ...@@ -51,8 +51,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SINT idnt 2,1 | Motorola 040 Floating Point Software Package |SINT idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -78,9 +78,9 @@ ...@@ -78,9 +78,9 @@
sint: sint:
bfextu FPCR_MODE(%a6){#2:#2},%d1 |use user's mode for rounding bfextu FPCR_MODE(%a6){#2:#2},%d1 |use user's mode for rounding
| ;implicitly has extend precision | ;implicitly has extend precision
| ;in upper word. | ;in upper word.
movel %d1,L_SCR1(%a6) |save mode bits movel %d1,L_SCR1(%a6) |save mode bits
bras sintexc bras sintexc
| |
| FINT with extended denorm inputs. | FINT with extended denorm inputs.
...@@ -115,13 +115,13 @@ sintmz: ...@@ -115,13 +115,13 @@ sintmz:
sintrz: sintrz:
movel #1,L_SCR1(%a6) |use rz mode for rounding movel #1,L_SCR1(%a6) |use rz mode for rounding
| ;implicitly has extend precision | ;implicitly has extend precision
| ;in upper word. | ;in upper word.
bras sintexc bras sintexc
| |
| SINTDO | SINTDO
| |
| Input: a0 points to an IEEE extended format operand | Input: a0 points to an IEEE extended format operand
| Output: fp0 has the result | Output: fp0 has the result
| |
| Exceptions: | Exceptions:
| |
...@@ -133,7 +133,7 @@ sintrz: ...@@ -133,7 +133,7 @@ sintrz:
sintdo: sintdo:
bfextu FPCR_MODE(%a6){#2:#2},%d1 |use user's mode for rounding bfextu FPCR_MODE(%a6){#2:#2},%d1 |use user's mode for rounding
| ;implicitly has ext precision | ;implicitly has ext precision
| ;in upper word. | ;in upper word.
movel %d1,L_SCR1(%a6) |save mode bits movel %d1,L_SCR1(%a6) |save mode bits
| |
| Real work of sint is in sintexc | Real work of sint is in sintexc
...@@ -141,7 +141,7 @@ sintdo: ...@@ -141,7 +141,7 @@ sintdo:
sintexc: sintexc:
bclrb #sign_bit,LOCAL_EX(%a0) |convert to internal extended bclrb #sign_bit,LOCAL_EX(%a0) |convert to internal extended
| ;format | ;format
sne LOCAL_SGN(%a0) sne LOCAL_SGN(%a0)
cmpw #0x403e,LOCAL_EX(%a0) |check if (unbiased) exp > 63 cmpw #0x403e,LOCAL_EX(%a0) |check if (unbiased) exp > 63
bgts out_rnge |branch if exp < 63 bgts out_rnge |branch if exp < 63
cmpw #0x3ffd,LOCAL_EX(%a0) |check if (unbiased) exp < 0 cmpw #0x3ffd,LOCAL_EX(%a0) |check if (unbiased) exp < 0
...@@ -187,7 +187,7 @@ un_rnrz: ...@@ -187,7 +187,7 @@ un_rnrz:
un_rnrz_neg: un_rnrz_neg:
bsr ld_mzero bsr ld_mzero
bra t_inx2 bra t_inx2
| |
| Input is greater than 2^63. All bits are significant. Return | Input is greater than 2^63. All bits are significant. Return
| the input. | the input.
...@@ -206,7 +206,7 @@ intps: ...@@ -206,7 +206,7 @@ intps:
rts rts
in_rnge: in_rnge:
| ;shift off fraction bits | ;shift off fraction bits
clrl %d0 |clear d0 - initial g,r,s for clrl %d0 |clear d0 - initial g,r,s for
| ;dnrm_lp | ;dnrm_lp
movel #0x403e,%d1 |set threshold for dnrm_lp movel #0x403e,%d1 |set threshold for dnrm_lp
......
...@@ -18,20 +18,20 @@ ...@@ -18,20 +18,20 @@
| to handle the exception. | to handle the exception.
| |
| If the exception was completely handled by the package, then | If the exception was completely handled by the package, then
| the return will be via a 'jmp fpsp_done'. Unless there is | the return will be via a 'jmp fpsp_done'. Unless there is
| OS specific work to be done (such as handling a context switch or | OS specific work to be done (such as handling a context switch or
| interrupt) the user program can be resumed via 'rte'. | interrupt) the user program can be resumed via 'rte'.
| |
| In the following skeleton code, some typical 'real_xxxx' handling | In the following skeleton code, some typical 'real_xxxx' handling
| code is shown. This code may need to be moved to an appropriate | code is shown. This code may need to be moved to an appropriate
| place in the target system, or rewritten. | place in the target system, or rewritten.
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
| |
...@@ -50,7 +50,7 @@ ...@@ -50,7 +50,7 @@
| |
|section 8 |section 8
#include "fpsp.h" #include "fpsp.h"
|xref b1238_fix |xref b1238_fix
...@@ -72,7 +72,7 @@ real_dz: ...@@ -72,7 +72,7 @@ real_dz:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
bral ret_from_exception bral ret_from_exception
...@@ -82,7 +82,7 @@ real_dz: ...@@ -82,7 +82,7 @@ real_dz:
| |
| All inexact exceptions are real, but the 'real' handler | All inexact exceptions are real, but the 'real' handler
| will probably want to clear the pending exception. | will probably want to clear the pending exception.
| The provided code will clear the E3 exception (if pending), | The provided code will clear the E3 exception (if pending),
| otherwise clear the E1 exception. The frestore is not really | otherwise clear the E1 exception. The frestore is not really
| necessary for E1 exceptions. | necessary for E1 exceptions.
| |
...@@ -96,7 +96,7 @@ real_dz: ...@@ -96,7 +96,7 @@ real_dz:
| to the appropriate handler for the exception in the fpsr. Note | to the appropriate handler for the exception in the fpsr. Note
| that this fix is only for d43b parts, and is skipped if the | that this fix is only for d43b parts, and is skipped if the
| version number is not $40. | version number is not $40.
| |
| |
.global real_inex .global real_inex
.global inex .global inex
...@@ -116,7 +116,7 @@ inex: ...@@ -116,7 +116,7 @@ inex:
bra snan bra snan
inex_ckofl: inex_ckofl:
btstb #ovfl_bit,2(%sp) |test for ovfl btstb #ovfl_bit,2(%sp) |test for ovfl
beq inex_ckufl beq inex_ckufl
addl #4,%sp addl #4,%sp
frestore (%sp)+ frestore (%sp)+
unlk %a6 unlk %a6
...@@ -163,11 +163,11 @@ inex_done: ...@@ -163,11 +163,11 @@ inex_done:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
bral ret_from_exception bral ret_from_exception
| |
| Overflow exception | Overflow exception
| |
...@@ -189,11 +189,11 @@ ovfl_done: ...@@ -189,11 +189,11 @@ ovfl_done:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
bral ret_from_exception bral ret_from_exception
| |
| Underflow exception | Underflow exception
| |
...@@ -215,11 +215,11 @@ unfl_done: ...@@ -215,11 +215,11 @@ unfl_done:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
bral ret_from_exception bral ret_from_exception
| |
| Signalling NAN exception | Signalling NAN exception
| |
...@@ -237,11 +237,11 @@ real_snan: ...@@ -237,11 +237,11 @@ real_snan:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
bral ret_from_exception bral ret_from_exception
| |
| Operand Error exception | Operand Error exception
| |
...@@ -259,12 +259,12 @@ real_operr: ...@@ -259,12 +259,12 @@ real_operr:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
bral ret_from_exception bral ret_from_exception
| |
| BSUN exception | BSUN exception
| |
...@@ -287,7 +287,7 @@ real_bsun: ...@@ -287,7 +287,7 @@ real_bsun:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
bral ret_from_exception bral ret_from_exception
...@@ -295,7 +295,7 @@ real_bsun: ...@@ -295,7 +295,7 @@ real_bsun:
| |
| F-line exception | F-line exception
| |
| A 'real' F-line exception is one that the FPSP isn't supposed to | A 'real' F-line exception is one that the FPSP isn't supposed to
| handle. E.g. an instruction with a co-processor ID that is not 1. | handle. E.g. an instruction with a co-processor ID that is not 1.
| |
| |
...@@ -308,7 +308,7 @@ real_fline: ...@@ -308,7 +308,7 @@ real_fline:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
bral ret_from_exception bral ret_from_exception
...@@ -330,7 +330,7 @@ real_unsupp: ...@@ -330,7 +330,7 @@ real_unsupp:
SAVE_ALL_INT SAVE_ALL_INT
GET_CURRENT(%d0) GET_CURRENT(%d0)
movel %sp,%sp@- | stack frame pointer argument movel %sp,%sp@- | stack frame pointer argument
bsrl trap_c bsrl trap_c
addql #4,%sp addql #4,%sp
bral ret_from_exception bral ret_from_exception
...@@ -355,14 +355,14 @@ real_trace: ...@@ -355,14 +355,14 @@ real_trace:
| {4028, 4130} - unimp frame | {4028, 4130} - unimp frame
| {4000, 4100} - idle frame | {4000, 4100} - idle frame
| |
| This entry point simply holds an f-line illegal value. | This entry point simply holds an f-line illegal value.
| Replace this with a call to your kernel panic code or | Replace this with a call to your kernel panic code or
| code to handle future revisions of the fpu. | code to handle future revisions of the fpu.
| |
.global fpsp_fmt_error .global fpsp_fmt_error
fpsp_fmt_error: fpsp_fmt_error:
.long 0xf27f0000 |f-line illegal .long 0xf27f0000 |f-line illegal
| |
| fpsp_done --- FPSP exit point | fpsp_done --- FPSP exit point
...@@ -442,7 +442,7 @@ user_write: ...@@ -442,7 +442,7 @@ user_write:
| a1 - supervisor destination address | a1 - supervisor destination address
| d0 - number of bytes to read (maximum count is 12) | d0 - number of bytes to read (maximum count is 12)
| |
| Like mem_write, mem_read always reads with a supervisor | Like mem_write, mem_read always reads with a supervisor
| destination address on the supervisor stack. Also like mem_write, | destination address on the supervisor stack. Also like mem_write,
| the EXC_SR is checked and a simple memory copy is done if reading | the EXC_SR is checked and a simple memory copy is done if reading
| from supervisor space is indicated. | from supervisor space is indicated.
......
| |
| slog2.sa 3.1 12/10/90 | slog2.sa 3.1 12/10/90
| |
| The entry point slog10 computes the base-10 | The entry point slog10 computes the base-10
| logarithm of an input argument X. | logarithm of an input argument X.
| slog10d does the same except the input value is a | slog10d does the same except the input value is a
| denormalized number. | denormalized number.
| sLog2 and sLog2d are the base-2 analogues. | sLog2 and sLog2d are the base-2 analogues.
| |
| INPUT: Double-extended value in memory location pointed to | INPUT: Double-extended value in memory location pointed to
| by address register a0. | by address register a0.
| |
| OUTPUT: log_10(X) or log_2(X) returned in floating-point | OUTPUT: log_10(X) or log_2(X) returned in floating-point
| register fp0. | register fp0.
| |
| ACCURACY and MONOTONICITY: The returned result is within 1.7 | ACCURACY and MONOTONICITY: The returned result is within 1.7
| ulps in 64 significant bit, i.e. within 0.5003 ulp | ulps in 64 significant bit, i.e. within 0.5003 ulp
| to 53 bits if the result is subsequently rounded | to 53 bits if the result is subsequently rounded
| to double precision. The result is provably monotonic | to double precision. The result is provably monotonic
| in double precision. | in double precision.
| |
| SPEED: Two timings are measured, both in the copy-back mode. | SPEED: Two timings are measured, both in the copy-back mode.
| The first one is measured when the function is invoked | The first one is measured when the function is invoked
| the first time (so the instructions and data are not | the first time (so the instructions and data are not
| in cache), and the second one is measured when the | in cache), and the second one is measured when the
| function is reinvoked at the same input argument. | function is reinvoked at the same input argument.
| |
| ALGORITHM and IMPLEMENTATION NOTES: | ALGORITHM and IMPLEMENTATION NOTES:
...@@ -42,7 +42,7 @@ ...@@ -42,7 +42,7 @@
| 2.2 Return ans := Y * INV_L10. | 2.2 Return ans := Y * INV_L10.
| |
| |
| slog10: | slog10:
| |
| Step 0. If X < 0, create a NaN and raise the invalid operation | Step 0. If X < 0, create a NaN and raise the invalid operation
| flag. Otherwise, save FPCR in D1; set FpCR to default. | flag. Otherwise, save FPCR in D1; set FpCR to default.
...@@ -96,15 +96,15 @@ ...@@ -96,15 +96,15 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SLOG2 idnt 2,1 | Motorola 040 Floating Point Software Package |SLOG2 idnt 2,1 | Motorola 040 Floating Point Software Package
|section 8 |section 8
|xref t_frcinx |xref t_frcinx
|xref t_operr |xref t_operr
|xref slogn |xref slogn
|xref slognd |xref slognd
......
...@@ -13,11 +13,11 @@ ...@@ -13,11 +13,11 @@
| |
| Accuracy and Monotonicity: The returned result is within 2 ulps in | Accuracy and Monotonicity: The returned result is within 2 ulps in
| 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the | 64 significant bit, i.e. within 0.5001 ulp to 53 bits if the
| result is subsequently rounded to double precision. The | result is subsequently rounded to double precision. The
| result is provably monotonic in double precision. | result is provably monotonic in double precision.
| |
| Speed: The program slogn takes approximately 190 cycles for input | Speed: The program slogn takes approximately 190 cycles for input
| argument X such that |X-1| >= 1/16, which is the usual | argument X such that |X-1| >= 1/16, which is the usual
| situation. For those arguments, slognp1 takes approximately | situation. For those arguments, slognp1 takes approximately
| 210 cycles. For the less common arguments, the program will | 210 cycles. For the less common arguments, the program will
| run no worse than 10% slower. | run no worse than 10% slower.
...@@ -45,26 +45,26 @@ ...@@ -45,26 +45,26 @@
| Step 2: Let 1+X = 2**k * Y, where 1 <= Y < 2. Define F as done in Step 2 | Step 2: Let 1+X = 2**k * Y, where 1 <= Y < 2. Define F as done in Step 2
| of the algorithm for LOGN and compute log(1+X) as | of the algorithm for LOGN and compute log(1+X) as
| k*log(2) + log(F) + poly where poly approximates log(1+u), | k*log(2) + log(F) + poly where poly approximates log(1+u),
| u = (Y-F)/F. | u = (Y-F)/F.
| |
| Implementation Notes: | Implementation Notes:
| Note 1. There are 64 different possible values for F, thus 64 log(F)'s | Note 1. There are 64 different possible values for F, thus 64 log(F)'s
| need to be tabulated. Moreover, the values of 1/F are also | need to be tabulated. Moreover, the values of 1/F are also
| tabulated so that the division in (Y-F)/F can be performed by a | tabulated so that the division in (Y-F)/F can be performed by a
| multiplication. | multiplication.
| |
| Note 2. In Step 2 of lognp1, in order to preserved accuracy, the value | Note 2. In Step 2 of lognp1, in order to preserved accuracy, the value
| Y-F has to be calculated carefully when 1/2 <= X < 3/2. | Y-F has to be calculated carefully when 1/2 <= X < 3/2.
| |
| Note 3. To fully exploit the pipeline, polynomials are usually separated | Note 3. To fully exploit the pipeline, polynomials are usually separated
| into two parts evaluated independently before being added up. | into two parts evaluated independently before being added up.
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|slogn idnt 2,1 | Motorola 040 Floating Point Software Package |slogn idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -262,7 +262,7 @@ slognd: ...@@ -262,7 +262,7 @@ slognd:
|----the value TWOTO100 is no longer needed. |----the value TWOTO100 is no longer needed.
|----Note that this code assumes the denormalized input is NON-ZERO. |----Note that this code assumes the denormalized input is NON-ZERO.
moveml %d2-%d7,-(%a7) | ...save some registers moveml %d2-%d7,-(%a7) | ...save some registers
movel #0x00000000,%d3 | ...D3 is exponent of smallest norm. # movel #0x00000000,%d3 | ...D3 is exponent of smallest norm. #
movel 4(%a0),%d4 movel 4(%a0),%d4
movel 8(%a0),%d5 | ...(D4,D5) is (Hi_X,Lo_X) movel 8(%a0),%d5 | ...(D4,D5) is (Hi_X,Lo_X)
...@@ -347,14 +347,14 @@ LOGMAIN: ...@@ -347,14 +347,14 @@ LOGMAIN:
|--NOTE THAT U = (Y-F)/F IS VERY SMALL AND THUS APPROXIMATING |--NOTE THAT U = (Y-F)/F IS VERY SMALL AND THUS APPROXIMATING
|--LOG(1+U) CAN BE VERY EFFICIENT. |--LOG(1+U) CAN BE VERY EFFICIENT.
|--ALSO NOTE THAT THE VALUE 1/F IS STORED IN A TABLE SO THAT NO |--ALSO NOTE THAT THE VALUE 1/F IS STORED IN A TABLE SO THAT NO
|--DIVISION IS NEEDED TO CALCULATE (Y-F)/F. |--DIVISION IS NEEDED TO CALCULATE (Y-F)/F.
|--GET K, Y, F, AND ADDRESS OF 1/F. |--GET K, Y, F, AND ADDRESS OF 1/F.
asrl #8,%d0 asrl #8,%d0
asrl #8,%d0 | ...SHIFTED 16 BITS, BIASED EXPO. OF X asrl #8,%d0 | ...SHIFTED 16 BITS, BIASED EXPO. OF X
subil #0x3FFF,%d0 | ...THIS IS K subil #0x3FFF,%d0 | ...THIS IS K
addl ADJK(%a6),%d0 | ...ADJUST K, ORIGINAL INPUT MAY BE DENORM. addl ADJK(%a6),%d0 | ...ADJUST K, ORIGINAL INPUT MAY BE DENORM.
lea LOGTBL,%a0 | ...BASE ADDRESS OF 1/F AND LOG(F) lea LOGTBL,%a0 | ...BASE ADDRESS OF 1/F AND LOG(F)
fmovel %d0,%fp1 | ...CONVERT K TO FLOATING-POINT FORMAT fmovel %d0,%fp1 | ...CONVERT K TO FLOATING-POINT FORMAT
|--WHILE THE CONVERSION IS GOING ON, WE GET F AND ADDRESS OF 1/F |--WHILE THE CONVERSION IS GOING ON, WE GET F AND ADDRESS OF 1/F
...@@ -363,7 +363,7 @@ LOGMAIN: ...@@ -363,7 +363,7 @@ LOGMAIN:
andil #0xFE000000,FFRAC(%a6) | ...FIRST 7 BITS OF Y andil #0xFE000000,FFRAC(%a6) | ...FIRST 7 BITS OF Y
oril #0x01000000,FFRAC(%a6) | ...GET F: ATTACH A 1 AT THE EIGHTH BIT oril #0x01000000,FFRAC(%a6) | ...GET F: ATTACH A 1 AT THE EIGHTH BIT
movel FFRAC(%a6),%d0 | ...READY TO GET ADDRESS OF 1/F movel FFRAC(%a6),%d0 | ...READY TO GET ADDRESS OF 1/F
andil #0x7E000000,%d0 andil #0x7E000000,%d0
asrl #8,%d0 asrl #8,%d0
asrl #8,%d0 asrl #8,%d0
asrl #4,%d0 | ...SHIFTED 20, D0 IS THE DISPLACEMENT asrl #4,%d0 | ...SHIFTED 20, D0 IS THE DISPLACEMENT
...@@ -390,7 +390,7 @@ LP1CONT1: ...@@ -390,7 +390,7 @@ LP1CONT1:
|--[U + V*(A1+V*(A3+V*A5))] + [U*V*(A2+V*(A4+V*A6))] |--[U + V*(A1+V*(A3+V*A5))] + [U*V*(A2+V*(A4+V*A6))]
fmovex %fp2,%fp3 fmovex %fp2,%fp3
fmovex %fp2,%fp1 fmovex %fp2,%fp1
fmuld LOGA6,%fp1 | ...V*A6 fmuld LOGA6,%fp1 | ...V*A6
fmuld LOGA5,%fp2 | ...V*A5 fmuld LOGA5,%fp2 | ...V*A5
...@@ -440,7 +440,7 @@ LP1CONT2: ...@@ -440,7 +440,7 @@ LP1CONT2:
fmovex %fp1,%fp0 fmovex %fp1,%fp0
fmulx %fp0,%fp0 | ...FP0 IS V fmulx %fp0,%fp0 | ...FP0 IS V
fmovex %fp1,SAVEU(%a6) | ...STORE U IN MEMORY, FREE FP1 fmovex %fp1,SAVEU(%a6) | ...STORE U IN MEMORY, FREE FP1
fmovex %fp0,%fp1 fmovex %fp0,%fp1
fmulx %fp1,%fp1 | ...FP1 IS W fmulx %fp1,%fp1 | ...FP1 IS W
fmoved LOGB5,%fp3 fmoved LOGB5,%fp3
...@@ -465,7 +465,7 @@ LP1CONT2: ...@@ -465,7 +465,7 @@ LP1CONT2:
fmulx %fp1,%fp0 | ...U*V*( [B1+W*(B3+W*B5)] + [V*(B2+W*B4)] ) fmulx %fp1,%fp0 | ...U*V*( [B1+W*(B3+W*B5)] + [V*(B2+W*B4)] )
fmovel %d1,%fpcr fmovel %d1,%fpcr
faddx SAVEU(%a6),%fp0 faddx SAVEU(%a6),%fp0
bra t_frcinx bra t_frcinx
rts rts
...@@ -549,7 +549,7 @@ KISNEG1: ...@@ -549,7 +549,7 @@ KISNEG1:
asrl #8,%d0 asrl #8,%d0
asrl #4,%d0 | ...D0 CONTAINS DISPLACEMENT FOR 1/F asrl #4,%d0 | ...D0 CONTAINS DISPLACEMENT FOR 1/F
faddx %fp1,%fp1 | ...GET 2Z faddx %fp1,%fp1 | ...GET 2Z
fmovemx %fp2-%fp2/%fp3,-(%sp) | ...SAVE FP2 fmovemx %fp2-%fp2/%fp3,-(%sp) | ...SAVE FP2
faddx %fp1,%fp0 | ...FP0 IS Y-F = (2-F)+2Z faddx %fp1,%fp0 | ...FP0 IS Y-F = (2-F)+2Z
lea LOGTBL,%a0 | ...A0 IS ADDRESS OF 1/F lea LOGTBL,%a0 | ...A0 IS ADDRESS OF 1/F
addal %d0,%a0 addal %d0,%a0
...@@ -569,7 +569,7 @@ KISZERO: ...@@ -569,7 +569,7 @@ KISZERO:
faddx %fp1,%fp0 | ...FP0 IS Y-F faddx %fp1,%fp0 | ...FP0 IS Y-F
fmovemx %fp2-%fp2/%fp3,-(%sp) | ...FP2 SAVED fmovemx %fp2-%fp2/%fp3,-(%sp) | ...FP2 SAVED
lea LOGTBL,%a0 lea LOGTBL,%a0
addal %d0,%a0 | ...A0 IS ADDRESS OF 1/F addal %d0,%a0 | ...A0 IS ADDRESS OF 1/F
fmoves zero,%fp1 | ...FP1 IS K = 0 fmoves zero,%fp1 | ...FP1 IS K = 0
bra LP1CONT1 bra LP1CONT1
......
...@@ -15,8 +15,8 @@ ...@@ -15,8 +15,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SMOVECR idnt 2,1 | Motorola 040 Floating Point Software Package |SMOVECR idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -39,7 +39,7 @@ ...@@ -39,7 +39,7 @@
FZERO: .long 00000000 FZERO: .long 00000000
| |
| FMOVECR | FMOVECR
| |
.global smovcr .global smovcr
smovcr: smovcr:
...@@ -55,9 +55,9 @@ smovcr: ...@@ -55,9 +55,9 @@ smovcr:
cmpib #0x0e,%d0 |check range $0b - $0e cmpib #0x0e,%d0 |check range $0b - $0e
bles SM_TBL |valid constants in this range bles SM_TBL |valid constants in this range
cmpib #0x2f,%d0 |check range $10 - $2f cmpib #0x2f,%d0 |check range $10 - $2f
bles Z_VAL |if in this range, return zero bles Z_VAL |if in this range, return zero
cmpib #0x3f,%d0 |check range $30 - $3f cmpib #0x3f,%d0 |check range $30 - $3f
ble BG_TBL |valid constants in this range ble BG_TBL |valid constants in this range
Z_VAL: Z_VAL:
fmoves FZERO,%fp0 fmoves FZERO,%fp0
rts rts
...@@ -149,7 +149,7 @@ not_ext: ...@@ -149,7 +149,7 @@ not_ext:
lea FP_SCR1(%a6),%a0 lea FP_SCR1(%a6),%a0
btstb #sign_bit,LOCAL_EX(%a0) btstb #sign_bit,LOCAL_EX(%a0)
sne LOCAL_SGN(%a0) |convert to internal ext. format sne LOCAL_SGN(%a0) |convert to internal ext. format
bsr round |go round the mantissa bsr round |go round the mantissa
bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format bfclr LOCAL_SGN(%a0){#0:#8} |convert back to IEEE ext format
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
| --------- | ---------
| |
| Step 1. Save and strip signs of X and Y: signX := sign(X), | Step 1. Save and strip signs of X and Y: signX := sign(X),
| signY := sign(Y), X := |X|, Y := |Y|, | signY := sign(Y), X := |X|, Y := |Y|,
| signQ := signX EOR signY. Record whether MOD or REM | signQ := signX EOR signY. Record whether MOD or REM
| is requested. | is requested.
| |
...@@ -41,7 +41,7 @@ ...@@ -41,7 +41,7 @@
| |
| Step 4. At this point, R = X - QY = MOD(X,Y). Set | Step 4. At this point, R = X - QY = MOD(X,Y). Set
| Last_Subtract := false (used in Step 7 below). If | Last_Subtract := false (used in Step 7 below). If
| MOD is requested, go to Step 6. | MOD is requested, go to Step 6.
| |
| Step 5. R = MOD(X,Y), but REM(X,Y) is requested. | Step 5. R = MOD(X,Y), but REM(X,Y) is requested.
| 5.1 If R < Y/2, then R = MOD(X,Y) = REM(X,Y). Go to | 5.1 If R < Y/2, then R = MOD(X,Y) = REM(X,Y). Go to
...@@ -61,13 +61,13 @@ ...@@ -61,13 +61,13 @@
| X = 2^(j)*(Q+1)Y. set Q := 2^(j)*(Q+1), | X = 2^(j)*(Q+1)Y. set Q := 2^(j)*(Q+1),
| R := 0. Return signQ, last 7 bits of Q, and R. | R := 0. Return signQ, last 7 bits of Q, and R.
| |
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
SREM_MOD: |idnt 2,1 | Motorola 040 Floating Point Software Package SREM_MOD: |idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -362,10 +362,10 @@ Fix_Sign: ...@@ -362,10 +362,10 @@ Fix_Sign:
|..Get Q |..Get Q
| |
Get_Q: Get_Q:
clrl %d6 clrl %d6
movew SignQ(%a6),%d6 | ...D6 is sign(Q) movew SignQ(%a6),%d6 | ...D6 is sign(Q)
movel #8,%d7 movel #8,%d7
lsrl %d7,%d6 lsrl %d7,%d6
andil #0x0000007F,%d3 | ...7 bits of Q andil #0x0000007F,%d3 | ...7 bits of Q
orl %d6,%d3 | ...sign and bits of Q orl %d6,%d3 | ...sign and bits of Q
swap %d3 swap %d3
...@@ -391,7 +391,7 @@ Finish: ...@@ -391,7 +391,7 @@ Finish:
Rem_is_0: Rem_is_0:
|..R = 2^(-j)X - Q Y = Y, thus R = 0 and quotient = 2^j (Q+1) |..R = 2^(-j)X - Q Y = Y, thus R = 0 and quotient = 2^j (Q+1)
addql #1,%d3 addql #1,%d3
cmpil #8,%d0 | ...D0 is j cmpil #8,%d0 | ...D0 is j
bges Q_Big bges Q_Big
lsll %d0,%d3 lsll %d0,%d3
......
...@@ -83,8 +83,8 @@ ...@@ -83,8 +83,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SSIN idnt 2,1 | Motorola 040 Floating Point Software Package |SSIN idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -204,7 +204,7 @@ SINMAIN: ...@@ -204,7 +204,7 @@ SINMAIN:
|--HIDE THE NEXT THREE INSTRUCTIONS |--HIDE THE NEXT THREE INSTRUCTIONS
lea PITBL+0x200,%a1 | ...TABLE OF N*PI/2, N = -32,...,32 lea PITBL+0x200,%a1 | ...TABLE OF N*PI/2, N = -32,...,32
|--FP1 IS NOW READY |--FP1 IS NOW READY
fmovel %fp1,N(%a6) | ...CONVERT TO INTEGER fmovel %fp1,N(%a6) | ...CONVERT TO INTEGER
...@@ -273,7 +273,7 @@ SINPOLY: ...@@ -273,7 +273,7 @@ SINPOLY:
faddx %fp2,%fp1 | ...[A1+T(A3+T(A5+TA7))]+[S(A2+T(A4+TA6))] faddx %fp2,%fp1 | ...[A1+T(A3+T(A5+TA7))]+[S(A2+T(A4+TA6))]
|--FP3 RELEASED, RESTORE NOW AND TAKE SOME ADVANTAGE OF HIDING |--FP3 RELEASED, RESTORE NOW AND TAKE SOME ADVANTAGE OF HIDING
|--FP2 RELEASED, RESTORE NOW AND TAKE FULL ADVANTAGE OF HIDING |--FP2 RELEASED, RESTORE NOW AND TAKE FULL ADVANTAGE OF HIDING
fmulx %fp1,%fp0 | ...SIN(R')-R' fmulx %fp1,%fp0 | ...SIN(R')-R'
|--FP1 RELEASED. |--FP1 RELEASED.
...@@ -335,7 +335,7 @@ COSPOLY: ...@@ -335,7 +335,7 @@ COSPOLY:
fmulx %fp2,%fp0 | ...S(B2+T(B4+T(B6+TB8))) fmulx %fp2,%fp0 | ...S(B2+T(B4+T(B6+TB8)))
|--FP3 RELEASED, RESTORE NOW AND TAKE SOME ADVANTAGE OF HIDING |--FP3 RELEASED, RESTORE NOW AND TAKE SOME ADVANTAGE OF HIDING
|--FP2 RELEASED. |--FP2 RELEASED.
faddx %fp1,%fp0 faddx %fp1,%fp0
|--FP1 RELEASED |--FP1 RELEASED
...@@ -352,7 +352,7 @@ SINBORS: ...@@ -352,7 +352,7 @@ SINBORS:
|--IF |X| < 2**(-40), RETURN X OR 1. |--IF |X| < 2**(-40), RETURN X OR 1.
cmpil #0x3FFF8000,%d0 cmpil #0x3FFF8000,%d0
bgts REDUCEX bgts REDUCEX
SINSM: SINSM:
movel ADJN(%a6),%d0 movel ADJN(%a6),%d0
...@@ -466,7 +466,7 @@ WORK: ...@@ -466,7 +466,7 @@ WORK:
movew %d2,FP_SCR2(%a6) movew %d2,FP_SCR2(%a6)
clrw FP_SCR2+2(%a6) clrw FP_SCR2+2(%a6)
movel #0xC90FDAA2,FP_SCR2+4(%a6) movel #0xC90FDAA2,FP_SCR2+4(%a6)
clrl FP_SCR2+8(%a6) | ...FP_SCR2 is 2**(L) * Piby2_1 clrl FP_SCR2+8(%a6) | ...FP_SCR2 is 2**(L) * Piby2_1
|--FP2 IS READY |--FP2 IS READY
fsubs TWOTO63(%a6),%fp2 | ...FP2 is N fsubs TWOTO63(%a6),%fp2 | ...FP2 is N
...@@ -514,7 +514,7 @@ RESTORE: ...@@ -514,7 +514,7 @@ RESTORE:
movel (%a7)+,%d2 movel (%a7)+,%d2
fmovemx (%a7)+,%fp2-%fp5 fmovemx (%a7)+,%fp2-%fp5
movel ADJN(%a6),%d0 movel ADJN(%a6),%d0
cmpil #4,%d0 cmpil #4,%d0
...@@ -559,7 +559,7 @@ SCMAIN: ...@@ -559,7 +559,7 @@ SCMAIN:
|--HIDE THE NEXT THREE INSTRUCTIONS |--HIDE THE NEXT THREE INSTRUCTIONS
lea PITBL+0x200,%a1 | ...TABLE OF N*PI/2, N = -32,...,32 lea PITBL+0x200,%a1 | ...TABLE OF N*PI/2, N = -32,...,32
|--FP1 IS NOW READY |--FP1 IS NOW READY
fmovel %fp1,N(%a6) | ...CONVERT TO INTEGER fmovel %fp1,N(%a6) | ...CONVERT TO INTEGER
...@@ -577,7 +577,7 @@ SCCONT: ...@@ -577,7 +577,7 @@ SCCONT:
|--HIDE THE NEXT TWO |--HIDE THE NEXT TWO
movel N(%a6),%d0 movel N(%a6),%d0
rorl #1,%d0 rorl #1,%d0
cmpil #0,%d0 | ...D0 < 0 IFF N IS ODD cmpil #0,%d0 | ...D0 < 0 IFF N IS ODD
bge NEVEN bge NEVEN
...@@ -641,7 +641,7 @@ NODD: ...@@ -641,7 +641,7 @@ NODD:
fmulx %fp0,%fp1 | ...S(A1+...) fmulx %fp0,%fp1 | ...S(A1+...)
fmulx %fp2,%fp0 | ...S(B2+...) fmulx %fp2,%fp0 | ...S(B2+...)
fmulx RPRIME(%a6),%fp1 | ...R'S(A1+...) fmulx RPRIME(%a6),%fp1 | ...R'S(A1+...)
fadds COSB1,%fp0 | ...B1+S(B2...) fadds COSB1,%fp0 | ...B1+S(B2...)
...@@ -709,7 +709,7 @@ NEVEN: ...@@ -709,7 +709,7 @@ NEVEN:
fmulx %fp0,%fp1 | ...S(B2+...) fmulx %fp0,%fp1 | ...S(B2+...)
fmulx %fp2,%fp0 | ...s(a1+...) fmulx %fp2,%fp0 | ...s(a1+...)
fadds COSB1,%fp1 | ...B1+S(B2...) fadds COSB1,%fp1 | ...B1+S(B2...)
fmulx RPRIME(%a6),%fp0 | ...R'S(A1+...) fmulx RPRIME(%a6),%fp0 | ...R'S(A1+...)
...@@ -728,7 +728,7 @@ NEVEN: ...@@ -728,7 +728,7 @@ NEVEN:
SCBORS: SCBORS:
cmpil #0x3FFF8000,%d0 cmpil #0x3FFF8000,%d0
bgt REDUCEX bgt REDUCEX
SCSM: SCSM:
movew #0x0000,XDCARE(%a6) movew #0x0000,XDCARE(%a6)
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
| an input argument; sSinhd does the same except for denormalized | an input argument; sSinhd does the same except for denormalized
| input. | input.
| |
| Input: Double-extended number X in location pointed to | Input: Double-extended number X in location pointed to
| by address register a0. | by address register a0.
| |
| Output: The value sinh(X) returned in floating-point register Fp0. | Output: The value sinh(X) returned in floating-point register Fp0.
...@@ -49,8 +49,8 @@ ...@@ -49,8 +49,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|SSINH idnt 2,1 | Motorola 040 Floating Point Software Package |SSINH idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -91,7 +91,7 @@ ssinh: ...@@ -91,7 +91,7 @@ ssinh:
moveml %a1/%d1,-(%sp) moveml %a1/%d1,-(%sp)
fmovemx %fp0-%fp0,(%a0) fmovemx %fp0-%fp0,(%a0)
clrl %d1 clrl %d1
bsr setoxm1 | ...FP0 IS Z = EXPM1(Y) bsr setoxm1 | ...FP0 IS Z = EXPM1(Y)
fmovel #0,%fpcr fmovel #0,%fpcr
moveml (%sp)+,%a1/%d1 moveml (%sp)+,%a1/%d1
......
...@@ -50,8 +50,8 @@ ...@@ -50,8 +50,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|STAN idnt 2,1 | Motorola 040 Floating Point Software Package |STAN idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -213,34 +213,34 @@ TANCONT: ...@@ -213,34 +213,34 @@ TANCONT:
blt NODD blt NODD
fmovex %fp0,%fp1 fmovex %fp0,%fp1
fmulx %fp1,%fp1 | ...S = R*R fmulx %fp1,%fp1 | ...S = R*R
fmoved TANQ4,%fp3 fmoved TANQ4,%fp3
fmoved TANP3,%fp2 fmoved TANP3,%fp2
fmulx %fp1,%fp3 | ...SQ4 fmulx %fp1,%fp3 | ...SQ4
fmulx %fp1,%fp2 | ...SP3 fmulx %fp1,%fp2 | ...SP3
faddd TANQ3,%fp3 | ...Q3+SQ4 faddd TANQ3,%fp3 | ...Q3+SQ4
faddx TANP2,%fp2 | ...P2+SP3 faddx TANP2,%fp2 | ...P2+SP3
fmulx %fp1,%fp3 | ...S(Q3+SQ4) fmulx %fp1,%fp3 | ...S(Q3+SQ4)
fmulx %fp1,%fp2 | ...S(P2+SP3) fmulx %fp1,%fp2 | ...S(P2+SP3)
faddx TANQ2,%fp3 | ...Q2+S(Q3+SQ4) faddx TANQ2,%fp3 | ...Q2+S(Q3+SQ4)
faddx TANP1,%fp2 | ...P1+S(P2+SP3) faddx TANP1,%fp2 | ...P1+S(P2+SP3)
fmulx %fp1,%fp3 | ...S(Q2+S(Q3+SQ4)) fmulx %fp1,%fp3 | ...S(Q2+S(Q3+SQ4))
fmulx %fp1,%fp2 | ...S(P1+S(P2+SP3)) fmulx %fp1,%fp2 | ...S(P1+S(P2+SP3))
faddx TANQ1,%fp3 | ...Q1+S(Q2+S(Q3+SQ4)) faddx TANQ1,%fp3 | ...Q1+S(Q2+S(Q3+SQ4))
fmulx %fp0,%fp2 | ...RS(P1+S(P2+SP3)) fmulx %fp0,%fp2 | ...RS(P1+S(P2+SP3))
fmulx %fp3,%fp1 | ...S(Q1+S(Q2+S(Q3+SQ4))) fmulx %fp3,%fp1 | ...S(Q1+S(Q2+S(Q3+SQ4)))
faddx %fp2,%fp0 | ...R+RS(P1+S(P2+SP3))
faddx %fp2,%fp0 | ...R+RS(P1+S(P2+SP3))
fadds #0x3F800000,%fp1 | ...1+S(Q1+...) fadds #0x3F800000,%fp1 | ...1+S(Q1+...)
...@@ -251,40 +251,40 @@ TANCONT: ...@@ -251,40 +251,40 @@ TANCONT:
NODD: NODD:
fmovex %fp0,%fp1 fmovex %fp0,%fp1
fmulx %fp0,%fp0 | ...S = R*R fmulx %fp0,%fp0 | ...S = R*R
fmoved TANQ4,%fp3 fmoved TANQ4,%fp3
fmoved TANP3,%fp2 fmoved TANP3,%fp2
fmulx %fp0,%fp3 | ...SQ4 fmulx %fp0,%fp3 | ...SQ4
fmulx %fp0,%fp2 | ...SP3 fmulx %fp0,%fp2 | ...SP3
faddd TANQ3,%fp3 | ...Q3+SQ4 faddd TANQ3,%fp3 | ...Q3+SQ4
faddx TANP2,%fp2 | ...P2+SP3 faddx TANP2,%fp2 | ...P2+SP3
fmulx %fp0,%fp3 | ...S(Q3+SQ4) fmulx %fp0,%fp3 | ...S(Q3+SQ4)
fmulx %fp0,%fp2 | ...S(P2+SP3) fmulx %fp0,%fp2 | ...S(P2+SP3)
faddx TANQ2,%fp3 | ...Q2+S(Q3+SQ4) faddx TANQ2,%fp3 | ...Q2+S(Q3+SQ4)
faddx TANP1,%fp2 | ...P1+S(P2+SP3) faddx TANP1,%fp2 | ...P1+S(P2+SP3)
fmulx %fp0,%fp3 | ...S(Q2+S(Q3+SQ4)) fmulx %fp0,%fp3 | ...S(Q2+S(Q3+SQ4))
fmulx %fp0,%fp2 | ...S(P1+S(P2+SP3)) fmulx %fp0,%fp2 | ...S(P1+S(P2+SP3))
faddx TANQ1,%fp3 | ...Q1+S(Q2+S(Q3+SQ4)) faddx TANQ1,%fp3 | ...Q1+S(Q2+S(Q3+SQ4))
fmulx %fp1,%fp2 | ...RS(P1+S(P2+SP3)) fmulx %fp1,%fp2 | ...RS(P1+S(P2+SP3))
fmulx %fp3,%fp0 | ...S(Q1+S(Q2+S(Q3+SQ4)))
fmulx %fp3,%fp0 | ...S(Q1+S(Q2+S(Q3+SQ4)))
faddx %fp2,%fp1 | ...R+RS(P1+S(P2+SP3)) faddx %fp2,%fp1 | ...R+RS(P1+S(P2+SP3))
fadds #0x3F800000,%fp0 | ...1+S(Q1+...) fadds #0x3F800000,%fp0 | ...1+S(Q1+...)
fmovex %fp1,-(%sp) fmovex %fp1,-(%sp)
eoril #0x80000000,(%sp) eoril #0x80000000,(%sp)
fmovel %d1,%fpcr |restore users exceptions fmovel %d1,%fpcr |restore users exceptions
fdivx (%sp)+,%fp0 |last inst - possible exception set fdivx (%sp)+,%fp0 |last inst - possible exception set
bra t_frcinx bra t_frcinx
...@@ -397,7 +397,7 @@ WORK: ...@@ -397,7 +397,7 @@ WORK:
movew %d2,FP_SCR2(%a6) movew %d2,FP_SCR2(%a6)
clrw FP_SCR2+2(%a6) clrw FP_SCR2+2(%a6)
movel #0xC90FDAA2,FP_SCR2+4(%a6) movel #0xC90FDAA2,FP_SCR2+4(%a6)
clrl FP_SCR2+8(%a6) | ...FP_SCR2 is 2**(L) * Piby2_1 clrl FP_SCR2+8(%a6) | ...FP_SCR2 is 2**(L) * Piby2_1
|--FP2 IS READY |--FP2 IS READY
fsubs TWOTO63(%a6),%fp2 | ...FP2 is N fsubs TWOTO63(%a6),%fp2 | ...FP2 is N
...@@ -445,7 +445,7 @@ RESTORE: ...@@ -445,7 +445,7 @@ RESTORE:
movel (%a7)+,%d2 movel (%a7)+,%d2
fmovemx (%a7)+,%fp2-%fp5 fmovemx (%a7)+,%fp2-%fp5
movel N(%a6),%d0 movel N(%a6),%d0
rorl #1,%d0 rorl #1,%d0
......
...@@ -49,14 +49,14 @@ ...@@ -49,14 +49,14 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|STANH idnt 2,1 | Motorola 040 Floating Point Software Package |STANH idnt 2,1 | Motorola 040 Floating Point Software Package
|section 8 |section 8
#include "fpsp.h" #include "fpsp.h"
.set X,FP_SCR5 .set X,FP_SCR5
...@@ -106,7 +106,7 @@ stanh: ...@@ -106,7 +106,7 @@ stanh:
movel %d1,-(%a7) movel %d1,-(%a7)
clrl %d1 clrl %d1
fmovemx %fp0-%fp0,(%a0) fmovemx %fp0-%fp0,(%a0)
bsr setoxm1 | ...FP0 IS Z = EXPM1(Y) bsr setoxm1 | ...FP0 IS Z = EXPM1(Y)
movel (%a7)+,%d1 movel (%a7)+,%d1
fmovex %fp0,%fp1 fmovex %fp0,%fp1
...@@ -149,7 +149,7 @@ TANHBORS: ...@@ -149,7 +149,7 @@ TANHBORS:
eorl #0xC0000000,%d0 | ...-SIGN(X)*2 eorl #0xC0000000,%d0 | ...-SIGN(X)*2
fmoves %d0,%fp1 | ...-SIGN(X)*2 IN SGL FMT fmoves %d0,%fp1 | ...-SIGN(X)*2 IN SGL FMT
fdivx %fp0,%fp1 | ...-SIGN(X)2 / [EXP(Y)+1 ] fdivx %fp0,%fp1 | ...-SIGN(X)2 / [EXP(Y)+1 ]
movel SGN(%a6),%d0 movel SGN(%a6),%d0
orl #0x3F800000,%d0 | ...SGN orl #0x3F800000,%d0 | ...SGN
......
...@@ -5,9 +5,9 @@ ...@@ -5,9 +5,9 @@
| Library functions return result in fp0. If fp0 is not the | Library functions return result in fp0. If fp0 is not the
| users destination register then fp0 is moved to the | users destination register then fp0 is moved to the
| correct floating-point destination register. fp0 and fp1 | correct floating-point destination register. fp0 and fp1
| are then restored to the original contents. | are then restored to the original contents.
| |
| Input: result in fp0,fp1 | Input: result in fp0,fp1
| |
| d2 & a0 should be kept unmodified | d2 & a0 should be kept unmodified
| |
...@@ -19,8 +19,8 @@ ...@@ -19,8 +19,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
STO_RES: |idnt 2,1 | Motorola 040 Floating Point Software Package STO_RES: |idnt 2,1 | Motorola 040 Floating Point Software Package
......
...@@ -76,8 +76,8 @@ ...@@ -76,8 +76,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|STWOTOX idnt 2,1 | Motorola 040 Floating Point Software Package |STWOTOX idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -222,17 +222,17 @@ TWOOK1: ...@@ -222,17 +222,17 @@ TWOOK1:
cmpil #0x400D80C0,%d0 | ...|X| > 16480? cmpil #0x400D80C0,%d0 | ...|X| > 16480?
bles TWOMAIN bles TWOMAIN
bra EXPBORS bra EXPBORS
TWOMAIN: TWOMAIN:
|--USUAL CASE, 2^(-70) <= |X| <= 16480 |--USUAL CASE, 2^(-70) <= |X| <= 16480
fmovex %fp0,%fp1 fmovex %fp0,%fp1
fmuls #0x42800000,%fp1 | ...64 * X fmuls #0x42800000,%fp1 | ...64 * X
fmovel %fp1,N(%a6) | ...N = ROUND-TO-INT(64 X) fmovel %fp1,N(%a6) | ...N = ROUND-TO-INT(64 X)
movel %d2,-(%sp) movel %d2,-(%sp)
lea EXPTBL,%a1 | ...LOAD ADDRESS OF TABLE OF 2^(J/64) lea EXPTBL,%a1 | ...LOAD ADDRESS OF TABLE OF 2^(J/64)
fmovel N(%a6),%fp1 | ...N --> FLOATING FMT fmovel N(%a6),%fp1 | ...N --> FLOATING FMT
movel N(%a6),%d0 movel N(%a6),%d0
movel %d0,%d2 movel %d0,%d2
...@@ -244,7 +244,7 @@ TWOMAIN: ...@@ -244,7 +244,7 @@ TWOMAIN:
asrl #1,%d0 | ...D0 IS M asrl #1,%d0 | ...D0 IS M
subl %d0,%d2 | ...d2 IS M', N = 64(M+M') + J subl %d0,%d2 | ...d2 IS M', N = 64(M+M') + J
addil #0x3FFF,%d2 addil #0x3FFF,%d2
movew %d2,ADJFACT(%a6) | ...ADJFACT IS 2^(M') movew %d2,ADJFACT(%a6) | ...ADJFACT IS 2^(M')
movel (%sp)+,%d2 movel (%sp)+,%d2
|--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64), |--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
|--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN. |--D0 IS M WHERE N = 64(M+M') + J. NOTE THAT |M| <= 16140 BY DESIGN.
...@@ -258,13 +258,13 @@ TWOMAIN: ...@@ -258,13 +258,13 @@ TWOMAIN:
movew (%a1)+,FACT2(%a6) movew (%a1)+,FACT2(%a6)
clrw FACT2+2(%a6) clrw FACT2+2(%a6)
fsubx %fp1,%fp0 | ...X - (1/64)*INT(64 X) fsubx %fp1,%fp0 | ...X - (1/64)*INT(64 X)
movew (%a1)+,FACT2HI(%a6) movew (%a1)+,FACT2HI(%a6)
clrw FACT2HI+2(%a6) clrw FACT2HI+2(%a6)
clrl FACT2LOW(%a6) clrl FACT2LOW(%a6)
addw %d0,FACT1(%a6) addw %d0,FACT1(%a6)
fmulx LOG2,%fp0 | ...FP0 IS R fmulx LOG2,%fp0 | ...FP0 IS R
addw %d0,FACT2(%a6) addw %d0,FACT2(%a6)
...@@ -332,10 +332,10 @@ TENMAIN: ...@@ -332,10 +332,10 @@ TENMAIN:
fmovex %fp0,%fp1 fmovex %fp0,%fp1
fmuld L2TEN64,%fp1 | ...X*64*LOG10/LOG2 fmuld L2TEN64,%fp1 | ...X*64*LOG10/LOG2
fmovel %fp1,N(%a6) | ...N=INT(X*64*LOG10/LOG2) fmovel %fp1,N(%a6) | ...N=INT(X*64*LOG10/LOG2)
movel %d2,-(%sp) movel %d2,-(%sp)
lea EXPTBL,%a1 | ...LOAD ADDRESS OF TABLE OF 2^(J/64) lea EXPTBL,%a1 | ...LOAD ADDRESS OF TABLE OF 2^(J/64)
fmovel N(%a6),%fp1 | ...N --> FLOATING FMT fmovel N(%a6),%fp1 | ...N --> FLOATING FMT
movel N(%a6),%d0 movel N(%a6),%d0
movel %d0,%d2 movel %d0,%d2
...@@ -347,7 +347,7 @@ TENMAIN: ...@@ -347,7 +347,7 @@ TENMAIN:
asrl #1,%d0 | ...D0 IS M asrl #1,%d0 | ...D0 IS M
subl %d0,%d2 | ...d2 IS M', N = 64(M+M') + J subl %d0,%d2 | ...d2 IS M', N = 64(M+M') + J
addil #0x3FFF,%d2 addil #0x3FFF,%d2
movew %d2,ADJFACT(%a6) | ...ADJFACT IS 2^(M') movew %d2,ADJFACT(%a6) | ...ADJFACT IS 2^(M')
movel (%sp)+,%d2 movel (%sp)+,%d2
|--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64), |--SUMMARY: a1 IS ADDRESS FOR THE LEADING PORTION OF 2^(J/64),
...@@ -375,7 +375,7 @@ TENMAIN: ...@@ -375,7 +375,7 @@ TENMAIN:
clrl FACT2LOW(%a6) clrl FACT2LOW(%a6)
fmulx LOG10,%fp0 | ...FP0 IS R fmulx LOG10,%fp0 | ...FP0 IS R
addw %d0,FACT1(%a6) addw %d0,FACT1(%a6)
addw %d0,FACT2(%a6) addw %d0,FACT2(%a6)
...@@ -405,9 +405,9 @@ expr: ...@@ -405,9 +405,9 @@ expr:
fmulx %fp1,%fp2 | ...FP2 IS S*(A1+S*(A3+S*A5)) fmulx %fp1,%fp2 | ...FP2 IS S*(A1+S*(A3+S*A5))
faddx %fp3,%fp0 | ...FP0 IS R+R*S*(A2+S*A4) faddx %fp3,%fp0 | ...FP0 IS R+R*S*(A2+S*A4)
faddx %fp2,%fp0 | ...FP0 IS EXP(R) - 1 faddx %fp2,%fp0 | ...FP0 IS EXP(R) - 1
|--FINAL RECONSTRUCTION PROCESS |--FINAL RECONSTRUCTION PROCESS
|--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1) - (1 OR 0) |--EXP(X) = 2^M*2^(J/64) + 2^M*2^(J/64)*(EXP(R)-1) - (1 OR 0)
......
...@@ -6,19 +6,19 @@ ...@@ -6,19 +6,19 @@
| of indirection in do_func for monadic | of indirection in do_func for monadic
| functions. Dyadic functions require two | functions. Dyadic functions require two
| levels, and the tables are still contained | levels, and the tables are still contained
| in do_func. The table is arranged for | in do_func. The table is arranged for
| index with a 10-bit index, with the first | index with a 10-bit index, with the first
| 7 bits the opcode, and the remaining 3 | 7 bits the opcode, and the remaining 3
| the stag. For dyadic functions, all | the stag. For dyadic functions, all
| valid addresses are to the generic entry | valid addresses are to the generic entry
| point. | point.
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|TBLDO idnt 2,1 | Motorola 040 Floating Point Software Package |TBLDO idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -57,7 +57,7 @@ tblpre: ...@@ -57,7 +57,7 @@ tblpre:
.long smovcr |$00-7 fmovecr all .long smovcr |$00-7 fmovecr all
.long sint |$01-0 fint norm .long sint |$01-0 fint norm
.long szero |$01-1 fint zero .long szero |$01-1 fint zero
.long sinf |$01-2 fint inf .long sinf |$01-2 fint inf
.long src_nan |$01-3 fint nan .long src_nan |$01-3 fint nan
.long sintd |$01-4 fint denorm inx .long sintd |$01-4 fint denorm inx
......
...@@ -4,20 +4,20 @@ ...@@ -4,20 +4,20 @@
| This file contains routines used by other programs. | This file contains routines used by other programs.
| |
| ovf_res: used by overflow to force the correct | ovf_res: used by overflow to force the correct
| result. ovf_r_k, ovf_r_x2, ovf_r_x3 are | result. ovf_r_k, ovf_r_x2, ovf_r_x3 are
| derivatives of this routine. | derivatives of this routine.
| get_fline: get user's opcode word | get_fline: get user's opcode word
| g_dfmtou: returns the destination format. | g_dfmtou: returns the destination format.
| g_opcls: returns the opclass of the float instruction. | g_opcls: returns the opclass of the float instruction.
| g_rndpr: returns the rounding precision. | g_rndpr: returns the rounding precision.
| reg_dest: write byte, word, or long data to Dn | reg_dest: write byte, word, or long data to Dn
| |
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
|UTIL idnt 2,1 | Motorola 040 Floating Point Software Package |UTIL idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -39,13 +39,13 @@ ...@@ -39,13 +39,13 @@
| are unnecessary as ovf_res always returns the sign separately from | are unnecessary as ovf_res always returns the sign separately from
| the exponent. | the exponent.
| ;+inf | ;+inf
EXT_PINF: .long 0x7fff0000,0x00000000,0x00000000,0x00000000 EXT_PINF: .long 0x7fff0000,0x00000000,0x00000000,0x00000000
| ;largest +ext | ;largest +ext
EXT_PLRG: .long 0x7ffe0000,0xffffffff,0xffffffff,0x00000000 EXT_PLRG: .long 0x7ffe0000,0xffffffff,0xffffffff,0x00000000
| ;largest magnitude +sgl in ext | ;largest magnitude +sgl in ext
SGL_PLRG: .long 0x407e0000,0xffffff00,0x00000000,0x00000000 SGL_PLRG: .long 0x407e0000,0xffffff00,0x00000000,0x00000000
| ;largest magnitude +dbl in ext | ;largest magnitude +dbl in ext
DBL_PLRG: .long 0x43fe0000,0xffffffff,0xfffff800,0x00000000 DBL_PLRG: .long 0x43fe0000,0xffffffff,0xfffff800,0x00000000
| ;largest -ext | ;largest -ext
tblovfl: tblovfl:
...@@ -70,7 +70,7 @@ tblovfl: ...@@ -70,7 +70,7 @@ tblovfl:
| |
| ovf_r_k --- overflow result calculation | ovf_r_k --- overflow result calculation
| |
| This entry point is used by kernel_ex. | This entry point is used by kernel_ex.
| |
| This forces the destination precision to be extended | This forces the destination precision to be extended
| |
...@@ -79,7 +79,7 @@ tblovfl: ...@@ -79,7 +79,7 @@ tblovfl:
| |
.global ovf_r_k .global ovf_r_k
ovf_r_k: ovf_r_k:
lea ETEMP(%a6),%a0 |a0 points to source operand lea ETEMP(%a6),%a0 |a0 points to source operand
bclrb #sign_bit,ETEMP_EX(%a6) bclrb #sign_bit,ETEMP_EX(%a6)
sne ETEMP_SGN(%a6) |convert to internal IEEE format sne ETEMP_SGN(%a6) |convert to internal IEEE format
...@@ -112,10 +112,10 @@ ovf_e3_exc: ...@@ -112,10 +112,10 @@ ovf_e3_exc:
beql ovff_dbl |force precision is double beql ovff_dbl |force precision is double
movew CMDREG3B(%a6),%d0 |get the command word again movew CMDREG3B(%a6),%d0 |get the command word again
andil #0x7f,%d0 |clear all except operation andil #0x7f,%d0 |clear all except operation
cmpil #0x33,%d0 cmpil #0x33,%d0
beql ovf_fsgl |fsglmul or fsgldiv beql ovf_fsgl |fsglmul or fsgldiv
cmpil #0x30,%d0 cmpil #0x30,%d0
beql ovf_fsgl beql ovf_fsgl
bra ovf_fpcr |instruction is none of the above bra ovf_fpcr |instruction is none of the above
| ;use FPCR | ;use FPCR
ovf_e1_exc: ovf_e1_exc:
...@@ -129,10 +129,10 @@ ovf_e1_exc: ...@@ -129,10 +129,10 @@ ovf_e1_exc:
andil #0x0000007f,%d0 |clear all except the op code andil #0x0000007f,%d0 |clear all except the op code
cmpil #0x00000027,%d0 cmpil #0x00000027,%d0
beql ovf_fsgl |fsglmul beql ovf_fsgl |fsglmul
cmpil #0x00000024,%d0 cmpil #0x00000024,%d0
beql ovf_fsgl |fsgldiv beql ovf_fsgl |fsgldiv
bra ovf_fpcr |none of the above, use FPCR bra ovf_fpcr |none of the above, use FPCR
| |
| |
| Inst is either fsgldiv or fsglmul. Force extended precision. | Inst is either fsgldiv or fsglmul. Force extended precision.
| |
...@@ -152,7 +152,7 @@ ovff_dbl: ...@@ -152,7 +152,7 @@ ovff_dbl:
ovf_fpcr: ovf_fpcr:
bfextu FPCR_MODE(%a6){#0:#2},%d0 |set round precision bfextu FPCR_MODE(%a6){#0:#2},%d0 |set round precision
bra ovf_res bra ovf_res
| |
| |
| ovf_r_x3 --- overflow result calculation | ovf_r_x3 --- overflow result calculation
...@@ -174,9 +174,9 @@ ovf_r_x3: ...@@ -174,9 +174,9 @@ ovf_r_x3:
| ovf_res --- overflow result calculation | ovf_res --- overflow result calculation
| |
| Input: | Input:
| a0 points to operand in internal extended format | a0 points to operand in internal extended format
| Output: | Output:
| a0 points to result in internal extended format | a0 points to result in internal extended format
| |
.global ovf_res .global ovf_res
ovf_res: ovf_res:
...@@ -192,7 +192,7 @@ ovf_res: ...@@ -192,7 +192,7 @@ ovf_res:
EXT_RN: EXT_RN:
leal EXT_PINF,%a1 |answer is +/- infinity leal EXT_PINF,%a1 |answer is +/- infinity
bsetb #inf_bit,FPSR_CC(%a6) bsetb #inf_bit,FPSR_CC(%a6)
bra set_sign |now go set the sign bra set_sign |now go set the sign
EXT_RZ: EXT_RZ:
leal EXT_PLRG,%a1 |answer is +/- large number leal EXT_PLRG,%a1 |answer is +/- large number
bra set_sign |now go set the sign bra set_sign |now go set the sign
...@@ -312,10 +312,10 @@ get_fline: ...@@ -312,10 +312,10 @@ get_fline:
movel (%a7)+,%d0 movel (%a7)+,%d0
rts rts
| |
| g_rndpr --- put rounding precision in d0{1:0} | g_rndpr --- put rounding precision in d0{1:0}
| |
| valid return codes are: | valid return codes are:
| 00 - extended | 00 - extended
| 01 - single | 01 - single
| 10 - double | 10 - double
| |
...@@ -350,7 +350,7 @@ g_rndpr: ...@@ -350,7 +350,7 @@ g_rndpr:
| For move out instructions (opclass 011) the destination format | For move out instructions (opclass 011) the destination format
| is the same as the rounding precision. Pass results from g_dfmtou. | is the same as the rounding precision. Pass results from g_dfmtou.
| |
bsr g_dfmtou bsr g_dfmtou
rts rts
op_0x0: op_0x0:
btstb #E3,E_BYTE(%a6) btstb #E3,E_BYTE(%a6)
...@@ -364,7 +364,7 @@ unf_e3_exc: ...@@ -364,7 +364,7 @@ unf_e3_exc:
beql unff_dbl beql unff_dbl
movew CMDREG3B(%a6),%d0 |get the command word again movew CMDREG3B(%a6),%d0 |get the command word again
andil #0x7f,%d0 |clear all except operation andil #0x7f,%d0 |clear all except operation
cmpil #0x33,%d0 cmpil #0x33,%d0
beql unf_fsgl |fsglmul or fsgldiv beql unf_fsgl |fsglmul or fsgldiv
cmpil #0x30,%d0 cmpil #0x30,%d0
beql unf_fsgl |fsgldiv or fsglmul beql unf_fsgl |fsgldiv or fsglmul
...@@ -408,7 +408,7 @@ unff_dbl: ...@@ -408,7 +408,7 @@ unff_dbl:
| Force extended | Force extended
| |
unf_fsgl: unf_fsgl:
movel #0,%d0 movel #0,%d0
rts rts
| |
| Get rounding precision set in FPCR{7:6}. | Get rounding precision set in FPCR{7:6}.
...@@ -436,7 +436,7 @@ opc_1b: ...@@ -436,7 +436,7 @@ opc_1b:
| If E1, the format is from cmdreg1b{12:10} | If E1, the format is from cmdreg1b{12:10}
| If E3, the format is extended. | If E3, the format is extended.
| |
| Dest. Fmt. | Dest. Fmt.
| extended 010 -> 00 | extended 010 -> 00
| single 001 -> 01 | single 001 -> 01
| double 101 -> 10 | double 101 -> 10
...@@ -468,26 +468,26 @@ not_dbl: ...@@ -468,26 +468,26 @@ not_dbl:
| are unnecessary as unf_sub always returns the sign separately from | are unnecessary as unf_sub always returns the sign separately from
| the exponent. | the exponent.
| ;+zero | ;+zero
EXT_PZRO: .long 0x00000000,0x00000000,0x00000000,0x00000000 EXT_PZRO: .long 0x00000000,0x00000000,0x00000000,0x00000000
| ;+zero | ;+zero
SGL_PZRO: .long 0x3f810000,0x00000000,0x00000000,0x00000000 SGL_PZRO: .long 0x3f810000,0x00000000,0x00000000,0x00000000
| ;+zero | ;+zero
DBL_PZRO: .long 0x3c010000,0x00000000,0x00000000,0x00000000 DBL_PZRO: .long 0x3c010000,0x00000000,0x00000000,0x00000000
| ;smallest +ext denorm | ;smallest +ext denorm
EXT_PSML: .long 0x00000000,0x00000000,0x00000001,0x00000000 EXT_PSML: .long 0x00000000,0x00000000,0x00000001,0x00000000
| ;smallest +sgl denorm | ;smallest +sgl denorm
SGL_PSML: .long 0x3f810000,0x00000100,0x00000000,0x00000000 SGL_PSML: .long 0x3f810000,0x00000100,0x00000000,0x00000000
| ;smallest +dbl denorm | ;smallest +dbl denorm
DBL_PSML: .long 0x3c010000,0x00000000,0x00000800,0x00000000 DBL_PSML: .long 0x3c010000,0x00000000,0x00000800,0x00000000
| |
| UNF_SUB --- underflow result calculation | UNF_SUB --- underflow result calculation
| |
| Input: | Input:
| d0 contains round precision | d0 contains round precision
| a0 points to input operand in the internal extended format | a0 points to input operand in the internal extended format
| |
| Output: | Output:
| a0 points to correct internal extended precision result. | a0 points to correct internal extended precision result.
| |
tblunf: tblunf:
...@@ -522,7 +522,7 @@ unf_sub: ...@@ -522,7 +522,7 @@ unf_sub:
uEXT_RN: uEXT_RN:
leal EXT_PZRO,%a1 |answer is +/- zero leal EXT_PZRO,%a1 |answer is +/- zero
bsetb #z_bit,FPSR_CC(%a6) bsetb #z_bit,FPSR_CC(%a6)
bra uset_sign |now go set the sign bra uset_sign |now go set the sign
uEXT_RZ: uEXT_RZ:
leal EXT_PZRO,%a1 |answer is +/- zero leal EXT_PZRO,%a1 |answer is +/- zero
bsetb #z_bit,FPSR_CC(%a6) bsetb #z_bit,FPSR_CC(%a6)
...@@ -629,7 +629,7 @@ end_unfr: ...@@ -629,7 +629,7 @@ end_unfr:
| |
| |
| Input: | Input:
| L_SCR1: Data | L_SCR1: Data
| d1: data size and dest register number formatted as: | d1: data size and dest register number formatted as:
| |
| 32 5 4 3 2 1 0 | 32 5 4 3 2 1 0
......
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
X_BSUN: |idnt 2,1 | Motorola 040 Floating Point Software Package X_BSUN: |idnt 2,1 | Motorola 040 Floating Point Software Package
......
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
X_FLINE: |idnt 2,1 | Motorola 040 Floating Point Software Package X_FLINE: |idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -52,7 +52,7 @@ fpsp_fline: ...@@ -52,7 +52,7 @@ fpsp_fline:
leal L_SCR1(%a6),%a1 |use L_SCR1 as scratch leal L_SCR1(%a6),%a1 |use L_SCR1 as scratch
movel #4,%d0 movel #4,%d0
addl #4,%a6 |to offset the sub.l #4,a7 above so that addl #4,%a6 |to offset the sub.l #4,a7 above so that
| ;a6 can point correctly to the stack frame | ;a6 can point correctly to the stack frame
| ;before branching to mem_read | ;before branching to mem_read
bsrl mem_read bsrl mem_read
subl #4,%a6 subl #4,%a6
...@@ -62,7 +62,7 @@ fpsp_fline: ...@@ -62,7 +62,7 @@ fpsp_fline:
bne not_mvcr |exit if not bne not_mvcr |exit if not
bfextu %d0{#16:#6},%d1 bfextu %d0{#16:#6},%d1
cmpib #0x17,%d1 |check if it is an FMOVECR encoding cmpib #0x17,%d1 |check if it is an FMOVECR encoding
bne not_mvcr bne not_mvcr
| ;if an FMOVECR instruction, fix stack | ;if an FMOVECR instruction, fix stack
| ;and go to FPSP_UNIMP | ;and go to FPSP_UNIMP
fix_stack: fix_stack:
......
...@@ -13,8 +13,8 @@ ...@@ -13,8 +13,8 @@
| the dest format is integer (b, w, l) and the operr is caused by | the dest format is integer (b, w, l) and the operr is caused by
| integer overflow, or the source op is inf, then the result stored is | integer overflow, or the source op is inf, then the result stored is
| garbage. | garbage.
| There are three cases in which operr is incorrectly signaled on the | There are three cases in which operr is incorrectly signaled on the
| 040. This occurs for move_out of format b, w, or l for the largest | 040. This occurs for move_out of format b, w, or l for the largest
| negative integer (-2^7 for b, -2^15 for w, -2^31 for l). | negative integer (-2^7 for b, -2^15 for w, -2^31 for l).
| |
| On opclass = 011 fmove.(b,w,l) that causes a conversion | On opclass = 011 fmove.(b,w,l) that causes a conversion
...@@ -36,15 +36,15 @@ ...@@ -36,15 +36,15 @@
| Note 2: For trap enabled 040 does the following: | Note 2: For trap enabled 040 does the following:
| If the inst is move_out, then same as Note 1. | If the inst is move_out, then same as Note 1.
| If the inst is not move_out, the dest is not modified. | If the inst is not move_out, the dest is not modified.
| The exceptional operand is not defined for integer overflow | The exceptional operand is not defined for integer overflow
| during a move_out. | during a move_out.
| |
| Copyright (C) Motorola, Inc. 1990 | Copyright (C) Motorola, Inc. 1990
| All Rights Reserved | All Rights Reserved
| |
| THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA | THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF MOTOROLA
| The copyright notice above does not evidence any | The copyright notice above does not evidence any
| actual or intended publication of such source code. | actual or intended publication of such source code.
X_OPERR: |idnt 2,1 | Motorola 040 Floating Point Software Package X_OPERR: |idnt 2,1 | Motorola 040 Floating Point Software Package
...@@ -77,7 +77,7 @@ fpsp_operr: ...@@ -77,7 +77,7 @@ fpsp_operr:
beqs operr_end beqs operr_end
| |
| If the destination size is B,W,or L, the operr must be | If the destination size is B,W,or L, the operr must be
| handled here. | handled here.
| |
movel CMDREG1B(%a6),%d0 movel CMDREG1B(%a6),%d0
...@@ -90,9 +90,9 @@ fpsp_operr: ...@@ -90,9 +90,9 @@ fpsp_operr:
beq operr_byte beq operr_byte
| |
| The size is not B,W,or L, so the operr is handled by the | The size is not B,W,or L, so the operr is handled by the
| kernel handler. Set the operr bits and clean up, leaving | kernel handler. Set the operr bits and clean up, leaving
| only the integer exception frame on the stack, and the | only the integer exception frame on the stack, and the
| fpu in the original exceptional state. | fpu in the original exceptional state.
| |
operr_end: operr_end:
...@@ -111,7 +111,7 @@ operr_long: ...@@ -111,7 +111,7 @@ operr_long:
moveb STAG(%a6),%d0 |test stag for nan moveb STAG(%a6),%d0 |test stag for nan
andib #0xe0,%d0 |clr all but tag andib #0xe0,%d0 |clr all but tag
cmpib #0x60,%d0 |check for nan cmpib #0x60,%d0 |check for nan
beq operr_nan beq operr_nan
cmpil #0x80000000,FPTEMP_LO(%a6) |test if ls lword is special cmpil #0x80000000,FPTEMP_LO(%a6) |test if ls lword is special
bnes chklerr |if not equal, check for incorrect operr bnes chklerr |if not equal, check for incorrect operr
bsr check_upper |check if exp and ms mant are special bsr check_upper |check if exp and ms mant are special
...@@ -158,7 +158,7 @@ operr_word: ...@@ -158,7 +158,7 @@ operr_word:
moveb STAG(%a6),%d0 |test stag for nan moveb STAG(%a6),%d0 |test stag for nan
andib #0xe0,%d0 |clr all but tag andib #0xe0,%d0 |clr all but tag
cmpib #0x60,%d0 |check for nan cmpib #0x60,%d0 |check for nan
beq operr_nan beq operr_nan
cmpil #0xffff8000,FPTEMP_LO(%a6) |test if ls lword is special cmpil #0xffff8000,FPTEMP_LO(%a6) |test if ls lword is special
bnes chkwerr |if not equal, check for incorrect operr bnes chkwerr |if not equal, check for incorrect operr
bsr check_upper |check if exp and ms mant are special bsr check_upper |check if exp and ms mant are special
...@@ -185,7 +185,7 @@ operr_byte: ...@@ -185,7 +185,7 @@ operr_byte:
moveb STAG(%a6),%d0 |test stag for nan moveb STAG(%a6),%d0 |test stag for nan
andib #0xe0,%d0 |clr all but tag andib #0xe0,%d0 |clr all but tag
cmpib #0x60,%d0 |check for nan cmpib #0x60,%d0 |check for nan
beqs operr_nan beqs operr_nan
cmpil #0xffffff80,FPTEMP_LO(%a6) |test if ls lword is special cmpil #0xffffff80,FPTEMP_LO(%a6) |test if ls lword is special
bnes chkberr |if not equal, check for incorrect operr bnes chkberr |if not equal, check for incorrect operr
bsr check_upper |check if exp and ms mant are special bsr check_upper |check if exp and ms mant are special
...@@ -229,7 +229,7 @@ store_max: ...@@ -229,7 +229,7 @@ store_max:
bclrb #inex2_bit,FPSR_EXCEPT(%a6) bclrb #inex2_bit,FPSR_EXCEPT(%a6)
bclrb #ainex_bit,FPSR_AEXCEPT(%a6) bclrb #ainex_bit,FPSR_AEXCEPT(%a6)
fmovel #0,%FPSR fmovel #0,%FPSR
tstw FPTEMP_EX(%a6) |check sign tstw FPTEMP_EX(%a6) |check sign
blts load_neg blts load_neg
movel #0x7fffffff,%d0 movel #0x7fffffff,%d0
...@@ -280,7 +280,7 @@ dest_mem: ...@@ -280,7 +280,7 @@ dest_mem:
bsrl mem_write bsrl mem_write
rts rts
| |
| Check the exponent for $c000 and the upper 32 bits of the | Check the exponent for $c000 and the upper 32 bits of the
| mantissa for $ffffffff. If both are true, return d0 clr | mantissa for $ffffffff. If both are true, return d0 clr
| and store the lower n bits of the least lword of FPTEMP | and store the lower n bits of the least lword of FPTEMP
| to d0 for write out. If not, it is a real operr, and set d0. | to d0 for write out. If not, it is a real operr, and set d0.
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -5,10 +5,10 @@ M68060 Software Package ...@@ -5,10 +5,10 @@ M68060 Software Package
Production Release P1.00 -- October 10, 1994 Production Release P1.00 -- October 10, 1994
M68060 Software Package Copyright © 1993, 1994 Motorola Inc. All rights reserved. M68060 Software Package Copyright © 1993, 1994 Motorola Inc. All rights reserved.
THE SOFTWARE is provided on an "AS IS" basis and without warranty. THE SOFTWARE is provided on an "AS IS" basis and without warranty.
To the maximum extent permitted by applicable law, To the maximum extent permitted by applicable law,
MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED, MOTOROLA DISCLAIMS ALL WARRANTIES WHETHER EXPRESS OR IMPLIED,
INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE INCLUDING IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE
and any warranty against infringement with regard to the SOFTWARE and any warranty against infringement with regard to the SOFTWARE
(INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials. (INCLUDING ANY MODIFIED VERSIONS THEREOF) and any accompanying written materials.
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment