Expand FSGNJ module to 16 and 64 bit floats
[ieee754fpu.git] / src / ieee754 / fsgnj / test / test_fsgnj_pipe.py
1 """ test of FPCVTMuxInOut
2 """
3
4 from ieee754.fsgnj.pipeline import (FSGNJMuxInOut)
5 from ieee754.fpcommon.test.fpmux import runfp
6
7 from sfpy import Float16, Float32, Float64
8
9
10 def fsgnj_f32_mov(a, b):
11 return Float32.from_bits((a.bits & 0x7fffffff) | (b.bits & 0x80000000))
12
13
14 def fsgnj_f32_neg(a, b):
15 sign = b.bits & 0x80000000
16 sign = sign ^ 0x80000000
17 return Float32.from_bits((a.bits & 0x7fffffff) | sign)
18
19
20 def fsgnj_f32_abs(a, b):
21 bsign = b.bits & 0x80000000
22 asign = a.bits & 0x80000000
23 sign = asign ^ bsign
24 return Float32.from_bits((a.bits & 0x7fffffff) | sign)
25
26
27 def fsgnj_f16_mov(a, b):
28 return Float16.from_bits((a.bits & 0x7fff) | (b.bits & 0x8000))
29
30
31 def fsgnj_f16_neg(a, b):
32 sign = b.bits & 0x8000
33 sign = sign ^ 0x8000
34 return Float16.from_bits((a.bits & 0x7fff) | sign)
35
36
37 def fsgnj_f16_abs(a, b):
38 bsign = b.bits & 0x8000
39 asign = a.bits & 0x8000
40 sign = asign ^ bsign
41 return Float16.from_bits((a.bits & 0x7fff) | sign)
42
43
44 def fsgnj_f64_mov(a, b):
45 return Float64.from_bits((a.bits & 0x7fffffffffffffff) |
46 (b.bits & 0x8000000000000000))
47
48
49 def fsgnj_f64_neg(a, b):
50 sign = b.bits & 0x8000000000000000
51 sign = sign ^ 0x8000000000000000
52 return Float64.from_bits((a.bits & 0x7fffffffffffffff) | sign)
53
54
55 def fsgnj_f64_abs(a, b):
56 bsign = b.bits & 0x8000000000000000
57 asign = a.bits & 0x8000000000000000
58 sign = asign ^ bsign
59 return Float64.from_bits((a.bits & 0x7fffffffffffffff) | sign)
60
61
62 def test_fsgnj_f32_mov():
63 dut = FSGNJMuxInOut(32, 4)
64 runfp(dut, 32, "test_fsgnj_f32_mov", Float32, fsgnj_f32_mov,
65 n_vals=100, opcode=0x0)
66
67
68 def test_fsgnj_f32_neg():
69 dut = FSGNJMuxInOut(32, 4)
70 runfp(dut, 32, "test_fsgnj_f32_neg", Float32, fsgnj_f32_neg,
71 n_vals=100, opcode=0x1)
72
73
74 def test_fsgnj_f32_abs():
75 dut = FSGNJMuxInOut(32, 4)
76 runfp(dut, 32, "test_fsgnj_f32_abs", Float32, fsgnj_f32_abs,
77 n_vals=100, opcode=0x2)
78
79
80 def test_fsgnj_f16_mov():
81 dut = FSGNJMuxInOut(16, 4)
82 runfp(dut, 16, "test_fsgnj_f16_mov", Float16, fsgnj_f16_mov,
83 n_vals=100, opcode=0x0)
84
85
86 def test_fsgnj_f16_neg():
87 dut = FSGNJMuxInOut(16, 4)
88 runfp(dut, 16, "test_fsgnj_f16_neg", Float16, fsgnj_f16_neg,
89 n_vals=100, opcode=0x1)
90
91
92 def test_fsgnj_f16_abs():
93 dut = FSGNJMuxInOut(16, 4)
94 runfp(dut, 16, "test_fsgnj_f16_abs", Float16, fsgnj_f16_abs,
95 n_vals=100, opcode=0x2)
96
97
98 def test_fsgnj_f64_mov():
99 dut = FSGNJMuxInOut(64, 4)
100 runfp(dut, 64, "test_fsgnj_f64_mov", Float64, fsgnj_f64_mov,
101 n_vals=100, opcode=0x0)
102
103
104 def test_fsgnj_f64_neg():
105 dut = FSGNJMuxInOut(64, 4)
106 runfp(dut, 64, "test_fsgnj_f64_neg", Float64, fsgnj_f64_neg,
107 n_vals=100, opcode=0x1)
108
109
110 def test_fsgnj_f64_abs():
111 dut = FSGNJMuxInOut(64, 4)
112 runfp(dut, 64, "test_fsgnj_f64_abs", Float64, fsgnj_f64_abs,
113 n_vals=100, opcode=0x2)
114
115
116 if __name__ == '__main__':
117 for i in range(50):
118 test_fsgnj_f32_mov()
119 test_fsgnj_f32_neg()
120 test_fsgnj_f32_abs()
121 test_fsgnj_f16_mov()
122 test_fsgnj_f16_neg()
123 test_fsgnj_f16_abs()
124 test_fsgnj_f64_mov()
125 test_fsgnj_f64_neg()
126 test_fsgnj_f64_abs()