135 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-apple-darwin -mattr=+sse2 | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-apple-darwin -mattr=+sse2 | FileCheck %s --check-prefix=X644 5define i32 @t(ptr %ref_frame_ptr, i32 %ref_frame_stride, i32 %idxX, i32 %idxY) nounwind {6; X86-LABEL: t:7; X86: ## %bb.0: ## %entry8; X86-NEXT: movl {{[0-9]+}}(%esp), %eax9; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx10; X86-NEXT: imull {{[0-9]+}}(%esp), %ecx11; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx12; X86-NEXT: movl (%eax,%ecx), %eax13; X86-NEXT: retl14;15; X64-LABEL: t:16; X64: ## %bb.0: ## %entry17; X64-NEXT: imull %ecx, %esi18; X64-NEXT: addl %edx, %esi19; X64-NEXT: movslq %esi, %rax20; X64-NEXT: movl (%rdi,%rax), %eax21; X64-NEXT: retq22entry:23 %tmp7 = mul i32 %idxY, %ref_frame_stride ; <i32> [#uses=2]24 %tmp9 = add i32 %tmp7, %idxX ; <i32> [#uses=1]25 %tmp11 = getelementptr i8, ptr %ref_frame_ptr, i32 %tmp9 ; <ptr> [#uses=1]26 %tmp13 = load i32, ptr %tmp11, align 4 ; <i32> [#uses=1]27 %tmp18 = add i32 %idxX, 4 ; <i32> [#uses=1]28 %tmp20.sum = add i32 %tmp18, %tmp7 ; <i32> [#uses=1]29 %tmp21 = getelementptr i8, ptr %ref_frame_ptr, i32 %tmp20.sum ; <ptr> [#uses=1]30 %tmp23 = load i16, ptr %tmp21, align 2 ; <i16> [#uses=1]31 %tmp2425 = zext i16 %tmp23 to i64 ; <i64> [#uses=1]32 %tmp26 = shl i64 %tmp2425, 32 ; <i64> [#uses=1]33 %tmp2728 = zext i32 %tmp13 to i64 ; <i64> [#uses=1]34 %tmp29 = or i64 %tmp26, %tmp2728 ; <i64> [#uses=1]35 %tmp3454 = bitcast i64 %tmp29 to double ; <double> [#uses=1]36 %tmp35 = insertelement <2 x double> undef, double %tmp3454, i32 0 ; <<2 x double>> [#uses=1]37 %tmp36 = insertelement <2 x double> %tmp35, double 0.000000e+00, i32 1 ; <<2 x double>> [#uses=1]38 %tmp42 = bitcast <2 x double> %tmp36 to <8 x i16> ; <<8 x i16>> [#uses=1]39 %tmp43 = shufflevector <8 x i16> %tmp42, <8 x i16> undef, <8 x i32> < i32 0, i32 1, i32 1, i32 2, i32 4, i32 5, i32 6, i32 7 > ; <<8 x i16>> [#uses=1]40 %tmp47 = bitcast <8 x i16> %tmp43 to <4 x i32> ; <<4 x i32>> [#uses=1]41 %tmp48 = extractelement <4 x i32> %tmp47, i32 0 ; <i32> [#uses=1]42 ret i32 %tmp4843}44 45; Test CSE for SDAG nodes with multiple results (UMUL_LOHI).46define i96 @square_high(i96 %x) nounwind {47; X86-LABEL: square_high:48; X86: ## %bb.0: ## %entry49; X86-NEXT: pushl %ebp50; X86-NEXT: pushl %ebx51; X86-NEXT: pushl %edi52; X86-NEXT: pushl %esi53; X86-NEXT: pushl %eax54; X86-NEXT: movl {{[0-9]+}}(%esp), %esi55; X86-NEXT: movl {{[0-9]+}}(%esp), %edi56; X86-NEXT: movl {{[0-9]+}}(%esp), %ebx57; X86-NEXT: movl %edi, %eax58; X86-NEXT: mull %edi59; X86-NEXT: movl %edx, %ecx60; X86-NEXT: movl %ebx, %eax61; X86-NEXT: mull %edi62; X86-NEXT: addl %eax, %ecx63; X86-NEXT: movl %edx, %ebp64; X86-NEXT: adcl $0, %ebp65; X86-NEXT: addl %eax, %ecx66; X86-NEXT: adcl %edx, %ebp67; X86-NEXT: setb %al68; X86-NEXT: movzbl %al, %ecx69; X86-NEXT: movl %ebx, %eax70; X86-NEXT: mull %ebx71; X86-NEXT: movl %eax, %ebx72; X86-NEXT: addl %ebp, %ebx73; X86-NEXT: adcl %edx, %ecx74; X86-NEXT: movl %esi, %eax75; X86-NEXT: mull %edi76; X86-NEXT: movl %edx, (%esp) ## 4-byte Spill77; X86-NEXT: movl %eax, %ebp78; X86-NEXT: movl %esi, %eax79; X86-NEXT: mull {{[0-9]+}}(%esp)80; X86-NEXT: movl %edx, %esi81; X86-NEXT: movl %eax, %edi82; X86-NEXT: addl (%esp), %edi ## 4-byte Folded Reload83; X86-NEXT: adcl $0, %esi84; X86-NEXT: addl %ebp, %ebx85; X86-NEXT: adcl %edi, %ecx86; X86-NEXT: movl %esi, %eax87; X86-NEXT: adcl $0, %eax88; X86-NEXT: setb %dl89; X86-NEXT: addl %ebp, %ebx90; X86-NEXT: adcl %ecx, %edi91; X86-NEXT: movzbl %dl, %ecx92; X86-NEXT: adcl %eax, %esi93; X86-NEXT: adcl $0, %ecx94; X86-NEXT: movl {{[0-9]+}}(%esp), %eax95; X86-NEXT: mull %eax96; X86-NEXT: addl %eax, %esi97; X86-NEXT: adcl %edx, %ecx98; X86-NEXT: movl %edi, %eax99; X86-NEXT: movl %esi, %edx100; X86-NEXT: addl $4, %esp101; X86-NEXT: popl %esi102; X86-NEXT: popl %edi103; X86-NEXT: popl %ebx104; X86-NEXT: popl %ebp105; X86-NEXT: retl106;107; X64-LABEL: square_high:108; X64: ## %bb.0: ## %entry109; X64-NEXT: movl %esi, %ecx110; X64-NEXT: movq %rcx, %rax111; X64-NEXT: mulq %rdi112; X64-NEXT: movq %rdx, %rsi113; X64-NEXT: movq %rax, %r8114; X64-NEXT: movq %rdi, %rax115; X64-NEXT: mulq %rdi116; X64-NEXT: addq %r8, %rdx117; X64-NEXT: movq %rsi, %rax118; X64-NEXT: adcq $0, %rax119; X64-NEXT: addq %rdx, %r8120; X64-NEXT: adcq %rsi, %rax121; X64-NEXT: imulq %rcx, %rcx122; X64-NEXT: addq %rax, %rcx123; X64-NEXT: shrdq $32, %rcx, %r8124; X64-NEXT: shrq $32, %rcx125; X64-NEXT: movq %r8, %rax126; X64-NEXT: movq %rcx, %rdx127; X64-NEXT: retq128entry:129 %conv = zext i96 %x to i192130 %mul = mul nuw i192 %conv, %conv131 %shr = lshr i192 %mul, 96132 %conv2 = trunc i192 %shr to i96133 ret i96 %conv2134}135