321 lines
2.8 KiB
ArmAsm
321 lines
2.8 KiB
ArmAsm
/
|
|
/
|
|
|
|
/ rc -- complex arithmetic
|
|
|
|
.globl c8c16
|
|
.globl c16c8
|
|
.globl i4c8
|
|
.globl r4c8
|
|
.globl r8c8
|
|
.globl i4c16
|
|
.globl r4c16
|
|
.globl r8c16
|
|
.globl cad8
|
|
.globl csb8
|
|
.globl cmp8
|
|
.globl cdv8
|
|
.globl cng8
|
|
.globl cad16
|
|
.globl csb16
|
|
.globl cmp16
|
|
.globl cdv16
|
|
.globl cng16
|
|
.globl rval16
|
|
.globl rval16p
|
|
.globl gas16
|
|
.globl ceq8
|
|
.globl cne8
|
|
.globl ceq16
|
|
.globl cne16
|
|
|
|
.globl cpi8
|
|
.globl cpi16
|
|
|
|
one = 040200
|
|
a = r2
|
|
b = r3
|
|
c = r4
|
|
d = r5
|
|
|
|
e = r0
|
|
f = r1
|
|
|
|
gas16:
|
|
mov 16.(sp),r0
|
|
setd
|
|
movf (sp)+,a
|
|
movf (sp)+,b
|
|
tst (sp)+
|
|
movf a,(r0)+
|
|
movf b,(r0)+
|
|
jmp *(r4)+
|
|
|
|
rval16p:
|
|
mov r3,r0
|
|
add (r4)+,r0
|
|
mov (r0),r0
|
|
br 1f
|
|
|
|
rval16:
|
|
mov (r4)+,r0
|
|
1:
|
|
setd
|
|
movf (r0)+,a
|
|
movf (r0)+,b
|
|
movf b,-(sp)
|
|
movf a,-(sp)
|
|
jmp *(r4)+
|
|
|
|
cad16:
|
|
setd
|
|
br 1f
|
|
|
|
cad8:
|
|
setf
|
|
1:
|
|
jsr pc,garg
|
|
addf a,e
|
|
addf b,f
|
|
br sarg
|
|
|
|
csb16:
|
|
setd
|
|
br 1f
|
|
|
|
csb8:
|
|
setf
|
|
1:
|
|
jsr pc,garg
|
|
subf a,e
|
|
negf e
|
|
subf b,f
|
|
negf f
|
|
br sarg
|
|
|
|
cmp16:
|
|
setd
|
|
br 1f
|
|
|
|
cmp8:
|
|
setf
|
|
1:
|
|
jsr pc,garg
|
|
mulf a,e
|
|
mulf b,f
|
|
subf f,e
|
|
mulf d,a
|
|
mulf c,b
|
|
movf a,f
|
|
addf b,f
|
|
|
|
sarg:
|
|
movf f,-(sp)
|
|
movf e,-(sp)
|
|
jmp *(r4)+
|
|
|
|
cdv16:
|
|
setd
|
|
br 1f
|
|
|
|
cdv8:
|
|
setf
|
|
1:
|
|
divide:
|
|
jsr pc,garg
|
|
absf e
|
|
absf f
|
|
cmpf e,f
|
|
cfcc
|
|
blt 1f
|
|
|
|
/ algorithm #1 |c| > |d|
|
|
|
|
movf d,e
|
|
divf c,e / r = d/c
|
|
movf d,f
|
|
mulf e,f
|
|
addf c,f / x = c+rd
|
|
movf f,c
|
|
movf a,f
|
|
mulf e,f
|
|
negf f
|
|
addf b,f
|
|
mulf b,e
|
|
addf a,e
|
|
divf c,e
|
|
divf c,f
|
|
br sarg
|
|
|
|
/ algorithm #2 |c| < |d|
|
|
|
|
1:
|
|
movf c,e
|
|
divf d,e / r = c/d
|
|
movf c,f
|
|
mulf e,f
|
|
addf d,f / x = d+rc
|
|
movf f,c
|
|
movf b,f
|
|
mulf e,f
|
|
subf a,f
|
|
mulf a,e
|
|
addf b,e
|
|
divf c,e
|
|
divf c,f
|
|
br sarg
|
|
|
|
cng16:
|
|
setd
|
|
br 1f
|
|
|
|
cng8:
|
|
setf
|
|
1:
|
|
movf (sp)+,a
|
|
negf a
|
|
negf (sp)
|
|
movf a,-(sp)
|
|
jmp *(r4)+
|
|
|
|
/ setup the following registers
|
|
/ (a,bi) +o (c,di) -> (e+fi)
|
|
/ a,b,c,d are input
|
|
/ e,f are output and also contain
|
|
/ c,d on input
|
|
|
|
garg:
|
|
mov (sp)+,r0
|
|
movf (sp)+,e
|
|
movf e,c
|
|
movf (sp)+,f
|
|
movf f,d
|
|
movf (sp)+,a
|
|
movf (sp)+,b
|
|
jmp (r0)
|
|
|
|
i4c8:
|
|
setf
|
|
br 1f
|
|
|
|
i4c16:
|
|
setd
|
|
1:
|
|
setl
|
|
movif (sp)+,fr0
|
|
br 2f
|
|
|
|
r4c8:
|
|
setf
|
|
br 1f
|
|
|
|
r8c16:
|
|
setd
|
|
1:
|
|
movf (sp)+,fr0
|
|
br 2f
|
|
|
|
r4c16:
|
|
setd
|
|
br 1f
|
|
|
|
r8c8:
|
|
setf
|
|
1:
|
|
movof (sp)+,fr0
|
|
2:
|
|
clrf -(sp)
|
|
movf fr0,-(sp)
|
|
jmp *(r4)+
|
|
|
|
c16c8:
|
|
setd
|
|
br 1f
|
|
|
|
c8c16:
|
|
setf
|
|
1:
|
|
movf (sp)+,r0
|
|
movf (sp)+,r1
|
|
movfo r1,-(sp)
|
|
movfo r0,-(sp)
|
|
jmp *(r4)+
|
|
|
|
ceq16:
|
|
setd
|
|
br 1f
|
|
ceq8:
|
|
setf
|
|
1:
|
|
mov $1,r1
|
|
br 2f
|
|
|
|
cne16:
|
|
setd
|
|
br 1f
|
|
|
|
cne8:
|
|
setf
|
|
1:
|
|
clr r1
|
|
2:
|
|
jsr pc,garg
|
|
cmpf c,a
|
|
cfcc
|
|
bne 1f
|
|
cmpf d,b
|
|
cfcc
|
|
beq 2f
|
|
1:
|
|
inc r1
|
|
bic $2,r1
|
|
2:
|
|
mov r1,-(sp)
|
|
jmp *(r4)+
|
|
|
|
cpi8:
|
|
setf
|
|
br 1f
|
|
|
|
cpi16:
|
|
setd
|
|
1:
|
|
clr r0
|
|
tst (sp)+
|
|
mov (sp)+,r1
|
|
bge 1f
|
|
inc r0
|
|
neg r1
|
|
1:
|
|
movf (sp)+,fr0
|
|
movf fr0,fr4
|
|
movf (sp)+,fr0
|
|
movf fr0,fr5
|
|
movf $one,fr0
|
|
clrf fr1
|
|
1:
|
|
dec r1
|
|
bmi 1f
|
|
movf fr0,fr2
|
|
movf fr1,fr3
|
|
mulf fr4,fr0
|
|
mulf fr4,fr1
|
|
mulf fr5,fr2
|
|
mulf fr5,fr3
|
|
subf fr3,fr0
|
|
addf fr2,fr1
|
|
br 1b
|
|
1:
|
|
tst r0
|
|
beq 1f
|
|
clrf -(sp)
|
|
movf $one,fr2
|
|
movf fr2,-(sp)
|
|
movf fr1,-(sp)
|
|
movf fr0,-(sp)
|
|
jmp divide
|
|
1:
|
|
movf fr1,-(sp)
|
|
movf fr0,-(sp)
|
|
jmp *(r4)+
|