Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Ten: .word64 0xA
- DZero: .double 0.0
- DTen: .double 10.0
- DOne: .double 1.0
- DFive: .double 5.0
- Dconsts:
- .double 1.0E100
- .double 1.0E200
- .double 1.0E300
- .double 1.0E10
- .double 1.0E20
- .double 1.0E30
- .double 1.0E40
- .double 1.0E50
- .double 1.0E60
- .double 1.0E70
- .double 1.0E80
- .double 1.0E90
- .double 1.0E1
- .double 1.0E2
- .double 1.0E3
- .double 1.0E4
- .double 1.0E5
- .double 1.0E6
- .double 1.0E7
- .double 1.0E8
- .double 1.0E9
- Dconsts2:
- .double 1.0E100
- .double 1.0E200
- .double 1.0E300
- .double 1.0E50
- .double 1.0E10
- .double 1.0E20
- .double 1.0E30
- .double 1.0E40
- .double 1.0E5
- .double 1.0E1
- .double 1.0E2
- .double 1.0E3
- .double 1.0E4
- .double 1.0E5
- .double 1.0E6
- .double 1.0E7
- .double 1.0E8
- .double 1.0E9
- MyZero: .asciiz "0.00000000e+0"
- MyOne: .asciiz "1.00000000e+0"
- MyMinusOne: .asciiz "-1.00000000e+0"
- ZeroCode: .word64 0x30 ; Ascii '0'
- --------------------------------------------------------------------------------------------------------------------------------------
- myatof: ; converts ascii to float
- ; function, expects r10 =string length, r17 = &Source string
- ; returns computed number in f11
- ldc1 f11,DZero(r0)
- ldc1 f10,DTen(r0)
- ldc1 f8,DOne(r0)
- ldc1 f0,DZero(r0)
- movz r9,r0,r0 ; r9 == i =0
- movz r18,r17,r0 ; r18 = &str[0]
- movz r6,r0,r0
- lb r6,0(r18)
- daddi r7,r0,45; r7 = '-'
- bne r6,r7,Skipa1
- sub.d f8,f0,f8 ; f8 = -1;
- daddi r18,r18,1
- b Skipa2
- Skipa1:
- daddi r7,r0,43; r7 = '+'
- bne r6,r7,Skipa2
- daddi r18,r18,1
- Skipa2:
- ldc1 f22,DOne(r0)
- div.d f29,f22,f10 ; f22 = 0.1
- mov.d f22,f29
- movz r6,r0,r0
- lb r6,0(r18); r6 = str[i]
- daddi r6,r6,-48 ; r6 = r6 - '0'
- dmtc1 r6,f5
- cvt.d.l f5,f5 ; f5 = (double) (str[i] - '0')
- add.d f11,f11,f5
- daddi r18,r18,2
- Whilea1:
- daddi r7,r0,101 ; r7 = 'e'
- movz r6,r0,r0
- lb r6,0(r18); r6 = str[i]
- beq r6,r7,EndWhilea1
- daddi r7,r0,69; r7 ='E'
- beq r6,r7,EndWhilea1
- daddi r7,r0,48; r7 = '0'
- dsub r6,r6,r7 ; r6 = r6 - '0'
- dmtc1 r6,f5
- cvt.d.l f5,f5 ; f5 = (double) (str[i] - '0')
- mul.d f5,f5,f22
- add.d f11,f11,f5
- div.d f22,f22,f10
- daddi r18,r18,1
- b Whilea1
- EndWhilea1:
- daddi r18,r18,1
- mov.d f22,f10
- movz r5,r0,r0
- daddi r24,r0,1
- daddi r7,r0,45; r7 = '-'
- movz r6,r0,r0
- lb r6,0(r18); r6 = str[i]
- bne r6,r7,Skipa3
- daddi r24,r0,-1
- ;daddi r18,r18,1
- Skipa3:
- ;daddi r18,r18,1
- daddi r18,r18,1
- dsub r25,r18,r17 ; r25 = i;
- movz r19,r0,r0
- ld r20,Ten(r0)
- Whilea2:
- dsub r21,r25,r10
- beqz r21,EndWhilea2
- dmult r19,r20
- mflo r19
- movz r6,r0,r0
- lb r6,0(r18); r6 = str[i]
- daddi r6,r6,-48 ; r6 = r6 - '0'
- dadd r19,r19,r6
- daddi r18,r18,1
- daddi r25,r25,1
- b Whilea2
- EndWhilea2:
- movz r29,r19,r0
- bgez r24,PositivePower
- daddi r21,r0,8 ; r21 = 8
- addi r10,r0,100; r10 = 100
- ddiv r29,r10
- mflo r15
- movz r16,r15,r0
- beqz r16,NoHundred1
- addi r16,r16,-1
- dmult r16,r21
- mflo r16
- ldc1 f28,Dconsts(r16)
- div.d f11,f11,f28
- NoHundred1:
- dmult r15,r10
- mflo r16
- dsub r16,r29,r16
- addi r10,r0,10
- ddiv r16,r10
- mflo r15
- movz r16,r15,r0
- beqz r16,NoTen1
- addi r16,r16,2
- dmult r16,r21
- mflo r16
- ldc1 f28,Dconsts(r16)
- div.d f11,f11,f28
- NoTen1:
- ddiv r29,r10
- mfhi r15
- movz r16,r15,r0
- beqz r16,NoOne1
- addi r16,r16,11
- dmult r16,r21
- mflo r16
- ldc1 f28,Dconsts(r16)
- div.d f11,f11,f28
- NoOne1:
- b NoOne2
- PositivePower:
- daddi r21,r0,8
- addi r10,r0,100
- ddiv r29,r10
- mflo r15
- movz r16,r15,r0
- beqz r16,NoHundred2
- addi r16,r16,-1
- dmult r16,r21
- mflo r16
- ldc1 f28,Dconsts(r16)
- mul.d f11,f11,f28
- NoHundred2:
- dmult r15,r10
- mflo r16
- dsub r16,r29,r16
- addi r10,r0,10
- ddiv r16,r10
- mflo r15
- movz r16,r15,r0
- beqz r16,NoTen2
- addi r16,r16,2
- dmult r16,r21
- mflo r16
- ldc1 f28,Dconsts(r16)
- mul.d f11,f11,f28
- NoTen2:
- ddiv r29,r10
- mfhi r15
- movz r16,r15,r0
- beqz r16,NoOne2
- addi r16,r16,11
- dmult r16,r21
- mflo r16
- ldc1 f28,Dconsts(r16)
- mul.d f11,f11,f28
- NoOne2:
- mul.d f11,f11,f8
- jr $ra
- myftoa: ; converts float to ascii
- ; function, expects f11 =source number
- ; r17 = &destination string
- ; returns length in r18
- ;
- ; id f == 0.0?
- mov.d f12,f11 ; f12 = x
- ldc1 f0,DZero(r0)
- c.eq.d 7,f12,f0 ; f == 0.0?
- bc1f 7,NotZero ; No, Skip
- movz r18,r17,r0; r18 = &str[0]
- addi r9,r0,13
- addi r29,r0,MyZero
- MemCpy:
- beqz r9,EndMemCpy
- lb r6,0(r29)
- sb r6,0(r18)
- addi r18,r18,1
- addi r29,r29,1
- addi r9,r9,-1
- b MemCpy
- EndMemCpy:
- addi r18,r0,13
- jr $ra
- NotZero:
- movz r18,r17,r0; r18 = &str[0]
- ldc1 f0,DZero(r0)
- ldc1 f1,DOne(r0)
- ldc1 f10,DTen(r0)
- c.lt.d 7,f11,f0 ; x < 0 ?
- bc1f 7,NonNeg; No, x >= 0.0
- sub.d f12,f0,f12; f12 = -x (|x|)
- daddi r6,r0,45 ; str[0] = '-'
- sb r6,0(r18);
- daddi r18,r18,1
- NonNeg:
- ; f < 1.0
- c.lt.d 7,f11,f1 ; x < 1 ?
- bc1t 7,LessOne ; No, x >= 0.0
- addi r3,r0,3
- movz r9,r0,r0 ; r9 = 0
- movz r4,r0,r0 ; r4 = 0
- addi r29,r0,Dconsts
- Whilefh1:
- ldc1 f29,0(r29)
- c.lt.d 7,f12,f29
- bc1t 7,EndWhilefh1
- beqz r3,EndWhilefh1
- addi r4,r4,1
- addi r3,r3,-1
- addi r29,r29,8
- addi r9,r9,100
- b Whilefh1
- EndWhilefh1:
- beqz r4,NoH1
- addi r29,r29,-8
- ldc1 f29,0(r29)
- div.d f12,f12,f29
- NoH1:
- addi r29,r0,Dconsts
- addi r29,r29,24
- addi r4,r0,0
- addi r3,r0,9
- Whileft1:
- ldc1 f29,0(r29)
- c.lt.d 7,f12,f29
- bc1t 7,EndWhileft1
- beqz r3,EndWhileft1
- addi r4,r4,1
- addi r3,r3,-1
- addi r29,r29,8
- addi r9,r9,10
- b Whileft1
- EndWhileft1:
- beqz r4,NoD1
- addi r29,r29,-8
- ldc1 f29,0(r29)
- div.d f12,f12,f29
- NoD1:
- addi r29,r0,Dconsts
- addi r29,r29,96
- addi r4,r0,0
- addi r3,r0,9
- Whilefs1:
- ldc1 f29,0(r29)
- c.lt.d 7,f12,f29
- bc1t 7,EndWhilefs1
- beqz r3,EndWhilefs1
- addi r4,r4,1
- addi r3,r3,-1
- addi r29,r29,8
- addi r9,r9,1
- b Whilefs1
- EndWhilefs1:
- beqz r4,NoS1
- addi r29,r29,-8
- ldc1 f29,0(r29)
- div.d f12,f12,f29
- NoS1:
- b GrOne
- LessOne:
- ldc1 f1,DOne(r0)
- addi r3,r0,3
- movz r9,r0,r0 ; r9 = 0
- movz r4,r0,r0 ; r9 = 0
- addi r29,r0,Dconsts
- Whilefh2:
- ldc1 f29,0(r29)
- mul.d f13,f12,f29
- c.lt.d 7,f13,f1
- bc1f 7,EndWhilefh2
- beqz r3,EndWhilefh2
- addi r4,r4,1
- addi r3,r3,-1
- addi r29,r29,8
- addi r9,r9,-100
- b Whilefh2
- EndWhilefh2:
- beqz r4,NoH2
- addi r29,r29,-8
- ldc1 f29,0(r29)
- mul.d f12,f12,f29
- NoH2:
- addi r29,r0,Dconsts
- addi r29,r29,24
- addi r4,r0,0
- addi r3,r0,9
- Whileft2:
- ldc1 f29,0(r29)
- mul.d f13,f12,f29
- c.lt.d 7,f13,f1
- bc1f 7,EndWhileft2
- beqz r3,EndWhileft2
- addi r4,r4,1
- addi r3,r3,-1
- addi r29,r29,8
- addi r9,r9,-10
- b Whileft2
- EndWhileft2:
- beqz r4,NoD2
- addi r29,r29,-8
- ldc1 f29,0(r29)
- mul.d f12,f12,f29
- NoD2:
- addi r29,r0,Dconsts
- addi r29,r29,96
- addi r4,r0,0
- addi r3,r0,9
- Whilefs2:
- ldc1 f29,0(r29)
- mul.d f13,f12,f29
- c.lt.d 7,f13,f1
- bc1f 7,EndWhilefs2
- beqz r3,EndWhilefs2
- addi r4,r4,1
- addi r3,r3,-1
- addi r29,r29,8
- addi r9,r9,-1
- b Whilefs2
- EndWhilefs2:
- addi r9,r9,-1
- beqz r4,NoS2
- addi r29,r29,-8
- ldc1 f29,0(r29)
- mul.d f12,f12,f29
- NoS2:
- ldc1 f10,DTen(r0)
- mul.d f12,f12,f10
- ldc1 f1,DOne(r0)
- c.lt.d 7,f12,f1
- bc1f 7,GrOne
- mul.d f12,f12,f10
- addi r9,r9,-1
- GrOne:
- ldc1 f10,DTen(r0)
- daddi r6,r0,46 ; str[i] = '.'
- sb r6,1(r18)
- daddi r19,r18,1 ;r19 == pos1
- movz r21,r0,r0
- daddi r22,r0,8
- mov.d f23,f1 ; f23 = 1.0
- daddi r23,r0,0 ; r23 == digit = 1
- whilef3a:
- c.eq.d 7,f23,f12
- bc1t 7,Eq1
- c.lt.d 7,f23,f12 ; f23 < f12?
- bc1f 7,EndWhilef3a ; No, break
- Eq1:
- daddi r23,r23,1 ; digit++
- add.d f23,f23,f1
- b whilef3a
- EndWhilef3a:
- daddi r23,r23,48; r23 = r23 + '0'
- sb r23,0(r18) ; str[i] = digit
- addi r18,r18,2
- add.d f12,f12,f1
- sub.d f12,f12,f23
- mul.d f12,f12,f10
- Forf1:
- beq r21,r22,EndForf1 ; i < 8?
- mov.d f23,f1 ; f23 = 1.0
- daddi r23,r0,0 ; r23 == digit = 1
- whilef3:
- c.lt.d 7,f23,f12 ; f23 < f12?
- bc1f 7,EndWhilef3 ; No, break
- daddi r23,r23,1 ; digit++
- add.d f23,f23,f1
- b whilef3
- EndWhilef3:
- daddi r23,r23,48; r23 = r23 + '0'
- sb r23,0(r18) ; str[i] = digit
- daddi r18,r18,1
- add.d f12,f12,f1
- sub.d f12,f12,f23
- mul.d f12,f12,f10
- addi r21,r21,1
- b Forf1
- EndForf1:
- daddi r23,r0,101; r23 = 'e'
- sb r23,0(r18) ; str[i] = 'e'
- daddi r18,r18,1 ; i++
- bgez r9,Skipf2 ; is e > 0?
- beqz r9,Skipf2 ; is e == 0?
- ;No e < 0
- daddi r23,r0,45; r23 = '-'
- sb r23,0(r18) ; str[i] = '-'
- daddi r18,r18,1 ; i++
- dsub r9,r0,r9 ; r9 = -r9 = |r9|
- b Skipf3
- Skipf2:
- daddi r23,r0,43 ; r23 = '+'
- sb r23,0(r18) ; str[i] = '+'
- daddi r18,r18,1 ; i++
- Skipf3:
- movz r14,r9,r0 ; r14 = e
- daddi r15,r0,0
- ld r10,Ten(r0)
- Whilef4:
- daddi r15,r15,1
- ddiv r14,r10
- mflo r14
- beqz r14,EndWhilef4
- b Whilef4
- EndWhilef4:
- daddi r15,r15,-1
- dadd r15,r15,r18
- movz r18,r15,r0 ; set up result
- movz r14,r9,r0 ; r14 = e
- ld r10,Ten(r0)
- Whilef5:
- ddiv r14,r10
- mflo r14
- mfhi r23
- daddi r23,r23,48 ; r23 = r23 + '0'
- sb r23,0(r15)
- daddi r15,r15,-1
- beqz r14,EndWhilef5
- j Whilef5
- EndWhilef5:
- dsub r18,r18,r17
- daddi r18,r18,2
- jr $ra
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement