home *** CD-ROM | disk | FTP | other *** search
- ;Level zero kernel functions for PARI
- ; By C.T.Stretch Fri,03 Jan 1992
-
- ; Registers
- a1=0
- a2=1
- a3=2
- a4=3
- v1=4
- v2=5
- v3=6
- v4=7
- v5=8
- v6=9
- sl=10
- fp=11
- ip=12
- sp=13
- lr=14
- pc=15
-
- ; ADR macro
-
- .MACRO ADR reg, label
- .IF (label) >= $ + 8
- ADD reg,pc,#(label)-$-8
- .ELSE
- SUB reg,pc,#$+8-(label)
- .ENDIF
- .ENDM
-
- .EXTERN x$stack_overflow,x$udivide
- .EXTERN pariputs
-
-
- .AREA C$$data
-
- overflow:: .LONG 0
- hiremainder:: .LONG 0
-
- printversion:: MOV ip,sp
- STMFD sp!,{fp,ip,lr,pc}
- SUB fp,ip,#4
- CMPS sp,sl
- BLLT x$stack_overflow
- ADR a1,string
- B pariputs
- string: .ASCII " GP/PARI CALCULATOR Version 1.36\n"
- .ASCIZ " (Archimedes version)\n"
- .ALIGN
-
- addll:: ADDS a1,a1,a2
- MOVCC a2,#0
- MOVCS a2,#1
- STR a2,overflow
- MOVS pc,lr
-
- addllx:: LDR a3,overflow
- MOVS a3,a3,LSR #1
- ADCS a1,a1,a2
- MOVCS a3,#1
- STR a3,overflow
- MOVS pc,lr
-
- subll:: SUBS a1,a1,a2
- MOVCC a2,#1
- MOVCS a2,#0
- STR a2,overflow
- MOVS pc,lr
-
- subllx:: LDR a3,overflow
- RSBS a3,a3,#0
- SBCS a1,a1,a2
- MOVCC a3,#1
- MOVCS a3,#0
- STR a3,overflow
- MOVS pc,lr
-
- shiftl:: RSB a3,a2,#32
- MOV a3,a1,LSR a3
- STR a3,hiremainder
- MOV a1,a1,ASL a2
- MOVS pc,lr
-
- shiftlr:: RSB a3,a2,#32
- MOV a3,a1,ASL a3
- STR a3,hiremainder
- MOV a1,a1,LSR a2
- MOVS pc,lr
-
- bfffo:: MOV a2,#0
- CMP a1,#1<<16
- MOVLO a1,a1,LSL #16
- ADDLO a2,a2,#16
- CMP a1,#1<<24
- MOVLO a1,a1,LSL #8
- ADDLO a2,a2,#8
- CMP a1,#1<<28
- MOVLO a1,a1,LSL #4
- ADDLO a2,a2,#4
- CMP a1,#1<<30
- MOVLO a1,a1,LSL #2
- ADDLO a2,a2,#2
- CMP a1,#1<<31
- ADDLO a2,a2,#1
- MOV a1,a2
- MOVS pc,lr
-
- mulll:: MOV ip,a1,LSR #16
- MOV a4,a2,LSR #16
- BIC a1,a1,ip,LSL #16
- BIC a2,a2,a4,LSL #16
- MUL a3,a1,a2
- MUL a2,ip,a2
- MUL a1,a4,a1
- MUL a4,ip,a4
- ADDS ip,a2,a1
- ADDCS a4,a4,#1<<16
- ADDS a1,a3,ip,LSL #16
- ADC a4,a4,ip,LSR #16
- STR a4,hiremainder
- MOVS pc,lr
-
- addmul:: MOV ip,a1,LSR #16
- MOV a4,a2,LSR #16
- BIC a1,a1,ip,LSL #16
- BIC a2,a2,a4,LSL #16
- MUL a3,a1,a2
- MUL a2,ip,a2
- MUL a1,a4,a1
- MUL a4,ip,a4
- ADDS ip,a2,a1
- ADDCS a4,a4,#1<<16
- ADDS a1,a3,ip,LSL #16
- ADC a4,a4,ip,LSR #16
- LDR ip,hiremainder
- ADDS a1,a1,ip
- ADDCS a4,a4,#1
- STR a4,hiremainder
- MOVS pc,lr
-
- xl=a1
- xu=a4
- du=a2
- dl=a3
- q=v1
- sumbit=ip
-
- divll:: STMFD sp!, {v1}
- LDR xu,hiremainder
- MOV q,#0
- MOV dl,#0
- MOV sumbit,#1<<31
- toploop: MOVS du,du,LSR #1
- MOV dl,dl,RRX
- CMP xu,du
- CMPEQ xl,dl
- BLO nosub
- SUBS xl,xl,dl
- SBC xu,xu,du
- ADD q,q,sumbit
- nosub: MOVS sumbit,sumbit,LSR #1
- BNE toploop
- STR xl,hiremainder
- MOV a1,q
- LDMFD sp!,{v1}
- MOVS pc,lr
-
- du2=a3
- dl2=a2
-
- mulmodll:: STMFD sp!, {v1,lr}
- MOV ip,a1,LSR #16
- MOV a4,a2,LSR #16
- BIC a1,a1,ip,LSL #16
- BIC a2,a2,a4,LSL #16
- MUL v1,a1,a2
- MUL a2,ip,a2
- MUL a1,a4,a1
- MUL a4,ip,a4
- ADDS ip,a2,a1
- ADDCS a4,a4,#1<<16
- ADDS a1,v1,ip,LSL #16
- ADC a4,a4,ip,LSR #16
- MOV dl2,#0
- MOV sumbit,#1<<31
- toploop2: MOVS du2,du2,LSR #1
- MOV dl2,dl2,RRX
- CMP xu,du2
- CMPEQ xl,dl2
- BLO nosub2
- SUBS xl,xl,dl2
- SBC xu,xu,du2
- nosub2: MOVS sumbit,sumbit,LSR #1
- BNE toploop2
- LDMFD sp!,{v1,pc}^
-
-
-
-
-
-
-
-
-