368 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=i386-unknown | FileCheck %s --check-prefix=X863; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X644 5target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"6 7define void @test(ptr %a, ptr %b, ptr %out) nounwind {8; X86-LABEL: test:9; X86: # %bb.0: # %entry10; X86-NEXT: pushl %ebp11; X86-NEXT: pushl %ebx12; X86-NEXT: pushl %edi13; X86-NEXT: pushl %esi14; X86-NEXT: subl $72, %esp15; X86-NEXT: movl {{[0-9]+}}(%esp), %edx16; X86-NEXT: movl {{[0-9]+}}(%esp), %eax17; X86-NEXT: movl 12(%eax), %ebx18; X86-NEXT: movl 8(%eax), %ebp19; X86-NEXT: movl (%edx), %edi20; X86-NEXT: movl %edi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill21; X86-NEXT: movl %ebp, %eax22; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill23; X86-NEXT: mull %edi24; X86-NEXT: movl %edx, %esi25; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill26; X86-NEXT: movl %ebx, %eax27; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill28; X86-NEXT: mull %edi29; X86-NEXT: movl %edx, %ecx30; X86-NEXT: movl %eax, %edi31; X86-NEXT: addl %esi, %edi32; X86-NEXT: adcl $0, %ecx33; X86-NEXT: movl {{[0-9]+}}(%esp), %eax34; X86-NEXT: movl 4(%eax), %esi35; X86-NEXT: movl %ebp, %eax36; X86-NEXT: mull %esi37; X86-NEXT: movl %esi, %ebp38; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill39; X86-NEXT: movl %edx, %esi40; X86-NEXT: addl %edi, %eax41; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill42; X86-NEXT: adcl %ecx, %esi43; X86-NEXT: setb %cl44; X86-NEXT: movl %ebx, %eax45; X86-NEXT: mull %ebp46; X86-NEXT: addl %esi, %eax47; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill48; X86-NEXT: movzbl %cl, %eax49; X86-NEXT: adcl %eax, %edx50; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill51; X86-NEXT: movl {{[0-9]+}}(%esp), %esi52; X86-NEXT: movl (%esi), %ebx53; X86-NEXT: movl %ebx, %eax54; X86-NEXT: movl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill55; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload56; X86-NEXT: mull %ecx57; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill58; X86-NEXT: movl %edx, %edi59; X86-NEXT: movl 4(%esi), %ebp60; X86-NEXT: movl %ebp, %eax61; X86-NEXT: mull %ecx62; X86-NEXT: movl %edx, %ecx63; X86-NEXT: movl %eax, %esi64; X86-NEXT: addl %edi, %esi65; X86-NEXT: adcl $0, %ecx66; X86-NEXT: movl %ebx, %eax67; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload68; X86-NEXT: mull %edi69; X86-NEXT: movl %edx, %ebx70; X86-NEXT: addl %esi, %eax71; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill72; X86-NEXT: adcl %ecx, %ebx73; X86-NEXT: setb %cl74; X86-NEXT: movl %ebp, %eax75; X86-NEXT: movl %ebp, %esi76; X86-NEXT: mull %edi77; X86-NEXT: addl %ebx, %eax78; X86-NEXT: movzbl %cl, %ecx79; X86-NEXT: adcl %ecx, %edx80; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload81; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill82; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload83; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill84; X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill85; X86-NEXT: adcl $0, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill86; X86-NEXT: movl {{[0-9]+}}(%esp), %eax87; X86-NEXT: movl 8(%eax), %ecx88; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill89; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload90; X86-NEXT: movl %edi, %eax91; X86-NEXT: mull %ecx92; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill93; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill94; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill95; X86-NEXT: movl %ebp, %eax96; X86-NEXT: mull %ecx97; X86-NEXT: movl %edx, %ecx98; X86-NEXT: movl %eax, %ebx99; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload100; X86-NEXT: adcl $0, %ecx101; X86-NEXT: movl {{[0-9]+}}(%esp), %eax102; X86-NEXT: movl 12(%eax), %ebp103; X86-NEXT: movl %edi, %eax104; X86-NEXT: mull %ebp105; X86-NEXT: movl %ebp, (%esp) # 4-byte Spill106; X86-NEXT: movl %edx, %edi107; X86-NEXT: addl %ebx, %eax108; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill109; X86-NEXT: adcl %ecx, %edi110; X86-NEXT: setb %cl111; X86-NEXT: movl %esi, %eax112; X86-NEXT: mull %ebp113; X86-NEXT: movl %eax, %ebx114; X86-NEXT: addl %edi, %ebx115; X86-NEXT: movzbl %cl, %eax116; X86-NEXT: adcl %eax, %edx117; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload118; X86-NEXT: addl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill119; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload120; X86-NEXT: adcl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill121; X86-NEXT: adcl $0, %ebx122; X86-NEXT: adcl $0, %edx123; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Folded Reload124; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload125; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill126; X86-NEXT: setb {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill127; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Reload128; X86-NEXT: movl %edi, %eax129; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload130; X86-NEXT: mull %ecx131; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill132; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill133; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload134; X86-NEXT: mull %ecx135; X86-NEXT: movl %edx, %esi136; X86-NEXT: movl %eax, %ebp137; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload138; X86-NEXT: adcl $0, %esi139; X86-NEXT: movl %edi, %eax140; X86-NEXT: movl (%esp), %ecx # 4-byte Reload141; X86-NEXT: mull %ecx142; X86-NEXT: movl %edx, %edi143; X86-NEXT: addl %ebp, %eax144; X86-NEXT: movl %eax, %ebp145; X86-NEXT: adcl %esi, %edi146; X86-NEXT: setb {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill147; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload148; X86-NEXT: mull %ecx149; X86-NEXT: addl %edi, %eax150; X86-NEXT: movl %eax, %esi151; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload152; X86-NEXT: adcl %eax, %edx153; X86-NEXT: addl %ebx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Folded Spill154; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Folded Reload155; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill156; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 1-byte Folded Reload157; X86-NEXT: adcl %eax, %esi158; X86-NEXT: movl %esi, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill159; X86-NEXT: adcl $0, %edx160; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill161; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx162; X86-NEXT: movl 16(%ecx), %esi163; X86-NEXT: movl (%esp), %edi # 4-byte Reload164; X86-NEXT: imull %esi, %edi165; X86-NEXT: movl %esi, %eax166; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload167; X86-NEXT: mull %ebx168; X86-NEXT: movl %eax, (%esp) # 4-byte Spill169; X86-NEXT: addl %edi, %edx170; X86-NEXT: movl 20(%ecx), %eax171; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill172; X86-NEXT: movl %ebx, %edi173; X86-NEXT: imull %eax, %edi174; X86-NEXT: addl %edx, %edi175; X86-NEXT: movl 24(%ecx), %eax176; X86-NEXT: movl %eax, %ecx177; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload178; X86-NEXT: imull %ebp, %ecx179; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload180; X86-NEXT: mull %ebx181; X86-NEXT: addl %ecx, %edx182; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx183; X86-NEXT: movl 28(%ecx), %ecx184; X86-NEXT: imull %ebx, %ecx185; X86-NEXT: addl %edx, %ecx186; X86-NEXT: addl (%esp), %eax # 4-byte Folded Reload187; X86-NEXT: movl %eax, (%esp) # 4-byte Spill188; X86-NEXT: adcl %edi, %ecx189; X86-NEXT: movl %ebx, %eax190; X86-NEXT: mull %esi191; X86-NEXT: movl %edx, %edi192; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill193; X86-NEXT: movl %ebp, %eax194; X86-NEXT: mull %esi195; X86-NEXT: movl %edx, %esi196; X86-NEXT: movl %eax, %ebx197; X86-NEXT: addl %edi, %ebx198; X86-NEXT: adcl $0, %esi199; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload200; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebp # 4-byte Reload201; X86-NEXT: mull %ebp202; X86-NEXT: movl %edx, %edi203; X86-NEXT: addl %ebx, %eax204; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill205; X86-NEXT: adcl %esi, %edi206; X86-NEXT: setb %bl207; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload208; X86-NEXT: mull %ebp209; X86-NEXT: addl %edi, %eax210; X86-NEXT: movzbl %bl, %esi211; X86-NEXT: adcl %esi, %edx212; X86-NEXT: addl (%esp), %eax # 4-byte Folded Reload213; X86-NEXT: movl %eax, (%esp) # 4-byte Spill214; X86-NEXT: adcl %ecx, %edx215; X86-NEXT: movl %edx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill216; X86-NEXT: movl {{[0-9]+}}(%esp), %edi217; X86-NEXT: movl 24(%edi), %esi218; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload219; X86-NEXT: movl %ecx, %eax220; X86-NEXT: mull %esi221; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill222; X86-NEXT: imull {{[-0-9]+}}(%e{{[sb]}}p), %esi # 4-byte Folded Reload223; X86-NEXT: addl %edx, %esi224; X86-NEXT: movl %edi, %edx225; X86-NEXT: movl 28(%edi), %eax226; X86-NEXT: imull %ecx, %eax227; X86-NEXT: addl %eax, %esi228; X86-NEXT: movl 16(%edi), %edi229; X86-NEXT: movl 20(%edx), %ebp230; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload231; X86-NEXT: movl %eax, %ebx232; X86-NEXT: imull %ebp, %ebx233; X86-NEXT: movl %ebp, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill234; X86-NEXT: mull %edi235; X86-NEXT: addl %ebx, %edx236; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload237; X86-NEXT: imull %edi, %ecx238; X86-NEXT: addl %edx, %ecx239; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload240; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill241; X86-NEXT: adcl %esi, %ecx242; X86-NEXT: movl %ecx, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill243; X86-NEXT: movl %edi, %eax244; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload245; X86-NEXT: mull %ecx246; X86-NEXT: movl %edx, %ebx247; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill248; X86-NEXT: movl %ebp, %eax249; X86-NEXT: mull %ecx250; X86-NEXT: movl %edx, %esi251; X86-NEXT: movl %eax, %ebp252; X86-NEXT: addl %ebx, %ebp253; X86-NEXT: adcl $0, %esi254; X86-NEXT: movl %edi, %eax255; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload256; X86-NEXT: mull %ecx257; X86-NEXT: movl %edx, %ebx258; X86-NEXT: movl %eax, %edi259; X86-NEXT: addl %ebp, %edi260; X86-NEXT: adcl %esi, %ebx261; X86-NEXT: setb {{[-0-9]+}}(%e{{[sb]}}p) # 1-byte Folded Spill262; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Reload263; X86-NEXT: mull %ecx264; X86-NEXT: addl %ebx, %eax265; X86-NEXT: movzbl {{[-0-9]+}}(%e{{[sb]}}p), %esi # 1-byte Folded Reload266; X86-NEXT: adcl %esi, %edx267; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload268; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload269; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Reload270; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload271; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload272; X86-NEXT: adcl (%esp), %eax # 4-byte Folded Reload273; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload274; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %ecx # 4-byte Folded Reload275; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edi # 4-byte Folded Reload276; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload277; X86-NEXT: adcl {{[-0-9]+}}(%e{{[sb]}}p), %edx # 4-byte Folded Reload278; X86-NEXT: movl {{[0-9]+}}(%esp), %esi279; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload280; X86-NEXT: movl %ebx, (%esi)281; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload282; X86-NEXT: movl %ebx, 4(%esi)283; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload284; X86-NEXT: movl %ebx, 8(%esi)285; X86-NEXT: movl {{[-0-9]+}}(%e{{[sb]}}p), %ebx # 4-byte Reload286; X86-NEXT: movl %ebx, 12(%esi)287; X86-NEXT: movl %ecx, 16(%esi)288; X86-NEXT: movl %edi, 20(%esi)289; X86-NEXT: movl %eax, 24(%esi)290; X86-NEXT: movl %edx, 28(%esi)291; X86-NEXT: addl $72, %esp292; X86-NEXT: popl %esi293; X86-NEXT: popl %edi294; X86-NEXT: popl %ebx295; X86-NEXT: popl %ebp296; X86-NEXT: retl297;298; X64-LABEL: test:299; X64: # %bb.0: # %entry300; X64-NEXT: pushq %r15301; X64-NEXT: pushq %r14302; X64-NEXT: pushq %rbx303; X64-NEXT: movq %rdx, %rcx304; X64-NEXT: movq (%rdi), %rbx305; X64-NEXT: movq 8(%rdi), %r11306; X64-NEXT: movq 16(%rdi), %r10307; X64-NEXT: movq 16(%rsi), %r8308; X64-NEXT: movq (%rsi), %r9309; X64-NEXT: movq 8(%rsi), %r14310; X64-NEXT: movq 24(%rdi), %r15311; X64-NEXT: imulq %r9, %r15312; X64-NEXT: movq %r9, %rax313; X64-NEXT: mulq %r10314; X64-NEXT: movq %rax, %rdi315; X64-NEXT: imulq %r14, %r10316; X64-NEXT: addq %rdx, %r10317; X64-NEXT: addq %r15, %r10318; X64-NEXT: movq %r8, %r15319; X64-NEXT: imulq %r11, %r15320; X64-NEXT: movq %r8, %rax321; X64-NEXT: mulq %rbx322; X64-NEXT: movq %rax, %r8323; X64-NEXT: addq %r15, %rdx324; X64-NEXT: movq 24(%rsi), %r15325; X64-NEXT: imulq %rbx, %r15326; X64-NEXT: addq %rdx, %r15327; X64-NEXT: addq %rdi, %r8328; X64-NEXT: adcq %r10, %r15329; X64-NEXT: movq %rbx, %rax330; X64-NEXT: mulq %r9331; X64-NEXT: movq %rdx, %rsi332; X64-NEXT: movq %rax, %r10333; X64-NEXT: movq %r11, %rax334; X64-NEXT: mulq %r9335; X64-NEXT: movq %rdx, %rdi336; X64-NEXT: movq %rax, %r9337; X64-NEXT: addq %rsi, %r9338; X64-NEXT: adcq $0, %rdi339; X64-NEXT: movq %rbx, %rax340; X64-NEXT: mulq %r14341; X64-NEXT: movq %rdx, %rsi342; X64-NEXT: movq %rax, %rbx343; X64-NEXT: addq %r9, %rbx344; X64-NEXT: adcq %rdi, %rsi345; X64-NEXT: setb %al346; X64-NEXT: movzbl %al, %edi347; X64-NEXT: movq %r11, %rax348; X64-NEXT: mulq %r14349; X64-NEXT: addq %rsi, %rax350; X64-NEXT: adcq %rdi, %rdx351; X64-NEXT: addq %r8, %rax352; X64-NEXT: adcq %r15, %rdx353; X64-NEXT: movq %r10, (%rcx)354; X64-NEXT: movq %rbx, 8(%rcx)355; X64-NEXT: movq %rax, 16(%rcx)356; X64-NEXT: movq %rdx, 24(%rcx)357; X64-NEXT: popq %rbx358; X64-NEXT: popq %r14359; X64-NEXT: popq %r15360; X64-NEXT: retq361entry:362 %av = load i256, ptr %a363 %bv = load i256, ptr %b364 %r = mul i256 %av, %bv365 store i256 %r, ptr %out366 ret void367}368