Машинный код x86 (с SSE2), 36 байт
; bool CirclesOverlap(double x1, double y1, double r1,
; double x2, double y2, double r2);
F2 0F 5C C3 subsd xmm0, xmm3 ; x1 - x2
F2 0F 5C CC subsd xmm1, xmm4 ; y1 - y2
F2 0F 58 D5 addsd xmm2, xmm5 ; r1 + r2
F2 0F 59 C0 mulsd xmm0, xmm0 ; (x1 - x2)^2
F2 0F 59 C9 mulsd xmm1, xmm1 ; (y1 - y2)^2
F2 0F 59 D2 mulsd xmm2, xmm2 ; (r1 + r2)^2
F2 0F 58 C1 addsd xmm0, xmm1 ; (x1 - x2)^2 + (y1 - y2)^2
66 0F 2F D0 comisd xmm2, xmm0
0F 97 C0 seta al ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3 ret
Вышеупомянутая функция принимает описания двух окружностей (x- и y-координаты центральной точки и радиуса) и возвращает логическое значение, указывающее, пересекаются они или нет.
Он использует векторное соглашение о вызовах, в котором параметры передаются в регистры SIMD. В x86-32 и 64-битной Windows это __vectorcall
соглашение о вызовах . На 64-битных Unix / Linux / Gnu это стандартное соглашение о вызовах System64 AMD64 .
Возвращаемое значение остается в младшем байте EAX
, как это стандартно для всех соглашений о вызовах x86.
Этот код одинаково хорошо работает на 32-разрядных и 64-разрядных процессорах x86, если они поддерживают набор инструкций SSE2 (который будет Intel Pentium 4 и более поздних версий или AMD Athlon 64 и более поздних).
Версия AVX, все еще 36 байтов
Если вы ориентируетесь на AVX , возможно, вы захотите добавить в инструкции префикс VEX. Это не меняет количество байтов; только фактические байты, используемые для кодирования инструкций:
; bool CirclesOverlap(double x1, double y1, double r1,
; double x2, double y2, double r2);
C5 FB 5C C3 vsubsd xmm0, xmm0, xmm3 ; x1 - x2
C5 F3 5C CC vsubsd xmm1, xmm1, xmm4 ; y1 - y2
C5 EB 58 D5 vaddsd xmm2, xmm2, xmm5 ; r1 + r2
C5 FB 59 C0 vmulsd xmm0, xmm0, xmm0 ; (x1 - x2)^2
C5 F3 59 C9 vmulsd xmm1, xmm1, xmm1 ; (y1 - y2)^2
C5 EB 59 D2 vmulsd xmm2, xmm2, xmm2 ; (r1 + r2)^2
C5 FB 58 C1 vaddsd xmm0, xmm0, xmm1 ; (x1 - x2)^2 + (y1 - y2)^2
C5 F9 2F D0 vcomisd xmm2, xmm0
0F 97 C0 seta al ; ((r1 + r2)^2) > ((x1 - x2)^2 + (y1 - y2)^2)
C3 ret
Преимущество инструкций AVX состоит в том, что они берут три операнда, что позволяет вам выполнять неразрушающие операции, но это не помогает нам сжать код здесь. Однако смешивание инструкций с префиксами VEX и без них может привести к неоптимальному коду, поэтому вы, как правило, хотите придерживаться всех инструкций AVX, если вы ориентируетесь на AVX, и в этом случае это даже не повредит количеству байтов.