[RISCV] Add shrinkwrap test cases showing gaps in current impl
[llvm-project.git] / llvm / test / CodeGen / X86 / physreg-pairs.ll
blob07ee803709caa4763ae51a0ed66d802645ebdd7f
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
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.
10 define 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
22 entry:
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
30 define 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
42 entry:
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
50 define 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
64 entry:
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
72 define 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
88 entry:
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
96 define 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
112 entry:
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
120 define 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
136 entry:
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
144 define 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
158 entry:
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