Test using fpcalc for fp_dataset.py

This commit is contained in:
David Harris 2024-05-14 11:11:24 -07:00
parent 46bf99d65b
commit 990d40410b
3 changed files with 74 additions and 22 deletions

View File

@ -169,6 +169,24 @@ void printF128 (char *msg, float128_t q) {
}
void printF128val(float128_t q) {
qp conv;
//__int128_t v128;
int i, j;
char buf[64];
//v128 = q.v[1];
//v128 = v128 << 64 | q.v[0]; // use union to convert between hexadecimal and floating-point views
//conv.v = v128;
conv.v64[0] = q.v[0]; // use union to convert between hexadecimal and floating-point views
conv.v64[1] = q.v[1]; // use union to convert between hexadecimal and floating-point views
// Some compilers can understand %Q for printf on quad precision instead of the
// API call of quadmath_snprintf
// printf("0x%016" PRIx64 "_%016" PRIx64 " = %1.15Qe\n", q.v[1], q.v[0], conv.q);
//quadmath_snprintf (buf, sizeof buf, "%1.15Qe", conv.q);
printf("%016" PRIx64 "%016" PRIx64 "\n", q.v[1], q.v[0]);
}
void printFlags(void) {
int NX = softfloat_exceptionFlags % 2;
int UF = (softfloat_exceptionFlags >> 1) % 2;
@ -369,7 +387,8 @@ int main(int argc, char *argv[])
}
printF128("X", x); printF128("Y", y);
//sprintf(cmd, "0x%016lx %c 0x%016lx", x.v, op1, y.v);
printF128("Result", r); printFlags();
printF128(cmd, r); printFlags();
printF128val(r);
}
}
}

69
tests/fp/quad/fp_dataset.py Normal file → Executable file
View File

@ -5,6 +5,7 @@ import random
import sys
import math
from decimal import *
import os
sys.set_int_max_str_digits(10000)
fzero = ['0x00000000', '0x80000000']
@ -347,6 +348,35 @@ def comments_parser(coverpoints):
cvpts.append((cvpt+ " #nosat",comment))
return cvpts
def softfloat_sub(a, b):
cmd = "$WALLY/examples/fp/fpcalc/fpcalc " + a + " - " + b
result = os.system(cmd)
print("cmd = ", cmd, "returns result = ", result)
return result
# rs1, rs3, result are hexadecimal strings
def gen_rs2(iflen,opcode,rs1,rs3,result):
if opcode in 'fadd':
rs2 = softfloat_sub(result, rs1)
elif opcode in 'fsub':
rs2 = rs1 - fields_dec_converter(iflen,result[i][0])
elif opcode in 'fmul':
rs2 = fields_dec_converter(iflen,result[i][0])/rs1
elif opcode in 'fdiv':
if fields_dec_converter(iflen,result[i][0]) != 0:
rs2 = rs1/fields_dec_converter(iflen,result[i][0])
elif opcode in 'fsqrt':
rs2 = fields_dec_converter(iflen,result[i][0])*fields_dec_converter(iflen,result[i][0])
elif opcode in 'fmadd':
rs2 = (fields_dec_converter(iflen,result[i][0]) - rs3)/rs1
elif opcode in 'fnmadd':
rs2 = (rs3 - fields_dec_converter(iflen,result[i][0]))/rs1
elif opcode in 'fmsub':
rs2 = (fields_dec_converter(iflen,result[i][0]) + rs3)/rs1
elif opcode in 'fnmsub':
rs2 = -1*(rs3 + fields_dec_converter(iflen,result[i][0]))/rs1
return rs2
def ibm_b1(flen, iflen, opcode, ops):
'''
IBM Model B1 Definition:
@ -525,25 +555,26 @@ def ibm_b2(flen, iflen, opcode, ops, int_val = 100, seed = -1): #***Quad support
rs1 = fields_dec_converter(iflen,'0x'+hex(int('1'+rs1_bin[2:],2))[3:])
#print(rs1)
rs3 = fields_dec_converter(iflen,'0x'+hex(int('1'+rs3_bin[2:],2))[3:])
if opcode in 'fadd':
rs2 = fields_dec_converter(iflen,result[i][0]) - rs1
elif opcode in 'fsub':
rs2 = rs1 - fields_dec_converter(iflen,result[i][0])
elif opcode in 'fmul':
rs2 = fields_dec_converter(iflen,result[i][0])/rs1
elif opcode in 'fdiv':
if fields_dec_converter(iflen,result[i][0]) != 0:
rs2 = rs1/fields_dec_converter(iflen,result[i][0])
elif opcode in 'fsqrt':
rs2 = fields_dec_converter(iflen,result[i][0])*fields_dec_converter(iflen,result[i][0])
elif opcode in 'fmadd':
rs2 = (fields_dec_converter(iflen,result[i][0]) - rs3)/rs1
elif opcode in 'fnmadd':
rs2 = (rs3 - fields_dec_converter(iflen,result[i][0]))/rs1
elif opcode in 'fmsub':
rs2 = (fields_dec_converter(iflen,result[i][0]) + rs3)/rs1
elif opcode in 'fnmsub':
rs2 = -1*(rs3 + fields_dec_converter(iflen,result[i][0]))/rs1
rs2 = gen_rs2(iflen,opcode,"3FFF8000000000000000000000000000","3FFF4000000000000000000000000000","3FFF8800000000000000000000000000")
# if opcode in 'fadd':
# rs2 = fields_dec_converter(iflen,result[i][0]) - rs1
# elif opcode in 'fsub':
# rs2 = rs1 - fields_dec_converter(iflen,result[i][0])
# elif opcode in 'fmul':
# rs2 = fields_dec_converter(iflen,result[i][0])/rs1
# elif opcode in 'fdiv':
# if fields_dec_converter(iflen,result[i][0]) != 0:
# rs2 = rs1/fields_dec_converter(iflen,result[i][0])
# elif opcode in 'fsqrt':
# rs2 = fields_dec_converter(iflen,result[i][0])*fields_dec_converter(iflen,result[i][0])
# elif opcode in 'fmadd':
# rs2 = (fields_dec_converter(iflen,result[i][0]) - rs3)/rs1
# elif opcode in 'fnmadd':
# rs2 = (rs3 - fields_dec_converter(iflen,result[i][0]))/rs1
# elif opcode in 'fmsub':
# rs2 = (fields_dec_converter(iflen,result[i][0]) + rs3)/rs1
# elif opcode in 'fnmsub':
# rs2 = -1*(rs3 + fields_dec_converter(iflen,result[i][0]))/rs1
if(iflen==32):
m = struct.unpack('f', struct.pack('f', rs2))[0]

6
tests/fp/quad/fpdatasetgen.py Normal file → Executable file
View File

@ -1,7 +1,9 @@
#!/usr/bin/python
from fp_dataset import *
#coverpoints=ibm_b1(128, 128, 'fadd.q', 2) #ibm_b1(flen, iflen, opcode, ops)
#coverpoints=ibm_b2(128,128,'fadd.q',2) #ibm_b2(flen, iflen, opcode, ops, int_val = 100, seed = -1)
coverpoints=ibm_b2(32,32,'fadd.s',2) #ibm_b2(flen, iflen, opcode, ops,seed = -1)
coverpoints=ibm_b2(128,128,'fadd.q',2) #ibm_b2(flen, iflen, opcode, ops, int_val = 100, seed = -1)
#coverpoints=ibm_b2(32,32,'fadd.s',2) #ibm_b2(flen, iflen, opcode, ops,seed = -1)
#print(coverpoints)
#quad_precision_hex = "0x3ff00000000000000000000000000001" # Example quad precision hexadecimal value
#quad_precision_dec = fields_dec_converter(128, quad_precision_hex)