Merge pull request #982 from stineje/main

fpcalc
This commit is contained in:
David Harris 2024-10-02 05:57:30 -07:00 committed by GitHub
commit 723eee8b47
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -224,8 +224,15 @@ __uint128_t strtoul128(char *num, int base) {
} }
__uint128_t parseNum(char *num) { __uint128_t parseNum(char *num) {
// uint64_t result; __uint128_t result = 0;
__uint128_t result;
// Ensure input is in correct form
if (num[0] == '0' && num[1] == 'x') {
num += 2; // Skip "0x"
} else if (num[0] == 'x') {
num += 1; // Skip "x"
}
int size; // size of operands in bytes (2= half, 4=single, 8 = double) int size; // size of operands in bytes (2= half, 4=single, 8 = double)
if (strlen(num) < 8) size = 2; if (strlen(num) < 8) size = 2;
else if (strlen(num) < 16) size = 4; else if (strlen(num) < 16) size = 4;
@ -242,9 +249,29 @@ __uint128_t parseNum(char *num) {
} }
} else { } else {
opSize = size; opSize = size;
//printf ("Operand size is %d\n", opSize);
} }
result = (__uint128_t)strtoul128(num, 16);
if (strlen(num) <= 16) {
result = (__uint128_t)strtoull(num, NULL, 16);
}
else {
while (*num) {
int value;
if (*num >= '0' && *num <= '9')
value = *num - '0';
else if (*num >= 'a' && *num <= 'f')
value = *num - 'a' + 10;
else if (*num >= 'A' && *num <= 'F')
value = *num - 'A' + 10;
else {
printf("Error: invalid character in input\n");
exit(1);
}
result = (result << 4) | value;
num++;
}
}
//printf("Parsed %s as 0x%lx\n", num, result); //printf("Parsed %s as 0x%lx\n", num, result);
return result; return result;
} }
@ -269,8 +296,7 @@ char parseRound(char *rnd) {
} }
} }
int main(int argc, char *argv[]) int main(int argc, char *argv[]) {
{
//uint64_t xn, yn, zn; //uint64_t xn, yn, zn;
__uint128_t xn, yn, zn; __uint128_t xn, yn, zn;
char op1, op2; char op1, op2;
@ -387,8 +413,10 @@ int main(int argc, char *argv[])
} }
printF128("X", x); printF128("Y", y); printF128("X", x); printF128("Y", y);
//sprintf(cmd, "0x%016lx %c 0x%016lx", x.v, op1, y.v); //sprintf(cmd, "0x%016lx %c 0x%016lx", x.v, op1, y.v);
printf("0x%016" PRIx64 "_%016" PRIx64 " %c ", x.v[1], x.v[0], op1);
printf("0x%016" PRIx64 "_%016" PRIx64 " ", y.v[1], y.v[0]);
printF128(cmd, r); printFlags(); printF128(cmd, r); printFlags();
printF128val(r); // printF128val(r);
} }
} }
} }