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