open-simh.simtools/tests/test-float.lst.ok
Olaf Seibert c587587f49 Fix/work around a bug in parse_expr().
There was an obscure bug in parse_expr(), used to evaluate 'if df',
where it could skip past the end of the line marker.

If this happened inside an expanded macro, then after that was the
next line...
In other cases it might be worse.

Now that this is fixed, another check for line end junk can be enabled.
2021-01-23 20:09:32 +01:00

168 lines
12 KiB
Plaintext

1 ;;;;;
2 ;
3 ; Test floating point numbers.
4 ;
5 ; The values in the comments are the reference values from MACRO V05.05.
6 ;
7 000000 040200 .word ^F 1.0 ; 040200
8 000002 140200 .word ^F-1.0 ; 140200
9 000004 137600 .word -^F 1.0 ; 137600
10 000006 037600 .word -^F-1.0 ; 037600
11
12 000010 040706 .word ^F6.2 ; 040706
13 000012 137071 .word ^C^F6.2 ; 137071
14 000014 137071 .word ^C<^F6.2> ; 137071
15
16 000016 040706 063146 .flt2 6.2 ; 040706 063146
17 000022 040706 063146 063146 .flt4 6.2 ; 040706 063146 063146 063146
000030 063146
18
19 000032 040300 000000 .flt2 1.5 ; 040300 000000
20 000036 040300 000000 000000 .flt4 1.5 ; 040300 000000 000000 000000
000044 000000
21
22 000046 040511 .word ^F 3.1415926535897932384626433 ; 040511
23 000050 040511 007733 .flt2 3.1415926535897932384626433 ; 040511 007733
24 000054 040511 007732 121041 .flt4 3.1415926535897932384626433 ; 040511 007732 121041 064302
000062 064302
25
26 ; Test some large numbers at the edge of the exactly representable
27 ; integers.
28 ; 1 << 56 just barely fits: it uses 57 bits but the lsb is 0 so
29 ; when it is cut off, we don't notice.
30 ; 1 << 56 + 1 R the lsb are 01 and is cut off.
31 ; 1 << 56 + 2 the lsb are 10 and the missing 0 goes unnoticed.
32
33 ; 1 << 56 - 1 consists of 56 1 bits. This value and all smaller ints
34 ; 1 << 56 - 2 get represented exactly.
35
36 ; Going up, to rounding steps of 4:
37 ;
38 ; 1 << 57
39 ; 1 << 57 + 4 next higher available representation
40 ; 1 << 57 + 8 next higher available representation
41
42 ; 1 << 56 - 3
43 000064 056177 177777 177777 .flt4 72057594037927933 ; 056177 177777 177777 177775
000072 177775
44 ; 1 << 56 - 2
45 000074 056177 177777 177777 .flt4 72057594037927934 ; 056177 177777 177777 177776
000102 177776
46
47 ; 1 << 56 - 1
48 000104 056200 .word ^F 72057594037927935 ; 056200 (rounded up!)
49 000106 056200 000000 .flt2 72057594037927935 ; 056200 000000 (rounded up!)
50 000112 056177 177777 177777 .flt4 72057594037927935 ; 056177 177777 177777 177777
000120 177777
51
52 ; 1 << 56
53 000122 056200 .word ^F 72057594037927936 ; 056200
54 000124 056200 000000 .flt2 72057594037927936 ; 056200 000000
55 000130 056200 000000 000000 .flt4 72057594037927936 ; 056200 000000 000000 000000
000136 000000
56
57 000140 056200 000000 000000 .flt4 72057594037927938 ; 1 << 56 + 2
000146 000001
58 ; 056200 000000 000000 000001
59
60 000150 056400 000000 000000 .flt4 144115188075855872 ; 1 << 57
000156 000000
61 ; 056400 000000 000000 000000
62 000160 056400 000000 000000 .flt4 144115188075855873 ; 1 << 57 + 1
000166 000000
63 ; 056400 000000 000000 000000 (inexact)
64 000170 056400 000000 000000 .flt4 144115188075855874 ; 1 << 57 + 2
000176 000001
65 ; 056400 000000 000000 000001 (inexact)
66 000200 056400 000000 000000 .flt4 144115188075855875 ; 1 << 57 + 3
000206 000001
67 ; 056400 000000 000000 000001 (inexact)
68 000210 056400 000000 000000 .flt4 144115188075855876 ; 1 << 57 + 4
000216 000001
69 ; 056400 000000 000000 000001 (exact!)
70 000220 056400 000000 000000 .flt4 144115188075855880 ; 1 << 57 + 8
000226 000002
71 ; 056400 000000 000000 000002 (exact!)
72
73 ; This one triggers rounding up (round == 1)
74 000230 040725 052507 055061 .flt4 6.66666 ; 040725 052507 055061 122276
000236 122276
75
76 ; MACRO-11 truncates these ^F values despite what the manual says.
77 ; On the other hand, it does round up some of the test values above.
78 ; We stick to the manual since the result is more consistent.
79
80 ; Expression RT-11 this
81 ; MACRO-11 version
82 ; V05.06
83
84 000240 040177 .word ^F 0.994140625 ; (2**9-3)/2**9 040176 040177
85 000242 040176 100000 000000 .flt4 0.994140625
000250 000000
86
87 000252 040200 .word ^F 0.998046875 ; (2**9-1)/2**9 040177 040200
88 000254 040177 100000 000000 .flt4 0.998046875
000262 000000
89
90 000264 040201 .word ^F 1.00390625 ; (2**8+1)/2**8 040200 040201
91 000266 040200 100000 000000 .flt4 1.00390625
000274 000000
92
93 000276 040202 .word ^F 1.01171875 ; (2**8+3)/2**8 040201 040202
94 000300 040201 100000 000000 .flt4 1.01171875
000306 000000
95
96 000310 077777 177777 177777 .flt4 1.701411834604692307e+38 ; 077777 177777 177777 177777
000316 177777
97 000320 077777 177777 177777 .FLT4 170141183460469230551095682998472802304 ; 2**127-2**70
000326 177777
98 000330 077777 177777 177777 .FLT4 170141183460469230564930741053754966015 ; 2**127-(2**70-2**64+2**62+1)
000336 177777
99 000340 077777 177777 177777 .FLT4 170141183460469230564930741053754966016 ; 2**127-(2**70-2**64+2**62+2)
000346 177777
100
101 ; Several ways to define a name for the fpp registers
102
103 000000 ac0 = r0
104 000001 ac1 = %1
105 000002 f2 = %2
106
107 000350 171003 mulf r3,ac0
108 000352 171102 mulf r2,ac1
109 000354 172227 041040 ADDF #^O41040,F2
110 000360 172127 040200 addf #1,ac1
111
112 000364 171003 mulf r3,ac0
113 000366 171102 mulf r2,ac1
114 000370 172227 041040 addf #^O41040,F2 ; taken literally
115 000374 172127 040200 addf #1,ac1 ; as float
116 000400 172127 040200 addf #1.,ac1 ; as float
117 000404 172127 000001 addf #^D1,ac1 ; literally
118 000410 172127 000002 addf #<1+1>,ac1 ; literally
119 000414 172127 040300 addf #1.5,ac1 ; as float
120 000420 172127 140263 addd #-1.4,ac1 ; as float
121
122 ; TODO: let parser check for junk at end of line
test-float.mac:123: ***ERROR Junk at end of line ('5 ; bad: ')
123 000424 170627 000002 absf #2.5 ; bad: operand is destination
test-float.mac:124: ***ERROR Junk at end of line ('5 ; bad: ')
124 000430 170527 000002 tstd #2.5 ; bad: operand is considered FDST by the arch handbook
test-float.mac:125: ***ERROR Junk at end of line ('5 ; bad: junk')
125 000434 174027 000002 stf ac0,#2.5 ; bad: junk at end of line
126 000440 174027 000002 stf ac0,#2 ; doesn't makes sense but MACRO11 allows it
127
128
129 .end
129
Symbol table
. ******R 001 AC0 =%000000 AC1 =%000001 F2 =%000002
Program sections:
. ABS. 000000 000 (RW,I,GBL,ABS,OVR,NOSAV)
000444 001 (RW,I,LCL,REL,CON,NOSAV)