brintos

brintos / llvm-project-archived public Read only

0
0
Text · 4.6 KiB · 97a4318 Raw
149 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown -mattr=+bmi,+bmi2,+sse,+sse2,+avx,+avx2 | FileCheck %s --check-prefixes=CHECK,X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+bmi,+bmi2,+sse,+sse2,+avx,+avx2 | FileCheck %s --check-prefixes=CHECK,X644 5; If we have a shift by sign-extended value, we can replace sign-extension6; with zero-extension.7 8define i32 @t0_shl(i32 %x, i8 %shamt) nounwind {9; X86-LABEL: t0_shl:10; X86:       # %bb.0:11; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax12; X86-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax13; X86-NEXT:    retl14;15; X64-LABEL: t0_shl:16; X64:       # %bb.0:17; X64-NEXT:    shlxl %esi, %edi, %eax18; X64-NEXT:    retq19  %shamt_wide = sext i8 %shamt to i3220  %r = shl i32 %x, %shamt_wide21  ret i32 %r22}23define i32 @t1_lshr(i32 %x, i8 %shamt) nounwind {24; X86-LABEL: t1_lshr:25; X86:       # %bb.0:26; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax27; X86-NEXT:    shrxl %eax, {{[0-9]+}}(%esp), %eax28; X86-NEXT:    retl29;30; X64-LABEL: t1_lshr:31; X64:       # %bb.0:32; X64-NEXT:    shrxl %esi, %edi, %eax33; X64-NEXT:    retq34  %shamt_wide = sext i8 %shamt to i3235  %r = lshr i32 %x, %shamt_wide36  ret i32 %r37}38define i32 @t2_ashr(i32 %x, i8 %shamt) nounwind {39; X86-LABEL: t2_ashr:40; X86:       # %bb.0:41; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %eax42; X86-NEXT:    sarxl %eax, {{[0-9]+}}(%esp), %eax43; X86-NEXT:    retl44;45; X64-LABEL: t2_ashr:46; X64:       # %bb.0:47; X64-NEXT:    sarxl %esi, %edi, %eax48; X64-NEXT:    retq49  %shamt_wide = sext i8 %shamt to i3250  %r = ashr i32 %x, %shamt_wide51  ret i32 %r52}53 54define <4 x i32> @t3_vec_shl(<4 x i32> %x, <4 x i8> %shamt) nounwind {55; CHECK-LABEL: t3_vec_shl:56; CHECK:       # %bb.0:57; CHECK-NEXT:    vpmovsxbd %xmm1, %xmm158; CHECK-NEXT:    vpsllvd %xmm1, %xmm0, %xmm059; CHECK-NEXT:    ret{{[l|q]}}60  %shamt_wide = sext <4 x i8> %shamt to <4 x i32>61  %r = shl <4 x i32> %x, %shamt_wide62  ret <4 x i32> %r63}64define <4 x i32> @t4_vec_lshr(<4 x i32> %x, <4 x i8> %shamt) nounwind {65; CHECK-LABEL: t4_vec_lshr:66; CHECK:       # %bb.0:67; CHECK-NEXT:    vpmovsxbd %xmm1, %xmm168; CHECK-NEXT:    vpsrlvd %xmm1, %xmm0, %xmm069; CHECK-NEXT:    ret{{[l|q]}}70  %shamt_wide = sext <4 x i8> %shamt to <4 x i32>71  %r = lshr <4 x i32> %x, %shamt_wide72  ret <4 x i32> %r73}74define <4 x i32> @t5_vec_ashr(<4 x i32> %x, <4 x i8> %shamt) nounwind {75; CHECK-LABEL: t5_vec_ashr:76; CHECK:       # %bb.0:77; CHECK-NEXT:    vpmovsxbd %xmm1, %xmm178; CHECK-NEXT:    vpsravd %xmm1, %xmm0, %xmm079; CHECK-NEXT:    ret{{[l|q]}}80  %shamt_wide = sext <4 x i8> %shamt to <4 x i32>81  %r = ashr <4 x i32> %x, %shamt_wide82  ret <4 x i32> %r83}84 85; This is not valid for funnel shifts86declare i32 @llvm.fshl.i32(i32 %a, i32 %b, i32 %c)87declare i32 @llvm.fshr.i32(i32 %a, i32 %b, i32 %c)88define i32 @n6_fshl(i32 %x, i32 %y, i8 %shamt) nounwind {89; X86-LABEL: n6_fshl:90; X86:       # %bb.0:91; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx92; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax93; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx94; X86-NEXT:    shldl %cl, %edx, %eax95; X86-NEXT:    retl96;97; X64-LABEL: n6_fshl:98; X64:       # %bb.0:99; X64-NEXT:    movl %edx, %ecx100; X64-NEXT:    movl %edi, %eax101; X64-NEXT:    # kill: def $cl killed $cl killed $ecx102; X64-NEXT:    shldl %cl, %esi, %eax103; X64-NEXT:    retq104  %shamt_wide = sext i8 %shamt to i32105  %r = call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %shamt_wide)106  ret i32 %r107}108define i32 @n7_fshr(i32 %x, i32 %y, i8 %shamt) nounwind {109; X86-LABEL: n7_fshr:110; X86:       # %bb.0:111; X86-NEXT:    movl {{[0-9]+}}(%esp), %edx112; X86-NEXT:    movl {{[0-9]+}}(%esp), %eax113; X86-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx114; X86-NEXT:    shrdl %cl, %edx, %eax115; X86-NEXT:    retl116;117; X64-LABEL: n7_fshr:118; X64:       # %bb.0:119; X64-NEXT:    movl %edx, %ecx120; X64-NEXT:    movl %esi, %eax121; X64-NEXT:    # kill: def $cl killed $cl killed $ecx122; X64-NEXT:    shrdl %cl, %edi, %eax123; X64-NEXT:    retq124  %shamt_wide = sext i8 %shamt to i32125  %r = call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %shamt_wide)126  ret i32 %r127}128 129define i32 @n8_extrause(i32 %x, i8 %shamt, ptr %shamt_wide_store) nounwind {130; X86-LABEL: n8_extrause:131; X86:       # %bb.0:132; X86-NEXT:    movsbl {{[0-9]+}}(%esp), %eax133; X86-NEXT:    movl {{[0-9]+}}(%esp), %ecx134; X86-NEXT:    movl %eax, (%ecx)135; X86-NEXT:    shlxl %eax, {{[0-9]+}}(%esp), %eax136; X86-NEXT:    retl137;138; X64-LABEL: n8_extrause:139; X64:       # %bb.0:140; X64-NEXT:    movsbl %sil, %eax141; X64-NEXT:    movl %eax, (%rdx)142; X64-NEXT:    shlxl %eax, %edi, %eax143; X64-NEXT:    retq144  %shamt_wide = sext i8 %shamt to i32145  store i32 %shamt_wide, ptr %shamt_wide_store, align 4146  %r = shl i32 %x, %shamt_wide147  ret i32 %r148}149