1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=riscv64 -mattr=+v,+m -verify-machineinstrs < %s | FileCheck %s 3; RUN: llc -mtriple=riscv64 -mattr=+Zve64x,+m -verify-machineinstrs < %s | FileCheck %s 4 5declare i64 @llvm.vscale.i64() 6 7define i64 @vscale_lshr(i64 %TC) { 8; CHECK-LABEL: vscale_lshr: 9; CHECK: # %bb.0: 10; CHECK-NEXT: csrr a1, vlenb 11; CHECK-NEXT: srli a1, a1, 6 12; CHECK-NEXT: addi a1, a1, -1 13; CHECK-NEXT: and a0, a0, a1 14; CHECK-NEXT: ret 15 %vscale = call i64 @llvm.vscale.i64() 16 %shifted = lshr i64 %vscale, 3 17 %urem = urem i64 %TC, %shifted 18 ret i64 %urem 19} 20 21define i64 @vscale(i64 %TC) { 22; CHECK-LABEL: vscale: 23; CHECK: # %bb.0: 24; CHECK-NEXT: csrr a1, vlenb 25; CHECK-NEXT: srli a1, a1, 3 26; CHECK-NEXT: addi a1, a1, -1 27; CHECK-NEXT: and a0, a0, a1 28; CHECK-NEXT: ret 29 %vscale = call i64 @llvm.vscale.i64() 30 %urem = urem i64 %TC, %vscale 31 ret i64 %urem 32} 33 34define i64 @vscale_shl(i64 %TC) { 35; CHECK-LABEL: vscale_shl: 36; CHECK: # %bb.0: 37; CHECK-NEXT: csrr a1, vlenb 38; CHECK-NEXT: addi a1, a1, -1 39; CHECK-NEXT: and a0, a0, a1 40; CHECK-NEXT: ret 41 %vscale = call i64 @llvm.vscale.i64() 42 %shifted = shl i64 %vscale, 3 43 %urem = urem i64 %TC, %shifted 44 ret i64 %urem 45} 46 47define i64 @TC_minus_rem(i64 %TC) { 48; CHECK-LABEL: TC_minus_rem: 49; CHECK: # %bb.0: 50; CHECK-NEXT: csrr a1, vlenb 51; CHECK-NEXT: srli a1, a1, 3 52; CHECK-NEXT: neg a1, a1 53; CHECK-NEXT: and a0, a0, a1 54; CHECK-NEXT: ret 55 %vscale = call i64 @llvm.vscale.i64() 56 %urem = urem i64 %TC, %vscale 57 %VTC = sub i64 %TC, %urem 58 ret i64 %VTC 59} 60 61define i64 @TC_minus_rem_shl(i64 %TC) { 62; CHECK-LABEL: TC_minus_rem_shl: 63; CHECK: # %bb.0: 64; CHECK-NEXT: csrr a1, vlenb 65; CHECK-NEXT: neg a1, a1 66; CHECK-NEXT: and a0, a0, a1 67; CHECK-NEXT: ret 68 %vscale = call i64 @llvm.vscale.i64() 69 %shifted = shl i64 %vscale, 3 70 %urem = urem i64 %TC, %shifted 71 %VTC = sub i64 %TC, %urem 72 ret i64 %VTC 73} 74 75define i64 @con1024_minus_rem() { 76; CHECK-LABEL: con1024_minus_rem: 77; CHECK: # %bb.0: 78; CHECK-NEXT: csrr a0, vlenb 79; CHECK-NEXT: srli a0, a0, 3 80; CHECK-NEXT: negw a0, a0 81; CHECK-NEXT: andi a0, a0, 1024 82; CHECK-NEXT: ret 83 %vscale = call i64 @llvm.vscale.i64() 84 %urem = urem i64 1024, %vscale 85 %VTC = sub i64 1024, %urem 86 ret i64 %VTC 87} 88 89; Maximum VLEN=64k implies Maximum vscale=1024. 90; TODO: This should fold to 2048 91define i64 @con2048_minus_rem() { 92; CHECK-LABEL: con2048_minus_rem: 93; CHECK: # %bb.0: 94; CHECK-NEXT: csrr a0, vlenb 95; CHECK-NEXT: li a1, 1 96; CHECK-NEXT: srli a0, a0, 3 97; CHECK-NEXT: neg a0, a0 98; CHECK-NEXT: slli a1, a1, 11 99; CHECK-NEXT: and a0, a0, a1 100; CHECK-NEXT: ret 101 %vscale = call i64 @llvm.vscale.i64() 102 %urem = urem i64 2048, %vscale 103 %VTC = sub i64 2048, %urem 104 ret i64 %VTC 105} 106