static void sse3_test_hsubpd_subsume (double *i1, double *i2, double *r) { __m128d t1 = _mm_load_pd (i1); __m128d t2 = _mm_load_pd (i2); t1 = _mm_hsub_pd (t1, t2); _mm_storeu_pd (r, t1); }
double Point::Cross(const Point &point) const { #ifdef __SSE3__ __m128d b = _mm_shuffle_pd(point.v, point.v, 0x01); b *= v; b = _mm_hsub_pd(b, b); return reinterpret_cast<double &>(b); #else return x * point.y - y * point.x; #endif }
__m128d test_mm_hsub_pd(__m128d A, __m128d B) { // CHECK-LABEL: test_mm_hsub_pd // CHECK: call <2 x double> @llvm.x86.sse3.hsub.pd(<2 x double> %{{.*}}, <2 x double> %{{.*}}) return _mm_hsub_pd(A, B); }
__m128d test_mm_hsub_pd(__m128d A, __m128d B) { // CHECK-LABEL: test_mm_hsub_pd // CHECK: call <2 x double> @llvm.x86.sse3.hsub.pd // CHECK-ASM: hsubpd %xmm{{.*}}, %xmm{{.*}} return _mm_hsub_pd(A, B); }