260 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-unknown-unknown | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=-slow-incdec | FileCheck %s --check-prefixes=X64,X64-FASTINC4; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+slow-incdec | FileCheck %s --check-prefixes=X64,X64-SLOWINC5 6define i32 @xori64i32(i64 %a) {7; X86-LABEL: xori64i32:8; X86: # %bb.0:9; X86-NEXT: movl {{[0-9]+}}(%esp), %eax10; X86-NEXT: sarl $31, %eax11; X86-NEXT: xorl $2147483647, %eax # imm = 0x7FFFFFFF12; X86-NEXT: retl13;14; X64-LABEL: xori64i32:15; X64: # %bb.0:16; X64-NEXT: movq %rdi, %rax17; X64-NEXT: sarq $63, %rax18; X64-NEXT: xorl $2147483647, %eax # imm = 0x7FFFFFFF19; X64-NEXT: # kill: def $eax killed $eax killed $rax20; X64-NEXT: retq21 %shr4 = ashr i64 %a, 6322 %conv5 = trunc i64 %shr4 to i3223 %xor = xor i32 %conv5, 214748364724 ret i32 %xor25}26 27define i64 @selecti64i64(i64 %a) {28; X86-LABEL: selecti64i64:29; X86: # %bb.0:30; X86-NEXT: movl {{[0-9]+}}(%esp), %edx31; X86-NEXT: sarl $31, %edx32; X86-NEXT: movl %edx, %eax33; X86-NEXT: xorl $2147483647, %eax # imm = 0x7FFFFFFF34; X86-NEXT: retl35;36; X64-LABEL: selecti64i64:37; X64: # %bb.0:38; X64-NEXT: movq %rdi, %rax39; X64-NEXT: sarq $63, %rax40; X64-NEXT: xorq $2147483647, %rax # imm = 0x7FFFFFFF41; X64-NEXT: retq42 %c = icmp sgt i64 %a, -143 %s = select i1 %c, i64 2147483647, i64 -214748364844 ret i64 %s45}46 47define i32 @selecti64i32(i64 %a) {48; X86-LABEL: selecti64i32:49; X86: # %bb.0:50; X86-NEXT: xorl %eax, %eax51; X86-NEXT: cmpl $0, {{[0-9]+}}(%esp)52; X86-NEXT: sets %al53; X86-NEXT: addl $2147483647, %eax # imm = 0x7FFFFFFF54; X86-NEXT: retl55;56; X64-LABEL: selecti64i32:57; X64: # %bb.0:58; X64-NEXT: xorl %eax, %eax59; X64-NEXT: testq %rdi, %rdi60; X64-NEXT: sets %al61; X64-NEXT: addl $2147483647, %eax # imm = 0x7FFFFFFF62; X64-NEXT: retq63 %c = icmp sgt i64 %a, -164 %s = select i1 %c, i32 2147483647, i32 -214748364865 ret i32 %s66}67 68define i64 @selecti32i64(i32 %a) {69; X86-LABEL: selecti32i64:70; X86: # %bb.0:71; X86-NEXT: movl {{[0-9]+}}(%esp), %edx72; X86-NEXT: sarl $31, %edx73; X86-NEXT: movl %edx, %eax74; X86-NEXT: xorl $2147483647, %eax # imm = 0x7FFFFFFF75; X86-NEXT: retl76;77; X64-LABEL: selecti32i64:78; X64: # %bb.0:79; X64-NEXT: sarl $31, %edi80; X64-NEXT: movslq %edi, %rax81; X64-NEXT: xorq $2147483647, %rax # imm = 0x7FFFFFFF82; X64-NEXT: retq83 %c = icmp sgt i32 %a, -184 %s = select i1 %c, i64 2147483647, i64 -214748364885 ret i64 %s86}87 88 89 90define i8 @xori32i8(i32 %a) {91; X86-LABEL: xori32i8:92; X86: # %bb.0:93; X86-NEXT: movl {{[0-9]+}}(%esp), %eax94; X86-NEXT: sarl $31, %eax95; X86-NEXT: xorb $84, %al96; X86-NEXT: # kill: def $al killed $al killed $eax97; X86-NEXT: retl98;99; X64-LABEL: xori32i8:100; X64: # %bb.0:101; X64-NEXT: movl %edi, %eax102; X64-NEXT: sarl $31, %eax103; X64-NEXT: xorb $84, %al104; X64-NEXT: # kill: def $al killed $al killed $eax105; X64-NEXT: retq106 %shr4 = ashr i32 %a, 31107 %conv5 = trunc i32 %shr4 to i8108 %xor = xor i8 %conv5, 84109 ret i8 %xor110}111 112define i32 @selecti32i32(i32 %a) {113; X86-LABEL: selecti32i32:114; X86: # %bb.0:115; X86-NEXT: movl {{[0-9]+}}(%esp), %eax116; X86-NEXT: sarl $31, %eax117; X86-NEXT: xorl $84, %eax118; X86-NEXT: retl119;120; X64-LABEL: selecti32i32:121; X64: # %bb.0:122; X64-NEXT: movl %edi, %eax123; X64-NEXT: sarl $31, %eax124; X64-NEXT: xorl $84, %eax125; X64-NEXT: retq126 %c = icmp sgt i32 %a, -1127 %s = select i1 %c, i32 84, i32 -85128 ret i32 %s129}130 131define i8 @selecti32i8(i32 %a) {132; X86-LABEL: selecti32i8:133; X86: # %bb.0:134; X86-NEXT: movl {{[0-9]+}}(%esp), %eax135; X86-NEXT: sarl $31, %eax136; X86-NEXT: xorb $84, %al137; X86-NEXT: # kill: def $al killed $al killed $eax138; X86-NEXT: retl139;140; X64-LABEL: selecti32i8:141; X64: # %bb.0:142; X64-NEXT: movl %edi, %eax143; X64-NEXT: sarl $31, %eax144; X64-NEXT: xorb $84, %al145; X64-NEXT: # kill: def $al killed $al killed $eax146; X64-NEXT: retq147 %c = icmp sgt i32 %a, -1148 %s = select i1 %c, i8 84, i8 -85149 ret i8 %s150}151 152define i32 @selecti8i32(i8 %a) {153; X86-LABEL: selecti8i32:154; X86: # %bb.0:155; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax156; X86-NEXT: sarb $7, %al157; X86-NEXT: movsbl %al, %eax158; X86-NEXT: xorl $84, %eax159; X86-NEXT: retl160;161; X64-LABEL: selecti8i32:162; X64: # %bb.0:163; X64-NEXT: sarb $7, %dil164; X64-NEXT: movsbl %dil, %eax165; X64-NEXT: xorl $84, %eax166; X64-NEXT: retq167 %c = icmp sgt i8 %a, -1168 %s = select i1 %c, i32 84, i32 -85169 ret i32 %s170}171 172define i32 @icmpasreq(i32 %input, i32 %a, i32 %b) {173; X86-LABEL: icmpasreq:174; X86: # %bb.0:175; X86-NEXT: cmpl $0, {{[0-9]+}}(%esp)176; X86-NEXT: js .LBB8_1177; X86-NEXT: # %bb.2:178; X86-NEXT: leal {{[0-9]+}}(%esp), %eax179; X86-NEXT: movl (%eax), %eax180; X86-NEXT: retl181; X86-NEXT: .LBB8_1:182; X86-NEXT: leal {{[0-9]+}}(%esp), %eax183; X86-NEXT: movl (%eax), %eax184; X86-NEXT: retl185;186; X64-LABEL: icmpasreq:187; X64: # %bb.0:188; X64-NEXT: movl %esi, %eax189; X64-NEXT: testl %edi, %edi190; X64-NEXT: cmovnsl %edx, %eax191; X64-NEXT: retq192 %sh = ashr i32 %input, 31193 %c = icmp eq i32 %sh, -1194 %s = select i1 %c, i32 %a, i32 %b195 ret i32 %s196}197 198define i32 @icmpasrne(i32 %input, i32 %a, i32 %b) {199; X86-LABEL: icmpasrne:200; X86: # %bb.0:201; X86-NEXT: cmpl $0, {{[0-9]+}}(%esp)202; X86-NEXT: jns .LBB9_1203; X86-NEXT: # %bb.2:204; X86-NEXT: leal {{[0-9]+}}(%esp), %eax205; X86-NEXT: movl (%eax), %eax206; X86-NEXT: retl207; X86-NEXT: .LBB9_1:208; X86-NEXT: leal {{[0-9]+}}(%esp), %eax209; X86-NEXT: movl (%eax), %eax210; X86-NEXT: retl211;212; X64-LABEL: icmpasrne:213; X64: # %bb.0:214; X64-NEXT: movl %esi, %eax215; X64-NEXT: testl %edi, %edi216; X64-NEXT: cmovsl %edx, %eax217; X64-NEXT: retq218 %sh = ashr i32 %input, 31219 %c = icmp ne i32 %sh, -1220 %s = select i1 %c, i32 %a, i32 %b221 ret i32 %s222}223 224define i32 @oneusecmp(i32 %a, i32 %b, i32 %d) {225; X86-LABEL: oneusecmp:226; X86: # %bb.0:227; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx228; X86-NEXT: movl %ecx, %eax229; X86-NEXT: sarl $31, %eax230; X86-NEXT: xorl $127, %eax231; X86-NEXT: testl %ecx, %ecx232; X86-NEXT: js .LBB10_1233; X86-NEXT: # %bb.2:234; X86-NEXT: leal {{[0-9]+}}(%esp), %ecx235; X86-NEXT: addl (%ecx), %eax236; X86-NEXT: retl237; X86-NEXT: .LBB10_1:238; X86-NEXT: leal {{[0-9]+}}(%esp), %ecx239; X86-NEXT: addl (%ecx), %eax240; X86-NEXT: retl241;242; X64-LABEL: oneusecmp:243; X64: # %bb.0:244; X64-NEXT: movl %edi, %eax245; X64-NEXT: sarl $31, %eax246; X64-NEXT: xorl $127, %eax247; X64-NEXT: testl %edi, %edi248; X64-NEXT: cmovsl %edx, %esi249; X64-NEXT: addl %esi, %eax250; X64-NEXT: retq251 %c = icmp sle i32 %a, -1252 %s = select i1 %c, i32 -128, i32 127253 %s2 = select i1 %c, i32 %d, i32 %b254 %x = add i32 %s, %s2255 ret i32 %x256}257;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:258; X64-FASTINC: {{.*}}259; X64-SLOWINC: {{.*}}260