brintos

brintos / llvm-project-archived public Read only

0
0
Text · 10.7 KiB · fd30319 Raw
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