@@ -56,79 +56,110 @@ static inline uint64_t fastHexToU64(const char *inStr) {
56
56
return result;
57
57
}
58
58
59
- int checkFile (char *inputFileName, int *totalFails, int *totalBitDiffs,
60
- int *detailedBitDiffs, int *total) {
61
- int32_t curFails = 0 ; // Only counts actual failures, not bitdiffs.
62
- int32_t curBitDiffs = 0 ; // A bitdiff is when the expected result and actual
63
- // result are off by +/- 1 bit.
64
- char line[100 ];
65
- char *num;
66
-
67
- auto *fileHandle = LIBC_NAMESPACE::fopen (inputFileName, " r" );
59
+ static void parseLine (char *line, int *total, int *detailedBitDiffs,
60
+ int32_t &curFails, int32_t &curBitDiffs) {
68
61
69
- if (!fileHandle) {
70
- LIBC_NAMESPACE::printf (" file '%s' failed to open. Exiting.\n " ,
71
- inputFileName);
72
- return 1 ;
62
+ if (line[0 ] == ' #' ) {
63
+ return ;
73
64
}
65
+ *total = *total + 1 ;
66
+ uint32_t expectedFloatRaw;
67
+ uint64_t expectedDoubleRaw;
74
68
75
- while (LIBC_NAMESPACE::fgets (line, sizeof (line), fileHandle)) {
76
- if (line[0 ] == ' #' ) {
77
- continue ;
78
- }
79
- *total = *total + 1 ;
80
- uint32_t expectedFloatRaw;
81
- uint64_t expectedDoubleRaw;
69
+ expectedFloatRaw = fastHexToU32 (line + 5 );
70
+ expectedDoubleRaw = fastHexToU64 (line + 14 );
82
71
83
- expectedFloatRaw = fastHexToU32 (line + 5 );
84
- expectedDoubleRaw = fastHexToU64 (line + 14 );
85
- num = line + 31 ;
72
+ char *num = line + 31 ;
86
73
87
- float floatResult = LIBC_NAMESPACE::strtof (num, nullptr );
74
+ float floatResult = LIBC_NAMESPACE::strtof (num, nullptr );
88
75
89
- double doubleResult = LIBC_NAMESPACE::strtod (num, nullptr );
76
+ double doubleResult = LIBC_NAMESPACE::strtod (num, nullptr );
90
77
91
- uint32_t floatRaw = LIBC_NAMESPACE::cpp::bit_cast<uint32_t >(floatResult);
78
+ uint32_t floatRaw = LIBC_NAMESPACE::cpp::bit_cast<uint32_t >(floatResult);
92
79
93
- uint64_t doubleRaw = LIBC_NAMESPACE::cpp::bit_cast<uint64_t >(doubleResult);
80
+ uint64_t doubleRaw = LIBC_NAMESPACE::cpp::bit_cast<uint64_t >(doubleResult);
94
81
95
- if (!(expectedFloatRaw == floatRaw)) {
96
- if (expectedFloatRaw == floatRaw + 1 ||
97
- expectedFloatRaw == floatRaw - 1 ) {
98
- curBitDiffs++;
99
- if (expectedFloatRaw == floatRaw + 1 ) {
100
- detailedBitDiffs[0 ] = detailedBitDiffs[0 ] + 1 ; // float low
101
- } else {
102
- detailedBitDiffs[1 ] = detailedBitDiffs[1 ] + 1 ; // float high
103
- }
82
+ if (!(expectedFloatRaw == floatRaw)) {
83
+ if (expectedFloatRaw == floatRaw + 1 || expectedFloatRaw == floatRaw - 1 ) {
84
+ curBitDiffs++;
85
+ if (expectedFloatRaw == floatRaw + 1 ) {
86
+ detailedBitDiffs[0 ] = detailedBitDiffs[0 ] + 1 ; // float low
104
87
} else {
105
- curFails++;
106
- }
107
- if (curFails + curBitDiffs < 10 ) {
108
- LIBC_NAMESPACE::printf (" Float fail for '%s'. Expected %x but got %x\n " ,
109
- num, expectedFloatRaw, floatRaw);
88
+ detailedBitDiffs[1 ] = detailedBitDiffs[1 ] + 1 ; // float high
110
89
}
90
+ } else {
91
+ curFails++;
111
92
}
93
+ if (curFails + curBitDiffs < 10 ) {
94
+ LIBC_NAMESPACE::printf (" Float fail for '%s'. Expected %x but got %x\n " ,
95
+ num, expectedFloatRaw, floatRaw);
96
+ }
97
+ }
112
98
113
- if (!(expectedDoubleRaw == doubleRaw)) {
114
- if (expectedDoubleRaw == doubleRaw + 1 ||
115
- expectedDoubleRaw == doubleRaw - 1 ) {
116
- curBitDiffs++;
117
- if (expectedDoubleRaw == doubleRaw + 1 ) {
118
- detailedBitDiffs[2 ] = detailedBitDiffs[2 ] + 1 ; // double low
119
- } else {
120
- detailedBitDiffs[3 ] = detailedBitDiffs[3 ] + 1 ; // double high
121
- }
99
+ if (!(expectedDoubleRaw == doubleRaw)) {
100
+ if (expectedDoubleRaw == doubleRaw + 1 ||
101
+ expectedDoubleRaw == doubleRaw - 1 ) {
102
+ curBitDiffs++;
103
+ if (expectedDoubleRaw == doubleRaw + 1 ) {
104
+ detailedBitDiffs[2 ] = detailedBitDiffs[2 ] + 1 ; // double low
122
105
} else {
123
- curFails++;
124
- }
125
- if (curFails + curBitDiffs < 10 ) {
126
- LIBC_NAMESPACE::printf (
127
- " Double fail for '%s'. Expected %lx but got %lx\n " , num,
128
- expectedDoubleRaw, doubleRaw);
106
+ detailedBitDiffs[3 ] = detailedBitDiffs[3 ] + 1 ; // double high
129
107
}
108
+ } else {
109
+ curFails++;
110
+ }
111
+ if (curFails + curBitDiffs < 10 ) {
112
+ LIBC_NAMESPACE::printf (" Double fail for '%s'. Expected %lx but got %lx\n " ,
113
+ num, expectedDoubleRaw, doubleRaw);
130
114
}
131
115
}
116
+ }
117
+
118
+ int checkBuffer (int *totalFails, int *totalBitDiffs, int *detailedBitDiffs,
119
+ int *total) {
120
+ const char *lines[6 ] = {" 3C00 3F800000 3FF0000000000000 1" ,
121
+ " 3D00 3FA00000 3FF4000000000000 1.25" ,
122
+ " 3D9A 3FB33333 3FF6666666666666 1.4" ,
123
+ " 57B7 42F6E979 405EDD2F1A9FBE77 123.456" ,
124
+ " 622A 44454000 4088A80000000000 789" ,
125
+ " 7C00 7F800000 7FF0000000000000 123.456e789" };
126
+
127
+ int32_t curFails = 0 ; // Only counts actual failures, not bitdiffs.
128
+ int32_t curBitDiffs = 0 ; // A bitdiff is when the expected result and actual
129
+ // result are off by +/- 1 bit.
130
+
131
+ for (uint8_t i = 0 ; i < 6 ; i++) {
132
+ auto line = const_cast <char *>(lines[i]);
133
+ parseLine (line, total, detailedBitDiffs, curFails, curBitDiffs);
134
+ }
135
+
136
+ *totalBitDiffs += curBitDiffs;
137
+ *totalFails += curFails;
138
+
139
+ if (curFails > 1 || curBitDiffs > 1 ) {
140
+ return 2 ;
141
+ }
142
+ return 0 ;
143
+ }
144
+
145
+ int checkFile (char *inputFileName, int *totalFails, int *totalBitDiffs,
146
+ int *detailedBitDiffs, int *total) {
147
+ int32_t curFails = 0 ; // Only counts actual failures, not bitdiffs.
148
+ int32_t curBitDiffs = 0 ; // A bitdiff is when the expected result and actual
149
+ // result are off by +/- 1 bit.
150
+ char line[100 ];
151
+
152
+ auto *fileHandle = LIBC_NAMESPACE::fopen (inputFileName, " r" );
153
+
154
+ if (!fileHandle) {
155
+ LIBC_NAMESPACE::printf (" file '%s' failed to open. Exiting.\n " ,
156
+ inputFileName);
157
+ return 1 ;
158
+ }
159
+
160
+ while (LIBC_NAMESPACE::fgets (line, sizeof (line), fileHandle)) {
161
+ parseLine (line, total, detailedBitDiffs, curFails, curBitDiffs);
162
+ }
132
163
133
164
LIBC_NAMESPACE::fclose (fileHandle);
134
165
@@ -141,7 +172,16 @@ int checkFile(char *inputFileName, int *totalFails, int *totalBitDiffs,
141
172
return 0 ;
142
173
}
143
174
144
- TEST (LlvmLibcStrToFloatComparisonTest, CheckFile) {
175
+ int updateResult (int result, int curResult) {
176
+ if (curResult == 1 ) {
177
+ result = 1 ;
178
+ } else if (curResult == 2 ) {
179
+ result = 2 ;
180
+ }
181
+ return result;
182
+ }
183
+
184
+ TEST (LlvmLibcStrToFloatComparisonTest, CheckFloats) {
145
185
int result = 0 ;
146
186
int fails = 0 ;
147
187
@@ -155,15 +195,17 @@ TEST(LlvmLibcStrToFloatComparisonTest, CheckFile) {
155
195
int total = 0 ;
156
196
157
197
char *files = LIBC_NAMESPACE::getenv (" FILES" );
158
- files = LIBC_NAMESPACE::strdup (files);
159
- for (char *file = LIBC_NAMESPACE::strtok (files, " ," ); file != nullptr ;
160
- file = LIBC_NAMESPACE::strtok (nullptr , " ," )) {
161
- int curResult =
162
- checkFile (file, &fails, &bitdiffs, detailedBitDiffs, &total);
163
- if (curResult == 1 ) {
164
- result = 1 ;
165
- } else if (curResult == 2 ) {
166
- result = 2 ;
198
+
199
+ if (files == nullptr ) {
200
+ int curResult = checkBuffer (&fails, &bitdiffs, detailedBitDiffs, &total);
201
+ result = updateResult (result, curResult);
202
+ } else {
203
+ files = LIBC_NAMESPACE::strdup (files);
204
+ for (char *file = LIBC_NAMESPACE::strtok (files, " ," ); file != nullptr ;
205
+ file = LIBC_NAMESPACE::strtok (nullptr , " ," )) {
206
+ int curResult =
207
+ checkFile (file, &fails, &bitdiffs, detailedBitDiffs, &total);
208
+ result = updateResult (result, curResult);
167
209
}
168
210
}
169
211
0 commit comments