bool multicast_communication::quote_message::initialize(const std::string& msg) { if (msg.length() < 58) { return false; } try { std::string header = msg.substr(0, 24); std::string body = msg.substr(24, msg.length() - 24); std::string time = header.substr(18, 3); time_ = 3600 * time_stamp_[time[0]] + 60 * time_stamp_[time[1]] + time_stamp_[time[2]]; if ((header[0] == 'E' || header[0] == 'L') && header[1] == 'D') { return init_short(body); } else if ((header[0] == 'B' || header[0] == 'E' || header[0] == 'L') && header[1] == 'B') { return init_long(body); } } catch(...) { return false; } return false; }
int main() { int i; init_double(old_dst.d, 4, 3.14); /* Initialize memory and the registers */ vind.l[0] = 0; vind.l[1] = 6; vind.l[2] = 3; vind.l[3] = 1; mask.l[0] = 0x80ffffff00000000LL; mask.l[1] = 0x00ffffff10000000LL; mask.l[2] = 0x00ffffff00000000LL; mask.l[3] = 0x80ffffff10000000LL; init_long(&d, 0xdeadbeef); for (i = 0; i < 4; i++) { expect.d[i] = (mask.l[i] & 0x8000000000000000LL) ? *(double *)(ptr+(vind.l[i] * 8 + 0)) : old_dst.d[i]; } __asm { /* VGATHERDPD ymm1, [rax + ymm2_vind*8], ymm3_mask */ lea REG, ADDRPTR [arr-4] /* the memory rewrite of the vgather will add 4 back to the address */ vmovupd YMMa, [old_dst.md]; vmovupd YMMb, [vind.md]; vmovupd YMMc, [mask.md]; vmovupd [YMMDestBefore.ms], YMMa; vmovupd [YMMIndexBefore.ms], YMMb; vmovupd [YMMMaskBefore.ms], YMMc; vgatherqpd YMMa, [REG + YMMb*8], YMMc vmovupd [d.md], YMMa; vmovupd [YMMIndexAfter.ms], YMMb; vmovupd [YMMMaskAfter.ms], YMMc; } printVl("YMM dest before: ", YMMDestBefore.l); printVl("YMM dest after: ", d.l); printVl("YMM index before: ", YMMIndexBefore.l); printVl("YMM index after: ", YMMIndexAfter.l); printVl("YMM mask before: ", YMMMaskBefore.l); printVl("YMM mask after: ", YMMMaskAfter.l); check_res(1); init_long(&d, 0xdeadbeef); for (i = 2; i < 4; i++) { expect.d[i] = 0; } __asm { /* VGATHERDPD xmm1, [rax + xmm2_vind*8], xmm3_mask */ lea REG, ADDRPTR [arr-4] /* the memory rewrite of the vgather will add 4 back to the address */ vmovupd YMMa, [old_dst.md]; vmovupd YMMb, [vind.md]; vmovupd YMMc, [mask.md]; vmovupd [YMMDestBefore.ms], YMMa; vmovupd [YMMIndexBefore.ms], YMMb; vmovupd [YMMMaskBefore.ms], YMMc; vgatherqpd XMMa, [REG + XMMb*8], XMMc vmovupd [d.md], YMMa; vmovupd [YMMIndexAfter.ms], YMMb; vmovupd [YMMMaskAfter.ms], YMMc; } printVl("YMM dest before: ", YMMDestBefore.l); printVl("YMM dest after: ", d.l); printVl("YMM index before: ", YMMIndexBefore.l); printVl("YMM index after: ", YMMIndexAfter.l); printVl("YMM mask before: ", YMMMaskBefore.l); printVl("YMM mask after: ", YMMMaskAfter.l); check_res(2); init_long(&d, 0xdeadbeef); for (i = 0; i < 4; i++) { expect.d[i] = (mask.l[i] & 0x8000000000000000LL) ? *(double *)(ptr+(vind.l[i] * 8 + 8)) : old_dst.d[i]; } __asm { /* VGATHERDPD ymm1, [rax + ymm2_vind*8 + 8], ymm3_mask */ lea REG, ADDRPTR [arr-4] /* the memory rewrite of the vgather will add 4 back to the address */ vmovupd YMMa, [old_dst.md]; vmovupd YMMb, [vind.md]; vmovupd YMMc, [mask.md]; vmovupd [YMMDestBefore.ms], YMMa; vmovupd [YMMIndexBefore.ms], YMMb; vmovupd [YMMMaskBefore.ms], YMMc; vgatherqpd YMMa, [REG + YMMb*8 + 8], YMMc vmovupd [d.md], YMMa; vmovupd [YMMIndexAfter.ms], YMMb; vmovupd [YMMMaskAfter.ms], YMMc; } printVl("YMM dest before: ", YMMDestBefore.l); printVl("YMM dest after: ", d.l); printVl("YMM index before: ", YMMIndexBefore.l); printVl("YMM index after: ", YMMIndexAfter.l); printVl("YMM mask before: ", YMMMaskBefore.l); printVl("YMM mask after: ", YMMMaskAfter.l); check_res(3); init_long(&d, 0xdeadbeef); for (i = 2; i < 4; i++) { expect.d[i] = 0; } __asm { /* VGATHERDPD xmm1, [rax + xmm2_vind*8 + 8], xmm3_mask */ lea REG, ADDRPTR [arr-4] /* the memory rewrite of the vgather will add 4 back to the address */ vmovupd YMMa, [old_dst.md]; vmovupd YMMb, [vind.md]; vmovupd YMMc, [mask.md]; vmovupd [YMMDestBefore.ms], YMMa; vmovupd [YMMIndexBefore.ms], YMMb; vmovupd [YMMMaskBefore.ms], YMMc; vgatherqpd XMMa, [REG + XMMb*8 + 8], XMMc vmovupd [d.md], YMMa; vmovupd [YMMIndexAfter.ms], YMMb; vmovupd [YMMMaskAfter.ms], YMMc; } printVl("YMM dest before: ", YMMDestBefore.l); printVl("YMM dest after: ", d.l); printVl("YMM index before: ", YMMIndexBefore.l); printVl("YMM index after: ", YMMIndexAfter.l); printVl("YMM mask before: ", YMMMaskBefore.l); printVl("YMM mask after: ", YMMMaskAfter.l); check_res(4); if(!res) PRINTF("gatherqpd passed\n"); return res; }