1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc < %s -mtriple=x86_64-unknown | FileCheck %s --check-prefix=X64 3; RUN: llc < %s -mtriple=i386-unknown | FileCheck %s --check-prefix=X86 4 5define i128 @foo(i128 %t, i128 %u) { 6; X64-LABEL: foo: 7; X64: # %bb.0: 8; X64-NEXT: movq %rdx, %r8 9; X64-NEXT: movq %rdi, %rax 10; X64-NEXT: imulq %rdi, %rcx 11; X64-NEXT: mulq %rdx 12; X64-NEXT: addq %rcx, %rdx 13; X64-NEXT: imulq %rsi, %r8 14; X64-NEXT: addq %r8, %rdx 15; X64-NEXT: retq 16; 17; X86-LABEL: foo: 18; X86: # %bb.0: 19; X86-NEXT: pushl %ebp 20; X86-NEXT: .cfi_def_cfa_offset 8 21; X86-NEXT: pushl %ebx 22; X86-NEXT: .cfi_def_cfa_offset 12 23; X86-NEXT: pushl %edi 24; X86-NEXT: .cfi_def_cfa_offset 16 25; X86-NEXT: pushl %esi 26; X86-NEXT: .cfi_def_cfa_offset 20 27; X86-NEXT: subl $8, %esp 28; X86-NEXT: .cfi_def_cfa_offset 28 29; X86-NEXT: .cfi_offset %esi, -20 30; X86-NEXT: .cfi_offset %edi, -16 31; X86-NEXT: .cfi_offset %ebx, -12 32; X86-NEXT: .cfi_offset %ebp, -8 33; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 34; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 35; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp 36; X86-NEXT: imull %ecx, %ebp 37; X86-NEXT: movl %eax, %esi 38; X86-NEXT: mull %ecx 39; X86-NEXT: movl %eax, %edi 40; X86-NEXT: movl %edx, %ebx 41; X86-NEXT: addl %ebp, %ebx 42; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 43; X86-NEXT: imull %esi, %eax 44; X86-NEXT: addl %eax, %ebx 45; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 46; X86-NEXT: movl %eax, %esi 47; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 48; X86-NEXT: imull %ecx, %esi 49; X86-NEXT: movl {{[0-9]+}}(%esp), %ebp 50; X86-NEXT: mull %ebp 51; X86-NEXT: addl %esi, %edx 52; X86-NEXT: movl {{[0-9]+}}(%esp), %esi 53; X86-NEXT: imull %ebp, %esi 54; X86-NEXT: addl %edx, %esi 55; X86-NEXT: addl %edi, %eax 56; X86-NEXT: movl %eax, {{[-0-9]+}}(%e{{[sb]}}p) # 4-byte Spill 57; X86-NEXT: adcl %ebx, %esi 58; X86-NEXT: movl %ebp, %eax 59; X86-NEXT: movl {{[0-9]+}}(%esp), %edi 60; X86-NEXT: mull %edi 61; X86-NEXT: movl %edx, %ebx 62; X86-NEXT: movl %eax, (%esp) # 4-byte Spill 63; X86-NEXT: movl %ecx, %eax 64; X86-NEXT: mull %edi 65; X86-NEXT: movl %edx, %edi 66; X86-NEXT: movl %eax, %ecx 67; X86-NEXT: addl %ebx, %ecx 68; X86-NEXT: adcl $0, %edi 69; X86-NEXT: movl %ebp, %eax 70; X86-NEXT: mull {{[0-9]+}}(%esp) 71; X86-NEXT: movl %edx, %ebp 72; X86-NEXT: movl %eax, %ebx 73; X86-NEXT: addl %ecx, %ebx 74; X86-NEXT: adcl %edi, %ebp 75; X86-NEXT: setb %cl 76; X86-NEXT: movl {{[0-9]+}}(%esp), %eax 77; X86-NEXT: mull {{[0-9]+}}(%esp) 78; X86-NEXT: addl %ebp, %eax 79; X86-NEXT: movzbl %cl, %ecx 80; X86-NEXT: adcl %ecx, %edx 81; X86-NEXT: addl {{[-0-9]+}}(%e{{[sb]}}p), %eax # 4-byte Folded Reload 82; X86-NEXT: adcl %esi, %edx 83; X86-NEXT: movl {{[0-9]+}}(%esp), %ecx 84; X86-NEXT: movl %ebx, 4(%ecx) 85; X86-NEXT: movl (%esp), %esi # 4-byte Reload 86; X86-NEXT: movl %esi, (%ecx) 87; X86-NEXT: movl %eax, 8(%ecx) 88; X86-NEXT: movl %edx, 12(%ecx) 89; X86-NEXT: movl %ecx, %eax 90; X86-NEXT: addl $8, %esp 91; X86-NEXT: .cfi_def_cfa_offset 20 92; X86-NEXT: popl %esi 93; X86-NEXT: .cfi_def_cfa_offset 16 94; X86-NEXT: popl %edi 95; X86-NEXT: .cfi_def_cfa_offset 12 96; X86-NEXT: popl %ebx 97; X86-NEXT: .cfi_def_cfa_offset 8 98; X86-NEXT: popl %ebp 99; X86-NEXT: .cfi_def_cfa_offset 4 100; X86-NEXT: retl $4 101 %k = mul i128 %t, %u 102 ret i128 %k 103} 104 105@aaa = external dso_local global i128 106@bbb = external dso_local global i128 107 108define void @PR13897() nounwind { 109; X64-LABEL: PR13897: 110; X64: # %bb.0: # %"0x0" 111; X64-NEXT: movq bbb(%rip), %rax 112; X64-NEXT: movl %eax, %ecx 113; X64-NEXT: shlq $32, %rax 114; X64-NEXT: orq %rcx, %rax 115; X64-NEXT: movq %rax, aaa+8(%rip) 116; X64-NEXT: movq %rax, aaa(%rip) 117; X64-NEXT: retq 118; 119; X86-LABEL: PR13897: 120; X86: # %bb.0: # %"0x0" 121; X86-NEXT: movl bbb, %eax 122; X86-NEXT: movl %eax, aaa+12 123; X86-NEXT: movl %eax, aaa+8 124; X86-NEXT: movl %eax, aaa+4 125; X86-NEXT: movl %eax, aaa 126; X86-NEXT: retl 127"0x0": 128 %0 = load i128, ptr @bbb 129 %1 = and i128 %0, 4294967295 130 %2 = shl i128 %0, 96 131 %3 = mul i128 %1, 18446744078004518913 132 %4 = add i128 %3, %2 133 store i128 %4, ptr @aaa 134 ret void 135} 136