1 // vfmerge_vf vd, vs2, vs1, vm
2 VI_CHECK_SSS(false);
3 VI_VFP_COMMON;
4 
5 switch(P.VU.vsew) {
6   case e16:
7     for (reg_t i=P.VU.vstart->read(); i<vl; ++i) {
8       auto &vd = P.VU.elt<float16_t>(rd_num, i, true);
9       auto rs1 = f16(READ_FREG(rs1_num));
10       auto vs2 = P.VU.elt<float16_t>(rs2_num, i);
11 
12       int midx = i / 64;
13       int mpos = i % 64;
14       bool use_first = (P.VU.elt<uint64_t>(0, midx) >> mpos) & 0x1;
15 
16       vd = use_first ? rs1 : vs2;
17     }
18     break;
19   case e32:
20     for (reg_t i=P.VU.vstart->read(); i<vl; ++i) {
21       auto &vd = P.VU.elt<float32_t>(rd_num, i, true);
22       auto rs1 = f32(READ_FREG(rs1_num));
23       auto vs2 = P.VU.elt<float32_t>(rs2_num, i);
24 
25       int midx = i / 64;
26       int mpos = i % 64;
27       bool use_first = (P.VU.elt<uint64_t>(0, midx) >> mpos) & 0x1;
28 
29       vd = use_first ? rs1 : vs2;
30     }
31     break;
32   case e64:
33     for (reg_t i=P.VU.vstart->read(); i<vl; ++i) {
34       auto &vd = P.VU.elt<float64_t>(rd_num, i, true);
35       auto rs1 = f64(READ_FREG(rs1_num));
36       auto vs2 = P.VU.elt<float64_t>(rs2_num, i);
37 
38       int midx = i / 64;
39       int mpos = i % 64;
40       bool use_first = (P.VU.elt<uint64_t>(0, midx) >> mpos) & 0x1;
41 
42       vd = use_first ? rs1 : vs2;
43     }
44     break;
45   default:
46     require(0);
47     break;
48 }
49 
50 P.VU.vstart->write(0);
51