707 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=-bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X86-NOBMI23; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X86-NOBMI24; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X86-NOBMI25; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+bmi2 < %s | FileCheck %s --check-prefixes=X86-BMI26; RUN: llc -mtriple=i686-unknown-linux-gnu -mattr=+bmi,+bmi2 < %s | FileCheck %s --check-prefixes=X86-BMI27; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=-bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X64-NOBMI28; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X64-NOBMI29; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,-bmi2 < %s | FileCheck %s --check-prefixes=X64-NOBMI210; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+bmi2 < %s | FileCheck %s --check-prefixes=X64-BMI211; RUN: llc -mtriple=x86_64-unknown-linux-gnu -mattr=+bmi,+bmi2 < %s | FileCheck %s --check-prefixes=X64-BMI212 13 14 15define i64 @sub63_shiftl64(i64 %val, i64 %cnt) nounwind {16; X86-NOBMI2-LABEL: sub63_shiftl64:17; X86-NOBMI2: # %bb.0:18; X86-NOBMI2-NEXT: pushl %esi19; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %esi20; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %edx21; X86-NOBMI2-NEXT: movb $63, %cl22; X86-NOBMI2-NEXT: subb {{[0-9]+}}(%esp), %cl23; X86-NOBMI2-NEXT: movl %esi, %eax24; X86-NOBMI2-NEXT: shll %cl, %eax25; X86-NOBMI2-NEXT: shldl %cl, %esi, %edx26; X86-NOBMI2-NEXT: testb $32, %cl27; X86-NOBMI2-NEXT: je .LBB0_228; X86-NOBMI2-NEXT: # %bb.1:29; X86-NOBMI2-NEXT: movl %eax, %edx30; X86-NOBMI2-NEXT: xorl %eax, %eax31; X86-NOBMI2-NEXT: .LBB0_2:32; X86-NOBMI2-NEXT: popl %esi33; X86-NOBMI2-NEXT: retl34;35; X86-BMI2-LABEL: sub63_shiftl64:36; X86-BMI2: # %bb.0:37; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax38; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx39; X86-BMI2-NEXT: movb $63, %cl40; X86-BMI2-NEXT: subb {{[0-9]+}}(%esp), %cl41; X86-BMI2-NEXT: shldl %cl, %eax, %edx42; X86-BMI2-NEXT: shlxl %ecx, %eax, %eax43; X86-BMI2-NEXT: testb $32, %cl44; X86-BMI2-NEXT: je .LBB0_245; X86-BMI2-NEXT: # %bb.1:46; X86-BMI2-NEXT: movl %eax, %edx47; X86-BMI2-NEXT: xorl %eax, %eax48; X86-BMI2-NEXT: .LBB0_2:49; X86-BMI2-NEXT: retl50;51; X64-NOBMI2-LABEL: sub63_shiftl64:52; X64-NOBMI2: # %bb.0:53; X64-NOBMI2-NEXT: movq %rsi, %rcx54; X64-NOBMI2-NEXT: movq %rdi, %rax55; X64-NOBMI2-NEXT: notb %cl56; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $rcx57; X64-NOBMI2-NEXT: shlq %cl, %rax58; X64-NOBMI2-NEXT: retq59;60; X64-BMI2-LABEL: sub63_shiftl64:61; X64-BMI2: # %bb.0:62; X64-BMI2-NEXT: notb %sil63; X64-BMI2-NEXT: shlxq %rsi, %rdi, %rax64; X64-BMI2-NEXT: retq65 %adjcnt = sub i64 63, %cnt66 %result = shl i64 %val, %adjcnt67 ret i64 %result68}69 70define i64 @xor63_shiftr64(i64 %val, i64 %cnt) nounwind {71; X86-NOBMI2-LABEL: xor63_shiftr64:72; X86-NOBMI2: # %bb.0:73; X86-NOBMI2-NEXT: pushl %esi74; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax75; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %esi76; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx77; X86-NOBMI2-NEXT: xorb $63, %cl78; X86-NOBMI2-NEXT: movl %esi, %edx79; X86-NOBMI2-NEXT: shrl %cl, %edx80; X86-NOBMI2-NEXT: shrdl %cl, %esi, %eax81; X86-NOBMI2-NEXT: testb $32, %cl82; X86-NOBMI2-NEXT: je .LBB1_283; X86-NOBMI2-NEXT: # %bb.1:84; X86-NOBMI2-NEXT: movl %edx, %eax85; X86-NOBMI2-NEXT: xorl %edx, %edx86; X86-NOBMI2-NEXT: .LBB1_2:87; X86-NOBMI2-NEXT: popl %esi88; X86-NOBMI2-NEXT: retl89;90; X86-BMI2-LABEL: xor63_shiftr64:91; X86-BMI2: # %bb.0:92; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax93; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx94; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx95; X86-BMI2-NEXT: xorb $63, %cl96; X86-BMI2-NEXT: shrdl %cl, %edx, %eax97; X86-BMI2-NEXT: shrxl %ecx, %edx, %edx98; X86-BMI2-NEXT: testb $32, %cl99; X86-BMI2-NEXT: je .LBB1_2100; X86-BMI2-NEXT: # %bb.1:101; X86-BMI2-NEXT: movl %edx, %eax102; X86-BMI2-NEXT: xorl %edx, %edx103; X86-BMI2-NEXT: .LBB1_2:104; X86-BMI2-NEXT: retl105;106; X64-NOBMI2-LABEL: xor63_shiftr64:107; X64-NOBMI2: # %bb.0:108; X64-NOBMI2-NEXT: movq %rsi, %rcx109; X64-NOBMI2-NEXT: movq %rdi, %rax110; X64-NOBMI2-NEXT: notb %cl111; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $rcx112; X64-NOBMI2-NEXT: shrq %cl, %rax113; X64-NOBMI2-NEXT: retq114;115; X64-BMI2-LABEL: xor63_shiftr64:116; X64-BMI2: # %bb.0:117; X64-BMI2-NEXT: notb %sil118; X64-BMI2-NEXT: shrxq %rsi, %rdi, %rax119; X64-BMI2-NEXT: retq120 %adjcnt = xor i64 %cnt, 63121 %result = lshr i64 %val, %adjcnt122 ret i64 %result123}124 125define i64 @sub127_shiftl64(i64 %val, i64 %cnt) nounwind {126; X86-NOBMI2-LABEL: sub127_shiftl64:127; X86-NOBMI2: # %bb.0:128; X86-NOBMI2-NEXT: pushl %esi129; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %esi130; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %edx131; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx132; X86-NOBMI2-NEXT: xorb $127, %cl133; X86-NOBMI2-NEXT: movl %esi, %eax134; X86-NOBMI2-NEXT: shll %cl, %eax135; X86-NOBMI2-NEXT: shldl %cl, %esi, %edx136; X86-NOBMI2-NEXT: testb $32, %cl137; X86-NOBMI2-NEXT: je .LBB2_2138; X86-NOBMI2-NEXT: # %bb.1:139; X86-NOBMI2-NEXT: movl %eax, %edx140; X86-NOBMI2-NEXT: xorl %eax, %eax141; X86-NOBMI2-NEXT: .LBB2_2:142; X86-NOBMI2-NEXT: popl %esi143; X86-NOBMI2-NEXT: retl144;145; X86-BMI2-LABEL: sub127_shiftl64:146; X86-BMI2: # %bb.0:147; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax148; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx149; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx150; X86-BMI2-NEXT: xorb $127, %cl151; X86-BMI2-NEXT: shldl %cl, %eax, %edx152; X86-BMI2-NEXT: shlxl %ecx, %eax, %eax153; X86-BMI2-NEXT: testb $32, %cl154; X86-BMI2-NEXT: je .LBB2_2155; X86-BMI2-NEXT: # %bb.1:156; X86-BMI2-NEXT: movl %eax, %edx157; X86-BMI2-NEXT: xorl %eax, %eax158; X86-BMI2-NEXT: .LBB2_2:159; X86-BMI2-NEXT: retl160;161; X64-NOBMI2-LABEL: sub127_shiftl64:162; X64-NOBMI2: # %bb.0:163; X64-NOBMI2-NEXT: movq %rsi, %rcx164; X64-NOBMI2-NEXT: movq %rdi, %rax165; X64-NOBMI2-NEXT: notb %cl166; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $rcx167; X64-NOBMI2-NEXT: shlq %cl, %rax168; X64-NOBMI2-NEXT: retq169;170; X64-BMI2-LABEL: sub127_shiftl64:171; X64-BMI2: # %bb.0:172; X64-BMI2-NEXT: notb %sil173; X64-BMI2-NEXT: shlxq %rsi, %rdi, %rax174; X64-BMI2-NEXT: retq175 %adjcnt = sub i64 127, %cnt176 %result = shl i64 %val, %adjcnt177 ret i64 %result178}179 180define i64 @xor127_shiftr64(i64 %val, i64 %cnt) nounwind {181; X86-NOBMI2-LABEL: xor127_shiftr64:182; X86-NOBMI2: # %bb.0:183; X86-NOBMI2-NEXT: pushl %esi184; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax185; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %esi186; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx187; X86-NOBMI2-NEXT: xorb $127, %cl188; X86-NOBMI2-NEXT: movl %esi, %edx189; X86-NOBMI2-NEXT: shrl %cl, %edx190; X86-NOBMI2-NEXT: shrdl %cl, %esi, %eax191; X86-NOBMI2-NEXT: testb $32, %cl192; X86-NOBMI2-NEXT: je .LBB3_2193; X86-NOBMI2-NEXT: # %bb.1:194; X86-NOBMI2-NEXT: movl %edx, %eax195; X86-NOBMI2-NEXT: xorl %edx, %edx196; X86-NOBMI2-NEXT: .LBB3_2:197; X86-NOBMI2-NEXT: popl %esi198; X86-NOBMI2-NEXT: retl199;200; X86-BMI2-LABEL: xor127_shiftr64:201; X86-BMI2: # %bb.0:202; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax203; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx204; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx205; X86-BMI2-NEXT: xorb $127, %cl206; X86-BMI2-NEXT: shrdl %cl, %edx, %eax207; X86-BMI2-NEXT: shrxl %ecx, %edx, %edx208; X86-BMI2-NEXT: testb $32, %cl209; X86-BMI2-NEXT: je .LBB3_2210; X86-BMI2-NEXT: # %bb.1:211; X86-BMI2-NEXT: movl %edx, %eax212; X86-BMI2-NEXT: xorl %edx, %edx213; X86-BMI2-NEXT: .LBB3_2:214; X86-BMI2-NEXT: retl215;216; X64-NOBMI2-LABEL: xor127_shiftr64:217; X64-NOBMI2: # %bb.0:218; X64-NOBMI2-NEXT: movq %rsi, %rcx219; X64-NOBMI2-NEXT: movq %rdi, %rax220; X64-NOBMI2-NEXT: notb %cl221; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $rcx222; X64-NOBMI2-NEXT: shrq %cl, %rax223; X64-NOBMI2-NEXT: retq224;225; X64-BMI2-LABEL: xor127_shiftr64:226; X64-BMI2: # %bb.0:227; X64-BMI2-NEXT: notb %sil228; X64-BMI2-NEXT: shrxq %rsi, %rdi, %rax229; X64-BMI2-NEXT: retq230 %adjcnt = xor i64 %cnt, 127231 %result = lshr i64 %val, %adjcnt232 ret i64 %result233}234 235define i64 @xor64_shiftl64(i64 %val, i64 %cnt) nounwind {236; X86-NOBMI2-LABEL: xor64_shiftl64:237; X86-NOBMI2: # %bb.0:238; X86-NOBMI2-NEXT: pushl %esi239; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %esi240; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %edx241; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx242; X86-NOBMI2-NEXT: xorb $64, %cl243; X86-NOBMI2-NEXT: movl %esi, %eax244; X86-NOBMI2-NEXT: shll %cl, %eax245; X86-NOBMI2-NEXT: shldl %cl, %esi, %edx246; X86-NOBMI2-NEXT: testb $32, %cl247; X86-NOBMI2-NEXT: je .LBB4_2248; X86-NOBMI2-NEXT: # %bb.1:249; X86-NOBMI2-NEXT: movl %eax, %edx250; X86-NOBMI2-NEXT: xorl %eax, %eax251; X86-NOBMI2-NEXT: .LBB4_2:252; X86-NOBMI2-NEXT: popl %esi253; X86-NOBMI2-NEXT: retl254;255; X86-BMI2-LABEL: xor64_shiftl64:256; X86-BMI2: # %bb.0:257; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax258; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx259; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx260; X86-BMI2-NEXT: xorb $64, %cl261; X86-BMI2-NEXT: shldl %cl, %eax, %edx262; X86-BMI2-NEXT: shlxl %ecx, %eax, %eax263; X86-BMI2-NEXT: testb $32, %cl264; X86-BMI2-NEXT: je .LBB4_2265; X86-BMI2-NEXT: # %bb.1:266; X86-BMI2-NEXT: movl %eax, %edx267; X86-BMI2-NEXT: xorl %eax, %eax268; X86-BMI2-NEXT: .LBB4_2:269; X86-BMI2-NEXT: retl270;271; X64-NOBMI2-LABEL: xor64_shiftl64:272; X64-NOBMI2: # %bb.0:273; X64-NOBMI2-NEXT: movq %rsi, %rcx274; X64-NOBMI2-NEXT: movq %rdi, %rax275; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $rcx276; X64-NOBMI2-NEXT: shlq %cl, %rax277; X64-NOBMI2-NEXT: retq278;279; X64-BMI2-LABEL: xor64_shiftl64:280; X64-BMI2: # %bb.0:281; X64-BMI2-NEXT: shlxq %rsi, %rdi, %rax282; X64-BMI2-NEXT: retq283 %adjcnt = xor i64 %cnt, 64284 %result = shl i64 %val, %adjcnt285 ret i64 %result286}287 288define i64 @sub1s_shiftr64(i64 %val, i64 %cnt) nounwind {289; X86-NOBMI2-LABEL: sub1s_shiftr64:290; X86-NOBMI2: # %bb.0:291; X86-NOBMI2-NEXT: pushl %esi292; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax293; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %esi294; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx295; X86-NOBMI2-NEXT: notb %cl296; X86-NOBMI2-NEXT: movl %esi, %edx297; X86-NOBMI2-NEXT: shrl %cl, %edx298; X86-NOBMI2-NEXT: shrdl %cl, %esi, %eax299; X86-NOBMI2-NEXT: testb $32, %cl300; X86-NOBMI2-NEXT: je .LBB5_2301; X86-NOBMI2-NEXT: # %bb.1:302; X86-NOBMI2-NEXT: movl %edx, %eax303; X86-NOBMI2-NEXT: xorl %edx, %edx304; X86-NOBMI2-NEXT: .LBB5_2:305; X86-NOBMI2-NEXT: popl %esi306; X86-NOBMI2-NEXT: retl307;308; X86-BMI2-LABEL: sub1s_shiftr64:309; X86-BMI2: # %bb.0:310; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax311; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx312; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx313; X86-BMI2-NEXT: notb %cl314; X86-BMI2-NEXT: shrdl %cl, %edx, %eax315; X86-BMI2-NEXT: shrxl %ecx, %edx, %edx316; X86-BMI2-NEXT: testb $32, %cl317; X86-BMI2-NEXT: je .LBB5_2318; X86-BMI2-NEXT: # %bb.1:319; X86-BMI2-NEXT: movl %edx, %eax320; X86-BMI2-NEXT: xorl %edx, %edx321; X86-BMI2-NEXT: .LBB5_2:322; X86-BMI2-NEXT: retl323;324; X64-NOBMI2-LABEL: sub1s_shiftr64:325; X64-NOBMI2: # %bb.0:326; X64-NOBMI2-NEXT: movq %rsi, %rcx327; X64-NOBMI2-NEXT: movq %rdi, %rax328; X64-NOBMI2-NEXT: notb %cl329; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $rcx330; X64-NOBMI2-NEXT: shrq %cl, %rax331; X64-NOBMI2-NEXT: retq332;333; X64-BMI2-LABEL: sub1s_shiftr64:334; X64-BMI2: # %bb.0:335; X64-BMI2-NEXT: notb %sil336; X64-BMI2-NEXT: shrxq %rsi, %rdi, %rax337; X64-BMI2-NEXT: retq338 %adjcnt = xor i64 %cnt, -1339 %result = lshr i64 %val, %adjcnt340 ret i64 %result341}342 343define i64 @xor1s_shiftl64(i64 %val, i64 %cnt) nounwind {344; X86-NOBMI2-LABEL: xor1s_shiftl64:345; X86-NOBMI2: # %bb.0:346; X86-NOBMI2-NEXT: pushl %esi347; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %esi348; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %edx349; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx350; X86-NOBMI2-NEXT: notb %cl351; X86-NOBMI2-NEXT: movl %esi, %eax352; X86-NOBMI2-NEXT: shll %cl, %eax353; X86-NOBMI2-NEXT: shldl %cl, %esi, %edx354; X86-NOBMI2-NEXT: testb $32, %cl355; X86-NOBMI2-NEXT: je .LBB6_2356; X86-NOBMI2-NEXT: # %bb.1:357; X86-NOBMI2-NEXT: movl %eax, %edx358; X86-NOBMI2-NEXT: xorl %eax, %eax359; X86-NOBMI2-NEXT: .LBB6_2:360; X86-NOBMI2-NEXT: popl %esi361; X86-NOBMI2-NEXT: retl362;363; X86-BMI2-LABEL: xor1s_shiftl64:364; X86-BMI2: # %bb.0:365; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %eax366; X86-BMI2-NEXT: movl {{[0-9]+}}(%esp), %edx367; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx368; X86-BMI2-NEXT: notb %cl369; X86-BMI2-NEXT: shldl %cl, %eax, %edx370; X86-BMI2-NEXT: shlxl %ecx, %eax, %eax371; X86-BMI2-NEXT: testb $32, %cl372; X86-BMI2-NEXT: je .LBB6_2373; X86-BMI2-NEXT: # %bb.1:374; X86-BMI2-NEXT: movl %eax, %edx375; X86-BMI2-NEXT: xorl %eax, %eax376; X86-BMI2-NEXT: .LBB6_2:377; X86-BMI2-NEXT: retl378;379; X64-NOBMI2-LABEL: xor1s_shiftl64:380; X64-NOBMI2: # %bb.0:381; X64-NOBMI2-NEXT: movq %rsi, %rcx382; X64-NOBMI2-NEXT: movq %rdi, %rax383; X64-NOBMI2-NEXT: notb %cl384; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $rcx385; X64-NOBMI2-NEXT: shlq %cl, %rax386; X64-NOBMI2-NEXT: retq387;388; X64-BMI2-LABEL: xor1s_shiftl64:389; X64-BMI2: # %bb.0:390; X64-BMI2-NEXT: notb %sil391; X64-BMI2-NEXT: shlxq %rsi, %rdi, %rax392; X64-BMI2-NEXT: retq393 %adjcnt = xor i64 %cnt, -1394 %result = shl i64 %val, %adjcnt395 ret i64 %result396}397 398define i32 @sub31_shiftr32(i32 %val, i32 %cnt) nounwind {399; X86-NOBMI2-LABEL: sub31_shiftr32:400; X86-NOBMI2: # %bb.0:401; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax402; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx403; X86-NOBMI2-NEXT: notb %cl404; X86-NOBMI2-NEXT: shrl %cl, %eax405; X86-NOBMI2-NEXT: retl406;407; X86-BMI2-LABEL: sub31_shiftr32:408; X86-BMI2: # %bb.0:409; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %eax410; X86-BMI2-NEXT: notb %al411; X86-BMI2-NEXT: shrxl %eax, {{[0-9]+}}(%esp), %eax412; X86-BMI2-NEXT: retl413;414; X64-NOBMI2-LABEL: sub31_shiftr32:415; X64-NOBMI2: # %bb.0:416; X64-NOBMI2-NEXT: movl %esi, %ecx417; X64-NOBMI2-NEXT: movl %edi, %eax418; X64-NOBMI2-NEXT: notb %cl419; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $ecx420; X64-NOBMI2-NEXT: shrl %cl, %eax421; X64-NOBMI2-NEXT: retq422;423; X64-BMI2-LABEL: sub31_shiftr32:424; X64-BMI2: # %bb.0:425; X64-BMI2-NEXT: notb %sil426; X64-BMI2-NEXT: shrxl %esi, %edi, %eax427; X64-BMI2-NEXT: retq428 %adjcnt = sub i32 31, %cnt429 %result = lshr i32 %val, %adjcnt430 ret i32 %result431}432 433define i32 @xor31_shiftl32(i32 %val, i32 %cnt) nounwind {434; X86-NOBMI2-LABEL: xor31_shiftl32:435; X86-NOBMI2: # %bb.0:436; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax437; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx438; X86-NOBMI2-NEXT: notb %cl439; X86-NOBMI2-NEXT: shll %cl, %eax440; X86-NOBMI2-NEXT: retl441;442; X86-BMI2-LABEL: xor31_shiftl32:443; X86-BMI2: # %bb.0:444; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %eax445; X86-BMI2-NEXT: notb %al446; X86-BMI2-NEXT: shlxl %eax, {{[0-9]+}}(%esp), %eax447; X86-BMI2-NEXT: retl448;449; X64-NOBMI2-LABEL: xor31_shiftl32:450; X64-NOBMI2: # %bb.0:451; X64-NOBMI2-NEXT: movl %esi, %ecx452; X64-NOBMI2-NEXT: movl %edi, %eax453; X64-NOBMI2-NEXT: notb %cl454; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $ecx455; X64-NOBMI2-NEXT: shll %cl, %eax456; X64-NOBMI2-NEXT: retq457;458; X64-BMI2-LABEL: xor31_shiftl32:459; X64-BMI2: # %bb.0:460; X64-BMI2-NEXT: notb %sil461; X64-BMI2-NEXT: shlxl %esi, %edi, %eax462; X64-BMI2-NEXT: retq463 %adjcnt = xor i32 %cnt, 31464 %result = shl i32 %val, %adjcnt465 ret i32 %result466}467 468define i32 @sub63_shiftr32(i32 %val, i32 %cnt) nounwind {469; X86-NOBMI2-LABEL: sub63_shiftr32:470; X86-NOBMI2: # %bb.0:471; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax472; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx473; X86-NOBMI2-NEXT: notb %cl474; X86-NOBMI2-NEXT: shrl %cl, %eax475; X86-NOBMI2-NEXT: retl476;477; X86-BMI2-LABEL: sub63_shiftr32:478; X86-BMI2: # %bb.0:479; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %eax480; X86-BMI2-NEXT: notb %al481; X86-BMI2-NEXT: shrxl %eax, {{[0-9]+}}(%esp), %eax482; X86-BMI2-NEXT: retl483;484; X64-NOBMI2-LABEL: sub63_shiftr32:485; X64-NOBMI2: # %bb.0:486; X64-NOBMI2-NEXT: movl %esi, %ecx487; X64-NOBMI2-NEXT: movl %edi, %eax488; X64-NOBMI2-NEXT: notb %cl489; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $ecx490; X64-NOBMI2-NEXT: shrl %cl, %eax491; X64-NOBMI2-NEXT: retq492;493; X64-BMI2-LABEL: sub63_shiftr32:494; X64-BMI2: # %bb.0:495; X64-BMI2-NEXT: notb %sil496; X64-BMI2-NEXT: shrxl %esi, %edi, %eax497; X64-BMI2-NEXT: retq498 %adjcnt = sub i32 63, %cnt499 %result = lshr i32 %val, %adjcnt500 ret i32 %result501}502 503define i32 @xor63_shiftl32(i32 %val, i32 %cnt) nounwind {504; X86-NOBMI2-LABEL: xor63_shiftl32:505; X86-NOBMI2: # %bb.0:506; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax507; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx508; X86-NOBMI2-NEXT: notb %cl509; X86-NOBMI2-NEXT: shll %cl, %eax510; X86-NOBMI2-NEXT: retl511;512; X86-BMI2-LABEL: xor63_shiftl32:513; X86-BMI2: # %bb.0:514; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %eax515; X86-BMI2-NEXT: notb %al516; X86-BMI2-NEXT: shlxl %eax, {{[0-9]+}}(%esp), %eax517; X86-BMI2-NEXT: retl518;519; X64-NOBMI2-LABEL: xor63_shiftl32:520; X64-NOBMI2: # %bb.0:521; X64-NOBMI2-NEXT: movl %esi, %ecx522; X64-NOBMI2-NEXT: movl %edi, %eax523; X64-NOBMI2-NEXT: notb %cl524; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $ecx525; X64-NOBMI2-NEXT: shll %cl, %eax526; X64-NOBMI2-NEXT: retq527;528; X64-BMI2-LABEL: xor63_shiftl32:529; X64-BMI2: # %bb.0:530; X64-BMI2-NEXT: notb %sil531; X64-BMI2-NEXT: shlxl %esi, %edi, %eax532; X64-BMI2-NEXT: retq533 %adjcnt = xor i32 %cnt, 63534 %result = shl i32 %val, %adjcnt535 ret i32 %result536}537 538define i32 @xor32_shiftr32(i32 %val, i32 %cnt) nounwind {539; X86-NOBMI2-LABEL: xor32_shiftr32:540; X86-NOBMI2: # %bb.0:541; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx542; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax543; X86-NOBMI2-NEXT: shrl %cl, %eax544; X86-NOBMI2-NEXT: retl545;546; X86-BMI2-LABEL: xor32_shiftr32:547; X86-BMI2: # %bb.0:548; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %eax549; X86-BMI2-NEXT: shrxl %eax, {{[0-9]+}}(%esp), %eax550; X86-BMI2-NEXT: retl551;552; X64-NOBMI2-LABEL: xor32_shiftr32:553; X64-NOBMI2: # %bb.0:554; X64-NOBMI2-NEXT: movl %esi, %ecx555; X64-NOBMI2-NEXT: movl %edi, %eax556; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $ecx557; X64-NOBMI2-NEXT: shrl %cl, %eax558; X64-NOBMI2-NEXT: retq559;560; X64-BMI2-LABEL: xor32_shiftr32:561; X64-BMI2: # %bb.0:562; X64-BMI2-NEXT: shrxl %esi, %edi, %eax563; X64-BMI2-NEXT: retq564 %adjcnt = xor i32 %cnt, 32565 %result = lshr i32 %val, %adjcnt566 ret i32 %result567}568 569define i32 @sub1s_shiftl32(i32 %val, i32 %cnt) nounwind {570; X86-NOBMI2-LABEL: sub1s_shiftl32:571; X86-NOBMI2: # %bb.0:572; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax573; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx574; X86-NOBMI2-NEXT: notb %cl575; X86-NOBMI2-NEXT: shll %cl, %eax576; X86-NOBMI2-NEXT: retl577;578; X86-BMI2-LABEL: sub1s_shiftl32:579; X86-BMI2: # %bb.0:580; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %eax581; X86-BMI2-NEXT: notb %al582; X86-BMI2-NEXT: shlxl %eax, {{[0-9]+}}(%esp), %eax583; X86-BMI2-NEXT: retl584;585; X64-NOBMI2-LABEL: sub1s_shiftl32:586; X64-NOBMI2: # %bb.0:587; X64-NOBMI2-NEXT: movl %esi, %ecx588; X64-NOBMI2-NEXT: movl %edi, %eax589; X64-NOBMI2-NEXT: notb %cl590; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $ecx591; X64-NOBMI2-NEXT: shll %cl, %eax592; X64-NOBMI2-NEXT: retq593;594; X64-BMI2-LABEL: sub1s_shiftl32:595; X64-BMI2: # %bb.0:596; X64-BMI2-NEXT: notb %sil597; X64-BMI2-NEXT: shlxl %esi, %edi, %eax598; X64-BMI2-NEXT: retq599 %adjcnt = xor i32 %cnt, -1600 %result = shl i32 %val, %adjcnt601 ret i32 %result602}603 604define i32 @xor1s_shiftr32(i32 %val, i32 %cnt) nounwind {605; X86-NOBMI2-LABEL: xor1s_shiftr32:606; X86-NOBMI2: # %bb.0:607; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax608; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx609; X86-NOBMI2-NEXT: notb %cl610; X86-NOBMI2-NEXT: shrl %cl, %eax611; X86-NOBMI2-NEXT: retl612;613; X86-BMI2-LABEL: xor1s_shiftr32:614; X86-BMI2: # %bb.0:615; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %eax616; X86-BMI2-NEXT: notb %al617; X86-BMI2-NEXT: shrxl %eax, {{[0-9]+}}(%esp), %eax618; X86-BMI2-NEXT: retl619;620; X64-NOBMI2-LABEL: xor1s_shiftr32:621; X64-NOBMI2: # %bb.0:622; X64-NOBMI2-NEXT: movl %esi, %ecx623; X64-NOBMI2-NEXT: movl %edi, %eax624; X64-NOBMI2-NEXT: notb %cl625; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $ecx626; X64-NOBMI2-NEXT: shrl %cl, %eax627; X64-NOBMI2-NEXT: retq628;629; X64-BMI2-LABEL: xor1s_shiftr32:630; X64-BMI2: # %bb.0:631; X64-BMI2-NEXT: notb %sil632; X64-BMI2-NEXT: shrxl %esi, %edi, %eax633; X64-BMI2-NEXT: retq634 %adjcnt = xor i32 %cnt, -1635 %result = lshr i32 %val, %adjcnt636 ret i32 %result637}638define i32 @invalid_sub31(i32 %val, i32 %cnt) nounwind {639; X86-NOBMI2-LABEL: invalid_sub31:640; X86-NOBMI2: # %bb.0:641; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax642; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx643; X86-NOBMI2-NEXT: addb $-31, %cl644; X86-NOBMI2-NEXT: shll %cl, %eax645; X86-NOBMI2-NEXT: retl646;647; X86-BMI2-LABEL: invalid_sub31:648; X86-BMI2: # %bb.0:649; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %eax650; X86-BMI2-NEXT: addb $-31, %al651; X86-BMI2-NEXT: shlxl %eax, {{[0-9]+}}(%esp), %eax652; X86-BMI2-NEXT: retl653;654; X64-NOBMI2-LABEL: invalid_sub31:655; X64-NOBMI2: # %bb.0:656; X64-NOBMI2-NEXT: # kill: def $esi killed $esi def $rsi657; X64-NOBMI2-NEXT: movl %edi, %eax658; X64-NOBMI2-NEXT: leal -31(%rsi), %ecx659; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $ecx660; X64-NOBMI2-NEXT: shll %cl, %eax661; X64-NOBMI2-NEXT: retq662;663; X64-BMI2-LABEL: invalid_sub31:664; X64-BMI2: # %bb.0:665; X64-BMI2-NEXT: addb $-31, %sil666; X64-BMI2-NEXT: shlxl %esi, %edi, %eax667; X64-BMI2-NEXT: retq668 %adjcnt = sub i32 %cnt, 31669 %result = shl i32 %val, %adjcnt670 ret i32 %result671}672 673define i32 @invalid_add31(i32 %val, i32 %cnt) nounwind {674; X86-NOBMI2-LABEL: invalid_add31:675; X86-NOBMI2: # %bb.0:676; X86-NOBMI2-NEXT: movl {{[0-9]+}}(%esp), %eax677; X86-NOBMI2-NEXT: movzbl {{[0-9]+}}(%esp), %ecx678; X86-NOBMI2-NEXT: addb $31, %cl679; X86-NOBMI2-NEXT: shll %cl, %eax680; X86-NOBMI2-NEXT: retl681;682; X86-BMI2-LABEL: invalid_add31:683; X86-BMI2: # %bb.0:684; X86-BMI2-NEXT: movzbl {{[0-9]+}}(%esp), %eax685; X86-BMI2-NEXT: addb $31, %al686; X86-BMI2-NEXT: shlxl %eax, {{[0-9]+}}(%esp), %eax687; X86-BMI2-NEXT: retl688;689; X64-NOBMI2-LABEL: invalid_add31:690; X64-NOBMI2: # %bb.0:691; X64-NOBMI2-NEXT: # kill: def $esi killed $esi def $rsi692; X64-NOBMI2-NEXT: movl %edi, %eax693; X64-NOBMI2-NEXT: leal 31(%rsi), %ecx694; X64-NOBMI2-NEXT: # kill: def $cl killed $cl killed $ecx695; X64-NOBMI2-NEXT: shll %cl, %eax696; X64-NOBMI2-NEXT: retq697;698; X64-BMI2-LABEL: invalid_add31:699; X64-BMI2: # %bb.0:700; X64-BMI2-NEXT: addb $31, %sil701; X64-BMI2-NEXT: shlxl %esi, %edi, %eax702; X64-BMI2-NEXT: retq703 %adjcnt = add i32 %cnt, 31704 %result = shl i32 %val, %adjcnt705 ret i32 %result706}707