336 lines
3.3 KiB
ArmAsm
336 lines
3.3 KiB
ArmAsm
/ fp3 -- floating simulation
|
|
|
|
i.addx:
|
|
jsr pc,setab
|
|
br 1f
|
|
|
|
i.subx:
|
|
jsr pc,setab
|
|
neg bsign
|
|
1:
|
|
tst bsign
|
|
beq reta
|
|
tst asign
|
|
beq retb
|
|
mov areg+8,r1
|
|
sub breg+8,r1
|
|
blt 1f
|
|
beq 2f
|
|
cmp r1,$56.
|
|
bge reta
|
|
mov $breg,r0
|
|
br 4f
|
|
1:
|
|
neg r1
|
|
cmp r1,$56.
|
|
bge retb
|
|
mov $areg,r0
|
|
4:
|
|
mov r1,-(sp)
|
|
mov (r0)+,r1
|
|
mov (r0)+,r2
|
|
mov (r0)+,r3
|
|
mov (r0)+,r4
|
|
add (sp),(r0)
|
|
1:
|
|
clc
|
|
ror r1
|
|
ror r2
|
|
ror r3
|
|
ror r4
|
|
dec (sp)
|
|
bgt 1b
|
|
mov r4,-(r0)
|
|
mov r3,-(r0)
|
|
mov r2,-(r0)
|
|
mov r1,-(r0)
|
|
tst (sp)+
|
|
2:
|
|
mov $areg+8,r1
|
|
mov $breg+8,r2
|
|
mov $4,r0
|
|
cmp asign,bsign
|
|
bne 4f
|
|
clc
|
|
1:
|
|
adc -(r1)
|
|
bcs 3f
|
|
add -(r2),(r1)
|
|
2:
|
|
dec r0
|
|
bne 1b
|
|
br 5f
|
|
3:
|
|
add -(r2),(r1)
|
|
sec
|
|
br 2b
|
|
br 5f
|
|
4:
|
|
clc
|
|
1:
|
|
sbc -(r1)
|
|
bcs 3f
|
|
sub -(r2),(r1)
|
|
2:
|
|
dec r0
|
|
bne 1b
|
|
br 5f
|
|
3:
|
|
sub -(r2),(r1)
|
|
sec
|
|
br 2b
|
|
|
|
saret:
|
|
mov $areg,r1
|
|
5:
|
|
tst (r1)
|
|
bge 3f
|
|
mov $areg+8,r1
|
|
mov $4,r0
|
|
clc
|
|
1:
|
|
adc -(r1)
|
|
bcs 2f
|
|
neg (r1)
|
|
2:
|
|
dec r0
|
|
bne 1b
|
|
neg -(r1)
|
|
3:
|
|
jsr pc,norm
|
|
br reta
|
|
|
|
retb:
|
|
mov $bsign,r1
|
|
mov $asign,r2
|
|
mov $6,r0
|
|
1:
|
|
mov (r1)+,(r2)+
|
|
dec r0
|
|
bne 1b
|
|
|
|
reta:
|
|
mov r5,r2
|
|
mov $asign,r0
|
|
tst (r0)
|
|
beq unflo
|
|
mov aexp,r1
|
|
cmp r1,$177
|
|
bgt ovflo
|
|
cmp r1,$-177
|
|
blt unflo
|
|
add $200,r1
|
|
swab r1
|
|
clc
|
|
ror r1
|
|
tst (r0)+
|
|
bge 1f
|
|
bis $100000,r1
|
|
1:
|
|
bic $!177,(r0)
|
|
bis (r0)+,r1
|
|
mov r1,(r2)+
|
|
mov (r0)+,(r2)+
|
|
bit $m.ext,fpsr
|
|
beq 1f
|
|
mov (r0)+,(r2)+
|
|
mov (r0)+,(r2)+
|
|
1:
|
|
rts pc
|
|
|
|
unflo:
|
|
clr (r2)+
|
|
clr (r2)+
|
|
bit $m.ext,fpsr
|
|
beq 1f
|
|
clr (r2)+
|
|
clr (r2)+
|
|
1:
|
|
rts pc
|
|
|
|
ovflo:
|
|
bis $2,fpsr / set v-bit (overflow)
|
|
jmp ret
|
|
|
|
i.mulx:
|
|
jsr pc,i.mul
|
|
br saret
|
|
|
|
i.modx:
|
|
jsr pc,i.mul
|
|
jsr pc,norm
|
|
mov $asign,r0
|
|
mov $bsign,r1
|
|
mov $6,r2
|
|
1:
|
|
mov (r0)+,(r1)+
|
|
dec r2
|
|
bne 1b
|
|
clr r0 / count
|
|
mov $200,r1 / bit
|
|
clr r2 / reg offset
|
|
1:
|
|
cmp r0,aexp
|
|
bge 2f / in fraction
|
|
bic r1,areg(r2)
|
|
br 3f
|
|
2:
|
|
bic r1,breg(r2)
|
|
3:
|
|
inc r0
|
|
clc
|
|
ror r1
|
|
bne 1b
|
|
mov $100000,r1
|
|
add $2,r2
|
|
cmp r2,$8
|
|
blt 1b
|
|
jsr pc,norm
|
|
jsr pc,reta
|
|
cmp r5,$ac1
|
|
beq 1f
|
|
cmp r5,$ac3
|
|
beq 1f
|
|
bit $200,breg
|
|
bne 2f
|
|
clr bsign
|
|
2:
|
|
add $8,r5
|
|
jsr pc,retb
|
|
sub $8,r5
|
|
1:
|
|
rts pc
|
|
|
|
i.divx:
|
|
jsr pc,setab
|
|
tst bsign
|
|
beq ovflo
|
|
sub bexp,aexp
|
|
jsr pc,xorsign
|
|
mov r5,-(sp)
|
|
mov $areg,r0
|
|
mov (r0),r1
|
|
clr (r0)+
|
|
mov (r0),r2
|
|
clr (r0)+
|
|
mov (r0),r3
|
|
clr (r0)+
|
|
mov (r0),r4
|
|
clr (r0)+
|
|
mov $areg,r5
|
|
mov $400,-(sp)
|
|
1:
|
|
mov $breg,r0
|
|
cmp (r0)+,r1
|
|
blt 2f
|
|
bgt 3f
|
|
cmp (r0)+,r2
|
|
blo 2f
|
|
bhi 3f
|
|
cmp (r0)+,r3
|
|
blo 2f
|
|
bhi 3f
|
|
cmp (r0)+,r4
|
|
bhi 3f
|
|
2:
|
|
mov $breg,r0
|
|
sub (r0)+,r1
|
|
clr -(sp)
|
|
sub (r0)+,r2
|
|
adc (sp)
|
|
clr -(sp)
|
|
sub (r0)+,r3
|
|
adc (sp)
|
|
sub (r0)+,r4
|
|
sbc r3
|
|
adc (sp)
|
|
sub (sp)+,r2
|
|
adc (sp)
|
|
sub (sp)+,r1
|
|
bis (sp),(r5)
|
|
3:
|
|
asl r4
|
|
rol r3
|
|
rol r2
|
|
rol r1
|
|
clc
|
|
ror (sp)
|
|
bne 1b
|
|
mov $100000,(sp)
|
|
add $2,r5
|
|
cmp r5,$areg+8
|
|
blo 1b
|
|
tst (sp)+
|
|
mov (sp)+,r5
|
|
jmp saret
|
|
|
|
|
|
i.mul:
|
|
jsr pc,setab
|
|
add bexp,aexp
|
|
dec aexp
|
|
jsr pc,xorsign
|
|
mov r5,-(sp)
|
|
mov $breg+4,r5
|
|
bit $m.ext,fpsr
|
|
beq 1f
|
|
add $4,r5
|
|
1:
|
|
clr r0
|
|
clr r1
|
|
clr r2
|
|
clr r3
|
|
clr r4
|
|
1:
|
|
asl r0
|
|
bne 2f
|
|
inc r0
|
|
tst -(r5)
|
|
2:
|
|
cmp r0,$400
|
|
bne 2f
|
|
cmp r5,$breg
|
|
bhi 2f
|
|
mov $areg,r0
|
|
mov r1,(r0)+
|
|
mov r2,(r0)+
|
|
mov r3,(r0)+
|
|
mov r4,(r0)+
|
|
mov (sp)+,r5
|
|
rts pc
|
|
2:
|
|
clc
|
|
ror r1
|
|
ror r2
|
|
ror r3
|
|
ror r4
|
|
bit r0,(r5)
|
|
beq 1b
|
|
mov r0,-(sp)
|
|
mov $areg,r0
|
|
add (r0)+,r1
|
|
clr -(sp)
|
|
add (r0)+,r2
|
|
adc (sp)
|
|
clr -(sp)
|
|
add (r0)+,r3
|
|
adc (sp)
|
|
add (r0)+,r4
|
|
adc r3
|
|
adc (sp)
|
|
add (sp)+,r2
|
|
adc (sp)
|
|
add (sp)+,r1
|
|
mov (sp)+,r0
|
|
br 1b
|
|
|
|
xorsign:
|
|
cmp asign,bsign
|
|
beq 1f
|
|
mov $-1,asign
|
|
rts pc
|
|
1:
|
|
mov $1,asign
|
|
rts pc
|
|
|