| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 | |
| ; RUN: llc -mtriple=xtensa -verify-machineinstrs < %s \ | |
| ; RUN: | FileCheck %s | |
| define i32 @lshl(i32 %x, i32 %y) nounwind { | |
| ; CHECK-LABEL: lshl: | |
| ; CHECK: ssl a3 | |
| ; CHECK-NEXT: sll a2, a2 | |
| ; CHECK-NEXT: ret | |
| %c = shl i32 %x, %y | |
| ret i32 %c | |
| } | |
| define i32 @lshl_imm_1(i32 %x) nounwind { | |
| ; CHECK-LABEL: lshl_imm_1: | |
| ; CHECK: slli a2, a2, 1 | |
| ; CHECK-NEXT: ret | |
| %c = shl i32 %x, 1 | |
| ret i32 %c | |
| } | |
| define i32 @lshl_imm_10(i32 %x) nounwind { | |
| ; CHECK-LABEL: lshl_imm_10: | |
| ; CHECK: slli a2, a2, 10 | |
| ; CHECK-NEXT: ret | |
| %c = shl i32 %x, 10 | |
| ret i32 %c | |
| } | |
| define i32 @lshl_imm_31(i32 %x) nounwind { | |
| ; CHECK-LABEL: lshl_imm_31: | |
| ; CHECK: slli a2, a2, 31 | |
| ; CHECK-NEXT: ret | |
| %c = shl i32 %x, 31 | |
| ret i32 %c | |
| } | |
| define i32 @lshr(i32 %x, i32 %y) nounwind { | |
| ; CHECK-LABEL: lshr: | |
| ; CHECK: ssr a3 | |
| ; CHECK-NEXT: srl a2, a2 | |
| ; CHECK-NEXT: ret | |
| %c = lshr i32 %x, %y | |
| ret i32 %c | |
| } | |
| define i32 @lshr_imm_1(i32 %x) nounwind { | |
| ; CHECK-LABEL: lshr_imm_1: | |
| ; CHECK: srli a2, a2, 1 | |
| ; CHECK-NEXT: ret | |
| %c = lshr i32 %x, 1 | |
| ret i32 %c | |
| } | |
| define i32 @lshr_imm_15(i32 %x) nounwind { | |
| ; CHECK-LABEL: lshr_imm_15: | |
| ; CHECK: srli a2, a2, 15 | |
| ; CHECK-NEXT: ret | |
| %c = lshr i32 %x, 15 | |
| ret i32 %c | |
| } | |
| define i32 @lshr_imm_20(i32 %x) nounwind { | |
| ; CHECK-LABEL: lshr_imm_20: | |
| ; CHECK: extui a2, a2, 20, 12 | |
| ; CHECK-NEXT: ret | |
| %c = lshr i32 %x, 20 | |
| ret i32 %c | |
| } | |
| define i32 @ashr(i32 %x, i32 %y) nounwind { | |
| ; CHECK-LABEL: ashr: | |
| ; CHECK: ssr a3 | |
| ; CHECK-NEXT: sra a2, a2 | |
| ; CHECK-NEXT: ret | |
| %c = ashr i32 %x, %y | |
| ret i32 %c | |
| } | |
| define i32 @ashr_imm_1(i32 %x) nounwind { | |
| ; CHECK-LABEL: ashr_imm_1: | |
| ; CHECK: srai a2, a2, 1 | |
| ; CHECK-NEXT: ret | |
| %c = ashr i32 %x, 1 | |
| ret i32 %c | |
| } | |
| define i32 @ashr_imm_10(i32 %x) nounwind { | |
| ; CHECK-LABEL: ashr_imm_10: | |
| ; CHECK: srai a2, a2, 10 | |
| ; CHECK-NEXT: ret | |
| %c = ashr i32 %x, 10 | |
| ret i32 %c | |
| } | |
| define i32 @ashr_imm_31(i32 %x) nounwind { | |
| ; CHECK-LABEL: ashr_imm_31: | |
| ; CHECK: srai a2, a2, 31 | |
| ; CHECK-NEXT: ret | |
| %c = ashr i32 %x, 31 | |
| ret i32 %c | |
| } | |
| define i64 @lshl_64(i64 %x, i64 %y) nounwind { | |
| ; CHECK-LABEL: lshl_64: | |
| ; CHECK: ssl a4 | |
| ; CHECK-NEXT: src a3, a3, a2 | |
| ; CHECK-NEXT: addi a8, a4, -32 | |
| ; CHECK-NEXT: ssl a8 | |
| ; CHECK-NEXT: sll a10, a2 | |
| ; CHECK-NEXT: movi a9, 0 | |
| ; CHECK-NEXT: blt a8, a9, .LBB12_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: or a3, a10, a10 | |
| ; CHECK-NEXT: .LBB12_2: | |
| ; CHECK-NEXT: ssl a4 | |
| ; CHECK-NEXT: sll a2, a2 | |
| ; CHECK-NEXT: blt a8, a9, .LBB12_4 | |
| ; CHECK-NEXT: # %bb.3: | |
| ; CHECK-NEXT: or a2, a9, a9 | |
| ; CHECK-NEXT: .LBB12_4: | |
| ; CHECK-NEXT: ret | |
| %c = shl i64 %x, %y | |
| ret i64 %c | |
| } | |
| define i64 @lshr_64(i64 %x, i64 %y) nounwind { | |
| ; CHECK-LABEL: lshr_64: | |
| ; CHECK: ssr a4 | |
| ; CHECK-NEXT: src a2, a3, a2 | |
| ; CHECK-NEXT: addi a8, a4, -32 | |
| ; CHECK-NEXT: ssr a8 | |
| ; CHECK-NEXT: srl a10, a3 | |
| ; CHECK-NEXT: movi a9, 0 | |
| ; CHECK-NEXT: blt a8, a9, .LBB13_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: or a2, a10, a10 | |
| ; CHECK-NEXT: .LBB13_2: | |
| ; CHECK-NEXT: ssr a4 | |
| ; CHECK-NEXT: srl a3, a3 | |
| ; CHECK-NEXT: blt a8, a9, .LBB13_4 | |
| ; CHECK-NEXT: # %bb.3: | |
| ; CHECK-NEXT: or a3, a9, a9 | |
| ; CHECK-NEXT: .LBB13_4: | |
| ; CHECK-NEXT: ret | |
| %c = lshr i64 %x, %y | |
| ret i64 %c | |
| } | |
| define i64 @ashr_64(i64 %x, i64 %y) nounwind { | |
| ; CHECK-LABEL: ashr_64: | |
| ; CHECK: ssr a4 | |
| ; CHECK-NEXT: src a2, a3, a2 | |
| ; CHECK-NEXT: addi a9, a4, -32 | |
| ; CHECK-NEXT: ssr a9 | |
| ; CHECK-NEXT: sra a8, a3 | |
| ; CHECK-NEXT: movi a10, 0 | |
| ; CHECK-NEXT: blt a9, a10, .LBB14_2 | |
| ; CHECK-NEXT: # %bb.1: | |
| ; CHECK-NEXT: or a2, a8, a8 | |
| ; CHECK-NEXT: .LBB14_2: | |
| ; CHECK-NEXT: ssr a4 | |
| ; CHECK-NEXT: sra a8, a3 | |
| ; CHECK-NEXT: blt a9, a10, .LBB14_4 | |
| ; CHECK-NEXT: # %bb.3: | |
| ; CHECK-NEXT: srai a8, a3, 31 | |
| ; CHECK-NEXT: .LBB14_4: | |
| ; CHECK-NEXT: or a3, a8, a8 | |
| ; CHECK-NEXT: ret | |
| %c = ashr i64 %x, %y | |
| ret i64 %c | |
| } |