brintos

brintos / llvm-project-archived public Read only

0
0
Text · 45.8 KiB · 252cb33 Raw
1413 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686--   -mattr=sse2 | FileCheck %s --check-prefixes=CHECK,X86-SSE23; RUN: llc < %s -mtriple=x86_64-- -mattr=avx2 | FileCheck %s --check-prefixes=CHECK,X64-AVX,X64-AVX24; RUN: llc < %s -mtriple=x86_64-- -mattr=+avx512f,+avx512vbmi,+avx512vbmi2,+avx512vl | FileCheck %s --check-prefixes=CHECK,X64-AVX,X64-VBMI25 6declare i8 @llvm.fshl.i8(i8, i8, i8)7declare i16 @llvm.fshl.i16(i16, i16, i16)8declare i32 @llvm.fshl.i32(i32, i32, i32)9declare i64 @llvm.fshl.i64(i64, i64, i64)10declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)11declare i128 @llvm.fshl.i128(i128, i128, i128)12 13declare i8 @llvm.fshr.i8(i8, i8, i8)14declare i16 @llvm.fshr.i16(i16, i16, i16)15declare i32 @llvm.fshr.i32(i32, i32, i32)16declare i64 @llvm.fshr.i64(i64, i64, i64)17declare <4 x i32> @llvm.fshr.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)18 19; General case - all operands can be variables20 21define i32 @fshl_i32(i32 %x, i32 %y, i32 %z) nounwind {22; X86-SSE2-LABEL: fshl_i32:23; X86-SSE2:       # %bb.0:24; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx25; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx26; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax27; X86-SSE2-NEXT:    shldl %cl, %edx, %eax28; X86-SSE2-NEXT:    retl29;30; X64-AVX-LABEL: fshl_i32:31; X64-AVX:       # %bb.0:32; X64-AVX-NEXT:    movl %edx, %ecx33; X64-AVX-NEXT:    movl %edi, %eax34; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx35; X64-AVX-NEXT:    shldl %cl, %esi, %eax36; X64-AVX-NEXT:    retq37  %f = call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %z)38  ret i32 %f39}40 41define i64 @fshl_i64(i64 %x, i64 %y, i64 %z) nounwind {42; X86-SSE2-LABEL: fshl_i64:43; X86-SSE2:       # %bb.0:44; X86-SSE2-NEXT:    pushl %edi45; X86-SSE2-NEXT:    pushl %esi46; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %esi47; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx48; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx49; X86-SSE2-NEXT:    testb $32, %cl50; X86-SSE2-NEXT:    movl %edx, %edi51; X86-SSE2-NEXT:    cmovnel %esi, %edi52; X86-SSE2-NEXT:    cmovel {{[0-9]+}}(%esp), %edx53; X86-SSE2-NEXT:    cmovnel {{[0-9]+}}(%esp), %esi54; X86-SSE2-NEXT:    movl %edi, %eax55; X86-SSE2-NEXT:    shldl %cl, %esi, %eax56; X86-SSE2-NEXT:    # kill: def $cl killed $cl killed $ecx57; X86-SSE2-NEXT:    shldl %cl, %edi, %edx58; X86-SSE2-NEXT:    popl %esi59; X86-SSE2-NEXT:    popl %edi60; X86-SSE2-NEXT:    retl61;62; X64-AVX-LABEL: fshl_i64:63; X64-AVX:       # %bb.0:64; X64-AVX-NEXT:    movq %rdx, %rcx65; X64-AVX-NEXT:    movq %rdi, %rax66; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $rcx67; X64-AVX-NEXT:    shldq %cl, %rsi, %rax68; X64-AVX-NEXT:    retq69  %f = call i64 @llvm.fshl.i64(i64 %x, i64 %y, i64 %z)70  ret i64 %f71}72 73define i128 @fshl_i128(i128 %x, i128 %y, i128 %z) nounwind {74; X86-SSE2-LABEL: fshl_i128:75; X86-SSE2:       # %bb.0:76; X86-SSE2-NEXT:    pushl %ebp77; X86-SSE2-NEXT:    movl %esp, %ebp78; X86-SSE2-NEXT:    pushl %ebx79; X86-SSE2-NEXT:    pushl %edi80; X86-SSE2-NEXT:    pushl %esi81; X86-SSE2-NEXT:    andl $-16, %esp82; X86-SSE2-NEXT:    subl $16, %esp83; X86-SSE2-NEXT:    movl 48(%ebp), %edi84; X86-SSE2-NEXT:    movl 52(%ebp), %eax85; X86-SSE2-NEXT:    movl 24(%ebp), %edx86; X86-SSE2-NEXT:    movl 56(%ebp), %ecx87; X86-SSE2-NEXT:    testb $64, %cl88; X86-SSE2-NEXT:    movl %edx, %ecx89; X86-SSE2-NEXT:    cmovnel %edi, %ecx90; X86-SSE2-NEXT:    movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill91; X86-SSE2-NEXT:    movl 28(%ebp), %esi92; X86-SSE2-NEXT:    movl %esi, %ebx93; X86-SSE2-NEXT:    cmovnel %eax, %ebx94; X86-SSE2-NEXT:    cmovnel 44(%ebp), %eax95; X86-SSE2-NEXT:    cmovnel 40(%ebp), %edi96; X86-SSE2-NEXT:    cmovel 36(%ebp), %esi97; X86-SSE2-NEXT:    cmovel 32(%ebp), %edx98; X86-SSE2-NEXT:    movl 56(%ebp), %ecx99; X86-SSE2-NEXT:    testb $32, %cl100; X86-SSE2-NEXT:    cmovnel %edx, %esi101; X86-SSE2-NEXT:    cmovnel %ebx, %edx102; X86-SSE2-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload103; X86-SSE2-NEXT:    cmovnel %ecx, %ebx104; X86-SSE2-NEXT:    cmovel %eax, %edi105; X86-SSE2-NEXT:    cmovel %ecx, %eax106; X86-SSE2-NEXT:    movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill107; X86-SSE2-NEXT:    movl 56(%ebp), %ecx108; X86-SSE2-NEXT:    # kill: def $cl killed $cl killed $ecx109; X86-SSE2-NEXT:    shldl %cl, %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill110; X86-SSE2-NEXT:    movl %ebx, %edi111; X86-SSE2-NEXT:    movl 56(%ebp), %ecx112; X86-SSE2-NEXT:    # kill: def $cl killed $cl killed $ecx113; X86-SSE2-NEXT:    shldl %cl, %eax, %edi114; X86-SSE2-NEXT:    movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill115; X86-SSE2-NEXT:    movl %edx, %edi116; X86-SSE2-NEXT:    movl 56(%ebp), %ecx117; X86-SSE2-NEXT:    shldl %cl, %ebx, %edi118; X86-SSE2-NEXT:    movl 8(%ebp), %eax119; X86-SSE2-NEXT:    # kill: def $cl killed $cl killed $ecx120; X86-SSE2-NEXT:    shldl %cl, %edx, %esi121; X86-SSE2-NEXT:    movl %esi, 12(%eax)122; X86-SSE2-NEXT:    movl %edi, 8(%eax)123; X86-SSE2-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload124; X86-SSE2-NEXT:    movl %ecx, 4(%eax)125; X86-SSE2-NEXT:    movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload126; X86-SSE2-NEXT:    movl %ecx, (%eax)127; X86-SSE2-NEXT:    leal -12(%ebp), %esp128; X86-SSE2-NEXT:    popl %esi129; X86-SSE2-NEXT:    popl %edi130; X86-SSE2-NEXT:    popl %ebx131; X86-SSE2-NEXT:    popl %ebp132; X86-SSE2-NEXT:    retl $4133;134; X64-AVX-LABEL: fshl_i128:135; X64-AVX:       # %bb.0:136; X64-AVX-NEXT:    testb $64, %r8b137; X64-AVX-NEXT:    cmovneq %rdi, %rsi138; X64-AVX-NEXT:    cmoveq %rcx, %rdx139; X64-AVX-NEXT:    cmovneq %rcx, %rdi140; X64-AVX-NEXT:    movq %rdi, %rax141; X64-AVX-NEXT:    movl %r8d, %ecx142; X64-AVX-NEXT:    shldq %cl, %rdx, %rax143; X64-AVX-NEXT:    shldq %cl, %rdi, %rsi144; X64-AVX-NEXT:    movq %rsi, %rdx145; X64-AVX-NEXT:    retq146  %f = call i128 @llvm.fshl.i128(i128 %x, i128 %y, i128 %z)147  ret i128 %f148}149 150; Verify that weird types are minimally supported.151declare i37 @llvm.fshl.i37(i37, i37, i37)152define i37 @fshl_i37(i37 %x, i37 %y, i37 %z) nounwind {153; X86-SSE2-LABEL: fshl_i37:154; X86-SSE2:       # %bb.0:155; X86-SSE2-NEXT:    pushl %ebx156; X86-SSE2-NEXT:    pushl %edi157; X86-SSE2-NEXT:    pushl %esi158; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax159; X86-SSE2-NEXT:    andl $31, %eax160; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %esi161; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ebx162; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edi163; X86-SSE2-NEXT:    shldl $27, %ebx, %edi164; X86-SSE2-NEXT:    pushl $0165; X86-SSE2-NEXT:    pushl $37166; X86-SSE2-NEXT:    pushl %eax167; X86-SSE2-NEXT:    pushl {{[0-9]+}}(%esp)168; X86-SSE2-NEXT:    calll __umoddi3169; X86-SSE2-NEXT:    addl $16, %esp170; X86-SSE2-NEXT:    movl %eax, %ecx171; X86-SSE2-NEXT:    testb $32, %cl172; X86-SSE2-NEXT:    jne .LBB3_1173; X86-SSE2-NEXT:  # %bb.2:174; X86-SSE2-NEXT:    movl %edi, %ebx175; X86-SSE2-NEXT:    movl %esi, %edi176; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %esi177; X86-SSE2-NEXT:    jmp .LBB3_3178; X86-SSE2-NEXT:  .LBB3_1:179; X86-SSE2-NEXT:    shll $27, %ebx180; X86-SSE2-NEXT:  .LBB3_3:181; X86-SSE2-NEXT:    movl %edi, %eax182; X86-SSE2-NEXT:    shldl %cl, %ebx, %eax183; X86-SSE2-NEXT:    # kill: def $cl killed $cl killed $ecx184; X86-SSE2-NEXT:    shldl %cl, %edi, %esi185; X86-SSE2-NEXT:    movl %esi, %edx186; X86-SSE2-NEXT:    popl %esi187; X86-SSE2-NEXT:    popl %edi188; X86-SSE2-NEXT:    popl %ebx189; X86-SSE2-NEXT:    retl190;191; X64-AVX-LABEL: fshl_i37:192; X64-AVX:       # %bb.0:193; X64-AVX-NEXT:    movq %rdx, %rcx194; X64-AVX-NEXT:    movabsq $137438953471, %rax # imm = 0x1FFFFFFFFF195; X64-AVX-NEXT:    andq %rdx, %rax196; X64-AVX-NEXT:    movabsq $498560650640798693, %rdx # imm = 0x6EB3E45306EB3E5197; X64-AVX-NEXT:    mulq %rdx198; X64-AVX-NEXT:    leal (%rdx,%rdx,8), %eax199; X64-AVX-NEXT:    leal (%rdx,%rax,4), %eax200; X64-AVX-NEXT:    subl %eax, %ecx201; X64-AVX-NEXT:    shlq $27, %rsi202; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $rcx203; X64-AVX-NEXT:    shldq %cl, %rsi, %rdi204; X64-AVX-NEXT:    movq %rdi, %rax205; X64-AVX-NEXT:    retq206  %f = call i37 @llvm.fshl.i37(i37 %x, i37 %y, i37 %z)207  ret i37 %f208}209 210; extract(concat(0b1110000, 0b1111111) << 2) = 0b1000011211 212declare i7 @llvm.fshl.i7(i7, i7, i7)213define i7 @fshl_i7_const_fold() {214; CHECK-LABEL: fshl_i7_const_fold:215; CHECK:       # %bb.0:216; CHECK-NEXT:    movb $67, %al217; CHECK-NEXT:    ret{{[l|q]}}218  %f = call i7 @llvm.fshl.i7(i7 112, i7 127, i7 2)219  ret i7 %f220}221 222; With constant shift amount, this is 'shld' with constant operand.223 224define i32 @fshl_i32_const_shift(i32 %x, i32 %y) nounwind {225; X86-SSE2-LABEL: fshl_i32_const_shift:226; X86-SSE2:       # %bb.0:227; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx228; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax229; X86-SSE2-NEXT:    shldl $9, %ecx, %eax230; X86-SSE2-NEXT:    retl231;232; X64-AVX-LABEL: fshl_i32_const_shift:233; X64-AVX:       # %bb.0:234; X64-AVX-NEXT:    movl %edi, %eax235; X64-AVX-NEXT:    shldl $9, %esi, %eax236; X64-AVX-NEXT:    retq237  %f = call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 9)238  ret i32 %f239}240 241; Check modulo math on shift amount.242 243define i32 @fshl_i32_const_overshift(i32 %x, i32 %y) nounwind {244; X86-SSE2-LABEL: fshl_i32_const_overshift:245; X86-SSE2:       # %bb.0:246; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx247; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax248; X86-SSE2-NEXT:    shldl $9, %ecx, %eax249; X86-SSE2-NEXT:    retl250;251; X64-AVX-LABEL: fshl_i32_const_overshift:252; X64-AVX:       # %bb.0:253; X64-AVX-NEXT:    movl %edi, %eax254; X64-AVX-NEXT:    shldl $9, %esi, %eax255; X64-AVX-NEXT:    retq256  %f = call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 41)257  ret i32 %f258}259 260; 64-bit should also work.261 262define i64 @fshl_i64_const_overshift(i64 %x, i64 %y) nounwind {263; X86-SSE2-LABEL: fshl_i64_const_overshift:264; X86-SSE2:       # %bb.0:265; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax266; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx267; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx268; X86-SSE2-NEXT:    shldl $9, %ecx, %edx269; X86-SSE2-NEXT:    shrdl $23, %ecx, %eax270; X86-SSE2-NEXT:    retl271;272; X64-AVX-LABEL: fshl_i64_const_overshift:273; X64-AVX:       # %bb.0:274; X64-AVX-NEXT:    movq %rdi, %rax275; X64-AVX-NEXT:    shldq $41, %rsi, %rax276; X64-AVX-NEXT:    retq277  %f = call i64 @llvm.fshl.i64(i64 %x, i64 %y, i64 105)278  ret i64 %f279}280 281; This should work without any node-specific logic.282 283define i8 @fshl_i8_const_fold() nounwind {284; CHECK-LABEL: fshl_i8_const_fold:285; CHECK:       # %bb.0:286; CHECK-NEXT:    movb $-128, %al287; CHECK-NEXT:    ret{{[l|q]}}288  %f = call i8 @llvm.fshl.i8(i8 255, i8 0, i8 7)289  ret i8 %f290}291 292; Repeat everything for funnel shift right.293 294; General case - all operands can be variables295 296define i32 @fshr_i32(i32 %x, i32 %y, i32 %z) nounwind {297; X86-SSE2-LABEL: fshr_i32:298; X86-SSE2:       # %bb.0:299; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx300; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx301; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax302; X86-SSE2-NEXT:    shrdl %cl, %edx, %eax303; X86-SSE2-NEXT:    retl304;305; X64-AVX-LABEL: fshr_i32:306; X64-AVX:       # %bb.0:307; X64-AVX-NEXT:    movl %edx, %ecx308; X64-AVX-NEXT:    movl %esi, %eax309; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx310; X64-AVX-NEXT:    shrdl %cl, %edi, %eax311; X64-AVX-NEXT:    retq312  %f = call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %z)313  ret i32 %f314}315 316; Verify that weird types are minimally supported.317declare i37 @llvm.fshr.i37(i37, i37, i37)318define i37 @fshr_i37(i37 %x, i37 %y, i37 %z) nounwind {319; X86-SSE2-LABEL: fshr_i37:320; X86-SSE2:       # %bb.0:321; X86-SSE2-NEXT:    pushl %ebx322; X86-SSE2-NEXT:    pushl %edi323; X86-SSE2-NEXT:    pushl %esi324; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax325; X86-SSE2-NEXT:    andl $31, %eax326; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edi327; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ebx328; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %esi329; X86-SSE2-NEXT:    shldl $27, %ebx, %esi330; X86-SSE2-NEXT:    pushl $0331; X86-SSE2-NEXT:    pushl $37332; X86-SSE2-NEXT:    pushl %eax333; X86-SSE2-NEXT:    pushl {{[0-9]+}}(%esp)334; X86-SSE2-NEXT:    calll __umoddi3335; X86-SSE2-NEXT:    addl $16, %esp336; X86-SSE2-NEXT:    movl %eax, %ecx337; X86-SSE2-NEXT:    addl $27, %ecx338; X86-SSE2-NEXT:    testb $32, %cl339; X86-SSE2-NEXT:    je .LBB10_1340; X86-SSE2-NEXT:  # %bb.2:341; X86-SSE2-NEXT:    movl %edi, %edx342; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edi343; X86-SSE2-NEXT:    jmp .LBB10_3344; X86-SSE2-NEXT:  .LBB10_1:345; X86-SSE2-NEXT:    shll $27, %ebx346; X86-SSE2-NEXT:    movl %esi, %edx347; X86-SSE2-NEXT:    movl %ebx, %esi348; X86-SSE2-NEXT:  .LBB10_3:349; X86-SSE2-NEXT:    shrdl %cl, %edx, %esi350; X86-SSE2-NEXT:    # kill: def $cl killed $cl killed $ecx351; X86-SSE2-NEXT:    shrdl %cl, %edi, %edx352; X86-SSE2-NEXT:    movl %esi, %eax353; X86-SSE2-NEXT:    popl %esi354; X86-SSE2-NEXT:    popl %edi355; X86-SSE2-NEXT:    popl %ebx356; X86-SSE2-NEXT:    retl357;358; X64-AVX-LABEL: fshr_i37:359; X64-AVX:       # %bb.0:360; X64-AVX-NEXT:    movq %rdx, %rcx361; X64-AVX-NEXT:    movabsq $137438953471, %rax # imm = 0x1FFFFFFFFF362; X64-AVX-NEXT:    andq %rdx, %rax363; X64-AVX-NEXT:    movabsq $498560650640798693, %rdx # imm = 0x6EB3E45306EB3E5364; X64-AVX-NEXT:    mulq %rdx365; X64-AVX-NEXT:    leal (%rdx,%rdx,8), %eax366; X64-AVX-NEXT:    leal (%rdx,%rax,4), %eax367; X64-AVX-NEXT:    subl %eax, %ecx368; X64-AVX-NEXT:    addl $27, %ecx369; X64-AVX-NEXT:    shlq $27, %rsi370; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $rcx371; X64-AVX-NEXT:    shrdq %cl, %rdi, %rsi372; X64-AVX-NEXT:    movq %rsi, %rax373; X64-AVX-NEXT:    retq374  %f = call i37 @llvm.fshr.i37(i37 %x, i37 %y, i37 %z)375  ret i37 %f376}377 378; extract(concat(0b1110000, 0b1111111) >> 2) = 0b0011111379 380declare i7 @llvm.fshr.i7(i7, i7, i7)381define i7 @fshr_i7_const_fold() nounwind {382; CHECK-LABEL: fshr_i7_const_fold:383; CHECK:       # %bb.0:384; CHECK-NEXT:    movb $31, %al385; CHECK-NEXT:    ret{{[l|q]}}386  %f = call i7 @llvm.fshr.i7(i7 112, i7 127, i7 2)387  ret i7 %f388}389 390; demanded bits tests391 392define i32 @fshl_i32_demandedbits(i32 %a0, i32 %a1) nounwind {393; X86-SSE2-LABEL: fshl_i32_demandedbits:394; X86-SSE2:       # %bb.0:395; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx396; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax397; X86-SSE2-NEXT:    shldl $9, %ecx, %eax398; X86-SSE2-NEXT:    retl399;400; X64-AVX-LABEL: fshl_i32_demandedbits:401; X64-AVX:       # %bb.0:402; X64-AVX-NEXT:    movl %edi, %eax403; X64-AVX-NEXT:    shldl $9, %esi, %eax404; X64-AVX-NEXT:    retq405  %x = or i32 %a0, 2147483648406  %y = or i32 %a1, 1407  %res = call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 9)408  ret i32 %res409}410 411define i32 @fshr_i32_demandedbits(i32 %a0, i32 %a1) nounwind {412; X86-SSE2-LABEL: fshr_i32_demandedbits:413; X86-SSE2:       # %bb.0:414; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx415; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax416; X86-SSE2-NEXT:    shrdl $9, %ecx, %eax417; X86-SSE2-NEXT:    retl418;419; X64-AVX-LABEL: fshr_i32_demandedbits:420; X64-AVX:       # %bb.0:421; X64-AVX-NEXT:    movl %edi, %eax422; X64-AVX-NEXT:    shldl $23, %esi, %eax423; X64-AVX-NEXT:    retq424  %x = or i32 %a0, 2147483648425  %y = or i32 %a1, 1426  %res = call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 9)427  ret i32 %res428}429 430; undef handling431 432define i32 @fshl_i32_undef0(i32 %a0, i32 %a1) nounwind {433; X86-SSE2-LABEL: fshl_i32_undef0:434; X86-SSE2:       # %bb.0:435; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx436; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax437; X86-SSE2-NEXT:    shldl %cl, %eax, %eax438; X86-SSE2-NEXT:    retl439;440; X64-AVX-LABEL: fshl_i32_undef0:441; X64-AVX:       # %bb.0:442; X64-AVX-NEXT:    movl %esi, %ecx443; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx444; X64-AVX-NEXT:    shldl %cl, %edi, %eax445; X64-AVX-NEXT:    retq446  %res = call i32 @llvm.fshl.i32(i32 undef, i32 %a0, i32 %a1)447  ret i32 %res448}449 450define i32 @fshl_i32_undef0_msk(i32 %a0, i32 %a1) nounwind {451; X86-SSE2-LABEL: fshl_i32_undef0_msk:452; X86-SSE2:       # %bb.0:453; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax454; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx455; X86-SSE2-NEXT:    andl $7, %ecx456; X86-SSE2-NEXT:    # kill: def $cl killed $cl killed $ecx457; X86-SSE2-NEXT:    shldl %cl, %eax, %eax458; X86-SSE2-NEXT:    retl459;460; X64-AVX-LABEL: fshl_i32_undef0_msk:461; X64-AVX:       # %bb.0:462; X64-AVX-NEXT:    movl %esi, %ecx463; X64-AVX-NEXT:    andl $7, %ecx464; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx465; X64-AVX-NEXT:    shldl %cl, %edi, %eax466; X64-AVX-NEXT:    retq467  %m = and i32 %a1, 7468  %res = call i32 @llvm.fshl.i32(i32 undef, i32 %a0, i32 %m)469  ret i32 %res470}471 472define i32 @fshl_i32_undef0_cst(i32 %a0) nounwind {473; X86-SSE2-LABEL: fshl_i32_undef0_cst:474; X86-SSE2:       # %bb.0:475; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax476; X86-SSE2-NEXT:    shrl $23, %eax477; X86-SSE2-NEXT:    retl478;479; X64-AVX-LABEL: fshl_i32_undef0_cst:480; X64-AVX:       # %bb.0:481; X64-AVX-NEXT:    movl %edi, %eax482; X64-AVX-NEXT:    shrl $23, %eax483; X64-AVX-NEXT:    retq484  %res = call i32 @llvm.fshl.i32(i32 undef, i32 %a0, i32 9)485  ret i32 %res486}487 488define <4 x i32> @fshl_v4i32_undef0_cst(<4 x i32> %a0) nounwind {489; X86-SSE2-LABEL: fshl_v4i32_undef0_cst:490; X86-SSE2:       # %bb.0:491; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1492; X86-SSE2-NEXT:    psrld $20, %xmm1493; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2494; X86-SSE2-NEXT:    psrld $21, %xmm2495; X86-SSE2-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]496; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1497; X86-SSE2-NEXT:    psrld $22, %xmm1498; X86-SSE2-NEXT:    psrld $23, %xmm0499; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]500; X86-SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3],xmm2[0,3]501; X86-SSE2-NEXT:    retl502;503; X64-AVX2-LABEL: fshl_v4i32_undef0_cst:504; X64-AVX2:       # %bb.0:505; X64-AVX2-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0506; X64-AVX2-NEXT:    retq507;508; X64-VBMI2-LABEL: fshl_v4i32_undef0_cst:509; X64-VBMI2:       # %bb.0:510; X64-VBMI2-NEXT:    vpshldvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0511; X64-VBMI2-NEXT:    retq512  %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> undef, <4 x i32> %a0, <4 x i32> <i32 9, i32 10, i32 11, i32 12>)513  ret <4 x i32> %res514}515 516define i32 @fshl_i32_undef1(i32 %a0, i32 %a1) nounwind {517; X86-SSE2-LABEL: fshl_i32_undef1:518; X86-SSE2:       # %bb.0:519; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx520; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax521; X86-SSE2-NEXT:    shldl %cl, %eax, %eax522; X86-SSE2-NEXT:    retl523;524; X64-AVX-LABEL: fshl_i32_undef1:525; X64-AVX:       # %bb.0:526; X64-AVX-NEXT:    movl %esi, %ecx527; X64-AVX-NEXT:    movl %edi, %eax528; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx529; X64-AVX-NEXT:    shldl %cl, %eax, %eax530; X64-AVX-NEXT:    retq531  %res = call i32 @llvm.fshl.i32(i32 %a0, i32 undef, i32 %a1)532  ret i32 %res533}534 535define i32 @fshl_i32_undef1_msk(i32 %a0, i32 %a1) nounwind {536; X86-SSE2-LABEL: fshl_i32_undef1_msk:537; X86-SSE2:       # %bb.0:538; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax539; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx540; X86-SSE2-NEXT:    andb $7, %cl541; X86-SSE2-NEXT:    shll %cl, %eax542; X86-SSE2-NEXT:    retl543;544; X64-AVX-LABEL: fshl_i32_undef1_msk:545; X64-AVX:       # %bb.0:546; X64-AVX-NEXT:    movl %esi, %ecx547; X64-AVX-NEXT:    movl %edi, %eax548; X64-AVX-NEXT:    andb $7, %cl549; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx550; X64-AVX-NEXT:    shll %cl, %eax551; X64-AVX-NEXT:    retq552  %m = and i32 %a1, 7553  %res = call i32 @llvm.fshl.i32(i32 %a0, i32 undef, i32 %m)554  ret i32 %res555}556 557define i32 @fshl_i32_undef1_cst(i32 %a0) nounwind {558; X86-SSE2-LABEL: fshl_i32_undef1_cst:559; X86-SSE2:       # %bb.0:560; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax561; X86-SSE2-NEXT:    shll $9, %eax562; X86-SSE2-NEXT:    retl563;564; X64-AVX-LABEL: fshl_i32_undef1_cst:565; X64-AVX:       # %bb.0:566; X64-AVX-NEXT:    movl %edi, %eax567; X64-AVX-NEXT:    shll $9, %eax568; X64-AVX-NEXT:    retq569  %res = call i32 @llvm.fshl.i32(i32 %a0, i32 undef, i32 9)570  ret i32 %res571}572 573define <4 x i32> @fshl_v4i32_undef1_cst(<4 x i32> %a0) nounwind {574; X86-SSE2-LABEL: fshl_v4i32_undef1_cst:575; X86-SSE2:       # %bb.0:576; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]577; X86-SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [512,1024,2048,4096]578; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]579; X86-SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [1024,u,4096,u]580; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]581; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]582; X86-SSE2-NEXT:    retl583;584; X64-AVX-LABEL: fshl_v4i32_undef1_cst:585; X64-AVX:       # %bb.0:586; X64-AVX-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0587; X64-AVX-NEXT:    retq588  %res = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %a0, <4 x i32> undef, <4 x i32> <i32 9, i32 10, i32 11, i32 12>)589  ret <4 x i32> %res590}591 592define i32 @fshl_i32_undef2(i32 %a0, i32 %a1) nounwind {593; X86-SSE2-LABEL: fshl_i32_undef2:594; X86-SSE2:       # %bb.0:595; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx596; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax597; X86-SSE2-NEXT:    shldl %cl, %ecx, %eax598; X86-SSE2-NEXT:    retl599;600; X64-AVX-LABEL: fshl_i32_undef2:601; X64-AVX:       # %bb.0:602; X64-AVX-NEXT:    movl %edi, %eax603; X64-AVX-NEXT:    shldl %cl, %esi, %eax604; X64-AVX-NEXT:    retq605  %res = call i32 @llvm.fshl.i32(i32 %a0, i32 %a1, i32 undef)606  ret i32 %res607}608 609define i32 @fshr_i32_undef0(i32 %a0, i32 %a1) nounwind {610; X86-SSE2-LABEL: fshr_i32_undef0:611; X86-SSE2:       # %bb.0:612; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx613; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax614; X86-SSE2-NEXT:    shrdl %cl, %eax, %eax615; X86-SSE2-NEXT:    retl616;617; X64-AVX-LABEL: fshr_i32_undef0:618; X64-AVX:       # %bb.0:619; X64-AVX-NEXT:    movl %esi, %ecx620; X64-AVX-NEXT:    movl %edi, %eax621; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx622; X64-AVX-NEXT:    shrdl %cl, %eax, %eax623; X64-AVX-NEXT:    retq624  %res = call i32 @llvm.fshr.i32(i32 undef, i32 %a0, i32 %a1)625  ret i32 %res626}627 628define i32 @fshr_i32_undef0_msk(i32 %a0, i32 %a1) nounwind {629; X86-SSE2-LABEL: fshr_i32_undef0_msk:630; X86-SSE2:       # %bb.0:631; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax632; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx633; X86-SSE2-NEXT:    andb $7, %cl634; X86-SSE2-NEXT:    shrl %cl, %eax635; X86-SSE2-NEXT:    retl636;637; X64-AVX-LABEL: fshr_i32_undef0_msk:638; X64-AVX:       # %bb.0:639; X64-AVX-NEXT:    movl %esi, %ecx640; X64-AVX-NEXT:    movl %edi, %eax641; X64-AVX-NEXT:    andb $7, %cl642; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx643; X64-AVX-NEXT:    shrl %cl, %eax644; X64-AVX-NEXT:    retq645  %m = and i32 %a1, 7646  %res = call i32 @llvm.fshr.i32(i32 undef, i32 %a0, i32 %m)647  ret i32 %res648}649 650define i32 @fshr_i32_undef0_cst(i32 %a0) nounwind {651; X86-SSE2-LABEL: fshr_i32_undef0_cst:652; X86-SSE2:       # %bb.0:653; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax654; X86-SSE2-NEXT:    shrl $9, %eax655; X86-SSE2-NEXT:    retl656;657; X64-AVX-LABEL: fshr_i32_undef0_cst:658; X64-AVX:       # %bb.0:659; X64-AVX-NEXT:    movl %edi, %eax660; X64-AVX-NEXT:    shrl $9, %eax661; X64-AVX-NEXT:    retq662  %res = call i32 @llvm.fshr.i32(i32 undef, i32 %a0, i32 9)663  ret i32 %res664}665 666define <4 x i32> @fshr_v4i32_undef0_cst(<4 x i32> %a0) nounwind {667; X86-SSE2-LABEL: fshr_v4i32_undef0_cst:668; X86-SSE2:       # %bb.0:669; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1670; X86-SSE2-NEXT:    psrld $12, %xmm1671; X86-SSE2-NEXT:    movdqa %xmm0, %xmm2672; X86-SSE2-NEXT:    psrld $11, %xmm2673; X86-SSE2-NEXT:    punpckhqdq {{.*#+}} xmm2 = xmm2[1],xmm1[1]674; X86-SSE2-NEXT:    movdqa %xmm0, %xmm1675; X86-SSE2-NEXT:    psrld $10, %xmm1676; X86-SSE2-NEXT:    psrld $9, %xmm0677; X86-SSE2-NEXT:    punpcklqdq {{.*#+}} xmm0 = xmm0[0],xmm1[0]678; X86-SSE2-NEXT:    shufps {{.*#+}} xmm0 = xmm0[0,3],xmm2[0,3]679; X86-SSE2-NEXT:    retl680;681; X64-AVX-LABEL: fshr_v4i32_undef0_cst:682; X64-AVX:       # %bb.0:683; X64-AVX-NEXT:    vpsrlvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0684; X64-AVX-NEXT:    retq685  %res = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> undef, <4 x i32> %a0, <4 x i32> <i32 9, i32 10, i32 11, i32 12>)686  ret <4 x i32> %res687}688 689define i32 @fshr_i32_undef1(i32 %a0, i32 %a1) nounwind {690; X86-SSE2-LABEL: fshr_i32_undef1:691; X86-SSE2:       # %bb.0:692; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx693; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax694; X86-SSE2-NEXT:    shrdl %cl, %eax, %eax695; X86-SSE2-NEXT:    retl696;697; X64-AVX-LABEL: fshr_i32_undef1:698; X64-AVX:       # %bb.0:699; X64-AVX-NEXT:    movl %esi, %ecx700; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx701; X64-AVX-NEXT:    shrdl %cl, %edi, %eax702; X64-AVX-NEXT:    retq703  %res = call i32 @llvm.fshr.i32(i32 %a0, i32 undef, i32 %a1)704  ret i32 %res705}706 707define i32 @fshr_i32_undef1_msk(i32 %a0, i32 %a1) nounwind {708; X86-SSE2-LABEL: fshr_i32_undef1_msk:709; X86-SSE2:       # %bb.0:710; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax711; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx712; X86-SSE2-NEXT:    andl $7, %ecx713; X86-SSE2-NEXT:    # kill: def $cl killed $cl killed $ecx714; X86-SSE2-NEXT:    shrdl %cl, %eax, %eax715; X86-SSE2-NEXT:    retl716;717; X64-AVX-LABEL: fshr_i32_undef1_msk:718; X64-AVX:       # %bb.0:719; X64-AVX-NEXT:    movl %esi, %ecx720; X64-AVX-NEXT:    andl $7, %ecx721; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx722; X64-AVX-NEXT:    shrdl %cl, %edi, %eax723; X64-AVX-NEXT:    retq724  %m = and i32 %a1, 7725  %res = call i32 @llvm.fshr.i32(i32 %a0, i32 undef, i32 %m)726  ret i32 %res727}728 729define i32 @fshr_i32_undef1_cst(i32 %a0) nounwind {730; X86-SSE2-LABEL: fshr_i32_undef1_cst:731; X86-SSE2:       # %bb.0:732; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax733; X86-SSE2-NEXT:    shll $23, %eax734; X86-SSE2-NEXT:    retl735;736; X64-AVX-LABEL: fshr_i32_undef1_cst:737; X64-AVX:       # %bb.0:738; X64-AVX-NEXT:    movl %edi, %eax739; X64-AVX-NEXT:    shll $23, %eax740; X64-AVX-NEXT:    retq741  %res = call i32 @llvm.fshr.i32(i32 %a0, i32 undef, i32 9)742  ret i32 %res743}744 745define <4 x i32> @fshr_v4i32_undef1_cst(<4 x i32> %a0) nounwind {746; X86-SSE2-LABEL: fshr_v4i32_undef1_cst:747; X86-SSE2:       # %bb.0:748; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]749; X86-SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm0 # [8388608,4194304,2097152,1048576]750; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm0 = xmm0[0,2,2,3]751; X86-SSE2-NEXT:    pmuludq {{\.?LCPI[0-9]+_[0-9]+}}, %xmm1 # [4194304,u,1048576,u]752; X86-SSE2-NEXT:    pshufd {{.*#+}} xmm1 = xmm1[0,2,2,3]753; X86-SSE2-NEXT:    punpckldq {{.*#+}} xmm0 = xmm0[0],xmm1[0],xmm0[1],xmm1[1]754; X86-SSE2-NEXT:    retl755;756; X64-AVX2-LABEL: fshr_v4i32_undef1_cst:757; X64-AVX2:       # %bb.0:758; X64-AVX2-NEXT:    vpsllvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0759; X64-AVX2-NEXT:    retq760;761; X64-VBMI2-LABEL: fshr_v4i32_undef1_cst:762; X64-VBMI2:       # %bb.0:763; X64-VBMI2-NEXT:    vpshrdvd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0, %xmm0764; X64-VBMI2-NEXT:    retq765  %res = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %a0, <4 x i32> undef, <4 x i32> <i32 9, i32 10, i32 11, i32 12>)766  ret <4 x i32> %res767}768 769define i32 @fshr_i32_undef2(i32 %a0, i32 %a1) nounwind {770; X86-SSE2-LABEL: fshr_i32_undef2:771; X86-SSE2:       # %bb.0:772; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx773; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax774; X86-SSE2-NEXT:    shrdl %cl, %ecx, %eax775; X86-SSE2-NEXT:    retl776;777; X64-AVX-LABEL: fshr_i32_undef2:778; X64-AVX:       # %bb.0:779; X64-AVX-NEXT:    movl %esi, %eax780; X64-AVX-NEXT:    shrdl %cl, %edi, %eax781; X64-AVX-NEXT:    retq782  %res = call i32 @llvm.fshr.i32(i32 %a0, i32 %a1, i32 undef)783  ret i32 %res784}785 786; shift zero args787 788define i32 @fshl_i32_zero0(i32 %a0, i32 %a1) nounwind {789; X86-SSE2-LABEL: fshl_i32_zero0:790; X86-SSE2:       # %bb.0:791; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx792; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx793; X86-SSE2-NEXT:    xorl %eax, %eax794; X86-SSE2-NEXT:    shldl %cl, %edx, %eax795; X86-SSE2-NEXT:    retl796;797; X64-AVX-LABEL: fshl_i32_zero0:798; X64-AVX:       # %bb.0:799; X64-AVX-NEXT:    movl %esi, %ecx800; X64-AVX-NEXT:    xorl %eax, %eax801; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx802; X64-AVX-NEXT:    shldl %cl, %edi, %eax803; X64-AVX-NEXT:    retq804  %res = call i32 @llvm.fshl.i32(i32 0, i32 %a0, i32 %a1)805  ret i32 %res806}807 808define i32 @fshl_i32_zero0_cst(i32 %a0) nounwind {809; X86-SSE2-LABEL: fshl_i32_zero0_cst:810; X86-SSE2:       # %bb.0:811; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax812; X86-SSE2-NEXT:    shrl $23, %eax813; X86-SSE2-NEXT:    retl814;815; X64-AVX-LABEL: fshl_i32_zero0_cst:816; X64-AVX:       # %bb.0:817; X64-AVX-NEXT:    movl %edi, %eax818; X64-AVX-NEXT:    shrl $23, %eax819; X64-AVX-NEXT:    retq820  %res = call i32 @llvm.fshl.i32(i32 0, i32 %a0, i32 9)821  ret i32 %res822}823 824define i32 @fshl_i32_zero1(i32 %a0, i32 %a1) nounwind {825; X86-SSE2-LABEL: fshl_i32_zero1:826; X86-SSE2:       # %bb.0:827; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx828; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax829; X86-SSE2-NEXT:    xorl %edx, %edx830; X86-SSE2-NEXT:    shldl %cl, %edx, %eax831; X86-SSE2-NEXT:    retl832;833; X64-AVX-LABEL: fshl_i32_zero1:834; X64-AVX:       # %bb.0:835; X64-AVX-NEXT:    movl %esi, %ecx836; X64-AVX-NEXT:    movl %edi, %eax837; X64-AVX-NEXT:    xorl %edx, %edx838; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx839; X64-AVX-NEXT:    shldl %cl, %edx, %eax840; X64-AVX-NEXT:    retq841  %res = call i32 @llvm.fshl.i32(i32 %a0, i32 0, i32 %a1)842  ret i32 %res843}844 845define i32 @fshl_i32_zero1_cst(i32 %a0) nounwind {846; X86-SSE2-LABEL: fshl_i32_zero1_cst:847; X86-SSE2:       # %bb.0:848; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax849; X86-SSE2-NEXT:    shll $9, %eax850; X86-SSE2-NEXT:    retl851;852; X64-AVX-LABEL: fshl_i32_zero1_cst:853; X64-AVX:       # %bb.0:854; X64-AVX-NEXT:    movl %edi, %eax855; X64-AVX-NEXT:    shll $9, %eax856; X64-AVX-NEXT:    retq857  %res = call i32 @llvm.fshl.i32(i32 %a0, i32 0, i32 9)858  ret i32 %res859}860 861define i32 @fshr_i32_zero0(i32 %a0, i32 %a1) nounwind {862; X86-SSE2-LABEL: fshr_i32_zero0:863; X86-SSE2:       # %bb.0:864; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx865; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax866; X86-SSE2-NEXT:    xorl %edx, %edx867; X86-SSE2-NEXT:    shrdl %cl, %edx, %eax868; X86-SSE2-NEXT:    retl869;870; X64-AVX-LABEL: fshr_i32_zero0:871; X64-AVX:       # %bb.0:872; X64-AVX-NEXT:    movl %esi, %ecx873; X64-AVX-NEXT:    movl %edi, %eax874; X64-AVX-NEXT:    xorl %edx, %edx875; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx876; X64-AVX-NEXT:    shrdl %cl, %edx, %eax877; X64-AVX-NEXT:    retq878  %res = call i32 @llvm.fshr.i32(i32 0, i32 %a0, i32 %a1)879  ret i32 %res880}881 882define i32 @fshr_i32_zero0_cst(i32 %a0) nounwind {883; X86-SSE2-LABEL: fshr_i32_zero0_cst:884; X86-SSE2:       # %bb.0:885; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax886; X86-SSE2-NEXT:    shrl $9, %eax887; X86-SSE2-NEXT:    retl888;889; X64-AVX-LABEL: fshr_i32_zero0_cst:890; X64-AVX:       # %bb.0:891; X64-AVX-NEXT:    movl %edi, %eax892; X64-AVX-NEXT:    shrl $9, %eax893; X64-AVX-NEXT:    retq894  %res = call i32 @llvm.fshr.i32(i32 0, i32 %a0, i32 9)895  ret i32 %res896}897 898define i32 @fshr_i32_zero1(i32 %a0, i32 %a1) nounwind {899; X86-SSE2-LABEL: fshr_i32_zero1:900; X86-SSE2:       # %bb.0:901; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx902; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx903; X86-SSE2-NEXT:    xorl %eax, %eax904; X86-SSE2-NEXT:    shrdl %cl, %edx, %eax905; X86-SSE2-NEXT:    retl906;907; X64-AVX-LABEL: fshr_i32_zero1:908; X64-AVX:       # %bb.0:909; X64-AVX-NEXT:    movl %esi, %ecx910; X64-AVX-NEXT:    xorl %eax, %eax911; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx912; X64-AVX-NEXT:    shrdl %cl, %edi, %eax913; X64-AVX-NEXT:    retq914  %res = call i32 @llvm.fshr.i32(i32 %a0, i32 0, i32 %a1)915  ret i32 %res916}917 918define i32 @fshr_i32_zero1_cst(i32 %a0) nounwind {919; X86-SSE2-LABEL: fshr_i32_zero1_cst:920; X86-SSE2:       # %bb.0:921; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax922; X86-SSE2-NEXT:    shll $23, %eax923; X86-SSE2-NEXT:    retl924;925; X64-AVX-LABEL: fshr_i32_zero1_cst:926; X64-AVX:       # %bb.0:927; X64-AVX-NEXT:    movl %edi, %eax928; X64-AVX-NEXT:    shll $23, %eax929; X64-AVX-NEXT:    retq930  %res = call i32 @llvm.fshr.i32(i32 %a0, i32 0, i32 9)931  ret i32 %res932}933 934; shift by zero935 936define i32 @fshl_i32_zero2(i32 %a0, i32 %a1) nounwind {937; X86-SSE2-LABEL: fshl_i32_zero2:938; X86-SSE2:       # %bb.0:939; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax940; X86-SSE2-NEXT:    retl941;942; X64-AVX-LABEL: fshl_i32_zero2:943; X64-AVX:       # %bb.0:944; X64-AVX-NEXT:    movl %edi, %eax945; X64-AVX-NEXT:    retq946  %res = call i32 @llvm.fshl.i32(i32 %a0, i32 %a1, i32 0)947  ret i32 %res948}949 950define i32 @fshr_i32_zero2(i32 %a0, i32 %a1) nounwind {951; X86-SSE2-LABEL: fshr_i32_zero2:952; X86-SSE2:       # %bb.0:953; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax954; X86-SSE2-NEXT:    retl955;956; X64-AVX-LABEL: fshr_i32_zero2:957; X64-AVX:       # %bb.0:958; X64-AVX-NEXT:    movl %esi, %eax959; X64-AVX-NEXT:    retq960  %res = call i32 @llvm.fshr.i32(i32 %a0, i32 %a1, i32 0)961  ret i32 %res962}963 964; With constant shift amount, this is 'shrd' or 'shld'.965 966define i32 @fshr_i32_const_shift(i32 %x, i32 %y) nounwind {967; X86-SSE2-LABEL: fshr_i32_const_shift:968; X86-SSE2:       # %bb.0:969; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx970; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax971; X86-SSE2-NEXT:    shrdl $9, %ecx, %eax972; X86-SSE2-NEXT:    retl973;974; X64-AVX-LABEL: fshr_i32_const_shift:975; X64-AVX:       # %bb.0:976; X64-AVX-NEXT:    movl %edi, %eax977; X64-AVX-NEXT:    shldl $23, %esi, %eax978; X64-AVX-NEXT:    retq979  %f = call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 9)980  ret i32 %f981}982 983; Check modulo math on shift amount. 41-32=9, but right-shift may became left, so 32-9=23.984 985define i32 @fshr_i32_const_overshift(i32 %x, i32 %y) nounwind {986; X86-SSE2-LABEL: fshr_i32_const_overshift:987; X86-SSE2:       # %bb.0:988; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx989; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax990; X86-SSE2-NEXT:    shrdl $9, %ecx, %eax991; X86-SSE2-NEXT:    retl992;993; X64-AVX-LABEL: fshr_i32_const_overshift:994; X64-AVX:       # %bb.0:995; X64-AVX-NEXT:    movl %edi, %eax996; X64-AVX-NEXT:    shldl $23, %esi, %eax997; X64-AVX-NEXT:    retq998  %f = call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 41)999  ret i32 %f1000}1001 1002; 64-bit should also work. 105-64 = 41, but right-shift became left, so 64-41=23.1003 1004define i64 @fshr_i64_const_overshift(i64 %x, i64 %y) nounwind {1005; X86-SSE2-LABEL: fshr_i64_const_overshift:1006; X86-SSE2:       # %bb.0:1007; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1008; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1009; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1010; X86-SSE2-NEXT:    shrdl $9, %ecx, %eax1011; X86-SSE2-NEXT:    shldl $23, %ecx, %edx1012; X86-SSE2-NEXT:    retl1013;1014; X64-AVX-LABEL: fshr_i64_const_overshift:1015; X64-AVX:       # %bb.0:1016; X64-AVX-NEXT:    movq %rdi, %rax1017; X64-AVX-NEXT:    shldq $23, %rsi, %rax1018; X64-AVX-NEXT:    retq1019  %f = call i64 @llvm.fshr.i64(i64 %x, i64 %y, i64 105)1020  ret i64 %f1021}1022 1023; This should work without any node-specific logic.1024 1025define i8 @fshr_i8_const_fold() nounwind {1026; CHECK-LABEL: fshr_i8_const_fold:1027; CHECK:       # %bb.0:1028; CHECK-NEXT:    movb $-2, %al1029; CHECK-NEXT:    ret{{[l|q]}}1030  %f = call i8 @llvm.fshr.i8(i8 255, i8 0, i8 7)1031  ret i8 %f1032}1033 1034define i32 @fshl_i32_shift_by_bitwidth(i32 %x, i32 %y) nounwind {1035; X86-SSE2-LABEL: fshl_i32_shift_by_bitwidth:1036; X86-SSE2:       # %bb.0:1037; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1038; X86-SSE2-NEXT:    retl1039;1040; X64-AVX-LABEL: fshl_i32_shift_by_bitwidth:1041; X64-AVX:       # %bb.0:1042; X64-AVX-NEXT:    movl %edi, %eax1043; X64-AVX-NEXT:    retq1044  %f = call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 32)1045  ret i32 %f1046}1047 1048define i32 @fshr_i32_shift_by_bitwidth(i32 %x, i32 %y) nounwind {1049; X86-SSE2-LABEL: fshr_i32_shift_by_bitwidth:1050; X86-SSE2:       # %bb.0:1051; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1052; X86-SSE2-NEXT:    retl1053;1054; X64-AVX-LABEL: fshr_i32_shift_by_bitwidth:1055; X64-AVX:       # %bb.0:1056; X64-AVX-NEXT:    movl %esi, %eax1057; X64-AVX-NEXT:    retq1058  %f = call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 32)1059  ret i32 %f1060}1061 1062define <4 x i32> @fshl_v4i32_shift_by_bitwidth(<4 x i32> %x, <4 x i32> %y) nounwind {1063; CHECK-LABEL: fshl_v4i32_shift_by_bitwidth:1064; CHECK:       # %bb.0:1065; CHECK-NEXT:    ret{{[l|q]}}1066  %f = call <4 x i32> @llvm.fshl.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 32, i32 32, i32 32, i32 32>)1067  ret <4 x i32> %f1068}1069 1070define <4 x i32> @fshr_v4i32_shift_by_bitwidth(<4 x i32> %x, <4 x i32> %y) nounwind {1071; X86-SSE2-LABEL: fshr_v4i32_shift_by_bitwidth:1072; X86-SSE2:       # %bb.0:1073; X86-SSE2-NEXT:    movaps %xmm1, %xmm01074; X86-SSE2-NEXT:    retl1075;1076; X64-AVX-LABEL: fshr_v4i32_shift_by_bitwidth:1077; X64-AVX:       # %bb.0:1078; X64-AVX-NEXT:    vmovaps %xmm1, %xmm01079; X64-AVX-NEXT:    retq1080  %f = call <4 x i32> @llvm.fshr.v4i32(<4 x i32> %x, <4 x i32> %y, <4 x i32> <i32 32, i32 32, i32 32, i32 32>)1081  ret <4 x i32> %f1082}1083 1084%struct.S = type { [11 x i8], i8 }1085define void @PR45265(i32 %0, ptr nocapture readonly %1) nounwind {1086; X86-SSE2-LABEL: PR45265:1087; X86-SSE2:       # %bb.0:1088; X86-SSE2-NEXT:    pushl %edi1089; X86-SSE2-NEXT:    pushl %esi1090; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1091; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %ecx1092; X86-SSE2-NEXT:    leal (%eax,%eax,2), %esi1093; X86-SSE2-NEXT:    movzwl 8(%ecx,%esi,4), %edx1094; X86-SSE2-NEXT:    movl 4(%ecx,%esi,4), %edi1095; X86-SSE2-NEXT:    shrdl $8, %edx, %edi1096; X86-SSE2-NEXT:    xorl %eax, %edi1097; X86-SSE2-NEXT:    sarl $31, %eax1098; X86-SSE2-NEXT:    movzbl 10(%ecx,%esi,4), %ecx1099; X86-SSE2-NEXT:    shll $16, %ecx1100; X86-SSE2-NEXT:    orl %edx, %ecx1101; X86-SSE2-NEXT:    shll $8, %ecx1102; X86-SSE2-NEXT:    movl %ecx, %edx1103; X86-SSE2-NEXT:    sarl $8, %edx1104; X86-SSE2-NEXT:    sarl $31, %ecx1105; X86-SSE2-NEXT:    shldl $24, %edx, %ecx1106; X86-SSE2-NEXT:    xorl %eax, %ecx1107; X86-SSE2-NEXT:    orl %ecx, %edi1108; X86-SSE2-NEXT:    jne .LBB50_11109; X86-SSE2-NEXT:  # %bb.2:1110; X86-SSE2-NEXT:    popl %esi1111; X86-SSE2-NEXT:    popl %edi1112; X86-SSE2-NEXT:    jmp _Z3foov # TAILCALL1113; X86-SSE2-NEXT:  .LBB50_1:1114; X86-SSE2-NEXT:    popl %esi1115; X86-SSE2-NEXT:    popl %edi1116; X86-SSE2-NEXT:    retl1117;1118; X64-AVX-LABEL: PR45265:1119; X64-AVX:       # %bb.0:1120; X64-AVX-NEXT:    movslq %edi, %rax1121; X64-AVX-NEXT:    leaq (%rax,%rax,2), %rcx1122; X64-AVX-NEXT:    movsbq 10(%rsi,%rcx,4), %rdx1123; X64-AVX-NEXT:    shlq $16, %rdx1124; X64-AVX-NEXT:    movzwl 8(%rsi,%rcx,4), %edi1125; X64-AVX-NEXT:    orq %rdx, %rdi1126; X64-AVX-NEXT:    movq (%rsi,%rcx,4), %rcx1127; X64-AVX-NEXT:    shrdq $40, %rdi, %rcx1128; X64-AVX-NEXT:    cmpq %rax, %rcx1129; X64-AVX-NEXT:    je _Z3foov # TAILCALL1130; X64-AVX-NEXT:  # %bb.1:1131; X64-AVX-NEXT:    retq1132  %3 = sext i32 %0 to i641133  %4 = getelementptr inbounds %struct.S, ptr %1, i64 %31134  %5 = bitcast ptr %4 to ptr1135  %6 = load i88, ptr %5, align 11136  %7 = ashr i88 %6, 401137  %8 = trunc i88 %7 to i641138  %9 = icmp eq i64 %8, %31139  br i1 %9, label %10, label %111140 114110:1142  tail call void @_Z3foov()1143  br label %111144 114511:1146  ret void1147}1148declare dso_local void @_Z3foov()1149 1150define i32 @or_shl_fshl(i32 %x, i32 %y, i32 %s) nounwind {1151; X86-SSE2-LABEL: or_shl_fshl:1152; X86-SSE2:       # %bb.0:1153; X86-SSE2-NEXT:    pushl %esi1154; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1155; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1156; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1157; X86-SSE2-NEXT:    movl %edx, %esi1158; X86-SSE2-NEXT:    shll %cl, %esi1159; X86-SSE2-NEXT:    shldl %cl, %edx, %eax1160; X86-SSE2-NEXT:    orl %esi, %eax1161; X86-SSE2-NEXT:    popl %esi1162; X86-SSE2-NEXT:    retl1163;1164; X64-AVX-LABEL: or_shl_fshl:1165; X64-AVX:       # %bb.0:1166; X64-AVX-NEXT:    movl %edx, %ecx1167; X64-AVX-NEXT:    movl %esi, %eax1168; X64-AVX-NEXT:    shll %cl, %eax1169; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1170; X64-AVX-NEXT:    shldl %cl, %esi, %edi1171; X64-AVX-NEXT:    orl %edi, %eax1172; X64-AVX-NEXT:    retq1173  %shy = shl i32 %y, %s1174  %fun = call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %s)1175  %or = or i32 %fun, %shy1176  ret i32 %or1177}1178 1179define i32 @or_shl_rotl(i32 %x, i32 %y, i32 %s) nounwind {1180; X86-SSE2-LABEL: or_shl_rotl:1181; X86-SSE2:       # %bb.0:1182; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1183; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1184; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1185; X86-SSE2-NEXT:    shll %cl, %edx1186; X86-SSE2-NEXT:    roll %cl, %eax1187; X86-SSE2-NEXT:    orl %edx, %eax1188; X86-SSE2-NEXT:    retl1189;1190; X64-AVX-LABEL: or_shl_rotl:1191; X64-AVX:       # %bb.0:1192; X64-AVX-NEXT:    movl %edx, %ecx1193; X64-AVX-NEXT:    movl %esi, %eax1194; X64-AVX-NEXT:    shll %cl, %edi1195; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1196; X64-AVX-NEXT:    roll %cl, %eax1197; X64-AVX-NEXT:    orl %edi, %eax1198; X64-AVX-NEXT:    retq1199  %shx = shl i32 %x, %s1200  %rot = call i32 @llvm.fshl.i32(i32 %y, i32 %y, i32 %s)1201  %or = or i32 %rot, %shx1202  ret i32 %or1203}1204 1205define i32 @or_shl_fshl_commute(i32 %x, i32 %y, i32 %s) nounwind {1206; X86-SSE2-LABEL: or_shl_fshl_commute:1207; X86-SSE2:       # %bb.0:1208; X86-SSE2-NEXT:    pushl %esi1209; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1210; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1211; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1212; X86-SSE2-NEXT:    movl %edx, %esi1213; X86-SSE2-NEXT:    shll %cl, %esi1214; X86-SSE2-NEXT:    shldl %cl, %edx, %eax1215; X86-SSE2-NEXT:    orl %esi, %eax1216; X86-SSE2-NEXT:    popl %esi1217; X86-SSE2-NEXT:    retl1218;1219; X64-AVX-LABEL: or_shl_fshl_commute:1220; X64-AVX:       # %bb.0:1221; X64-AVX-NEXT:    movl %edx, %ecx1222; X64-AVX-NEXT:    movl %esi, %eax1223; X64-AVX-NEXT:    shll %cl, %eax1224; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1225; X64-AVX-NEXT:    shldl %cl, %esi, %edi1226; X64-AVX-NEXT:    orl %edi, %eax1227; X64-AVX-NEXT:    retq1228  %shy = shl i32 %y, %s1229  %fun = call i32 @llvm.fshl.i32(i32 %x, i32 %y, i32 %s)1230  %or = or i32 %shy, %fun1231  ret i32 %or1232}1233 1234define i32 @or_shl_rotl_commute(i32 %x, i32 %y, i32 %s) nounwind {1235; X86-SSE2-LABEL: or_shl_rotl_commute:1236; X86-SSE2:       # %bb.0:1237; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1238; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1239; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1240; X86-SSE2-NEXT:    shll %cl, %edx1241; X86-SSE2-NEXT:    roll %cl, %eax1242; X86-SSE2-NEXT:    orl %edx, %eax1243; X86-SSE2-NEXT:    retl1244;1245; X64-AVX-LABEL: or_shl_rotl_commute:1246; X64-AVX:       # %bb.0:1247; X64-AVX-NEXT:    movl %edx, %ecx1248; X64-AVX-NEXT:    movl %esi, %eax1249; X64-AVX-NEXT:    shll %cl, %edi1250; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1251; X64-AVX-NEXT:    roll %cl, %eax1252; X64-AVX-NEXT:    orl %edi, %eax1253; X64-AVX-NEXT:    retq1254  %shx = shl i32 %x, %s1255  %rot = call i32 @llvm.fshl.i32(i32 %y, i32 %y, i32 %s)1256  %or = or i32 %shx, %rot1257  ret i32 %or1258}1259 1260define i32 @or_lshr_fshr(i32 %x, i32 %y, i32 %s) nounwind {1261; X86-SSE2-LABEL: or_lshr_fshr:1262; X86-SSE2:       # %bb.0:1263; X86-SSE2-NEXT:    pushl %esi1264; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1265; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1266; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1267; X86-SSE2-NEXT:    movl %edx, %esi1268; X86-SSE2-NEXT:    shrl %cl, %esi1269; X86-SSE2-NEXT:    shrdl %cl, %edx, %eax1270; X86-SSE2-NEXT:    orl %esi, %eax1271; X86-SSE2-NEXT:    popl %esi1272; X86-SSE2-NEXT:    retl1273;1274; X64-AVX-LABEL: or_lshr_fshr:1275; X64-AVX:       # %bb.0:1276; X64-AVX-NEXT:    movl %edx, %ecx1277; X64-AVX-NEXT:    movl %esi, %eax1278; X64-AVX-NEXT:    shrl %cl, %eax1279; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1280; X64-AVX-NEXT:    shrdl %cl, %esi, %edi1281; X64-AVX-NEXT:    orl %edi, %eax1282; X64-AVX-NEXT:    retq1283  %shy = lshr i32 %y, %s1284  %fun = call i32 @llvm.fshr.i32(i32 %y, i32 %x, i32 %s)1285  %or = or i32 %fun, %shy1286  ret i32 %or1287}1288 1289define i32 @or_lshr_rotr(i32 %x, i32 %y, i32 %s) nounwind {1290; X86-SSE2-LABEL: or_lshr_rotr:1291; X86-SSE2:       # %bb.0:1292; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1293; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1294; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1295; X86-SSE2-NEXT:    shrl %cl, %edx1296; X86-SSE2-NEXT:    rorl %cl, %eax1297; X86-SSE2-NEXT:    orl %edx, %eax1298; X86-SSE2-NEXT:    retl1299;1300; X64-AVX-LABEL: or_lshr_rotr:1301; X64-AVX:       # %bb.0:1302; X64-AVX-NEXT:    movl %edx, %ecx1303; X64-AVX-NEXT:    movl %esi, %eax1304; X64-AVX-NEXT:    shrl %cl, %edi1305; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1306; X64-AVX-NEXT:    rorl %cl, %eax1307; X64-AVX-NEXT:    orl %edi, %eax1308; X64-AVX-NEXT:    retq1309  %shx = lshr i32 %x, %s1310  %rot = call i32 @llvm.fshr.i32(i32 %y, i32 %y, i32 %s)1311  %or = or i32 %rot, %shx1312  ret i32 %or1313}1314 1315define i32 @or_lshr_fshr_commute(i32 %x, i32 %y, i32 %s) nounwind {1316; X86-SSE2-LABEL: or_lshr_fshr_commute:1317; X86-SSE2:       # %bb.0:1318; X86-SSE2-NEXT:    pushl %esi1319; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1320; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1321; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1322; X86-SSE2-NEXT:    movl %edx, %esi1323; X86-SSE2-NEXT:    shrl %cl, %esi1324; X86-SSE2-NEXT:    shrdl %cl, %edx, %eax1325; X86-SSE2-NEXT:    orl %esi, %eax1326; X86-SSE2-NEXT:    popl %esi1327; X86-SSE2-NEXT:    retl1328;1329; X64-AVX-LABEL: or_lshr_fshr_commute:1330; X64-AVX:       # %bb.0:1331; X64-AVX-NEXT:    movl %edx, %ecx1332; X64-AVX-NEXT:    movl %esi, %eax1333; X64-AVX-NEXT:    shrl %cl, %eax1334; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1335; X64-AVX-NEXT:    shrdl %cl, %esi, %edi1336; X64-AVX-NEXT:    orl %edi, %eax1337; X64-AVX-NEXT:    retq1338  %shy = lshr i32 %y, %s1339  %fun = call i32 @llvm.fshr.i32(i32 %y, i32 %x, i32 %s)1340  %or = or i32 %shy, %fun1341  ret i32 %or1342}1343 1344define i32 @or_lshr_rotr_commute(i32 %x, i32 %y, i32 %s) nounwind {1345; X86-SSE2-LABEL: or_lshr_rotr_commute:1346; X86-SSE2:       # %bb.0:1347; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1348; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1349; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1350; X86-SSE2-NEXT:    shrl %cl, %edx1351; X86-SSE2-NEXT:    rorl %cl, %eax1352; X86-SSE2-NEXT:    orl %edx, %eax1353; X86-SSE2-NEXT:    retl1354;1355; X64-AVX-LABEL: or_lshr_rotr_commute:1356; X64-AVX:       # %bb.0:1357; X64-AVX-NEXT:    movl %edx, %ecx1358; X64-AVX-NEXT:    movl %esi, %eax1359; X64-AVX-NEXT:    shrl %cl, %edi1360; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1361; X64-AVX-NEXT:    rorl %cl, %eax1362; X64-AVX-NEXT:    orl %edi, %eax1363; X64-AVX-NEXT:    retq1364  %shx = lshr i32 %x, %s1365  %rot = call i32 @llvm.fshr.i32(i32 %y, i32 %y, i32 %s)1366  %or = or i32 %shx, %rot1367  ret i32 %or1368}1369 1370define i32 @or_shl_fshl_simplify(i32 %x, i32 %y, i32 %s) nounwind {1371; X86-SSE2-LABEL: or_shl_fshl_simplify:1372; X86-SSE2:       # %bb.0:1373; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1374; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1375; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1376; X86-SSE2-NEXT:    shldl %cl, %edx, %eax1377; X86-SSE2-NEXT:    retl1378;1379; X64-AVX-LABEL: or_shl_fshl_simplify:1380; X64-AVX:       # %bb.0:1381; X64-AVX-NEXT:    movl %edx, %ecx1382; X64-AVX-NEXT:    movl %esi, %eax1383; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1384; X64-AVX-NEXT:    shldl %cl, %edi, %eax1385; X64-AVX-NEXT:    retq1386  %shy = shl i32 %y, %s1387  %fun = call i32 @llvm.fshl.i32(i32 %y, i32 %x, i32 %s)1388  %or = or i32 %fun, %shy1389  ret i32 %or1390}1391 1392define i32 @or_lshr_fshr_simplify(i32 %x, i32 %y, i32 %s) nounwind {1393; X86-SSE2-LABEL: or_lshr_fshr_simplify:1394; X86-SSE2:       # %bb.0:1395; X86-SSE2-NEXT:    movzbl {{[0-9]+}}(%esp), %ecx1396; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %edx1397; X86-SSE2-NEXT:    movl {{[0-9]+}}(%esp), %eax1398; X86-SSE2-NEXT:    shrdl %cl, %edx, %eax1399; X86-SSE2-NEXT:    retl1400;1401; X64-AVX-LABEL: or_lshr_fshr_simplify:1402; X64-AVX:       # %bb.0:1403; X64-AVX-NEXT:    movl %edx, %ecx1404; X64-AVX-NEXT:    movl %esi, %eax1405; X64-AVX-NEXT:    # kill: def $cl killed $cl killed $ecx1406; X64-AVX-NEXT:    shrdl %cl, %edi, %eax1407; X64-AVX-NEXT:    retq1408  %shy = lshr i32 %y, %s1409  %fun = call i32 @llvm.fshr.i32(i32 %x, i32 %y, i32 %s)1410  %or = or i32 %shy, %fun1411  ret i32 %or1412}1413