118 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=+sse \3; RUN: -enable-legalize-types-checking | FileCheck %s --check-prefix=SSE4; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=+sse \5; RUN: -enable-legalize-types-checking | FileCheck %s --check-prefix=SSE6; RUN: llc < %s -O2 -mtriple=x86_64-linux-android -mattr=-sse \7; RUN: -enable-legalize-types-checking | FileCheck %s --check-prefix=NOSSE8; RUN: llc < %s -O2 -mtriple=x86_64-linux-gnu -mattr=-sse \9; RUN: -enable-legalize-types-checking | FileCheck %s --check-prefix=NOSSE10 11define void @test_select(ptr %p, ptr %q, i1 zeroext %c) nounwind {12; SSE-LABEL: test_select:13; SSE: # %bb.0:14; SSE-NEXT: testl %edx, %edx15; SSE-NEXT: jne .LBB0_116; SSE-NEXT: # %bb.2:17; SSE-NEXT: movaps {{.*#+}} xmm0 = [NaN]18; SSE-NEXT: movaps %xmm0, (%rsi)19; SSE-NEXT: retq20; SSE-NEXT: .LBB0_1:21; SSE-NEXT: movups (%rdi), %xmm022; SSE-NEXT: movaps %xmm0, (%rsi)23; SSE-NEXT: retq24;25; NOSSE-LABEL: test_select:26; NOSSE: # %bb.0:27; NOSSE-NEXT: xorl %eax, %eax28; NOSSE-NEXT: testl %edx, %edx29; NOSSE-NEXT: cmovneq (%rdi), %rax30; NOSSE-NEXT: movabsq $9223231299366420480, %rcx # imm = 0x7FFF80000000000031; NOSSE-NEXT: cmovneq 8(%rdi), %rcx32; NOSSE-NEXT: movq %rcx, 8(%rsi)33; NOSSE-NEXT: movq %rax, (%rsi)34; NOSSE-NEXT: retq35 %a = load fp128, ptr %p, align 236 %r = select i1 %c, fp128 %a, fp128 0xL00000000000000007FFF80000000000037 store fp128 %r, ptr %q38 ret void39}40 41; The uitofp will become a select_cc. This used to crash during type42; legalization because we didn't expect the operands to need to be softened.43define fp128 @test_select_cc(fp128, fp128) nounwind {44; SSE-LABEL: test_select_cc:45; SSE: # %bb.0: # %BB046; SSE-NEXT: pushq %rbx47; SSE-NEXT: subq $32, %rsp48; SSE-NEXT: movaps %xmm1, {{[-0-9]+}}(%r{{[sb]}}p) # 16-byte Spill49; SSE-NEXT: movaps %xmm0, (%rsp) # 16-byte Spill50; SSE-NEXT: callq __netf2@PLT51; SSE-NEXT: movl %eax, %ebx52; SSE-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload53; SSE-NEXT: movaps {{[-0-9]+}}(%r{{[sb]}}p), %xmm1 # 16-byte Reload54; SSE-NEXT: callq __eqtf2@PLT55; SSE-NEXT: testl %eax, %eax56; SSE-NEXT: je .LBB1_157; SSE-NEXT: # %bb.2: # %BB058; SSE-NEXT: xorps %xmm1, %xmm159; SSE-NEXT: jmp .LBB1_360; SSE-NEXT: .LBB1_1:61; SSE-NEXT: movaps {{.*#+}} xmm1 = [1.0E+0]62; SSE-NEXT: .LBB1_3: # %BB063; SSE-NEXT: testl %ebx, %ebx64; SSE-NEXT: movaps (%rsp), %xmm0 # 16-byte Reload65; SSE-NEXT: jne .LBB1_566; SSE-NEXT: # %bb.4: # %BB167; SSE-NEXT: movaps %xmm1, %xmm068; SSE-NEXT: .LBB1_5: # %BB269; SSE-NEXT: addq $32, %rsp70; SSE-NEXT: popq %rbx71; SSE-NEXT: retq72;73; NOSSE-LABEL: test_select_cc:74; NOSSE: # %bb.0: # %BB075; NOSSE-NEXT: pushq %rbp76; NOSSE-NEXT: pushq %r1577; NOSSE-NEXT: pushq %r1478; NOSSE-NEXT: pushq %r1279; NOSSE-NEXT: pushq %rbx80; NOSSE-NEXT: movq %rcx, %r1581; NOSSE-NEXT: movq %rdx, %r1282; NOSSE-NEXT: movq %rsi, %rbx83; NOSSE-NEXT: movq %rdi, %r1484; NOSSE-NEXT: callq __netf2@PLT85; NOSSE-NEXT: movl %eax, %ebp86; NOSSE-NEXT: movq %r14, %rdi87; NOSSE-NEXT: movq %rbx, %rsi88; NOSSE-NEXT: movq %r12, %rdx89; NOSSE-NEXT: movq %r15, %rcx90; NOSSE-NEXT: callq __eqtf2@PLT91; NOSSE-NEXT: movl %eax, %ecx92; NOSSE-NEXT: xorl %eax, %eax93; NOSSE-NEXT: testl %ecx, %ecx94; NOSSE-NEXT: movabsq $4611404543450677248, %rdx # imm = 0x3FFF00000000000095; NOSSE-NEXT: cmovneq %rax, %rdx96; NOSSE-NEXT: testl %ebp, %ebp97; NOSSE-NEXT: je .LBB1_298; NOSSE-NEXT: # %bb.1:99; NOSSE-NEXT: movq %r14, %rax100; NOSSE-NEXT: movq %rbx, %rdx101; NOSSE-NEXT: .LBB1_2: # %BB2102; NOSSE-NEXT: popq %rbx103; NOSSE-NEXT: popq %r12104; NOSSE-NEXT: popq %r14105; NOSSE-NEXT: popq %r15106; NOSSE-NEXT: popq %rbp107; NOSSE-NEXT: retq108BB0:109 %a = fcmp oeq fp128 %0, %1110 %b = uitofp i1 %a to fp128111 br i1 %a, label %BB1, label %BB2112BB1:113 br label %BB2114BB2:115 %c = phi fp128 [ %0, %BB0 ], [ %b, %BB1 ]116 ret fp128 %c117}118