428 lines
4.4 KiB
ArmAsm
428 lines
4.4 KiB
ArmAsm
/ fp1 -- floating point simulator
|
|
|
|
rti = 2
|
|
bpt = 3
|
|
|
|
m.ext = 200 / long mode bit
|
|
m.lngi = 100 / long integer mode
|
|
|
|
.globl fptrap
|
|
.globl ac0, ac1, ac2, ac3
|
|
|
|
fptrap:
|
|
dec reenter
|
|
bge 1f
|
|
4 / reentered!
|
|
1:
|
|
mov (sp)+,spc
|
|
mov (sp)+,sps
|
|
mov r0,sr0
|
|
mov $sr1,r0
|
|
mov r1,(r0)+
|
|
mov r2,(r0)+
|
|
mov r3,(r0)+
|
|
mov r4,(r0)+
|
|
mov r5,(r0)+
|
|
mov sp,(r0)+
|
|
sub $8,sp / room for double push
|
|
mov (r0),r5 / pc
|
|
clr trapins
|
|
mov -(r5),r5 / trapped instruction
|
|
mov r5,r4
|
|
bic $7777,r4
|
|
cmp r4,$170000
|
|
beq 1f
|
|
jmp badins
|
|
1:
|
|
bic $100000,fpsr / clear fp error
|
|
bic $170000,r5
|
|
mov r5,r4
|
|
bit $7000,r4
|
|
bne class3
|
|
bit $700,r4
|
|
bne class2
|
|
cmp r4,$12
|
|
blos 1f
|
|
jmp badins
|
|
1:
|
|
asl r4
|
|
jmp *1f(r4)
|
|
|
|
.data
|
|
1:
|
|
i.cfcc / 170000
|
|
i.setf / 170001
|
|
i.seti / 170002
|
|
badins
|
|
badins
|
|
badins
|
|
badins
|
|
badins
|
|
badins
|
|
i.setd / 170011
|
|
i.setl / 170012
|
|
.text
|
|
|
|
class2:
|
|
cmp r5,$400
|
|
bge 1f
|
|
jsr r1,fsrc; mod0rx; mod242
|
|
br 2f
|
|
1:
|
|
jsr r1,fsrc; mod0f; mod24f
|
|
2:
|
|
mov r3,r5
|
|
asl r4
|
|
asl r4
|
|
clrb r4
|
|
swab r4
|
|
asl r4
|
|
jsr pc,*1f(r4)
|
|
jmp sret
|
|
|
|
.data
|
|
1:
|
|
badins / 1700xx
|
|
i.ldfps / 1701xx
|
|
i.stfps / 1702xx
|
|
badins / 1703xx - stst
|
|
i.clrx / 1704xx
|
|
i.tstx / 1705xx
|
|
i.absx / 1706xx
|
|
i.negx / 1707xx
|
|
.text
|
|
|
|
class3:
|
|
cmp r5,$5000
|
|
blt 1f
|
|
mov r5,r2
|
|
clrb r2
|
|
cmp r2,$6400
|
|
blt 2f
|
|
sub $1400,r2
|
|
2:
|
|
cmp r2,$5000
|
|
bne 2f
|
|
jsr r1,fsrc; mod0rx; mod242
|
|
br 3f
|
|
2:
|
|
cmp r2,$5400
|
|
bne 2f
|
|
jsr r1,fsrc; mod0ra; mod24i
|
|
br 3f
|
|
2:
|
|
jsr r1,fsrc; mod0f; mod24d
|
|
br 3f
|
|
1:
|
|
jsr r1,fsrc; mod0f; mod24f
|
|
3:
|
|
jsr pc,freg
|
|
mov r2,r5
|
|
clrb r4
|
|
swab r4
|
|
asl r4
|
|
jsr pc,*1f(r4)
|
|
br sret
|
|
|
|
.data
|
|
1:
|
|
badins / 1700xx
|
|
badins / 1704xx
|
|
i.mulx / 1710xx
|
|
i.modx / 1714xx
|
|
i.addx / 1720xx
|
|
i.ldx / 1724xx
|
|
i.subx / 1730xx
|
|
i.cmpx / 1734xx
|
|
i.stx / 1740xx
|
|
i.divx / 1744xx
|
|
i.stexp / 1750xx
|
|
i.stcxj / 1754xx
|
|
i.stcxy / 1760xx
|
|
i.ldexp / 1764xx
|
|
i.ldcjx / 1770xx
|
|
i.ldcyx / 1774xx
|
|
.text
|
|
|
|
i.cfcc:
|
|
mov fpsr,r0
|
|
bic $!17,r0
|
|
mov r0,sps
|
|
br ret
|
|
|
|
i.setf:
|
|
bic $m.ext,fpsr
|
|
br ret
|
|
|
|
i.setd:
|
|
bis $m.ext,fpsr
|
|
br ret
|
|
|
|
i.seti:
|
|
bic $m.lngi,fpsr
|
|
br ret
|
|
|
|
i.setl:
|
|
bis $m.lngi,fpsr
|
|
br ret
|
|
|
|
badins:
|
|
inc trapins
|
|
br ret
|
|
|
|
sret:
|
|
mov $fpsr,r0
|
|
bic $17,(r0)
|
|
tst (r5)
|
|
bpl 1f
|
|
bis $10,(r0)
|
|
br ret
|
|
1:
|
|
bne ret
|
|
bis $4,(r0)
|
|
|
|
ret:
|
|
mov $sr1,r0
|
|
mov (r0)+,r1
|
|
mov (r0)+,r2
|
|
mov (r0)+,r3
|
|
mov (r0)+,r4
|
|
mov (r0)+,r5
|
|
mov (r0)+,sp
|
|
mov sr0,r0
|
|
mov sps,-(sp)
|
|
mov spc,-(sp)
|
|
tst trapins
|
|
bne 1f
|
|
inc reenter
|
|
rti
|
|
1:
|
|
bpt
|
|
|
|
freg:
|
|
mov r5,r2
|
|
bic $!300,r2
|
|
asr r2
|
|
asr r2
|
|
asr r2
|
|
add $ac0,r2
|
|
rts pc
|
|
|
|
fsrc:
|
|
mov r5,r3
|
|
bic $!7,r3 / register
|
|
asl r3
|
|
add $sr0,r3
|
|
mov r5,r0
|
|
bic $!70,r0 / mode
|
|
asr r0
|
|
asr r0
|
|
jmp *1f(r0)
|
|
|
|
.data
|
|
1:
|
|
mod0
|
|
mod1
|
|
mod2
|
|
mod3
|
|
mod4
|
|
mod5
|
|
mod6
|
|
mod7
|
|
.text
|
|
|
|
mod24f:
|
|
mov $4,r0
|
|
bit $m.ext,fpsr
|
|
beq 1f
|
|
add $4,r0
|
|
1:
|
|
rts pc
|
|
|
|
mod24d:
|
|
mov $8,r0
|
|
bit $m.ext,fpsr
|
|
beq 1f
|
|
sub $4,r0
|
|
1:
|
|
rts pc
|
|
|
|
mod242:
|
|
mov $2,r0
|
|
rts pc
|
|
|
|
mod24i:
|
|
mov $2,r0
|
|
bit $m.lngi,fpsr
|
|
beq 1f
|
|
add $2,r0
|
|
1:
|
|
rts pc
|
|
|
|
mod0:
|
|
jmp *(r1)+
|
|
|
|
mod0f:
|
|
sub $sr0,r3 / get fp ac
|
|
cmp r3,$6*2
|
|
bhis badi1
|
|
asl r3
|
|
asl r3
|
|
add $ac0,r3
|
|
tst (r1)+
|
|
rts r1
|
|
|
|
mod0ra:
|
|
bit $m.lngi,fpsr
|
|
bne badi1
|
|
|
|
mod0r:
|
|
cmp r3,$ssp
|
|
bhis badi1
|
|
mod0rx:
|
|
tst (r1)+
|
|
rts r1
|
|
|
|
mod1:
|
|
cmp r3,$spc
|
|
beq badi1
|
|
mov (r3),r3
|
|
br check
|
|
|
|
mod2:
|
|
mov (r3),-(sp)
|
|
jsr pc,*2(r1)
|
|
cmp r3,$spc
|
|
bne 1f
|
|
mov $2,r0
|
|
mov *(r3),pctmp
|
|
mov $pctmp,(sp)
|
|
1:
|
|
add r0,(r3)
|
|
mov (sp)+,r3
|
|
br check
|
|
|
|
mod3:
|
|
mov *(r3),-(sp)
|
|
add $2,(r3)
|
|
mov (sp)+,r3
|
|
br check
|
|
|
|
mod4:
|
|
cmp r3,$spc / test pc
|
|
beq badi1
|
|
jsr pc,*2(r1)
|
|
sub r0,(r3)
|
|
mov (r3),r3
|
|
br check
|
|
|
|
mod5:
|
|
cmp r3,$spc
|
|
beq badi1
|
|
sub $2,(r3)
|
|
mov *(r3),r3
|
|
br check
|
|
|
|
mod6:
|
|
mov *spc,-(sp)
|
|
add $2,spc
|
|
add (r3),(sp)
|
|
mov (sp)+,r3
|
|
br check
|
|
|
|
mod7:
|
|
jsr r1,mod6; ..; ..
|
|
mov (r3),r3
|
|
br check
|
|
|
|
badi1:
|
|
jmp badins
|
|
|
|
check:
|
|
bit $1,r3
|
|
bne badi1
|
|
cmp (r1)+,(r1)+
|
|
rts r1
|
|
|
|
setab:
|
|
mov $asign,r0
|
|
jsr pc,seta
|
|
mov r3,r2
|
|
mov $bsign,r0
|
|
|
|
seta:
|
|
clr (r0)
|
|
mov (r2)+,r1
|
|
mov r1,-(sp)
|
|
beq 1f
|
|
blt 2f
|
|
inc (r0)+
|
|
br 3f
|
|
2:
|
|
dec (r0)+
|
|
3:
|
|
bic $!177,r1
|
|
bis $200,r1
|
|
br 2f
|
|
1:
|
|
clr (r0)+
|
|
2:
|
|
mov r1,(r0)+
|
|
mov (r2)+,(r0)+
|
|
bit $m.ext,fpsr
|
|
beq 2f
|
|
mov (r2)+,(r0)+
|
|
mov (r2)+,(r0)+
|
|
br 3f
|
|
2:
|
|
clr (r0)+
|
|
clr (r0)+
|
|
3:
|
|
mov (sp)+,r1
|
|
asl r1
|
|
clrb r1
|
|
swab r1
|
|
sub $200,r1
|
|
mov r1,(r0)+ / exp
|
|
rts pc
|
|
|
|
norm:
|
|
mov $areg,r0
|
|
mov (r0)+,r1
|
|
mov r1,-(sp)
|
|
mov (r0)+,r2
|
|
bis r2,(sp)
|
|
mov (r0)+,r3
|
|
bis r3,(sp)
|
|
mov (r0)+,r4
|
|
bis r4,(sp)+
|
|
bne 1f
|
|
clr asign
|
|
rts pc
|
|
1:
|
|
bit $!377,r1
|
|
beq 1f
|
|
clc
|
|
ror r1
|
|
ror r2
|
|
ror r3
|
|
ror r4
|
|
inc (r0)
|
|
br 1b
|
|
1:
|
|
bit $200,r1
|
|
bne 1f
|
|
asl r4
|
|
rol r3
|
|
rol r2
|
|
rol r1
|
|
dec (r0)
|
|
br 1b
|
|
1:
|
|
mov r4,-(r0)
|
|
mov r3,-(r0)
|
|
mov r2,-(r0)
|
|
mov r1,-(r0)
|
|
rts pc
|
|
|