Path: blob/main/test/benchmark/benchmark_sse1.cpp
6174 views
/*1* Copyright 2020 The Emscripten Authors. All rights reserved.2* Emscripten is available under two separate licenses, the MIT license and the3* University of Illinois/NCSA Open Source License. Both these licenses can be4* found in the LICENSE file.5*/6#include <xmmintrin.h>7#include "benchmark_sse.h"89int main() {10printf ("{ \"workload\": %u, \"results\": [\n", N);1112float *src_flt = alloc_float_buffer();13float *src2_flt = alloc_float_buffer();14float *dst_flt = alloc_float_buffer();15for(int i = 0; i < N; ++i) src_flt[i] = (float)(1.0 + (double)rand() / RAND_MAX);16for(int i = 0; i < N; ++i) src2_flt[i] = (float)(1.0 + (double)rand() / RAND_MAX);1718double *src_dbl = alloc_double_buffer();19double *src2_dbl = alloc_double_buffer();20double *dst_dbl = alloc_double_buffer();21for(int i = 0; i < N; ++i) src_dbl[i] = 1.0 + (double)rand() / RAND_MAX;22for(int i = 0; i < N; ++i) src2_dbl[i] = 1.0 + (double)rand() / RAND_MAX;2324int *src_int = alloc_int_buffer();25int *src2_int = alloc_int_buffer();26int *dst_int = alloc_int_buffer();27int dst_int_scalar = 0;28for(int i = 0; i < N; ++i) src_int[i] = rand();29for(int i = 0; i < N; ++i) src2_int[i] = rand();3031float scalarTime = 0.f;3233// Benchmarks start:34SETCHART("load");35START();36for(int i = 0; i < N; ++i)37dst_flt[i] = src_flt[i];38ENDSCALAR(checksum_dst(dst_flt), "scalar");3940LOAD_STORE_F("_mm_load_ps", _mm_load_ps, 0, _mm_store_ps, float*, 0, 4);41LOAD_STORE_F("_mm_load_ps1", _mm_load_ps1, 1, _mm_store_ps, float*, 0, 4);42LOAD_STORE_F("_mm_load_ss", _mm_load_ss, 1, _mm_store_ps, float*, 0, 4);43LOAD_STORE_F("_mm_load1_ps", _mm_load1_ps, 1, _mm_store_ps, float*, 0, 4);4445__m128 tempReg = _mm_set_ps(1.f, 2.f, 3.f, 4.f);46LOAD_STORE_M64("_mm_loadh_pi", tempReg, _mm_loadh_pi, __m64*, 1, _mm_store_ps, float*, 0, 4);47LOAD_STORE_M64("_mm_loadl_pi", tempReg, _mm_loadh_pi, __m64*, 1, _mm_store_ps, float*, 0, 4);4849LOAD_STORE_F("_mm_loadr_ps", _mm_loadr_ps, 0, _mm_store_ps, float*, 0, 4);50LOAD_STORE_F("_mm_loadu_ps", _mm_loadu_ps, 1, _mm_store_ps, float*, 0, 4);5152SETCHART("set");53SET_STORE_F("_mm_set_ps", _mm_set_ps(src_flt[i+2], src_flt[i+1], src_flt[i+5], src_flt[i+0]));54SET_STORE_F("_mm_set_ps1", _mm_set_ps1(src_flt[i]));55SET_STORE_F("_mm_set_ss", _mm_set_ss(src_flt[i]));56SET_STORE_F("_mm_set1_ps", _mm_set1_ps(src_flt[i]));57SET_STORE_F("_mm_setr_ps", _mm_set_ps(src_flt[i+2], src_flt[i+1], src_flt[i+5], src_flt[i+0]));58SET_STORE_F("_mm_setzero_ps", _mm_setzero_ps());5960SETCHART("move");61SET_STORE_F("_mm_move_ss", _mm_move_ss(_mm_load_ps(src_flt+i), _mm_load_ps(src2_flt+i)));62SET_STORE_F("_mm_movehl_ps", _mm_movehl_ps(_mm_load_ps(src_flt+i), _mm_load_ps(src2_flt+i)));63SET_STORE_F("_mm_movelh_ps", _mm_movelh_ps(_mm_load_ps(src_flt+i), _mm_load_ps(src2_flt+i)));6465SETCHART("movemask");66START(); for(int i = 0; i < N; i += 4) { int movemask = ((unsigned int)src_flt[i] >> 31) | (((unsigned int)src_flt[i+1] >> 30) & 2) | (((unsigned int)src_flt[i+2] >> 29) & 4) | (((unsigned int)src_flt[i+3] >> 28) & 8); dst_int_scalar += movemask; } ENDSCALAR(dst_int_scalar, "scalar movemask");67UNARYOP_i_F("_mm_movemask_ps", _mm_movemask_ps(_mm_load_ps(src_flt+i)));6869SETCHART("store");70LOAD_STORE_F("_mm_store_ps", _mm_load_ps, 0, _mm_store_ps, float*, 0, 4);71LOAD_STORE_F("_mm_store_ps1", _mm_load_ps, 0, _mm_store_ps1, float*, 0, 4);72LOAD_STORE_F("_mm_store_ss", _mm_load_ps, 0, _mm_store_ss, float*, 1, 4);73LOAD_STORE_64_F("_mm_storeh_pi", _mm_load_ps, 0, _mm_storeh_pi, 1, 4);74LOAD_STORE_64_F("_mm_storel_pi", _mm_load_ps, 0, _mm_storel_pi, 1, 4);75LOAD_STORE_F("_mm_storer_ps", _mm_load_ps, 0, _mm_storer_ps, float*, 0, 4);76LOAD_STORE_F("_mm_storeu_ps", _mm_load_ps, 0, _mm_storeu_ps, float*, 1, 4);77LOAD_STORE_F("_mm_stream_ps", _mm_load_ps, 0, _mm_stream_ps, float*, 0, 4);7879SETCHART("arithmetic");80START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] += src2_flt[0]; dst_flt[1] += src2_flt[1]; dst_flt[2] += src2_flt[2]; dst_flt[3] += src2_flt[3]; } ENDSCALAR(checksum_dst(dst_flt), "scalar add");81BINARYOP_F_FF("_mm_add_ps", _mm_add_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));82BINARYOP_F_FF("_mm_add_ss", _mm_add_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));83START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] /= src2_flt[0]; dst_flt[1] /= src2_flt[1]; dst_flt[2] /= src2_flt[2]; dst_flt[3] /= src2_flt[3]; } ENDSCALAR(checksum_dst(dst_flt), "scalar div");84BINARYOP_F_FF("_mm_div_ps", _mm_div_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));85BINARYOP_F_FF("_mm_div_ss", _mm_div_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));86START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] *= src2_flt[0]; dst_flt[1] *= src2_flt[1]; dst_flt[2] *= src2_flt[2]; dst_flt[3] *= src2_flt[3]; } ENDSCALAR(checksum_dst(dst_flt), "scalar mul");87BINARYOP_F_FF("_mm_mul_ps", _mm_mul_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));88BINARYOP_F_FF("_mm_mul_ss", _mm_mul_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));89START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] -= src2_flt[0]; dst_flt[1] -= src2_flt[1]; dst_flt[2] -= src2_flt[2]; dst_flt[3] -= src2_flt[3]; } ENDSCALAR(checksum_dst(dst_flt), "scalar sub");90BINARYOP_F_FF("_mm_sub_ps", _mm_sub_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));91BINARYOP_F_FF("_mm_sub_ss", _mm_sub_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));9293SETCHART("roots");94START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = 1.f / dst_flt[0]; dst_flt[1] = 1.f / dst_flt[1]; dst_flt[2] = 1.f / dst_flt[2]; dst_flt[3] = 1.f / dst_flt[3]; } ENDSCALAR(checksum_dst(dst_flt), "scalar rcp");95UNARYOP_F_F("_mm_rcp_ps", _mm_rcp_ps, _mm_load_ps(src_flt));96UNARYOP_F_F("_mm_rcp_ss", _mm_rcp_ss, _mm_load_ps(src_flt));9798START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = 1.f / sqrtf(dst_flt[0]); dst_flt[1] = 1.f / sqrtf(dst_flt[1]); dst_flt[2] = 1.f / sqrtf(dst_flt[2]); dst_flt[3] = 1.f / sqrtf(dst_flt[3]); } ENDSCALAR(checksum_dst(dst_flt), "scalar rsqrt");99UNARYOP_F_F("_mm_rsqrt_ps", _mm_rsqrt_ps, _mm_load_ps(src_flt));100UNARYOP_F_F("_mm_rsqrt_ss", _mm_rsqrt_ss, _mm_load_ps(src_flt));101102START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = sqrtf(dst_flt[0]); dst_flt[1] = sqrtf(dst_flt[1]); dst_flt[2] = sqrtf(dst_flt[2]); dst_flt[3] = sqrtf(dst_flt[3]); } ENDSCALAR(checksum_dst(dst_flt), "scalar sqrt");103UNARYOP_F_F("_mm_sqrt_ps", _mm_sqrt_ps, _mm_load_ps(src_flt));104UNARYOP_F_F("_mm_sqrt_ss", _mm_sqrt_ss, _mm_load_ps(src_flt));105106SETCHART("logical");107START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = ucastf(fcastu(dst_flt[0]) & fcastu(src2_flt[0])); dst_flt[1] = ucastf(fcastu(dst_flt[1]) & fcastu(src2_flt[1])); dst_flt[2] = ucastf(fcastu(dst_flt[2]) & fcastu(src2_flt[2])); dst_flt[3] = ucastf(fcastu(dst_flt[3]) & fcastu(src2_flt[3])); } ENDSCALAR(checksum_dst(dst_flt), "scalar and");108BINARYOP_F_FF("_mm_and_ps", _mm_and_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));109START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = ucastf((~fcastu(dst_flt[0])) & fcastu(src2_flt[0])); dst_flt[1] = ucastf((~fcastu(dst_flt[1])) & fcastu(src2_flt[1])); dst_flt[2] = ucastf((~fcastu(dst_flt[2])) & fcastu(src2_flt[2])); dst_flt[3] = ucastf((~fcastu(dst_flt[3])) & fcastu(src2_flt[3])); } ENDSCALAR(checksum_dst(dst_flt), "scalar andnot");110BINARYOP_F_FF("_mm_andnot_ps", _mm_andnot_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));111START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = ucastf(fcastu(dst_flt[0]) | fcastu(src2_flt[0])); dst_flt[1] = ucastf(fcastu(dst_flt[1]) | fcastu(src2_flt[1])); dst_flt[2] = ucastf(fcastu(dst_flt[2]) | fcastu(src2_flt[2])); dst_flt[3] = ucastf(fcastu(dst_flt[3]) | fcastu(src2_flt[3])); } ENDSCALAR(checksum_dst(dst_flt), "scalar or");112BINARYOP_F_FF("_mm_or_ps", _mm_or_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));113START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = ucastf(fcastu(dst_flt[0]) ^ fcastu(src2_flt[0])); dst_flt[1] = ucastf(fcastu(dst_flt[1]) ^ fcastu(src2_flt[1])); dst_flt[2] = ucastf(fcastu(dst_flt[2]) ^ fcastu(src2_flt[2])); dst_flt[3] = ucastf(fcastu(dst_flt[3]) ^ fcastu(src2_flt[3])); } ENDSCALAR(checksum_dst(dst_flt), "scalar xor");114BINARYOP_F_FF("_mm_xor_ps", _mm_xor_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));115116SETCHART("cmp");117START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = (dst_flt[0] == src2_flt[0]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[1] = (dst_flt[1] == src2_flt[1]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[2] = (dst_flt[2] == src2_flt[2]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[3] = (dst_flt[3] == src2_flt[3]) ? ucastf(0xFFFFFFFFU) : 0.f; } ENDSCALAR(checksum_dst(dst_flt), "scalar cmp==");118BINARYOP_F_FF("_mm_cmpeq_ps", _mm_cmpeq_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));119BINARYOP_F_FF("_mm_cmpeq_ss", _mm_cmpeq_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));120START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = (dst_flt[0] >= src2_flt[0]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[1] = (dst_flt[1] >= src2_flt[1]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[2] = (dst_flt[2] >= src2_flt[2]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[3] = (dst_flt[3] >= src2_flt[3]) ? ucastf(0xFFFFFFFFU) : 0.f; } ENDSCALAR(checksum_dst(dst_flt), "scalar cmp>=");121BINARYOP_F_FF("_mm_cmpge_ps", _mm_cmpge_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));122BINARYOP_F_FF("_mm_cmpge_ss", _mm_cmpge_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));123START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = (dst_flt[0] > src2_flt[0]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[1] = (dst_flt[1] > src2_flt[1]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[2] = (dst_flt[2] > src2_flt[2]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[3] = (dst_flt[3] > src2_flt[3]) ? ucastf(0xFFFFFFFFU) : 0.f; } ENDSCALAR(checksum_dst(dst_flt), "scalar cmp>");124BINARYOP_F_FF("_mm_cmpgt_ps", _mm_cmpgt_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));125BINARYOP_F_FF("_mm_cmpgt_ss", _mm_cmpgt_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));126START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = (dst_flt[0] <= src2_flt[0]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[1] = (dst_flt[1] <= src2_flt[1]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[2] = (dst_flt[2] <= src2_flt[2]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[3] = (dst_flt[3] <= src2_flt[3]) ? ucastf(0xFFFFFFFFU) : 0.f; } ENDSCALAR(checksum_dst(dst_flt), "scalar cmp<=");127BINARYOP_F_FF("_mm_cmple_ps", _mm_cmple_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));128BINARYOP_F_FF("_mm_cmple_ss", _mm_cmple_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));129START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = (dst_flt[0] < src2_flt[0]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[1] = (dst_flt[1] < src2_flt[1]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[2] = (dst_flt[2] < src2_flt[2]) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[3] = (dst_flt[3] < src2_flt[3]) ? ucastf(0xFFFFFFFFU) : 0.f; } ENDSCALAR(checksum_dst(dst_flt), "scalar cmp<");130BINARYOP_F_FF("_mm_cmplt_ps", _mm_cmplt_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));131BINARYOP_F_FF("_mm_cmplt_ss", _mm_cmplt_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));132133START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = (!Isnan(dst_flt[0]) && !Isnan(src2_flt[0])) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[1] = (!Isnan(dst_flt[1]) && !Isnan(src2_flt[1])) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[2] = (!Isnan(dst_flt[2]) && !Isnan(src2_flt[2])) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[3] = (!Isnan(dst_flt[3]) && !Isnan(src2_flt[3])) ? ucastf(0xFFFFFFFFU) : 0.f; } ENDSCALAR(checksum_dst(dst_flt), "scalar cmpord");134BINARYOP_F_FF("_mm_cmpord_ps", _mm_cmpord_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));135BINARYOP_F_FF("_mm_cmpord_ss", _mm_cmpord_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));136START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = (Isnan(dst_flt[0]) || Isnan(src2_flt[0])) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[1] = (Isnan(dst_flt[1]) || Isnan(src2_flt[1])) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[2] = (Isnan(dst_flt[2]) || Isnan(src2_flt[2])) ? ucastf(0xFFFFFFFFU) : 0.f; dst_flt[3] = (Isnan(dst_flt[3]) || Isnan(src2_flt[3])) ? ucastf(0xFFFFFFFFU) : 0.f; } ENDSCALAR(checksum_dst(dst_flt), "scalar cmpunord");137BINARYOP_F_FF("_mm_cmpunord_ps", _mm_cmpunord_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));138BINARYOP_F_FF("_mm_cmpunord_ss", _mm_cmpunord_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));139140SETCHART("max");141START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = Max(dst_flt[0], src2_flt[0]); dst_flt[1] = Max(dst_flt[1], src2_flt[1]); dst_flt[2] = Max(dst_flt[2], src2_flt[2]); dst_flt[3] = Max(dst_flt[3], src2_flt[3]); } ENDSCALAR(checksum_dst(dst_flt), "scalar max");142BINARYOP_F_FF("_mm_max_ps", _mm_max_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));143BINARYOP_F_FF("_mm_max_ss", _mm_max_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));144START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = Min(dst_flt[0], src2_flt[0]); dst_flt[1] = Min(dst_flt[1], src2_flt[1]); dst_flt[2] = Min(dst_flt[2], src2_flt[2]); dst_flt[3] = Min(dst_flt[3], src2_flt[3]); } ENDSCALAR(checksum_dst(dst_flt), "scalar min");145BINARYOP_F_FF("_mm_min_ps", _mm_min_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));146BINARYOP_F_FF("_mm_min_ss", _mm_min_ss, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));147148SETCHART("shuffle");149START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[3] = dst_flt[1]; dst_flt[2] = dst_flt[0]; dst_flt[1] = src2_flt[3]; dst_flt[0] = src2_flt[2]; } ENDSCALAR(checksum_dst(dst_flt), "scalar shuffle");150151START();152__m128 o0 = _mm_load_ps(src_flt);153__m128 o1 = _mm_load_ps(src2_flt);154for(int i = 0; i < N; i += 4)155o0 = _mm_shuffle_ps(o0, o1, _MM_SHUFFLE(1, 0, 3, 2));156_mm_store_ps(dst_flt, o0);157END(checksum_dst(dst_flt), "_mm_shuffle_ps");158159START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[0] = dst_flt[2]; dst_flt[1] = src2_flt[2]; dst_flt[2] = dst_flt[3]; dst_flt[3] = src2_flt[3]; } ENDSCALAR(checksum_dst(dst_flt), "scalar unpackhi_ps");160BINARYOP_F_FF("_mm_unpackhi_ps", _mm_unpackhi_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));161START(); dst_flt[0] = src_flt[0]; dst_flt[1] = src_flt[1]; dst_flt[2] = src_flt[2]; dst_flt[3] = src_flt[3]; for(int i = 0; i < N; ++i) { dst_flt[2] = dst_flt[1]; dst_flt[1] = dst_flt[0]; dst_flt[0] = src2_flt[0]; dst_flt[3] = src2_flt[1]; } ENDSCALAR(checksum_dst(dst_flt), "scalar unpacklo_ps");162BINARYOP_F_FF("_mm_unpacklo_ps", _mm_unpacklo_ps, _mm_load_ps(src_flt), _mm_load_ps(src2_flt));163164// Benchmarks end:165printf("]}\n");166}167168169