1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=arm-eabi %s -o - | FileCheck %s 3; RUN: llc -mtriple=armv6m-eabi %s -o - | FileCheck %s --check-prefix=EXPAND 4 5define i64 @test_shl(i64 %val, i64 %amt) { 6; CHECK-LABEL: test_shl: 7; CHECK: @ %bb.0: 8; CHECK-NEXT: rsb r3, r2, #32 9; CHECK-NEXT: lsr r3, r0, r3 10; CHECK-NEXT: orr r1, r3, r1, lsl r2 11; CHECK-NEXT: subs r3, r2, #32 12; CHECK-NEXT: lslpl r1, r0, r3 13; CHECK-NEXT: lsl r0, r0, r2 14; CHECK-NEXT: movpl r0, #0 15; CHECK-NEXT: mov pc, lr 16; 17; EXPAND-LABEL: test_shl: 18; EXPAND: @ %bb.0: 19; EXPAND-NEXT: .save {r7, lr} 20; EXPAND-NEXT: push {r7, lr} 21; EXPAND-NEXT: bl __aeabi_llsl 22; EXPAND-NEXT: pop {r7, pc} 23 %res = shl i64 %val, %amt 24 ret i64 %res 25} 26 27; Explanation for lshr is pretty much the reverse of shl. 28define i64 @test_lshr(i64 %val, i64 %amt) { 29; CHECK-LABEL: test_lshr: 30; CHECK: @ %bb.0: 31; CHECK-NEXT: rsb r3, r2, #32 32; CHECK-NEXT: lsr r0, r0, r2 33; CHECK-NEXT: orr r0, r0, r1, lsl r3 34; CHECK-NEXT: subs r3, r2, #32 35; CHECK-NEXT: lsrpl r0, r1, r3 36; CHECK-NEXT: lsr r1, r1, r2 37; CHECK-NEXT: movpl r1, #0 38; CHECK-NEXT: mov pc, lr 39; 40; EXPAND-LABEL: test_lshr: 41; EXPAND: @ %bb.0: 42; EXPAND-NEXT: .save {r7, lr} 43; EXPAND-NEXT: push {r7, lr} 44; EXPAND-NEXT: bl __aeabi_llsr 45; EXPAND-NEXT: pop {r7, pc} 46 %res = lshr i64 %val, %amt 47 ret i64 %res 48} 49 50; One minor difference for ashr: the high bits must be "hi >> 31" if the shift 51; amount is large to get the right sign bit. 52define i64 @test_ashr(i64 %val, i64 %amt) { 53; CHECK-LABEL: test_ashr: 54; CHECK: @ %bb.0: 55; CHECK-NEXT: asr r3, r1, r2 56; CHECK-NEXT: subs r12, r2, #32 57; CHECK-NEXT: lsr r0, r0, r2 58; CHECK-NEXT: rsb r2, r2, #32 59; CHECK-NEXT: asrpl r3, r1, #31 60; CHECK-NEXT: orr r0, r0, r1, lsl r2 61; CHECK-NEXT: asrpl r0, r1, r12 62; CHECK-NEXT: mov r1, r3 63; CHECK-NEXT: mov pc, lr 64; 65; EXPAND-LABEL: test_ashr: 66; EXPAND: @ %bb.0: 67; EXPAND-NEXT: .save {r7, lr} 68; EXPAND-NEXT: push {r7, lr} 69; EXPAND-NEXT: bl __aeabi_lasr 70; EXPAND-NEXT: pop {r7, pc} 71 %res = ashr i64 %val, %amt 72 ret i64 %res 73} 74