xref: /llvm-project/llvm/test/CodeGen/X86/fp-logic-replace.ll (revision 25528d6de70e98683722e28655d8568d5f09b5c7)
19d13a188SSanjay Patel; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
281b021e7SCraig Topper; RUN: llc < %s -mtriple=x86_64-unknown-unknown -show-mc-encoding -mattr=+sse2 | FileCheck %s --check-prefix=SSE
381b021e7SCraig Topper; RUN: llc < %s -mtriple=x86_64-unknown-unknown -show-mc-encoding -mattr=+avx  | FileCheck %s --check-prefix=AVX
42baef8f4SCraig Topper; RUN: llc < %s -mtriple=x86_64-unknown-unknown -show-mc-encoding -mattr=+avx512dq,+avx512vl  | FileCheck %s --check-prefix=AVX512DQ
52a51748aSSanjay Patel
62a51748aSSanjay Patel; Test that we can replace "scalar" FP-bitwise-logic with the optimal instruction.
72a51748aSSanjay Patel; Scalar x86 FP-logic instructions only exist in your imagination and/or the bowels
82a51748aSSanjay Patel; of compilers, but float and double variants of FP-logic instructions are reality
92a51748aSSanjay Patel; and float may be a shorter instruction depending on which flavor of vector ISA
102a51748aSSanjay Patel; you have...so just prefer float all the time, ok? Yay, x86!
112a51748aSSanjay Patel
122a51748aSSanjay Pateldefine double @FsANDPSrr(double %x, double %y) {
132a51748aSSanjay Patel; SSE-LABEL: FsANDPSrr:
14*25528d6dSFrancis Visoiu Mistrih; SSE:       # %bb.0:
1581b021e7SCraig Topper; SSE-NEXT:    andps %xmm1, %xmm0 # encoding: [0x0f,0x54,0xc1]
1681b021e7SCraig Topper; SSE-NEXT:    retq # encoding: [0xc3]
172a51748aSSanjay Patel;
182a51748aSSanjay Patel; AVX-LABEL: FsANDPSrr:
19*25528d6dSFrancis Visoiu Mistrih; AVX:       # %bb.0:
2081b021e7SCraig Topper; AVX-NEXT:    vandps %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xf8,0x54,0xc1]
2181b021e7SCraig Topper; AVX-NEXT:    retq # encoding: [0xc3]
2281b021e7SCraig Topper;
2381b021e7SCraig Topper; AVX512DQ-LABEL: FsANDPSrr:
24*25528d6dSFrancis Visoiu Mistrih; AVX512DQ:       # %bb.0:
2519c4fc5eSGadi Haber; AVX512DQ-NEXT:    vandps %xmm1, %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf8,0x54,0xc1]
2681b021e7SCraig Topper; AVX512DQ-NEXT:    retq # encoding: [0xc3]
272a51748aSSanjay Patel  %bc1 = bitcast double %x to i64
282a51748aSSanjay Patel  %bc2 = bitcast double %y to i64
292a51748aSSanjay Patel  %and = and i64 %bc1, %bc2
302a51748aSSanjay Patel  %bc3 = bitcast i64 %and to double
312a51748aSSanjay Patel  ret double %bc3
322a51748aSSanjay Patel}
332a51748aSSanjay Patel
342a51748aSSanjay Pateldefine double @FsANDNPSrr(double %x, double %y) {
352a51748aSSanjay Patel; SSE-LABEL: FsANDNPSrr:
36*25528d6dSFrancis Visoiu Mistrih; SSE:       # %bb.0:
3781b021e7SCraig Topper; SSE-NEXT:    andnps %xmm0, %xmm1 # encoding: [0x0f,0x55,0xc8]
3881b021e7SCraig Topper; SSE-NEXT:    movaps %xmm1, %xmm0 # encoding: [0x0f,0x28,0xc1]
3981b021e7SCraig Topper; SSE-NEXT:    retq # encoding: [0xc3]
402a51748aSSanjay Patel;
412a51748aSSanjay Patel; AVX-LABEL: FsANDNPSrr:
42*25528d6dSFrancis Visoiu Mistrih; AVX:       # %bb.0:
4381b021e7SCraig Topper; AVX-NEXT:    vandnps %xmm0, %xmm1, %xmm0 # encoding: [0xc5,0xf0,0x55,0xc0]
4481b021e7SCraig Topper; AVX-NEXT:    retq # encoding: [0xc3]
4581b021e7SCraig Topper;
4681b021e7SCraig Topper; AVX512DQ-LABEL: FsANDNPSrr:
47*25528d6dSFrancis Visoiu Mistrih; AVX512DQ:       # %bb.0:
4819c4fc5eSGadi Haber; AVX512DQ-NEXT:    vandnps %xmm0, %xmm1, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf0,0x55,0xc0]
4981b021e7SCraig Topper; AVX512DQ-NEXT:    retq # encoding: [0xc3]
502a51748aSSanjay Patel  %bc1 = bitcast double %x to i64
512a51748aSSanjay Patel  %bc2 = bitcast double %y to i64
522a51748aSSanjay Patel  %not = xor i64 %bc2, -1
532a51748aSSanjay Patel  %and = and i64 %bc1, %not
542a51748aSSanjay Patel  %bc3 = bitcast i64 %and to double
552a51748aSSanjay Patel  ret double %bc3
562a51748aSSanjay Patel}
572a51748aSSanjay Patel
582a51748aSSanjay Pateldefine double @FsORPSrr(double %x, double %y) {
592a51748aSSanjay Patel; SSE-LABEL: FsORPSrr:
60*25528d6dSFrancis Visoiu Mistrih; SSE:       # %bb.0:
6181b021e7SCraig Topper; SSE-NEXT:    orps %xmm1, %xmm0 # encoding: [0x0f,0x56,0xc1]
6281b021e7SCraig Topper; SSE-NEXT:    retq # encoding: [0xc3]
632a51748aSSanjay Patel;
642a51748aSSanjay Patel; AVX-LABEL: FsORPSrr:
65*25528d6dSFrancis Visoiu Mistrih; AVX:       # %bb.0:
6681b021e7SCraig Topper; AVX-NEXT:    vorps %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xf8,0x56,0xc1]
6781b021e7SCraig Topper; AVX-NEXT:    retq # encoding: [0xc3]
6881b021e7SCraig Topper;
6981b021e7SCraig Topper; AVX512DQ-LABEL: FsORPSrr:
70*25528d6dSFrancis Visoiu Mistrih; AVX512DQ:       # %bb.0:
7119c4fc5eSGadi Haber; AVX512DQ-NEXT:    vorps %xmm1, %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf8,0x56,0xc1]
7281b021e7SCraig Topper; AVX512DQ-NEXT:    retq # encoding: [0xc3]
732a51748aSSanjay Patel  %bc1 = bitcast double %x to i64
742a51748aSSanjay Patel  %bc2 = bitcast double %y to i64
752a51748aSSanjay Patel  %or = or i64 %bc1, %bc2
762a51748aSSanjay Patel  %bc3 = bitcast i64 %or to double
772a51748aSSanjay Patel  ret double %bc3
782a51748aSSanjay Patel}
792a51748aSSanjay Patel
802a51748aSSanjay Pateldefine double @FsXORPSrr(double %x, double %y) {
812a51748aSSanjay Patel; SSE-LABEL: FsXORPSrr:
82*25528d6dSFrancis Visoiu Mistrih; SSE:       # %bb.0:
8381b021e7SCraig Topper; SSE-NEXT:    xorps %xmm1, %xmm0 # encoding: [0x0f,0x57,0xc1]
8481b021e7SCraig Topper; SSE-NEXT:    retq # encoding: [0xc3]
852a51748aSSanjay Patel;
862a51748aSSanjay Patel; AVX-LABEL: FsXORPSrr:
87*25528d6dSFrancis Visoiu Mistrih; AVX:       # %bb.0:
8881b021e7SCraig Topper; AVX-NEXT:    vxorps %xmm1, %xmm0, %xmm0 # encoding: [0xc5,0xf8,0x57,0xc1]
8981b021e7SCraig Topper; AVX-NEXT:    retq # encoding: [0xc3]
9081b021e7SCraig Topper;
9181b021e7SCraig Topper; AVX512DQ-LABEL: FsXORPSrr:
92*25528d6dSFrancis Visoiu Mistrih; AVX512DQ:       # %bb.0:
9319c4fc5eSGadi Haber; AVX512DQ-NEXT:    vxorps %xmm1, %xmm0, %xmm0 # EVEX TO VEX Compression encoding: [0xc5,0xf8,0x57,0xc1]
9481b021e7SCraig Topper; AVX512DQ-NEXT:    retq # encoding: [0xc3]
952a51748aSSanjay Patel  %bc1 = bitcast double %x to i64
962a51748aSSanjay Patel  %bc2 = bitcast double %y to i64
972a51748aSSanjay Patel  %xor = xor i64 %bc1, %bc2
982a51748aSSanjay Patel  %bc3 = bitcast i64 %xor to double
992a51748aSSanjay Patel  ret double %bc3
1002a51748aSSanjay Patel}
1012a51748aSSanjay Patel
102