375 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i686-- | FileCheck %s --check-prefixes=X863; RUN: llc < %s -mtriple=x86_64-- | FileCheck %s --check-prefixes=X644 5;6; fixed avg(x,y) = add(and(x,y),lshr(xor(x,y),1))7;8; lsb avg(x,y) = add(lshr(x,1),lshr(y,1),and(x,y,1))9;10; ext avg(x,y) = trunc(lshr(add(zext(x),zext(y)),1))11;12 13define i8 @test_fixed_i8(i8 %a0, i8 %a1) nounwind {14; X86-LABEL: test_fixed_i8:15; X86: # %bb.0:16; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx17; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax18; X86-NEXT: addl %ecx, %eax19; X86-NEXT: shrl %eax20; X86-NEXT: # kill: def $al killed $al killed $eax21; X86-NEXT: retl22;23; X64-LABEL: test_fixed_i8:24; X64: # %bb.0:25; X64-NEXT: movzbl %sil, %ecx26; X64-NEXT: movzbl %dil, %eax27; X64-NEXT: addl %ecx, %eax28; X64-NEXT: shrl %eax29; X64-NEXT: # kill: def $al killed $al killed $eax30; X64-NEXT: retq31 %and = and i8 %a0, %a132 %xor = xor i8 %a0, %a133 %shift = lshr i8 %xor, 134 %res = add i8 %and, %shift35 ret i8 %res36}37 38define i8 @test_lsb_i8(i8 %a0, i8 %a1) nounwind {39; X86-LABEL: test_lsb_i8:40; X86: # %bb.0:41; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx42; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax43; X86-NEXT: movl %eax, %edx44; X86-NEXT: shrb %dl45; X86-NEXT: andb %cl, %al46; X86-NEXT: shrb %cl47; X86-NEXT: addb %dl, %cl48; X86-NEXT: andb $1, %al49; X86-NEXT: addb %cl, %al50; X86-NEXT: retl51;52; X64-LABEL: test_lsb_i8:53; X64: # %bb.0:54; X64-NEXT: movl %edi, %eax55; X64-NEXT: shrb %al56; X64-NEXT: andb %sil, %dil57; X64-NEXT: shrb %sil58; X64-NEXT: addb %sil, %al59; X64-NEXT: andb $1, %dil60; X64-NEXT: addb %dil, %al61; X64-NEXT: retq62 %s0 = lshr i8 %a0, 163 %s1 = lshr i8 %a1, 164 %m0 = and i8 %a0, 165 %m1 = and i8 %m0, %a166 %r0 = add i8 %s0, %s167 %r1 = add i8 %r0, %m168 ret i8 %r169}70 71define i8 @test_ext_i8(i8 %a0, i8 %a1) nounwind {72; X86-LABEL: test_ext_i8:73; X86: # %bb.0:74; X86-NEXT: movzbl {{[0-9]+}}(%esp), %ecx75; X86-NEXT: movzbl {{[0-9]+}}(%esp), %eax76; X86-NEXT: addl %ecx, %eax77; X86-NEXT: shrl %eax78; X86-NEXT: # kill: def $al killed $al killed $eax79; X86-NEXT: retl80;81; X64-LABEL: test_ext_i8:82; X64: # %bb.0:83; X64-NEXT: movzbl %sil, %ecx84; X64-NEXT: movzbl %dil, %eax85; X64-NEXT: addl %ecx, %eax86; X64-NEXT: shrl %eax87; X64-NEXT: # kill: def $al killed $al killed $eax88; X64-NEXT: retq89 %x0 = zext i8 %a0 to i1690 %x1 = zext i8 %a1 to i1691 %sum = add i16 %x0, %x192 %shift = lshr i16 %sum, 193 %res = trunc i16 %shift to i894 ret i8 %res95}96 97define i16 @test_fixed_i16(i16 %a0, i16 %a1) nounwind {98; X86-LABEL: test_fixed_i16:99; X86: # %bb.0:100; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx101; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax102; X86-NEXT: addl %ecx, %eax103; X86-NEXT: shrl %eax104; X86-NEXT: # kill: def $ax killed $ax killed $eax105; X86-NEXT: retl106;107; X64-LABEL: test_fixed_i16:108; X64: # %bb.0:109; X64-NEXT: movzwl %si, %ecx110; X64-NEXT: movzwl %di, %eax111; X64-NEXT: addl %ecx, %eax112; X64-NEXT: shrl %eax113; X64-NEXT: # kill: def $ax killed $ax killed $eax114; X64-NEXT: retq115 %and = and i16 %a0, %a1116 %xor = xor i16 %a0, %a1117 %shift = lshr i16 %xor, 1118 %res = add i16 %and, %shift119 ret i16 %res120}121 122define i16 @test_lsb_i16(i16 %a0, i16 %a1) nounwind {123; X86-LABEL: test_lsb_i16:124; X86: # %bb.0:125; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx126; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax127; X86-NEXT: movl %eax, %edx128; X86-NEXT: shrl %edx129; X86-NEXT: andl %ecx, %eax130; X86-NEXT: shrl %ecx131; X86-NEXT: addl %edx, %ecx132; X86-NEXT: andl $1, %eax133; X86-NEXT: addl %ecx, %eax134; X86-NEXT: # kill: def $ax killed $ax killed $eax135; X86-NEXT: retl136;137; X64-LABEL: test_lsb_i16:138; X64: # %bb.0:139; X64-NEXT: movzwl %si, %eax140; X64-NEXT: movzwl %di, %ecx141; X64-NEXT: shrl %ecx142; X64-NEXT: shrl %eax143; X64-NEXT: addl %ecx, %eax144; X64-NEXT: andl %esi, %edi145; X64-NEXT: andl $1, %edi146; X64-NEXT: addl %edi, %eax147; X64-NEXT: # kill: def $ax killed $ax killed $eax148; X64-NEXT: retq149 %s0 = lshr i16 %a0, 1150 %s1 = lshr i16 %a1, 1151 %m0 = and i16 %a0, %a1152 %m1 = and i16 %m0, 1153 %r0 = add i16 %s0, %s1154 %r1 = add i16 %r0, %m1155 ret i16 %r1156}157 158define i16 @test_ext_i16(i16 %a0, i16 %a1) nounwind {159; X86-LABEL: test_ext_i16:160; X86: # %bb.0:161; X86-NEXT: movzwl {{[0-9]+}}(%esp), %ecx162; X86-NEXT: movzwl {{[0-9]+}}(%esp), %eax163; X86-NEXT: addl %ecx, %eax164; X86-NEXT: shrl %eax165; X86-NEXT: # kill: def $ax killed $ax killed $eax166; X86-NEXT: retl167;168; X64-LABEL: test_ext_i16:169; X64: # %bb.0:170; X64-NEXT: movzwl %si, %ecx171; X64-NEXT: movzwl %di, %eax172; X64-NEXT: addl %ecx, %eax173; X64-NEXT: shrl %eax174; X64-NEXT: # kill: def $ax killed $ax killed $eax175; X64-NEXT: retq176 %x0 = zext i16 %a0 to i32177 %x1 = zext i16 %a1 to i32178 %sum = add i32 %x0, %x1179 %shift = lshr i32 %sum, 1180 %res = trunc i32 %shift to i16181 ret i16 %res182}183 184define i32 @test_fixed_i32(i32 %a0, i32 %a1) nounwind {185; X86-LABEL: test_fixed_i32:186; X86: # %bb.0:187; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx188; X86-NEXT: movl {{[0-9]+}}(%esp), %eax189; X86-NEXT: movl %eax, %edx190; X86-NEXT: andl %ecx, %edx191; X86-NEXT: xorl %ecx, %eax192; X86-NEXT: shrl %eax193; X86-NEXT: addl %edx, %eax194; X86-NEXT: retl195;196; X64-LABEL: test_fixed_i32:197; X64: # %bb.0:198; X64-NEXT: movl %esi, %ecx199; X64-NEXT: movl %edi, %eax200; X64-NEXT: addq %rcx, %rax201; X64-NEXT: shrq %rax202; X64-NEXT: # kill: def $eax killed $eax killed $rax203; X64-NEXT: retq204 %and = and i32 %a0, %a1205 %xor = xor i32 %a1, %a0206 %shift = lshr i32 %xor, 1207 %res = add i32 %and, %shift208 ret i32 %res209}210 211define i32 @test_lsb_i32(i32 %a0, i32 %a1) nounwind {212; X86-LABEL: test_lsb_i32:213; X86: # %bb.0:214; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx215; X86-NEXT: movl {{[0-9]+}}(%esp), %eax216; X86-NEXT: movl %eax, %edx217; X86-NEXT: shrl %edx218; X86-NEXT: andl %ecx, %eax219; X86-NEXT: shrl %ecx220; X86-NEXT: addl %edx, %ecx221; X86-NEXT: andl $1, %eax222; X86-NEXT: addl %ecx, %eax223; X86-NEXT: retl224;225; X64-LABEL: test_lsb_i32:226; X64: # %bb.0:227; X64-NEXT: movl %edi, %eax228; X64-NEXT: shrl %eax229; X64-NEXT: andl %esi, %edi230; X64-NEXT: shrl %esi231; X64-NEXT: addl %esi, %eax232; X64-NEXT: andl $1, %edi233; X64-NEXT: addl %edi, %eax234; X64-NEXT: retq235 %s0 = lshr i32 %a0, 1236 %s1 = lshr i32 %a1, 1237 %m0 = and i32 %a0, %a1238 %m1 = and i32 %m0, 1239 %r0 = add i32 %s0, %m1240 %r1 = add i32 %r0, %s1241 ret i32 %r1242}243 244define i32 @test_ext_i32(i32 %a0, i32 %a1) nounwind {245; X86-LABEL: test_ext_i32:246; X86: # %bb.0:247; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx248; X86-NEXT: movl {{[0-9]+}}(%esp), %eax249; X86-NEXT: movl %eax, %edx250; X86-NEXT: andl %ecx, %edx251; X86-NEXT: xorl %ecx, %eax252; X86-NEXT: shrl %eax253; X86-NEXT: addl %edx, %eax254; X86-NEXT: retl255;256; X64-LABEL: test_ext_i32:257; X64: # %bb.0:258; X64-NEXT: movl %esi, %ecx259; X64-NEXT: movl %edi, %eax260; X64-NEXT: addq %rcx, %rax261; X64-NEXT: shrq %rax262; X64-NEXT: # kill: def $eax killed $eax killed $rax263; X64-NEXT: retq264 %x0 = zext i32 %a0 to i64265 %x1 = zext i32 %a1 to i64266 %sum = add i64 %x0, %x1267 %shift = lshr i64 %sum, 1268 %res = trunc i64 %shift to i32269 ret i32 %res270}271 272define i64 @test_fixed_i64(i64 %a0, i64 %a1) nounwind {273; X86-LABEL: test_fixed_i64:274; X86: # %bb.0:275; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx276; X86-NEXT: movl {{[0-9]+}}(%esp), %eax277; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx278; X86-NEXT: adcl {{[0-9]+}}(%esp), %eax279; X86-NEXT: setb %dl280; X86-NEXT: movzbl %dl, %edx281; X86-NEXT: shldl $31, %eax, %edx282; X86-NEXT: shldl $31, %ecx, %eax283; X86-NEXT: retl284;285; X64-LABEL: test_fixed_i64:286; X64: # %bb.0:287; X64-NEXT: movq %rdi, %rax288; X64-NEXT: andq %rsi, %rax289; X64-NEXT: xorq %rsi, %rdi290; X64-NEXT: shrq %rdi291; X64-NEXT: addq %rdi, %rax292; X64-NEXT: retq293 %and = and i64 %a0, %a1294 %xor = xor i64 %a1, %a0295 %shift = lshr i64 %xor, 1296 %res = add i64 %and, %shift297 ret i64 %res298}299 300define i64 @test_lsb_i64(i64 %a0, i64 %a1) nounwind {301; X86-LABEL: test_lsb_i64:302; X86: # %bb.0:303; X86-NEXT: pushl %ebx304; X86-NEXT: pushl %edi305; X86-NEXT: pushl %esi306; X86-NEXT: movl {{[0-9]+}}(%esp), %esi307; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx308; X86-NEXT: movl {{[0-9]+}}(%esp), %eax309; X86-NEXT: movl {{[0-9]+}}(%esp), %edi310; X86-NEXT: movl %edi, %ebx311; X86-NEXT: shrl %ebx312; X86-NEXT: shldl $31, %eax, %edi313; X86-NEXT: movl %ecx, %edx314; X86-NEXT: shrl %edx315; X86-NEXT: shldl $31, %esi, %ecx316; X86-NEXT: addl %edi, %ecx317; X86-NEXT: adcl %ebx, %edx318; X86-NEXT: andl %esi, %eax319; X86-NEXT: andl $1, %eax320; X86-NEXT: addl %ecx, %eax321; X86-NEXT: adcl $0, %edx322; X86-NEXT: popl %esi323; X86-NEXT: popl %edi324; X86-NEXT: popl %ebx325; X86-NEXT: retl326;327; X64-LABEL: test_lsb_i64:328; X64: # %bb.0:329; X64-NEXT: movq %rdi, %rcx330; X64-NEXT: shrq %rcx331; X64-NEXT: andl %esi, %edi332; X64-NEXT: movq %rsi, %rax333; X64-NEXT: shrq %rax334; X64-NEXT: addq %rcx, %rax335; X64-NEXT: andl $1, %edi336; X64-NEXT: addq %rdi, %rax337; X64-NEXT: retq338 %s0 = lshr i64 %a0, 1339 %s1 = lshr i64 %a1, 1340 %s = add i64 %s1, %s0341 %m0 = and i64 %a0, 1342 %m1 = and i64 %m0, %a1343 %res = add i64 %s, %m1344 ret i64 %res345}346 347define i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind {348; X86-LABEL: test_ext_i64:349; X86: # %bb.0:350; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx351; X86-NEXT: movl {{[0-9]+}}(%esp), %eax352; X86-NEXT: addl {{[0-9]+}}(%esp), %ecx353; X86-NEXT: adcl {{[0-9]+}}(%esp), %eax354; X86-NEXT: setb %dl355; X86-NEXT: movzbl %dl, %edx356; X86-NEXT: shldl $31, %eax, %edx357; X86-NEXT: shldl $31, %ecx, %eax358; X86-NEXT: retl359;360; X64-LABEL: test_ext_i64:361; X64: # %bb.0:362; X64-NEXT: movq %rdi, %rax363; X64-NEXT: andq %rsi, %rax364; X64-NEXT: xorq %rsi, %rdi365; X64-NEXT: shrq %rdi366; X64-NEXT: addq %rdi, %rax367; X64-NEXT: retq368 %x0 = zext i64 %a0 to i128369 %x1 = zext i64 %a1 to i128370 %sum = add i128 %x0, %x1371 %shift = lshr i128 %sum, 1372 %res = trunc i128 %shift to i64373 ret i64 %res374}375