394 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=x86_64-linux | FileCheck %s --check-prefix=X643; RUN: llc < %s -mtriple=i686 -mattr=cmov | FileCheck %s --check-prefix=X864 5declare i4 @llvm.sshl.sat.i4 (i4, i4)6declare i8 @llvm.sshl.sat.i8 (i8, i8)7declare i15 @llvm.sshl.sat.i15 (i15, i15)8declare i16 @llvm.sshl.sat.i16 (i16, i16)9declare i18 @llvm.sshl.sat.i18 (i18, i18)10declare i32 @llvm.sshl.sat.i32 (i32, i32)11declare i64 @llvm.sshl.sat.i64 (i64, i64)12 13define i16 @func(i16 %x, i16 %y) nounwind {14; X64-LABEL: func:15; X64: # %bb.0:16; X64-NEXT: movl %esi, %ecx17; X64-NEXT: movl %edi, %edx18; X64-NEXT: shll %cl, %edi19; X64-NEXT: movswl %di, %esi20; X64-NEXT: # kill: def $cl killed $cl killed $ecx21; X64-NEXT: sarl %cl, %esi22; X64-NEXT: xorl %eax, %eax23; X64-NEXT: testw %dx, %dx24; X64-NEXT: sets %al25; X64-NEXT: addl $32767, %eax # imm = 0x7FFF26; X64-NEXT: cmpw %si, %dx27; X64-NEXT: cmovel %edi, %eax28; X64-NEXT: # kill: def $ax killed $ax killed $eax29; X64-NEXT: retq30;31; X86-LABEL: func:32; X86: # %bb.0:33; X86-NEXT: pushl %edi34; X86-NEXT: pushl %esi35; X86-NEXT: movl {{[0-9]+}}(%esp), %edx36; X86-NEXT: movl %edx, %esi37; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx38; X86-NEXT: shll %cl, %edx39; X86-NEXT: movswl %dx, %edi40; X86-NEXT: sarl %cl, %edi41; X86-NEXT: xorl %eax, %eax42; X86-NEXT: testw %si, %si43; X86-NEXT: sets %al44; X86-NEXT: addl $32767, %eax # imm = 0x7FFF45; X86-NEXT: cmpw %di, %si46; X86-NEXT: cmovel %edx, %eax47; X86-NEXT: # kill: def $ax killed $ax killed $eax48; X86-NEXT: popl %esi49; X86-NEXT: popl %edi50; X86-NEXT: retl51 %tmp = call i16 @llvm.sshl.sat.i16(i16 %x, i16 %y)52 ret i16 %tmp53}54 55define i16 @func2(i8 %x, i8 %y) nounwind {56; X64-LABEL: func2:57; X64: # %bb.0:58; X64-NEXT: movl %esi, %ecx59; X64-NEXT: movsbl %dil, %eax60; X64-NEXT: addl %eax, %eax61; X64-NEXT: movl %eax, %edx62; X64-NEXT: xorl %esi, %esi63; X64-NEXT: testw %ax, %ax64; X64-NEXT: sets %sil65; X64-NEXT: addl $32767, %esi # imm = 0x7FFF66; X64-NEXT: shll %cl, %eax67; X64-NEXT: movswl %ax, %edi68; X64-NEXT: # kill: def $cl killed $cl killed $ecx69; X64-NEXT: sarl %cl, %edi70; X64-NEXT: cmpw %di, %dx71; X64-NEXT: cmovnel %esi, %eax72; X64-NEXT: cwtl73; X64-NEXT: shrl %eax74; X64-NEXT: # kill: def $ax killed $ax killed $eax75; X64-NEXT: retq76;77; X86-LABEL: func2:78; X86: # %bb.0:79; X86-NEXT: pushl %esi80; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx81; X86-NEXT: movsbl {{[0-9]+}}(%esp), %eax82; X86-NEXT: addl %eax, %eax83; X86-NEXT: movl %eax, %edx84; X86-NEXT: shll %cl, %edx85; X86-NEXT: movswl %dx, %esi86; X86-NEXT: sarl %cl, %esi87; X86-NEXT: xorl %ecx, %ecx88; X86-NEXT: testw %ax, %ax89; X86-NEXT: sets %cl90; X86-NEXT: addl $32767, %ecx # imm = 0x7FFF91; X86-NEXT: cmpw %si, %ax92; X86-NEXT: cmovel %edx, %ecx93; X86-NEXT: movswl %cx, %eax94; X86-NEXT: shrl %eax95; X86-NEXT: # kill: def $ax killed $ax killed $eax96; X86-NEXT: popl %esi97; X86-NEXT: retl98 %x2 = sext i8 %x to i1599 %y2 = sext i8 %y to i15100 %tmp = call i15 @llvm.sshl.sat.i15(i15 %x2, i15 %y2)101 %tmp2 = sext i15 %tmp to i16102 ret i16 %tmp2103}104 105define i16 @func3(i15 %x, i8 %y) nounwind {106; X64-LABEL: func3:107; X64: # %bb.0:108; X64-NEXT: movl %esi, %ecx109; X64-NEXT: shll $7, %ecx110; X64-NEXT: addl %edi, %edi111; X64-NEXT: movl %edi, %eax112; X64-NEXT: shll %cl, %eax113; X64-NEXT: movswl %ax, %edx114; X64-NEXT: # kill: def $cl killed $cl killed $ecx115; X64-NEXT: sarl %cl, %edx116; X64-NEXT: xorl %ecx, %ecx117; X64-NEXT: testw %di, %di118; X64-NEXT: sets %cl119; X64-NEXT: addl $32767, %ecx # imm = 0x7FFF120; X64-NEXT: cmpw %dx, %di121; X64-NEXT: cmovel %eax, %ecx122; X64-NEXT: movswl %cx, %eax123; X64-NEXT: shrl %eax124; X64-NEXT: # kill: def $ax killed $ax killed $eax125; X64-NEXT: retq126;127; X86-LABEL: func3:128; X86: # %bb.0:129; X86-NEXT: pushl %esi130; X86-NEXT: movl {{[0-9]+}}(%esp), %eax131; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx132; X86-NEXT: shll $7, %ecx133; X86-NEXT: addl %eax, %eax134; X86-NEXT: movl %eax, %edx135; X86-NEXT: shll %cl, %edx136; X86-NEXT: movswl %dx, %esi137; X86-NEXT: # kill: def $cl killed $cl killed $ecx138; X86-NEXT: sarl %cl, %esi139; X86-NEXT: xorl %ecx, %ecx140; X86-NEXT: testw %ax, %ax141; X86-NEXT: sets %cl142; X86-NEXT: addl $32767, %ecx # imm = 0x7FFF143; X86-NEXT: cmpw %si, %ax144; X86-NEXT: cmovel %edx, %ecx145; X86-NEXT: movswl %cx, %eax146; X86-NEXT: shrl %eax147; X86-NEXT: # kill: def $ax killed $ax killed $eax148; X86-NEXT: popl %esi149; X86-NEXT: retl150 %y2 = sext i8 %y to i15151 %y3 = shl i15 %y2, 7152 %tmp = call i15 @llvm.sshl.sat.i15(i15 %x, i15 %y3)153 %tmp2 = sext i15 %tmp to i16154 ret i16 %tmp2155}156 157define i4 @func4(i4 %x, i4 %y) nounwind {158; X64-LABEL: func4:159; X64: # %bb.0:160; X64-NEXT: movl %esi, %ecx161; X64-NEXT: andb $15, %cl162; X64-NEXT: shlb $4, %dil163; X64-NEXT: movl %edi, %eax164; X64-NEXT: shlb %cl, %al165; X64-NEXT: movzbl %al, %edx166; X64-NEXT: movl %edx, %esi167; X64-NEXT: # kill: def $cl killed $cl killed $ecx168; X64-NEXT: sarb %cl, %sil169; X64-NEXT: xorl %eax, %eax170; X64-NEXT: testb %dil, %dil171; X64-NEXT: sets %al172; X64-NEXT: addl $127, %eax173; X64-NEXT: cmpb %sil, %dil174; X64-NEXT: cmovel %edx, %eax175; X64-NEXT: sarb $4, %al176; X64-NEXT: # kill: def $al killed $al killed $eax177; X64-NEXT: retq178;179; X86-LABEL: func4:180; X86: # %bb.0:181; X86-NEXT: pushl %esi182; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx183; X86-NEXT: andb $15, %cl184; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx185; X86-NEXT: shlb $4, %dl186; X86-NEXT: movb %dl, %ch187; X86-NEXT: shlb %cl, %ch188; X86-NEXT: movzbl %ch, %esi189; X86-NEXT: sarb %cl, %ch190; X86-NEXT: xorl %eax, %eax191; X86-NEXT: testb %dl, %dl192; X86-NEXT: sets %al193; X86-NEXT: addl $127, %eax194; X86-NEXT: cmpb %ch, %dl195; X86-NEXT: cmovel %esi, %eax196; X86-NEXT: sarb $4, %al197; X86-NEXT: # kill: def $al killed $al killed $eax198; X86-NEXT: popl %esi199; X86-NEXT: retl200 %tmp = call i4 @llvm.sshl.sat.i4(i4 %x, i4 %y)201 ret i4 %tmp202}203 204define i64 @func5(i64 %x, i64 %y) nounwind {205; X64-LABEL: func5:206; X64: # %bb.0:207; X64-NEXT: movq %rsi, %rcx208; X64-NEXT: xorl %eax, %eax209; X64-NEXT: testq %rdi, %rdi210; X64-NEXT: sets %al211; X64-NEXT: movabsq $9223372036854775807, %rdx # imm = 0x7FFFFFFFFFFFFFFF212; X64-NEXT: addq %rax, %rdx213; X64-NEXT: movq %rdi, %rax214; X64-NEXT: shlq %cl, %rax215; X64-NEXT: movq %rax, %rsi216; X64-NEXT: # kill: def $cl killed $cl killed $rcx217; X64-NEXT: sarq %cl, %rsi218; X64-NEXT: cmpq %rsi, %rdi219; X64-NEXT: cmovneq %rdx, %rax220; X64-NEXT: retq221;222; X86-LABEL: func5:223; X86: # %bb.0:224; X86-NEXT: pushl %ebp225; X86-NEXT: pushl %ebx226; X86-NEXT: pushl %edi227; X86-NEXT: pushl %esi228; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx229; X86-NEXT: movl {{[0-9]+}}(%esp), %edx230; X86-NEXT: movl {{[0-9]+}}(%esp), %eax231; X86-NEXT: movl %edx, %ebx232; X86-NEXT: shll %cl, %ebx233; X86-NEXT: movl %eax, %esi234; X86-NEXT: shldl %cl, %edx, %esi235; X86-NEXT: xorl %edi, %edi236; X86-NEXT: testb $32, %cl237; X86-NEXT: cmovnel %ebx, %esi238; X86-NEXT: cmovel %ebx, %edi239; X86-NEXT: movl %esi, %edx240; X86-NEXT: sarl %cl, %edx241; X86-NEXT: movl %esi, %ebx242; X86-NEXT: sarl $31, %ebx243; X86-NEXT: testb $32, %cl244; X86-NEXT: cmovel %edx, %ebx245; X86-NEXT: movl %edi, %ebp246; X86-NEXT: shrdl %cl, %esi, %ebp247; X86-NEXT: testb $32, %cl248; X86-NEXT: cmovnel %edx, %ebp249; X86-NEXT: xorl %eax, %ebx250; X86-NEXT: xorl {{[0-9]+}}(%esp), %ebp251; X86-NEXT: sarl $31, %eax252; X86-NEXT: movl %eax, %edx253; X86-NEXT: xorl $2147483647, %edx # imm = 0x7FFFFFFF254; X86-NEXT: orl %ebx, %ebp255; X86-NEXT: notl %eax256; X86-NEXT: cmovel %edi, %eax257; X86-NEXT: cmovel %esi, %edx258; X86-NEXT: popl %esi259; X86-NEXT: popl %edi260; X86-NEXT: popl %ebx261; X86-NEXT: popl %ebp262; X86-NEXT: retl263 %tmp = call i64 @llvm.sshl.sat.i64(i64 %x, i64 %y)264 ret i64 %tmp265}266 267define i18 @func6(i16 %x, i16 %y) nounwind {268; X64-LABEL: func6:269; X64: # %bb.0:270; X64-NEXT: movl %esi, %ecx271; X64-NEXT: movswl %di, %edx272; X64-NEXT: shll $14, %edx273; X64-NEXT: movl %edx, %esi274; X64-NEXT: shll %cl, %esi275; X64-NEXT: movl %esi, %edi276; X64-NEXT: # kill: def $cl killed $cl killed $ecx277; X64-NEXT: sarl %cl, %edi278; X64-NEXT: xorl %eax, %eax279; X64-NEXT: testl %edx, %edx280; X64-NEXT: sets %al281; X64-NEXT: addl $2147483647, %eax # imm = 0x7FFFFFFF282; X64-NEXT: cmpl %edi, %edx283; X64-NEXT: cmovel %esi, %eax284; X64-NEXT: sarl $14, %eax285; X64-NEXT: retq286;287; X86-LABEL: func6:288; X86: # %bb.0:289; X86-NEXT: pushl %edi290; X86-NEXT: pushl %esi291; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx292; X86-NEXT: movswl {{[0-9]+}}(%esp), %edx293; X86-NEXT: shll $14, %edx294; X86-NEXT: movl %edx, %esi295; X86-NEXT: shll %cl, %esi296; X86-NEXT: movl %esi, %edi297; X86-NEXT: sarl %cl, %edi298; X86-NEXT: xorl %eax, %eax299; X86-NEXT: testl %edx, %edx300; X86-NEXT: sets %al301; X86-NEXT: addl $2147483647, %eax # imm = 0x7FFFFFFF302; X86-NEXT: cmpl %edi, %edx303; X86-NEXT: cmovel %esi, %eax304; X86-NEXT: sarl $14, %eax305; X86-NEXT: popl %esi306; X86-NEXT: popl %edi307; X86-NEXT: retl308 %x2 = sext i16 %x to i18309 %y2 = sext i16 %y to i18310 %tmp = call i18 @llvm.sshl.sat.i18(i18 %x2, i18 %y2)311 ret i18 %tmp312}313 314define i32 @func7(i32 %x, i32 %y) nounwind {315; X64-LABEL: func7:316; X64: # %bb.0:317; X64-NEXT: movl %esi, %ecx318; X64-NEXT: movl %edi, %edx319; X64-NEXT: shll %cl, %edx320; X64-NEXT: movl %edx, %esi321; X64-NEXT: # kill: def $cl killed $cl killed $ecx322; X64-NEXT: sarl %cl, %esi323; X64-NEXT: xorl %eax, %eax324; X64-NEXT: testl %edi, %edi325; X64-NEXT: sets %al326; X64-NEXT: addl $2147483647, %eax # imm = 0x7FFFFFFF327; X64-NEXT: cmpl %esi, %edi328; X64-NEXT: cmovel %edx, %eax329; X64-NEXT: retq330;331; X86-LABEL: func7:332; X86: # %bb.0:333; X86-NEXT: pushl %edi334; X86-NEXT: pushl %esi335; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx336; X86-NEXT: movl {{[0-9]+}}(%esp), %edx337; X86-NEXT: movl %edx, %esi338; X86-NEXT: shll %cl, %esi339; X86-NEXT: movl %esi, %edi340; X86-NEXT: sarl %cl, %edi341; X86-NEXT: xorl %eax, %eax342; X86-NEXT: testl %edx, %edx343; X86-NEXT: sets %al344; X86-NEXT: addl $2147483647, %eax # imm = 0x7FFFFFFF345; X86-NEXT: cmpl %edi, %edx346; X86-NEXT: cmovel %esi, %eax347; X86-NEXT: popl %esi348; X86-NEXT: popl %edi349; X86-NEXT: retl350 %tmp = call i32 @llvm.sshl.sat.i32(i32 %x, i32 %y)351 ret i32 %tmp352}353 354define i8 @func8(i8 %x, i8 %y) nounwind {355; X64-LABEL: func8:356; X64: # %bb.0:357; X64-NEXT: movl %esi, %ecx358; X64-NEXT: movl %edi, %eax359; X64-NEXT: shlb %cl, %al360; X64-NEXT: movzbl %al, %edx361; X64-NEXT: movl %edx, %esi362; X64-NEXT: # kill: def $cl killed $cl killed $ecx363; X64-NEXT: sarb %cl, %sil364; X64-NEXT: xorl %eax, %eax365; X64-NEXT: testb %dil, %dil366; X64-NEXT: sets %al367; X64-NEXT: addl $127, %eax368; X64-NEXT: cmpb %sil, %dil369; X64-NEXT: cmovel %edx, %eax370; X64-NEXT: # kill: def $al killed $al killed $eax371; X64-NEXT: retq372;373; X86-LABEL: func8:374; X86: # %bb.0:375; X86-NEXT: pushl %esi376; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx377; X86-NEXT: movzbl {{[0-9]+}}(%esp), %edx378; X86-NEXT: movb %dl, %ch379; X86-NEXT: shlb %cl, %ch380; X86-NEXT: movzbl %ch, %esi381; X86-NEXT: sarb %cl, %ch382; X86-NEXT: xorl %eax, %eax383; X86-NEXT: testb %dl, %dl384; X86-NEXT: sets %al385; X86-NEXT: addl $127, %eax386; X86-NEXT: cmpb %ch, %dl387; X86-NEXT: cmovel %esi, %eax388; X86-NEXT: # kill: def $al killed $al killed $eax389; X86-NEXT: popl %esi390; X86-NEXT: retl391 %tmp = call i8 @llvm.sshl.sat.i8(i8 %x, i8 %y)392 ret i8 %tmp393}394