[11] | 1 | # Define common subformulae. |
---|
| 2 | \define START (start=1 * FPM.state[1:0]=0) |
---|
| 3 | \define Validx (x[6:3]=0 -> x[2:0]=0) |
---|
| 4 | \define Validy (y[6:3]=0 -> y[2:0]=0) |
---|
| 5 | \define Validz (z[6:3]=0 -> z[2:0]=0) |
---|
| 6 | \define NaNx (x[6:3]=b1111 * !(x[2:0]=0)) |
---|
| 7 | \define NaNy (y[6:3]=b1111 * !(y[2:0]=0)) |
---|
| 8 | \define NaNz (z[6:3]=b1111 * !(z[2:0]=0)) |
---|
| 9 | \define Infx x[6:0]=b1111000 |
---|
| 10 | \define Infy y[6:0]=b1111000 |
---|
| 11 | \define Infz z[6:0]=b1111000 |
---|
| 12 | |
---|
| 13 | #PASS: Legal operands cannot produce illegal results. The only illegal |
---|
| 14 | # operands in our case are the denormals. |
---|
| 15 | |
---|
| 16 | AG((\START * \Validy * \Validx) -> AX:3(\Validz)); |
---|
| 17 | |
---|
| 18 | #FAIL: If the sign bits are different the result is negative. |
---|
| 19 | # This formula fails because one operand may be NaN. |
---|
| 20 | |
---|
| 21 | AG((\START * !(y[7]==x[7])) -> AX:3(z[7]=1)); |
---|
| 22 | |
---|
| 23 | #PASS: If the sign bits are the same the result is positive. |
---|
| 24 | |
---|
| 25 | AG((\START * y[7]==x[7]) -> AX:3(z[7]=0)); |
---|
| 26 | |
---|
| 27 | #PASS: If one of the operands is NaN the result is NaN. |
---|
| 28 | |
---|
| 29 | AG((\START * (\NaNy + \NaNx)) -> AX:3(\NaNz)); |
---|
| 30 | |
---|
| 31 | #FAIL: If one of the operands is zero and the other operand is |
---|
| 32 | # not NaN the result is zero. |
---|
| 33 | # These properties should fail, because infinity * zero = NaN. |
---|
| 34 | |
---|
| 35 | AG((\START * y[6:0]=0 * !\NaNx) -> AX:3(z[6:0]=0)); |
---|
| 36 | AG((\START * x[6:0]=0 * !\NaNy) -> AX:3(z[6:0]=0)); |
---|
| 37 | |
---|
| 38 | #PASS: If one of the operands is infinite and the other operand is |
---|
| 39 | # neither NaN nor zero the result is infinite. |
---|
| 40 | |
---|
| 41 | AG((\START * \Infy * !\NaNx * !(x[6:3]=0)) -> AX:3(\Infz)); |
---|
| 42 | AG((\START * \Infx * !\NaNy * !(y[6:3]=0)) -> AX:3(\Infz)); |
---|