@@ -56,79 +56,110 @@ static inline uint64_t fastHexToU64(const char *inStr) {
5656 return result;
5757}
5858
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) {
6861
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 ;
7364 }
65+ *total = *total + 1 ;
66+ uint32_t expectedFloatRaw;
67+ uint64_t expectedDoubleRaw;
7468
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 );
8271
83- expectedFloatRaw = fastHexToU32 (line + 5 );
84- expectedDoubleRaw = fastHexToU64 (line + 14 );
85- num = line + 31 ;
72+ char *num = line + 31 ;
8673
87- float floatResult = LIBC_NAMESPACE::strtof (num, nullptr );
74+ float floatResult = LIBC_NAMESPACE::strtof (num, nullptr );
8875
89- double doubleResult = LIBC_NAMESPACE::strtod (num, nullptr );
76+ double doubleResult = LIBC_NAMESPACE::strtod (num, nullptr );
9077
91- uint32_t floatRaw = LIBC_NAMESPACE::cpp::bit_cast<uint32_t >(floatResult);
78+ uint32_t floatRaw = LIBC_NAMESPACE::cpp::bit_cast<uint32_t >(floatResult);
9279
93- uint64_t doubleRaw = LIBC_NAMESPACE::cpp::bit_cast<uint64_t >(doubleResult);
80+ uint64_t doubleRaw = LIBC_NAMESPACE::cpp::bit_cast<uint64_t >(doubleResult);
9481
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
10487 } 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
11089 }
90+ } else {
91+ curFails++;
11192 }
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+ }
11298
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
122105 } 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
129107 }
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);
130114 }
131115 }
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+ }
132163
133164 LIBC_NAMESPACE::fclose (fileHandle);
134165
@@ -141,7 +172,16 @@ int checkFile(char *inputFileName, int *totalFails, int *totalBitDiffs,
141172 return 0 ;
142173}
143174
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) {
145185 int result = 0 ;
146186 int fails = 0 ;
147187
@@ -155,15 +195,17 @@ TEST(LlvmLibcStrToFloatComparisonTest, CheckFile) {
155195 int total = 0 ;
156196
157197 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);
167209 }
168210 }
169211
0 commit comments