270 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=i686-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X863; RUN: llc -mtriple=x86_64-unknown-linux-gnu < %s | FileCheck %s --check-prefixes=X644 5declare i64 @llvm.abs.i64(i64, i1)6declare <2 x i64> @llvm.abs.2xi64(<2 x i64>, i1)7declare i32 @llvm.abs.i32(i32, i1)8declare i16 @llvm.abs.i16(i16, i1)9declare i8 @llvm.abs.i8(i8, i1)10 11define i1 @eq_pow_or(i32 %0) nounwind {12; X86-LABEL: eq_pow_or:13; X86: # %bb.0:14; X86-NEXT: movl {{[0-9]+}}(%esp), %eax15; X86-NEXT: addl $32, %eax16; X86-NEXT: testl $-65, %eax17; X86-NEXT: sete %al18; X86-NEXT: retl19;20; X64-LABEL: eq_pow_or:21; X64: # %bb.0:22; X64-NEXT: addl $32, %edi23; X64-NEXT: testl $-65, %edi24; X64-NEXT: sete %al25; X64-NEXT: retq26 %2 = icmp eq i32 %0, 3227 %3 = icmp eq i32 %0, -3228 %4 = or i1 %2, %329 ret i1 %430}31 32define i1 @ne_pow_and(i8 %0) nounwind {33; X86-LABEL: ne_pow_and:34; X86: # %bb.0:35; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax36; X86-NEXT: addb $16, %al37; X86-NEXT: testb $-33, %al38; X86-NEXT: setne %al39; X86-NEXT: retl40;41; X64-LABEL: ne_pow_and:42; X64: # %bb.0:43; X64-NEXT: addb $16, %dil44; X64-NEXT: testb $-33, %dil45; X64-NEXT: setne %al46; X64-NEXT: retq47 %2 = icmp ne i8 %0, 1648 %3 = icmp ne i8 %0, -1649 %4 = and i1 %2, %350 ret i1 %451}52 53define i1 @eq_pow_mismatch_or(i32 %0) nounwind {54; X86-LABEL: eq_pow_mismatch_or:55; X86: # %bb.0:56; X86-NEXT: movl {{[0-9]+}}(%esp), %eax57; X86-NEXT: cmpl $16, %eax58; X86-NEXT: sete %cl59; X86-NEXT: cmpl $-32, %eax60; X86-NEXT: sete %al61; X86-NEXT: orb %cl, %al62; X86-NEXT: retl63;64; X64-LABEL: eq_pow_mismatch_or:65; X64: # %bb.0:66; X64-NEXT: cmpl $16, %edi67; X64-NEXT: sete %cl68; X64-NEXT: cmpl $-32, %edi69; X64-NEXT: sete %al70; X64-NEXT: orb %cl, %al71; X64-NEXT: retq72 %2 = icmp eq i32 %0, 1673 %3 = icmp eq i32 %0, -3274 %4 = or i1 %2, %375 ret i1 %476}77 78define i1 @ne_non_pow_and(i8 %0) nounwind {79; X86-LABEL: ne_non_pow_and:80; X86: # %bb.0:81; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax82; X86-NEXT: cmpb $17, %al83; X86-NEXT: setne %cl84; X86-NEXT: cmpb $-17, %al85; X86-NEXT: setne %al86; X86-NEXT: andb %cl, %al87; X86-NEXT: retl88;89; X64-LABEL: ne_non_pow_and:90; X64: # %bb.0:91; X64-NEXT: cmpb $17, %dil92; X64-NEXT: setne %cl93; X64-NEXT: cmpb $-17, %dil94; X64-NEXT: setne %al95; X64-NEXT: andb %cl, %al96; X64-NEXT: retq97 %2 = icmp ne i8 %0, 1798 %3 = icmp ne i8 %0, -1799 %4 = and i1 %2, %3100 ret i1 %4101}102 103define i1 @ne_pow_or(i32 %0) nounwind {104; X86-LABEL: ne_pow_or:105; X86: # %bb.0:106; X86-NEXT: movl {{[0-9]+}}(%esp), %eax107; X86-NEXT: movl %eax, %ecx108; X86-NEXT: xorl $32, %ecx109; X86-NEXT: xorl $-32, %eax110; X86-NEXT: orl %ecx, %eax111; X86-NEXT: setne %al112; X86-NEXT: retl113;114; X64-LABEL: ne_pow_or:115; X64: # %bb.0:116; X64-NEXT: movl %edi, %eax117; X64-NEXT: xorl $32, %eax118; X64-NEXT: xorl $-32, %edi119; X64-NEXT: orl %eax, %edi120; X64-NEXT: setne %al121; X64-NEXT: retq122 %2 = icmp ne i32 %0, 32123 %3 = icmp ne i32 %0, -32124 %4 = or i1 %2, %3125 ret i1 %4126}127 128define i1 @eq_pow_and(i8 %0) nounwind {129; X86-LABEL: eq_pow_and:130; X86: # %bb.0:131; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax132; X86-NEXT: movl %eax, %ecx133; X86-NEXT: xorb $16, %cl134; X86-NEXT: xorb $-16, %al135; X86-NEXT: orb %cl, %al136; X86-NEXT: sete %al137; X86-NEXT: retl138;139; X64-LABEL: eq_pow_and:140; X64: # %bb.0:141; X64-NEXT: movl %edi, %eax142; X64-NEXT: xorb $16, %al143; X64-NEXT: xorb $-16, %dil144; X64-NEXT: orb %al, %dil145; X64-NEXT: sete %al146; X64-NEXT: retq147 %2 = icmp eq i8 %0, 16148 %3 = icmp eq i8 %0, -16149 %4 = and i1 %2, %3150 ret i1 %4151}152 153define i1 @abs_eq_pow2(i32 %0) nounwind {154; X86-LABEL: abs_eq_pow2:155; X86: # %bb.0:156; X86-NEXT: movl {{[0-9]+}}(%esp), %eax157; X86-NEXT: addl $4, %eax158; X86-NEXT: testl $-9, %eax159; X86-NEXT: sete %al160; X86-NEXT: retl161;162; X64-LABEL: abs_eq_pow2:163; X64: # %bb.0:164; X64-NEXT: addl $4, %edi165; X64-NEXT: testl $-9, %edi166; X64-NEXT: sete %al167; X64-NEXT: retq168 %2 = tail call i32 @llvm.abs.i32(i32 %0, i1 true)169 %3 = icmp eq i32 %2, 4170 ret i1 %3171}172 173define i1 @abs_ne_pow2(i64 %0) nounwind {174; X86-LABEL: abs_ne_pow2:175; X86: # %bb.0:176; X86-NEXT: movl {{[0-9]+}}(%esp), %eax177; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx178; X86-NEXT: addl $2, %eax179; X86-NEXT: adcl $0, %ecx180; X86-NEXT: andl $-5, %eax181; X86-NEXT: orl %ecx, %eax182; X86-NEXT: setne %al183; X86-NEXT: retl184;185; X64-LABEL: abs_ne_pow2:186; X64: # %bb.0:187; X64-NEXT: addq $2, %rdi188; X64-NEXT: testq $-5, %rdi189; X64-NEXT: setne %al190; X64-NEXT: retq191 %2 = tail call i64 @llvm.abs.i64(i64 %0, i1 true)192 %3 = icmp ne i64 %2, 2193 ret i1 %3194}195 196define i1 @abs_ne_nonpow2(i16 %0) nounwind {197; X86-LABEL: abs_ne_nonpow2:198; X86: # %bb.0:199; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax200; X86-NEXT: movswl %ax, %ecx201; X86-NEXT: sarl $15, %ecx202; X86-NEXT: xorl %ecx, %eax203; X86-NEXT: subl %ecx, %eax204; X86-NEXT: movzwl %ax, %eax205; X86-NEXT: cmpl $57344, %eax # imm = 0xE000206; X86-NEXT: setne %al207; X86-NEXT: retl208;209; X64-LABEL: abs_ne_nonpow2:210; X64: # %bb.0:211; X64-NEXT: movl %edi, %eax212; X64-NEXT: negw %ax213; X64-NEXT: cmovsw %di, %ax214; X64-NEXT: movzwl %ax, %eax215; X64-NEXT: cmpl $57344, %eax # imm = 0xE000216; X64-NEXT: setne %al217; X64-NEXT: retq218 %2 = tail call i16 @llvm.abs.i16(i16 %0, i1 true)219 %3 = icmp ne i16 %2, -8192220 ret i1 %3221}222 223define <2 x i1> @abs_ne_vec(<2 x i64> %0) nounwind {224; X86-LABEL: abs_ne_vec:225; X86: # %bb.0:226; X86-NEXT: pushl %edi227; X86-NEXT: pushl %esi228; X86-NEXT: movl {{[0-9]+}}(%esp), %eax229; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx230; X86-NEXT: movl %ecx, %esi231; X86-NEXT: sarl $31, %esi232; X86-NEXT: xorl %esi, %ecx233; X86-NEXT: movl {{[0-9]+}}(%esp), %edx234; X86-NEXT: xorl %esi, %edx235; X86-NEXT: subl %esi, %edx236; X86-NEXT: sbbl %esi, %ecx237; X86-NEXT: movl %eax, %esi238; X86-NEXT: sarl $31, %esi239; X86-NEXT: xorl %esi, %eax240; X86-NEXT: movl {{[0-9]+}}(%esp), %edi241; X86-NEXT: xorl %esi, %edi242; X86-NEXT: subl %esi, %edi243; X86-NEXT: sbbl %esi, %eax244; X86-NEXT: xorl $8, %edi245; X86-NEXT: orl %eax, %edi246; X86-NEXT: setne %al247; X86-NEXT: xorl $8, %edx248; X86-NEXT: orl %ecx, %edx249; X86-NEXT: setne %dl250; X86-NEXT: popl %esi251; X86-NEXT: popl %edi252; X86-NEXT: retl253;254; X64-LABEL: abs_ne_vec:255; X64: # %bb.0:256; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,1,3,3]257; X64-NEXT: psrad $31, %xmm1258; X64-NEXT: pxor %xmm1, %xmm0259; X64-NEXT: psubq %xmm1, %xmm0260; X64-NEXT: pcmpeqd {{\.?LCPI[0-9]+_[0-9]+}}(%rip), %xmm0261; X64-NEXT: pshufd {{.*#+}} xmm1 = xmm0[1,0,3,2]262; X64-NEXT: pand %xmm1, %xmm0263; X64-NEXT: pcmpeqd %xmm1, %xmm1264; X64-NEXT: pxor %xmm1, %xmm0265; X64-NEXT: retq266 %2 = tail call <2 x i64> @llvm.abs.2xi64(<2 x i64> %0, i1 true)267 %3 = icmp ne <2 x i64> %2, <i64 8, i64 8>268 ret <2 x i1> %3269}270