@@ -93,3 +93,91 @@ define i64 @cfcmov64rr_inv(i64 %0) {
9393 %3 = select i1 %2 , i64 0 , i64 %0
9494 ret i64 %3
9595}
96+
97+ define void @cfcmov16mr (ptr %p , i16 %0 ) {
98+ ; CHECK-LABEL: cfcmov16mr:
99+ ; CHECK: # %bb.0:
100+ ; CHECK-NEXT: movzwl (%rdi), %eax
101+ ; CHECK-NEXT: cmpw %ax, %si
102+ ; CHECK-NEXT: cfcmovlew %si, (%rdi)
103+ ; CHECK-NEXT: retq
104+ %2 = load i16 , ptr %p , align 2
105+ %3 = icmp sgt i16 %0 , %2
106+ %4 = select i1 %3 , i16 %2 , i16 %0
107+ store i16 %4 , ptr %p , align 2
108+ ret void
109+ }
110+
111+ define void @cfcmov32mr (ptr %p , i32 %0 ) {
112+ ; CHECK-LABEL: cfcmov32mr:
113+ ; CHECK: # %bb.0:
114+ ; CHECK-NEXT: cmpl (%rdi), %esi
115+ ; CHECK-NEXT: cfcmovgl %esi, (%rdi)
116+ ; CHECK-NEXT: retq
117+ %2 = load i32 , ptr %p , align 4
118+ %3 = call i32 @llvm.smax.i32 (i32 %0 , i32 %2 )
119+ store i32 %3 , ptr %p , align 4
120+ ret void
121+ }
122+
123+ define void @cfcmov64mr (ptr %p , i64 %0 ) {
124+ ; CHECK-LABEL: cfcmov64mr:
125+ ; CHECK: # %bb.0:
126+ ; CHECK-NEXT: cmpq (%rdi), %rsi
127+ ; CHECK-NEXT: cfcmovgq %rsi, (%rdi)
128+ ; CHECK-NEXT: retq
129+ %2 = load i64 , ptr %p , align 8
130+ %3 = icmp sgt i64 %0 , %2
131+ %4 = select i1 %3 , i64 %0 , i64 %2
132+ store i64 %4 , ptr %p , align 8
133+ ret void
134+ }
135+
136+ define void @volatileload (ptr %p , i32 %0 ) {
137+ ; CHECK-LABEL: volatileload:
138+ ; CHECK: # %bb.0:
139+ ; CHECK-NEXT: movl (%rdi), %eax
140+ ; CHECK-NEXT: cmpl %eax, %esi
141+ ; CHECK-NEXT: cmovbl %esi, %eax
142+ ; CHECK-NEXT: movl %eax, (%rdi)
143+ ; CHECK-NEXT: retq
144+ %2 = load volatile i32 , ptr %p , align 4
145+ %3 = call i32 @llvm.umin.i32 (i32 %0 , i32 %2 )
146+ store i32 %3 , ptr %p , align 4
147+ ret void
148+ }
149+
150+ define void @atomicstore (ptr %p , i64 %0 ) {
151+ ; CHECK-LABEL: atomicstore:
152+ ; CHECK: # %bb.0:
153+ ; CHECK-NEXT: movq (%rdi), %rax
154+ ; CHECK-NEXT: cmpq %rax, %rsi
155+ ; CHECK-NEXT: cmovaq %rsi, %rax
156+ ; CHECK-NEXT: movq %rax, (%rdi)
157+ ; CHECK-NEXT: retq
158+ %2 = load i64 , ptr %p , align 8
159+ %3 = icmp ugt i64 %0 , %2
160+ %4 = select i1 %3 , i64 %0 , i64 %2
161+ store atomic i64 %4 , ptr %p unordered , align 8
162+ ret void
163+ }
164+
165+ define void @loadstorediffptr (ptr %p , i32 %0 ) {
166+ ; CHECK-LABEL: loadstorediffptr:
167+ ; CHECK: # %bb.0:
168+ ; CHECK-NEXT: movl (%rdi), %eax
169+ ; CHECK-NEXT: cmpl %eax, %esi
170+ ; CHECK-NEXT: cmovbel %eax, %esi
171+ ; CHECK-NEXT: movl %esi, 4(%rdi)
172+ ; CHECK-NEXT: retq
173+ %2 = getelementptr [2 x i32 ], ptr %p , i32 0 , i32 0
174+ %3 = load i32 , ptr %2 , align 4
175+ %4 = icmp ule i32 %0 , %3
176+ %5 = select i1 %4 , i32 %3 , i32 %0
177+ %6 = getelementptr [2 x i32 ], ptr %p , i32 0 , i32 1
178+ store i32 %5 , ptr %6 , align 4
179+ ret void
180+ }
181+
182+ declare i32 @llvm.smax.i32 (i32 , i32 )
183+ declare i32 @llvm.umin.i32 (i32 , i32 )
0 commit comments