1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=i386-unknown-linux-gnu -o - %s | FileCheck %s 3 4; To match GCC's behavior in assigning 64-bit values to a 32-bit 5; register, we bind the a subsequence of 2 registers starting with the 6; explicitly given register from the following sequence: EAX, EDX, 7; ECX, EBX, ESI, EDI, EBP, ESP, to the value. There is no wrapping 8; from the sequence, so this will fail given ESP. 9 10define dso_local i64 @test_eax(i64 %in) local_unnamed_addr nounwind { 11; CHECK-LABEL: test_eax: 12; CHECK: # %bb.0: # %entry 13; CHECK-NEXT: movl $-1985229329, %eax # imm = 0x89ABCDEF 14; CHECK-NEXT: movl $19088743, %edx # imm = 0x1234567 15; CHECK-NEXT: #APP 16; CHECK-NEXT: movl %eax, %eax 17; CHECK-NEXT: #NO_APP 18; CHECK-NEXT: addl $3, %eax 19; CHECK-NEXT: movl %eax, %edx 20; CHECK-NEXT: sarl $31, %edx 21; CHECK-NEXT: retl 22entry: 23 %0 = tail call i64 asm sideeffect "mov $1, $0", "=r,{eax},~{dirflag},~{fpsr},~{flags}"(i64 81985529216486895) 24 %conv = trunc i64 %0 to i32 25 %add = add nsw i32 %conv, 3 26 %conv1 = sext i32 %add to i64 27 ret i64 %conv1 28} 29 30define dso_local i64 @test_edx(i64 %in) local_unnamed_addr nounwind { 31; CHECK-LABEL: test_edx: 32; CHECK: # %bb.0: # %entry 33; CHECK-NEXT: movl $-1985229329, %edx # imm = 0x89ABCDEF 34; CHECK-NEXT: movl $19088743, %ecx # imm = 0x1234567 35; CHECK-NEXT: #APP 36; CHECK-NEXT: movl %edx, %eax 37; CHECK-NEXT: #NO_APP 38; CHECK-NEXT: addl $3, %eax 39; CHECK-NEXT: movl %eax, %edx 40; CHECK-NEXT: sarl $31, %edx 41; CHECK-NEXT: retl 42entry: 43 %0 = tail call i64 asm sideeffect "mov $1, $0", "=r,{edx},~{dirflag},~{fpsr},~{flags}"(i64 81985529216486895) 44 %conv = trunc i64 %0 to i32 45 %add = add nsw i32 %conv, 3 46 %conv1 = sext i32 %add to i64 47 ret i64 %conv1 48} 49 50define dso_local i64 @test_ecx(i64 %in) local_unnamed_addr nounwind { 51; CHECK-LABEL: test_ecx: 52; CHECK: # %bb.0: # %entry 53; CHECK-NEXT: pushl %ebx 54; CHECK-NEXT: movl $-1985229329, %ecx # imm = 0x89ABCDEF 55; CHECK-NEXT: movl $19088743, %ebx # imm = 0x1234567 56; CHECK-NEXT: #APP 57; CHECK-NEXT: movl %ecx, %eax 58; CHECK-NEXT: #NO_APP 59; CHECK-NEXT: addl $3, %eax 60; CHECK-NEXT: movl %eax, %edx 61; CHECK-NEXT: sarl $31, %edx 62; CHECK-NEXT: popl %ebx 63; CHECK-NEXT: retl 64entry: 65 %0 = tail call i64 asm sideeffect "mov $1, $0", "=r,{ecx},~{dirflag},~{fpsr},~{flags}"(i64 81985529216486895) 66 %conv = trunc i64 %0 to i32 67 %add = add nsw i32 %conv, 3 68 %conv1 = sext i32 %add to i64 69 ret i64 %conv1 70} 71 72define dso_local i64 @test_ebx(i64 %in) local_unnamed_addr nounwind { 73; CHECK-LABEL: test_ebx: 74; CHECK: # %bb.0: # %entry 75; CHECK-NEXT: pushl %ebx 76; CHECK-NEXT: pushl %esi 77; CHECK-NEXT: movl $-1985229329, %ebx # imm = 0x89ABCDEF 78; CHECK-NEXT: movl $19088743, %esi # imm = 0x1234567 79; CHECK-NEXT: #APP 80; CHECK-NEXT: movl %ebx, %eax 81; CHECK-NEXT: #NO_APP 82; CHECK-NEXT: addl $3, %eax 83; CHECK-NEXT: movl %eax, %edx 84; CHECK-NEXT: sarl $31, %edx 85; CHECK-NEXT: popl %esi 86; CHECK-NEXT: popl %ebx 87; CHECK-NEXT: retl 88entry: 89 %0 = tail call i64 asm sideeffect "mov $1, $0", "=r,{ebx},~{dirflag},~{fpsr},~{flags}"(i64 81985529216486895) 90 %conv = trunc i64 %0 to i32 91 %add = add nsw i32 %conv, 3 92 %conv1 = sext i32 %add to i64 93 ret i64 %conv1 94} 95 96define dso_local i64 @test_esi(i64 %in) local_unnamed_addr nounwind { 97; CHECK-LABEL: test_esi: 98; CHECK: # %bb.0: # %entry 99; CHECK-NEXT: pushl %edi 100; CHECK-NEXT: pushl %esi 101; CHECK-NEXT: movl $-1985229329, %esi # imm = 0x89ABCDEF 102; CHECK-NEXT: movl $19088743, %edi # imm = 0x1234567 103; CHECK-NEXT: #APP 104; CHECK-NEXT: movl %esi, %eax 105; CHECK-NEXT: #NO_APP 106; CHECK-NEXT: addl $3, %eax 107; CHECK-NEXT: movl %eax, %edx 108; CHECK-NEXT: sarl $31, %edx 109; CHECK-NEXT: popl %esi 110; CHECK-NEXT: popl %edi 111; CHECK-NEXT: retl 112entry: 113 %0 = tail call i64 asm sideeffect "mov $1, $0", "=r,{esi},~{dirflag},~{fpsr},~{flags}"(i64 81985529216486895) 114 %conv = trunc i64 %0 to i32 115 %add = add nsw i32 %conv, 3 116 %conv1 = sext i32 %add to i64 117 ret i64 %conv1 118} 119 120define dso_local i64 @test_edi(i64 %in) local_unnamed_addr nounwind { 121; CHECK-LABEL: test_edi: 122; CHECK: # %bb.0: # %entry 123; CHECK-NEXT: pushl %ebp 124; CHECK-NEXT: pushl %edi 125; CHECK-NEXT: movl $-1985229329, %edi # imm = 0x89ABCDEF 126; CHECK-NEXT: movl $19088743, %ebp # imm = 0x1234567 127; CHECK-NEXT: #APP 128; CHECK-NEXT: movl %edi, %eax 129; CHECK-NEXT: #NO_APP 130; CHECK-NEXT: addl $3, %eax 131; CHECK-NEXT: movl %eax, %edx 132; CHECK-NEXT: sarl $31, %edx 133; CHECK-NEXT: popl %edi 134; CHECK-NEXT: popl %ebp 135; CHECK-NEXT: retl 136entry: 137 %0 = tail call i64 asm sideeffect "mov $1, $0", "=r,{edi},~{dirflag},~{fpsr},~{flags}"(i64 81985529216486895) 138 %conv = trunc i64 %0 to i32 139 %add = add nsw i32 %conv, 3 140 %conv1 = sext i32 %add to i64 141 ret i64 %conv1 142} 143 144define dso_local i64 @test_ebp(i64 %in) local_unnamed_addr nounwind { 145; CHECK-LABEL: test_ebp: 146; CHECK: # %bb.0: # %entry 147; CHECK-NEXT: pushl %ebp 148; CHECK-NEXT: movl $-1985229329, %ebp # imm = 0x89ABCDEF 149; CHECK-NEXT: movl $19088743, %esp # imm = 0x1234567 150; CHECK-NEXT: #APP 151; CHECK-NEXT: movl %ebp, %eax 152; CHECK-NEXT: #NO_APP 153; CHECK-NEXT: addl $3, %eax 154; CHECK-NEXT: movl %eax, %edx 155; CHECK-NEXT: sarl $31, %edx 156; CHECK-NEXT: popl %ebp 157; CHECK-NEXT: retl 158entry: 159 %0 = tail call i64 asm sideeffect "mov $1, $0", "=r,{ebp},~{dirflag},~{fpsr},~{flags}"(i64 81985529216486895) 160 %conv = trunc i64 %0 to i32 161 %add = add nsw i32 %conv, 3 162 %conv1 = sext i32 %add to i64 163 ret i64 %conv1 164} 165 166