Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/CodeGen/M68k/Arith/bitwise.ll
Show First 20 Lines • Show All 224 Lines • ▼ Show 20 Lines | |||||
; CHECK-LABEL: eoril: | ; CHECK-LABEL: eoril: | ||||
; CHECK: ; %bb.0: | ; CHECK: ; %bb.0: | ||||
; CHECK-NEXT: move.l (4,%sp), %d0 | ; CHECK-NEXT: move.l (4,%sp), %d0 | ||||
; CHECK-NEXT: eori.l #305419896, %d0 | ; CHECK-NEXT: eori.l #305419896, %d0 | ||||
; CHECK-NEXT: rts | ; CHECK-NEXT: rts | ||||
%1 = xor i32 %a, 305419896 | %1 = xor i32 %a, 305419896 | ||||
ret i32 %1 | ret i32 %1 | ||||
} | } | ||||
define i64 @lshr64(i64 %a, i64 %b) nounwind { | |||||
; CHECK-LABEL: lshr64: | |||||
jrtc27: Regenerate the CHECK lines | |||||
Not Done ReplyInline ActionsOK. AnnikaCodes: OK. | |||||
; CHECK: ; %bb.0: | |||||
; CHECK-NEXT: suba.l #16, %sp | |||||
; CHECK-NEXT: movem.l %d2-%d4, (4,%sp) ; 16-byte Folded Spill | |||||
; CHECK-NEXT: move.l (32,%sp), %d3 | |||||
; CHECK-NEXT: move.l (20,%sp), %d2 | |||||
; CHECK-NEXT: move.l %d3, %d1 | |||||
Not Done ReplyInline ActionsHm now why is this being turned into a libcall, I'd expect Expand to inline it. RISC-V has custom lowering you could copy, but that lowering looks pretty generic (just turn XLEN into the width of the first operand). jrtc27: Hm now why is this being turned into a libcall, I'd expect Expand to inline it. RISC-V has… | |||||
Yeah, the custom lowering does away with the call. AnnikaCodes: Yeah, the custom lowering does away with the call. | |||||
; CHECK-NEXT: add.l #-32, %d1 | |||||
; CHECK-NEXT: move.w %ccr, (2,%sp) ; 1-byte Folded Spill | |||||
; CHECK-NEXT: bmi .LBB18_1 | |||||
; CHECK-NEXT: ; %bb.2: | |||||
; CHECK-NEXT: move.l #0, %d0 | |||||
; CHECK-NEXT: move.w (2,%sp), %ccr ; 1-byte Folded Reload | |||||
; CHECK-NEXT: bpl .LBB18_5 | |||||
; CHECK-NEXT: .LBB18_4: | |||||
; CHECK-NEXT: move.l #31, %d4 | |||||
; CHECK-NEXT: sub.l %d3, %d4 | |||||
; CHECK-NEXT: lsl.l #1, %d2 | |||||
; CHECK-NEXT: move.l (24,%sp), %d1 | |||||
; CHECK-NEXT: lsl.l %d4, %d2 | |||||
; CHECK-NEXT: lsr.l %d3, %d1 | |||||
; CHECK-NEXT: or.l %d2, %d1 | |||||
; CHECK-NEXT: bra .LBB18_6 | |||||
; CHECK-NEXT: .LBB18_1: | |||||
; CHECK-NEXT: move.l %d2, %d0 | |||||
; CHECK-NEXT: lsr.l %d3, %d0 | |||||
; CHECK-NEXT: move.w (2,%sp), %ccr ; 1-byte Folded Reload | |||||
; CHECK-NEXT: bmi .LBB18_4 | |||||
; CHECK-NEXT: .LBB18_5: | |||||
; CHECK-NEXT: lsr.l %d1, %d2 | |||||
; CHECK-NEXT: move.l %d2, %d1 | |||||
; CHECK-NEXT: .LBB18_6: | |||||
; CHECK-NEXT: movem.l (4,%sp), %d2-%d4 ; 16-byte Folded Reload | |||||
; CHECK-NEXT: adda.l #16, %sp | |||||
; CHECK-NEXT: rts | |||||
%1 = lshr i64 %a, %b | |||||
ret i64 %1 | |||||
} | |||||
define i64 @ashr64(i64 %a, i64 %b) nounwind { | |||||
; CHECK-LABEL: ashr64: | |||||
; CHECK: ; %bb.0: | |||||
; CHECK-NEXT: suba.l #16, %sp | |||||
; CHECK-NEXT: movem.l %d2-%d4, (4,%sp) ; 16-byte Folded Spill | |||||
; CHECK-NEXT: move.l (32,%sp), %d2 | |||||
; CHECK-NEXT: move.l #31, %d3 | |||||
; CHECK-NEXT: move.l (20,%sp), %d0 | |||||
; CHECK-NEXT: move.l %d2, %d4 | |||||
; CHECK-NEXT: add.l #-32, %d4 | |||||
; CHECK-NEXT: move.w %ccr, (2,%sp) ; 1-byte Folded Spill | |||||
; CHECK-NEXT: bmi .LBB19_1 | |||||
; CHECK-NEXT: ; %bb.2: | |||||
; CHECK-NEXT: move.l %d0, %d1 | |||||
; CHECK-NEXT: asr.l %d4, %d1 | |||||
; CHECK-NEXT: move.w (2,%sp), %ccr ; 1-byte Folded Reload | |||||
; CHECK-NEXT: bpl .LBB19_5 | |||||
; CHECK-NEXT: .LBB19_4: | |||||
; CHECK-NEXT: asr.l %d2, %d0 | |||||
; CHECK-NEXT: bra .LBB19_6 | |||||
; CHECK-NEXT: .LBB19_1: | |||||
; CHECK-NEXT: move.l %d3, %d1 | |||||
; CHECK-NEXT: sub.l %d2, %d1 | |||||
; CHECK-NEXT: move.l %d0, %d4 | |||||
; CHECK-NEXT: lsl.l #1, %d4 | |||||
; CHECK-NEXT: lsl.l %d1, %d4 | |||||
; CHECK-NEXT: move.l (24,%sp), %d1 | |||||
; CHECK-NEXT: lsr.l %d2, %d1 | |||||
; CHECK-NEXT: or.l %d4, %d1 | |||||
; CHECK-NEXT: move.w (2,%sp), %ccr ; 1-byte Folded Reload | |||||
; CHECK-NEXT: bmi .LBB19_4 | |||||
; CHECK-NEXT: .LBB19_5: | |||||
; CHECK-NEXT: asr.l %d3, %d0 | |||||
; CHECK-NEXT: .LBB19_6: | |||||
; CHECK-NEXT: movem.l (4,%sp), %d2-%d4 ; 16-byte Folded Reload | |||||
; CHECK-NEXT: adda.l #16, %sp | |||||
; CHECK-NEXT: rts | |||||
%1 = ashr i64 %a, %b | |||||
ret i64 %1 | |||||
} | |||||
define i64 @shl64(i64 %a, i64 %b) nounwind { | |||||
; CHECK-LABEL: shl64: | |||||
; CHECK: ; %bb.0: | |||||
; CHECK-NEXT: suba.l #16, %sp | |||||
; CHECK-NEXT: movem.l %d2-%d4, (4,%sp) ; 16-byte Folded Spill | |||||
; CHECK-NEXT: move.l (32,%sp), %d3 | |||||
; CHECK-NEXT: move.l (24,%sp), %d2 | |||||
; CHECK-NEXT: move.l %d3, %d0 | |||||
; CHECK-NEXT: add.l #-32, %d0 | |||||
; CHECK-NEXT: move.w %ccr, (2,%sp) ; 1-byte Folded Spill | |||||
; CHECK-NEXT: bmi .LBB20_1 | |||||
; CHECK-NEXT: ; %bb.2: | |||||
; CHECK-NEXT: move.l #0, %d1 | |||||
; CHECK-NEXT: move.w (2,%sp), %ccr ; 1-byte Folded Reload | |||||
; CHECK-NEXT: bpl .LBB20_5 | |||||
; CHECK-NEXT: .LBB20_4: | |||||
; CHECK-NEXT: move.l #31, %d4 | |||||
; CHECK-NEXT: sub.l %d3, %d4 | |||||
; CHECK-NEXT: lsr.l #1, %d2 | |||||
; CHECK-NEXT: move.l (20,%sp), %d0 | |||||
; CHECK-NEXT: lsr.l %d4, %d2 | |||||
; CHECK-NEXT: lsl.l %d3, %d0 | |||||
; CHECK-NEXT: or.l %d2, %d0 | |||||
; CHECK-NEXT: bra .LBB20_6 | |||||
; CHECK-NEXT: .LBB20_1: | |||||
; CHECK-NEXT: move.l %d2, %d1 | |||||
; CHECK-NEXT: lsl.l %d3, %d1 | |||||
; CHECK-NEXT: move.w (2,%sp), %ccr ; 1-byte Folded Reload | |||||
; CHECK-NEXT: bmi .LBB20_4 | |||||
; CHECK-NEXT: .LBB20_5: | |||||
; CHECK-NEXT: lsl.l %d0, %d2 | |||||
; CHECK-NEXT: move.l %d2, %d0 | |||||
; CHECK-NEXT: .LBB20_6: | |||||
; CHECK-NEXT: movem.l (4,%sp), %d2-%d4 ; 16-byte Folded Reload | |||||
; CHECK-NEXT: adda.l #16, %sp | |||||
; CHECK-NEXT: rts | |||||
%1 = shl i64 %a, %b | |||||
ret i64 %1 | |||||
} |
Regenerate the CHECK lines