|
29 | 29 | call void @foo()
|
30 | 30 | ret void
|
31 | 31 | }
|
| 32 | + |
| 33 | + define void @test_cmov(i64 %a, i64 %b) { |
| 34 | + entry: |
| 35 | + call void @foo() |
| 36 | + ret void |
| 37 | + } |
| 38 | + |
| 39 | + define void @test_cfcmov(i64 %a, i64 %b) { |
| 40 | + entry: |
| 41 | + call void @foo() |
| 42 | + ret void |
| 43 | + } |
32 | 44 | ...
|
33 | 45 | ---
|
34 | 46 | name: test_adc
|
@@ -166,3 +178,93 @@ body: |
|
166 | 178 | RET 0
|
167 | 179 |
|
168 | 180 | ...
|
| 181 | +--- |
| 182 | +name: test_cmov |
| 183 | +# CHECK-LABEL: name: test_cmov |
| 184 | +liveins: |
| 185 | + - { reg: '$rdi', virtual-reg: '%0' } |
| 186 | + - { reg: '$rsi', virtual-reg: '%1' } |
| 187 | +body: | |
| 188 | + bb.0: |
| 189 | + liveins: $rdi, $rsi |
| 190 | +
|
| 191 | + %0:gr64 = COPY $rdi |
| 192 | + %1:gr64 = COPY $rsi |
| 193 | + CMP64rr %0, %1, implicit-def $eflags |
| 194 | + %2:gr64 = COPY $eflags |
| 195 | + ; CHECK-NOT: COPY{{( killed)?}} $eflags |
| 196 | + ; CHECK: %[[A_REG:[^:]*]]:gr8 = SETCCr 7, implicit $eflags |
| 197 | + ; CHECK-NEXT: %[[B_REG:[^:]*]]:gr8 = SETCCr 2, implicit $eflags |
| 198 | + ; CHECK-NEXT: %[[E_REG:[^:]*]]:gr8 = SETCCr 4, implicit $eflags |
| 199 | + ; CHECK-NOT: COPY{{( killed)?}} $eflags |
| 200 | +
|
| 201 | + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| 202 | + CALL64pcrel32 @foo, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $eax |
| 203 | + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| 204 | +
|
| 205 | + $eflags = COPY %2 |
| 206 | + %3:gr64 = CMOV64rr_ND %0, %1, 7, implicit $eflags |
| 207 | + %4:gr64 = CMOV64rr_ND %0, %1, 2, implicit $eflags |
| 208 | + %5:gr64 = CMOV64rr_ND %0, %1, 4, implicit $eflags |
| 209 | + %6:gr64 = CMOV64rr_ND %0, %1, 5, implicit killed $eflags |
| 210 | + ; CHECK-NOT: $eflags = |
| 211 | + ; CHECK: TEST8rr %[[A_REG]], %[[A_REG]], implicit-def $eflags |
| 212 | + ; CHECK-NEXT: %3:gr64 = CMOV64rr_ND %0, %1, 5, implicit killed $eflags |
| 213 | + ; CHECK-NEXT: TEST8rr %[[B_REG]], %[[B_REG]], implicit-def $eflags |
| 214 | + ; CHECK-NEXT: %4:gr64 = CMOV64rr_ND %0, %1, 5, implicit killed $eflags |
| 215 | + ; CHECK-NEXT: TEST8rr %[[E_REG]], %[[E_REG]], implicit-def $eflags |
| 216 | + ; CHECK-NEXT: %5:gr64 = CMOV64rr_ND %0, %1, 5, implicit killed $eflags |
| 217 | + ; CHECK-NEXT: TEST8rr %[[E_REG]], %[[E_REG]], implicit-def $eflags |
| 218 | + ; CHECK-NEXT: %6:gr64 = CMOV64rr_ND %0, %1, 4, implicit killed $eflags |
| 219 | + MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %3 |
| 220 | + MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %4 |
| 221 | + MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5 |
| 222 | + MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %6 |
| 223 | +
|
| 224 | + RET 0 |
| 225 | +... |
| 226 | +--- |
| 227 | +name: test_cfcmov |
| 228 | +# CHECK-LABEL: name: test_cfcmov |
| 229 | +liveins: |
| 230 | + - { reg: '$rdi', virtual-reg: '%0' } |
| 231 | + - { reg: '$rsi', virtual-reg: '%1' } |
| 232 | +body: | |
| 233 | + bb.0: |
| 234 | + liveins: $rdi, $rsi |
| 235 | +
|
| 236 | + %0:gr64 = COPY $rdi |
| 237 | + %1:gr64 = COPY $rsi |
| 238 | + CMP64rr %0, %1, implicit-def $eflags |
| 239 | + %2:gr64 = COPY $eflags |
| 240 | + ; CHECK-NOT: COPY{{( killed)?}} $eflags |
| 241 | + ; CHECK: %[[A_REG:[^:]*]]:gr8 = SETCCr 7, implicit $eflags |
| 242 | + ; CHECK-NEXT: %[[B_REG:[^:]*]]:gr8 = SETCCr 2, implicit $eflags |
| 243 | + ; CHECK-NEXT: %[[E_REG:[^:]*]]:gr8 = SETCCr 4, implicit $eflags |
| 244 | + ; CHECK-NOT: COPY{{( killed)?}} $eflags |
| 245 | +
|
| 246 | + ADJCALLSTACKDOWN64 0, 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| 247 | + CALL64pcrel32 @foo, csr_64, implicit $rsp, implicit $ssp, implicit $rdi, implicit-def $rsp, implicit-def $ssp, implicit-def $eax |
| 248 | + ADJCALLSTACKUP64 0, 0, implicit-def dead $rsp, implicit-def dead $eflags, implicit-def dead $ssp, implicit $rsp, implicit $ssp |
| 249 | +
|
| 250 | + $eflags = COPY %2 |
| 251 | + %3:gr64 = CFCMOV64rr %1, 7, implicit $eflags |
| 252 | + %4:gr64 = CFCMOV64rr %1, 2, implicit $eflags |
| 253 | + %5:gr64 = CFCMOV64rr_ND %0, %1, 4, implicit $eflags |
| 254 | + %6:gr64 = CFCMOV64rr_ND %0, %1, 5, implicit killed $eflags |
| 255 | + ; CHECK-NOT: $eflags = |
| 256 | + ; CHECK: TEST8rr %[[A_REG]], %[[A_REG]], implicit-def $eflags |
| 257 | + ; CHECK-NEXT: %3:gr64 = CFCMOV64rr %1, 5, implicit killed $eflags |
| 258 | + ; CHECK-NEXT: TEST8rr %[[B_REG]], %[[B_REG]], implicit-def $eflags |
| 259 | + ; CHECK-NEXT: %4:gr64 = CFCMOV64rr %1, 5, implicit killed $eflags |
| 260 | + ; CHECK-NEXT: TEST8rr %[[E_REG]], %[[E_REG]], implicit-def $eflags |
| 261 | + ; CHECK-NEXT: %5:gr64 = CFCMOV64rr_ND %0, %1, 5, implicit killed $eflags |
| 262 | + ; CHECK-NEXT: TEST8rr %[[E_REG]], %[[E_REG]], implicit-def $eflags |
| 263 | + ; CHECK-NEXT: %6:gr64 = CFCMOV64rr_ND %0, %1, 4, implicit killed $eflags |
| 264 | + MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %3 |
| 265 | + MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %4 |
| 266 | + MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %5 |
| 267 | + MOV64mr $rsp, 1, $noreg, -16, $noreg, killed %6 |
| 268 | +
|
| 269 | + RET 0 |
| 270 | +... |
0 commit comments