From 990d40410bd248f3a87326117c32e897131142be Mon Sep 17 00:00:00 2001 From: David Harris Date: Tue, 14 May 2024 11:11:24 -0700 Subject: [PATCH] Test using fpcalc for fp_dataset.py --- examples/fp/fpcalc/fpcalc.c | 21 ++++++++++- tests/fp/quad/fp_dataset.py | 69 +++++++++++++++++++++++++---------- tests/fp/quad/fpdatasetgen.py | 6 ++- 3 files changed, 74 insertions(+), 22 deletions(-) mode change 100644 => 100755 tests/fp/quad/fp_dataset.py mode change 100644 => 100755 tests/fp/quad/fpdatasetgen.py diff --git a/examples/fp/fpcalc/fpcalc.c b/examples/fp/fpcalc/fpcalc.c index 5a075b69c..8264b1442 100644 --- a/examples/fp/fpcalc/fpcalc.c +++ b/examples/fp/fpcalc/fpcalc.c @@ -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); } } } diff --git a/tests/fp/quad/fp_dataset.py b/tests/fp/quad/fp_dataset.py old mode 100644 new mode 100755 index 0b0bd32ca..d095d58f7 --- a/tests/fp/quad/fp_dataset.py +++ b/tests/fp/quad/fp_dataset.py @@ -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] diff --git a/tests/fp/quad/fpdatasetgen.py b/tests/fp/quad/fpdatasetgen.py old mode 100644 new mode 100755 index 3d49e7082..6208b1ba3 --- a/tests/fp/quad/fpdatasetgen.py +++ b/tests/fp/quad/fpdatasetgen.py @@ -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)