399 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),ashr(xor(x,y),1))7;8; lsb avg(x,y) = add(ashr(x,1),ashr(y,1),and(x,y,1))9;10; ext avg(x,y) = trunc(ashr(add(sext(x),sext(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: movsbl {{[0-9]+}}(%esp), %ecx17; X86-NEXT: movsbl {{[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: movsbl %sil, %ecx26; X64-NEXT: movsbl %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 = ashr 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: sarb %dl45; X86-NEXT: andb %cl, %al46; X86-NEXT: sarb %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: sarb %al56; X64-NEXT: andb %sil, %dil57; X64-NEXT: sarb %sil58; X64-NEXT: addb %sil, %al59; X64-NEXT: andb $1, %dil60; X64-NEXT: addb %dil, %al61; X64-NEXT: retq62 %s0 = ashr i8 %a0, 163 %s1 = ashr 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: movsbl {{[0-9]+}}(%esp), %ecx75; X86-NEXT: movsbl {{[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: movsbl %sil, %ecx84; X64-NEXT: movsbl %dil, %eax85; X64-NEXT: addl %ecx, %eax86; X64-NEXT: shrl %eax87; X64-NEXT: # kill: def $al killed $al killed $eax88; X64-NEXT: retq89 %x0 = sext i8 %a0 to i1690 %x1 = sext i8 %a1 to i1691 %sum = add i16 %x0, %x192 %shift = ashr 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: movswl {{[0-9]+}}(%esp), %ecx101; X86-NEXT: movswl {{[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: movswl %si, %ecx110; X64-NEXT: movswl %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 = ashr 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: movswl {{[0-9]+}}(%esp), %ecx126; X86-NEXT: movswl {{[0-9]+}}(%esp), %eax127; X86-NEXT: movl %eax, %edx128; X86-NEXT: sarl %edx129; X86-NEXT: andl %ecx, %eax130; X86-NEXT: sarl %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: movswl %si, %eax140; X64-NEXT: movswl %di, %ecx141; X64-NEXT: sarl %ecx142; X64-NEXT: sarl %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 = ashr i16 %a0, 1150 %s1 = ashr 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: movswl {{[0-9]+}}(%esp), %ecx162; X86-NEXT: movswl {{[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: movswl %si, %ecx171; X64-NEXT: movswl %di, %eax172; X64-NEXT: addl %ecx, %eax173; X64-NEXT: shrl %eax174; X64-NEXT: # kill: def $ax killed $ax killed $eax175; X64-NEXT: retq176 %x0 = sext i16 %a0 to i32177 %x1 = sext i16 %a1 to i32178 %sum = add i32 %x0, %x1179 %shift = ashr 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: sarl %eax193; X86-NEXT: addl %edx, %eax194; X86-NEXT: retl195;196; X64-LABEL: test_fixed_i32:197; X64: # %bb.0:198; X64-NEXT: movslq %esi, %rcx199; X64-NEXT: movslq %edi, %rax200; 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 = ashr 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: sarl %edx218; X86-NEXT: andl %ecx, %eax219; X86-NEXT: sarl %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: sarl %eax229; X64-NEXT: andl %esi, %edi230; X64-NEXT: sarl %esi231; X64-NEXT: addl %esi, %eax232; X64-NEXT: andl $1, %edi233; X64-NEXT: addl %edi, %eax234; X64-NEXT: retq235 %s0 = ashr i32 %a0, 1236 %s1 = ashr 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: sarl %eax253; X86-NEXT: addl %edx, %eax254; X86-NEXT: retl255;256; X64-LABEL: test_ext_i32:257; X64: # %bb.0:258; X64-NEXT: movslq %esi, %rcx259; X64-NEXT: movslq %edi, %rax260; X64-NEXT: addq %rcx, %rax261; X64-NEXT: shrq %rax262; X64-NEXT: # kill: def $eax killed $eax killed $rax263; X64-NEXT: retq264 %x0 = sext i32 %a0 to i64265 %x1 = sext i32 %a1 to i64266 %sum = add i64 %x0, %x1267 %shift = ashr 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: pushl %ebx276; X86-NEXT: pushl %edi277; X86-NEXT: pushl %esi278; X86-NEXT: movl {{[0-9]+}}(%esp), %esi279; X86-NEXT: movl {{[0-9]+}}(%esp), %edi280; X86-NEXT: movl {{[0-9]+}}(%esp), %eax281; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx282; X86-NEXT: movl %eax, %ebx283; X86-NEXT: xorl %esi, %ebx284; X86-NEXT: movl %ecx, %edx285; X86-NEXT: xorl %edi, %edx286; X86-NEXT: shrdl $1, %edx, %ebx287; X86-NEXT: andl %edi, %ecx288; X86-NEXT: sarl %edx289; X86-NEXT: andl %esi, %eax290; X86-NEXT: addl %ebx, %eax291; X86-NEXT: adcl %ecx, %edx292; X86-NEXT: popl %esi293; X86-NEXT: popl %edi294; X86-NEXT: popl %ebx295; X86-NEXT: retl296;297; X64-LABEL: test_fixed_i64:298; X64: # %bb.0:299; X64-NEXT: movq %rdi, %rax300; X64-NEXT: andq %rsi, %rax301; X64-NEXT: xorq %rsi, %rdi302; X64-NEXT: sarq %rdi303; X64-NEXT: addq %rdi, %rax304; X64-NEXT: retq305 %and = and i64 %a0, %a1306 %xor = xor i64 %a1, %a0307 %shift = ashr i64 %xor, 1308 %res = add i64 %and, %shift309 ret i64 %res310}311 312define i64 @test_lsb_i64(i64 %a0, i64 %a1) nounwind {313; X86-LABEL: test_lsb_i64:314; X86: # %bb.0:315; X86-NEXT: pushl %ebx316; X86-NEXT: pushl %edi317; X86-NEXT: pushl %esi318; X86-NEXT: movl {{[0-9]+}}(%esp), %esi319; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx320; X86-NEXT: movl {{[0-9]+}}(%esp), %eax321; X86-NEXT: movl {{[0-9]+}}(%esp), %edi322; X86-NEXT: movl %edi, %ebx323; X86-NEXT: sarl %ebx324; X86-NEXT: shldl $31, %eax, %edi325; X86-NEXT: movl %ecx, %edx326; X86-NEXT: sarl %edx327; X86-NEXT: shldl $31, %esi, %ecx328; X86-NEXT: addl %edi, %ecx329; X86-NEXT: adcl %ebx, %edx330; X86-NEXT: andl %esi, %eax331; X86-NEXT: andl $1, %eax332; X86-NEXT: addl %ecx, %eax333; X86-NEXT: adcl $0, %edx334; X86-NEXT: popl %esi335; X86-NEXT: popl %edi336; X86-NEXT: popl %ebx337; X86-NEXT: retl338;339; X64-LABEL: test_lsb_i64:340; X64: # %bb.0:341; X64-NEXT: movq %rdi, %rcx342; X64-NEXT: sarq %rcx343; X64-NEXT: andl %esi, %edi344; X64-NEXT: movq %rsi, %rax345; X64-NEXT: sarq %rax346; X64-NEXT: addq %rcx, %rax347; X64-NEXT: andl $1, %edi348; X64-NEXT: addq %rdi, %rax349; X64-NEXT: retq350 %s0 = ashr i64 %a0, 1351 %s1 = ashr i64 %a1, 1352 %s = add i64 %s1, %s0353 %m0 = and i64 %a0, 1354 %m1 = and i64 %m0, %a1355 %res = add i64 %s, %m1356 ret i64 %res357}358 359define i64 @test_ext_i64(i64 %a0, i64 %a1) nounwind {360; X86-LABEL: test_ext_i64:361; X86: # %bb.0:362; X86-NEXT: pushl %ebx363; X86-NEXT: pushl %edi364; X86-NEXT: pushl %esi365; X86-NEXT: movl {{[0-9]+}}(%esp), %esi366; X86-NEXT: movl {{[0-9]+}}(%esp), %edi367; X86-NEXT: movl {{[0-9]+}}(%esp), %eax368; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx369; X86-NEXT: movl %eax, %ebx370; X86-NEXT: xorl %esi, %ebx371; X86-NEXT: movl %ecx, %edx372; X86-NEXT: xorl %edi, %edx373; X86-NEXT: shrdl $1, %edx, %ebx374; X86-NEXT: andl %edi, %ecx375; X86-NEXT: sarl %edx376; X86-NEXT: andl %esi, %eax377; X86-NEXT: addl %ebx, %eax378; X86-NEXT: adcl %ecx, %edx379; X86-NEXT: popl %esi380; X86-NEXT: popl %edi381; X86-NEXT: popl %ebx382; X86-NEXT: retl383;384; X64-LABEL: test_ext_i64:385; X64: # %bb.0:386; X64-NEXT: movq %rdi, %rax387; X64-NEXT: andq %rsi, %rax388; X64-NEXT: xorq %rsi, %rdi389; X64-NEXT: sarq %rdi390; X64-NEXT: addq %rdi, %rax391; X64-NEXT: retq392 %x0 = sext i64 %a0 to i128393 %x1 = sext i64 %a1 to i128394 %sum = add i128 %x0, %x1395 %shift = ashr i128 %sum, 1396 %res = trunc i128 %shift to i64397 ret i64 %res398}399