230 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-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown-unknown -mattr=+cmov | FileCheck %s --check-prefix=X644 5;6; PR48768 - 'xor' clears the overflow flag, so we don't need a separate 'test'.7;8 9define i8 @xor_i8_ri(i8 zeroext %0, i8 zeroext %1) {10; X86-LABEL: xor_i8_ri:11; X86: # %bb.0:12; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax13; X86-NEXT: movl %eax, %ecx14; X86-NEXT: xorb $-17, %cl15; X86-NEXT: je .LBB0_216; X86-NEXT: # %bb.1:17; X86-NEXT: movl %ecx, %eax18; X86-NEXT: .LBB0_2:19; X86-NEXT: retl20;21; X64-LABEL: xor_i8_ri:22; X64: # %bb.0:23; X64-NEXT: movl %edi, %eax24; X64-NEXT: xorb $-17, %al25; X64-NEXT: movzbl %al, %eax26; X64-NEXT: cmovel %edi, %eax27; X64-NEXT: # kill: def $al killed $al killed $eax28; X64-NEXT: retq29 %3 = xor i8 %0, -1730 %4 = icmp eq i8 %3, 031 %5 = select i1 %4, i8 %0, i8 %332 ret i8 %533}34 35define i8 @xor_i8_rr(i8 zeroext %0, i8 zeroext %1) {36; X86-LABEL: xor_i8_rr:37; X86: # %bb.0:38; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax39; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx40; X86-NEXT: xorb %al, %cl41; X86-NEXT: je .LBB1_242; X86-NEXT: # %bb.1:43; X86-NEXT: movl %ecx, %eax44; X86-NEXT: .LBB1_2:45; X86-NEXT: retl46;47; X64-LABEL: xor_i8_rr:48; X64: # %bb.0:49; X64-NEXT: movl %esi, %eax50; X64-NEXT: xorl %edi, %eax51; X64-NEXT: cmovel %edi, %eax52; X64-NEXT: # kill: def $al killed $al killed $eax53; X64-NEXT: retq54 %3 = xor i8 %1, %055 %4 = icmp eq i8 %3, 056 %5 = select i1 %4, i8 %0, i8 %357 ret i8 %558}59 60define i16 @xor_i16_ri(i16 zeroext %0, i16 zeroext %1) {61; X86-LABEL: xor_i16_ri:62; X86: # %bb.0:63; X86-NEXT: movl {{[0-9]+}}(%esp), %eax64; X86-NEXT: movl %eax, %ecx65; X86-NEXT: xorl $65519, %ecx # imm = 0xFFEF66; X86-NEXT: testw %cx, %cx67; X86-NEXT: je .LBB2_268; X86-NEXT: # %bb.1:69; X86-NEXT: movl %ecx, %eax70; X86-NEXT: .LBB2_2:71; X86-NEXT: # kill: def $ax killed $ax killed $eax72; X86-NEXT: retl73;74; X64-LABEL: xor_i16_ri:75; X64: # %bb.0:76; X64-NEXT: movl %edi, %eax77; X64-NEXT: xorl $65519, %eax # imm = 0xFFEF78; X64-NEXT: cmovel %edi, %eax79; X64-NEXT: # kill: def $ax killed $ax killed $eax80; X64-NEXT: retq81 %3 = xor i16 %0, -1782 %4 = icmp eq i16 %3, 083 %5 = select i1 %4, i16 %0, i16 %384 ret i16 %585}86 87define i16 @xor_i16_rr(i16 zeroext %0, i16 zeroext %1) {88; X86-LABEL: xor_i16_rr:89; X86: # %bb.0:90; X86-NEXT: movl {{[0-9]+}}(%esp), %eax91; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx92; X86-NEXT: xorw %ax, %cx93; X86-NEXT: je .LBB3_294; X86-NEXT: # %bb.1:95; X86-NEXT: movl %ecx, %eax96; X86-NEXT: .LBB3_2:97; X86-NEXT: # kill: def $ax killed $ax killed $eax98; X86-NEXT: retl99;100; X64-LABEL: xor_i16_rr:101; X64: # %bb.0:102; X64-NEXT: movl %esi, %eax103; X64-NEXT: xorl %edi, %eax104; X64-NEXT: cmovel %edi, %eax105; X64-NEXT: # kill: def $ax killed $ax killed $eax106; X64-NEXT: retq107 %3 = xor i16 %1, %0108 %4 = icmp eq i16 %3, 0109 %5 = select i1 %4, i16 %0, i16 %3110 ret i16 %5111}112 113define i32 @xor_i32_ri(i32 %0, i32 %1) {114; X86-LABEL: xor_i32_ri:115; X86: # %bb.0:116; X86-NEXT: movl {{[0-9]+}}(%esp), %eax117; X86-NEXT: movl %eax, %ecx118; X86-NEXT: xorl $-17, %ecx119; X86-NEXT: jle .LBB4_2120; X86-NEXT: # %bb.1:121; X86-NEXT: movl %ecx, %eax122; X86-NEXT: .LBB4_2:123; X86-NEXT: retl124;125; X64-LABEL: xor_i32_ri:126; X64: # %bb.0:127; X64-NEXT: movl %edi, %eax128; X64-NEXT: xorl $-17, %eax129; X64-NEXT: cmovlel %edi, %eax130; X64-NEXT: retq131 %3 = xor i32 %0, -17132 %4 = icmp slt i32 %3, 1133 %5 = select i1 %4, i32 %0, i32 %3134 ret i32 %5135}136 137define i32 @xor_i32_rr(i32 %0, i32 %1) {138; X86-LABEL: xor_i32_rr:139; X86: # %bb.0:140; X86-NEXT: movl {{[0-9]+}}(%esp), %eax141; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx142; X86-NEXT: xorl %eax, %ecx143; X86-NEXT: jle .LBB5_2144; X86-NEXT: # %bb.1:145; X86-NEXT: movl %ecx, %eax146; X86-NEXT: .LBB5_2:147; X86-NEXT: retl148;149; X64-LABEL: xor_i32_rr:150; X64: # %bb.0:151; X64-NEXT: movl %esi, %eax152; X64-NEXT: xorl %edi, %eax153; X64-NEXT: cmovlel %edi, %eax154; X64-NEXT: retq155 %3 = xor i32 %1, %0156 %4 = icmp slt i32 %3, 1157 %5 = select i1 %4, i32 %0, i32 %3158 ret i32 %5159}160 161define i64 @xor_i64_ri(i64 %0, i64 %1) nounwind {162; X86-LABEL: xor_i64_ri:163; X86: # %bb.0:164; X86-NEXT: pushl %edi165; X86-NEXT: pushl %esi166; X86-NEXT: movl {{[0-9]+}}(%esp), %eax167; X86-NEXT: movl {{[0-9]+}}(%esp), %edx168; X86-NEXT: movl %edx, %ecx169; X86-NEXT: notl %ecx170; X86-NEXT: movl %eax, %esi171; X86-NEXT: xorl $-17, %esi172; X86-NEXT: cmpl $1, %esi173; X86-NEXT: movl %ecx, %edi174; X86-NEXT: sbbl $0, %edi175; X86-NEXT: jl .LBB6_2176; X86-NEXT: # %bb.1:177; X86-NEXT: movl %esi, %eax178; X86-NEXT: movl %ecx, %edx179; X86-NEXT: .LBB6_2:180; X86-NEXT: popl %esi181; X86-NEXT: popl %edi182; X86-NEXT: retl183;184; X64-LABEL: xor_i64_ri:185; X64: # %bb.0:186; X64-NEXT: movq %rdi, %rax187; X64-NEXT: xorq $-17, %rax188; X64-NEXT: cmovleq %rdi, %rax189; X64-NEXT: retq190 %3 = xor i64 %0, -17191 %4 = icmp slt i64 %3, 1192 %5 = select i1 %4, i64 %0, i64 %3193 ret i64 %5194}195 196define i64 @xor_i64_rr(i64 %0, i64 %1) nounwind {197; X86-LABEL: xor_i64_rr:198; X86: # %bb.0:199; X86-NEXT: pushl %edi200; X86-NEXT: pushl %esi201; X86-NEXT: movl {{[0-9]+}}(%esp), %eax202; X86-NEXT: movl {{[0-9]+}}(%esp), %edx203; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx204; X86-NEXT: xorl %edx, %ecx205; X86-NEXT: movl {{[0-9]+}}(%esp), %esi206; X86-NEXT: xorl %eax, %esi207; X86-NEXT: cmpl $1, %esi208; X86-NEXT: movl %ecx, %edi209; X86-NEXT: sbbl $0, %edi210; X86-NEXT: jl .LBB7_2211; X86-NEXT: # %bb.1:212; X86-NEXT: movl %esi, %eax213; X86-NEXT: movl %ecx, %edx214; X86-NEXT: .LBB7_2:215; X86-NEXT: popl %esi216; X86-NEXT: popl %edi217; X86-NEXT: retl218;219; X64-LABEL: xor_i64_rr:220; X64: # %bb.0:221; X64-NEXT: movq %rsi, %rax222; X64-NEXT: xorq %rdi, %rax223; X64-NEXT: cmovleq %rdi, %rax224; X64-NEXT: retq225 %3 = xor i64 %1, %0226 %4 = icmp slt i64 %3, 1227 %5 = select i1 %4, i64 %0, i64 %3228 ret i64 %5229}230