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