| ; NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py UTC_ARGS: --version 6 |
| ; RUN: llc -mtriple=x86_64-- -fast-isel -fast-isel-abort=1 -stop-after=finalize-isel < %s | FileCheck %s |
| |
| define i16 @shl_i16(i16 %a, i16 %b) { |
| ; CHECK-LABEL: name: shl_i16 |
| ; CHECK: bb.0 (%ir-block.0): |
| ; CHECK-NEXT: liveins: $edi, $esi |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $esi |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi |
| ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr16 = COPY [[COPY]].sub_16bit |
| ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr16 = COPY [[COPY1]].sub_16bit |
| ; CHECK-NEXT: $cx = COPY [[COPY2]] |
| ; CHECK-NEXT: $cl = KILL killed $cx |
| ; CHECK-NEXT: [[SHL16rCL:%[0-9]+]]:gr16 = SHL16rCL [[COPY3]], implicit-def dead $eflags, implicit $cl |
| ; CHECK-NEXT: $ax = COPY [[SHL16rCL]] |
| ; CHECK-NEXT: RET64 implicit $ax |
| %r = shl i16 %a, %b |
| ret i16 %r |
| } |
| |
| define i32 @shl_i32(i32 %a, i32 %b) { |
| ; CHECK-LABEL: name: shl_i32 |
| ; CHECK: bb.0 (%ir-block.0): |
| ; CHECK-NEXT: liveins: $edi, $esi |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $esi |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi |
| ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY killed [[COPY1]] |
| ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr32 = COPY killed [[COPY]] |
| ; CHECK-NEXT: $ecx = COPY [[COPY3]] |
| ; CHECK-NEXT: $cl = KILL killed $ecx |
| ; CHECK-NEXT: [[SHL32rCL:%[0-9]+]]:gr32 = SHL32rCL [[COPY2]], implicit-def dead $eflags, implicit $cl |
| ; CHECK-NEXT: $eax = COPY [[SHL32rCL]] |
| ; CHECK-NEXT: RET64 implicit $eax |
| %r = shl i32 %a, %b |
| ret i32 %r |
| } |
| |
| define i32 @lshr_i32(i32 %a, i32 %b) { |
| ; CHECK-LABEL: name: lshr_i32 |
| ; CHECK: bb.0 (%ir-block.0): |
| ; CHECK-NEXT: liveins: $edi, $esi |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr32 = COPY $esi |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr32 = COPY $edi |
| ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr32 = COPY killed [[COPY1]] |
| ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr32 = COPY killed [[COPY]] |
| ; CHECK-NEXT: $ecx = COPY [[COPY3]] |
| ; CHECK-NEXT: $cl = KILL killed $ecx |
| ; CHECK-NEXT: [[SHR32rCL:%[0-9]+]]:gr32 = SHR32rCL [[COPY2]], implicit-def dead $eflags, implicit $cl |
| ; CHECK-NEXT: $eax = COPY [[SHR32rCL]] |
| ; CHECK-NEXT: RET64 implicit $eax |
| %r = lshr i32 %a, %b |
| ret i32 %r |
| } |
| |
| define i64 @ashr_i64(i64 %a, i64 %b) { |
| ; CHECK-LABEL: name: ashr_i64 |
| ; CHECK: bb.0 (%ir-block.0): |
| ; CHECK-NEXT: liveins: $rdi, $rsi |
| ; CHECK-NEXT: {{ $}} |
| ; CHECK-NEXT: [[COPY:%[0-9]+]]:gr64 = COPY $rsi |
| ; CHECK-NEXT: [[COPY1:%[0-9]+]]:gr64 = COPY $rdi |
| ; CHECK-NEXT: [[COPY2:%[0-9]+]]:gr64 = COPY killed [[COPY1]] |
| ; CHECK-NEXT: [[COPY3:%[0-9]+]]:gr64 = COPY killed [[COPY]] |
| ; CHECK-NEXT: $rcx = COPY [[COPY3]] |
| ; CHECK-NEXT: $cl = KILL killed $rcx |
| ; CHECK-NEXT: [[SAR64rCL:%[0-9]+]]:gr64 = SAR64rCL [[COPY2]], implicit-def dead $eflags, implicit $cl |
| ; CHECK-NEXT: $rax = COPY [[SAR64rCL]] |
| ; CHECK-NEXT: RET64 implicit $rax |
| %r = ashr i64 %a, %b |
| ret i64 %r |
| } |