; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 ; RUN: llc -mtriple=riscv32 -mattr=+zilsd < %s | FileCheck %s --check-prefixes=RV32ZILSD ; RUN: llc -mtriple=riscv32 -mattr=+zilsd,+zba < %s | FileCheck %s --check-prefixes=RV32ZILSDZBA define i64 @test_sh3add_load(ptr %p, i32 %x, i32 %y) { ; RV32ZILSD-LABEL: test_sh3add_load: ; RV32ZILSD: # %bb.0: # %entry ; RV32ZILSD-NEXT: slli a1, a1, 3 ; RV32ZILSD-NEXT: slli a2, a2, 3 ; RV32ZILSD-NEXT: add a1, a1, a0 ; RV32ZILSD-NEXT: add a0, a0, a2 ; RV32ZILSD-NEXT: ld a2, 480(a1) ; RV32ZILSD-NEXT: ld a4, 400(a0) ; RV32ZILSD-NEXT: add a1, a5, a3 ; RV32ZILSD-NEXT: add a0, a4, a2 ; RV32ZILSD-NEXT: sltu a2, a0, a4 ; RV32ZILSD-NEXT: add a1, a1, a2 ; RV32ZILSD-NEXT: ret ; ; RV32ZILSDZBA-LABEL: test_sh3add_load: ; RV32ZILSDZBA: # %bb.0: # %entry ; RV32ZILSDZBA-NEXT: sh3add a1, a1, a0 ; RV32ZILSDZBA-NEXT: sh3add a0, a2, a0 ; RV32ZILSDZBA-NEXT: ld a2, 480(a1) ; RV32ZILSDZBA-NEXT: ld a4, 400(a0) ; RV32ZILSDZBA-NEXT: add a1, a5, a3 ; RV32ZILSDZBA-NEXT: add a0, a4, a2 ; RV32ZILSDZBA-NEXT: sltu a2, a0, a4 ; RV32ZILSDZBA-NEXT: add a1, a1, a2 ; RV32ZILSDZBA-NEXT: ret entry: %b = getelementptr inbounds nuw i8, ptr %p, i64 400 %add = add i32 %x, 10 %arrayidx = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i32 %add %0 = load i64, ptr %arrayidx, align 8 %arrayidx2 = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i32 %y %1 = load i64, ptr %arrayidx2, align 8 %add3 = add nsw i64 %1, %0 ret i64 %add3 } define i64 @test_sh3add_load_minsize(ptr %p, i32 %x, i32 %y) minsize { ; RV32ZILSD-LABEL: test_sh3add_load_minsize: ; RV32ZILSD: # %bb.0: # %entry ; RV32ZILSD-NEXT: addi a0, a0, 400 ; RV32ZILSD-NEXT: slli a1, a1, 3 ; RV32ZILSD-NEXT: slli a2, a2, 3 ; RV32ZILSD-NEXT: add a1, a1, a0 ; RV32ZILSD-NEXT: add a0, a0, a2 ; RV32ZILSD-NEXT: ld a2, 80(a1) ; RV32ZILSD-NEXT: ld a4, 0(a0) ; RV32ZILSD-NEXT: add a1, a5, a3 ; RV32ZILSD-NEXT: add a0, a4, a2 ; RV32ZILSD-NEXT: sltu a2, a0, a4 ; RV32ZILSD-NEXT: add a1, a1, a2 ; RV32ZILSD-NEXT: ret ; ; RV32ZILSDZBA-LABEL: test_sh3add_load_minsize: ; RV32ZILSDZBA: # %bb.0: # %entry ; RV32ZILSDZBA-NEXT: addi a0, a0, 400 ; RV32ZILSDZBA-NEXT: sh3add a1, a1, a0 ; RV32ZILSDZBA-NEXT: sh3add a0, a2, a0 ; RV32ZILSDZBA-NEXT: ld a2, 80(a1) ; RV32ZILSDZBA-NEXT: ld a4, 0(a0) ; RV32ZILSDZBA-NEXT: add a1, a5, a3 ; RV32ZILSDZBA-NEXT: add a0, a4, a2 ; RV32ZILSDZBA-NEXT: sltu a2, a0, a4 ; RV32ZILSDZBA-NEXT: add a1, a1, a2 ; RV32ZILSDZBA-NEXT: ret entry: %b = getelementptr inbounds nuw i8, ptr %p, i64 400 %add = add i32 %x, 10 %arrayidx = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i32 %add %0 = load i64, ptr %arrayidx, align 8 %arrayidx2 = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i32 %y %1 = load i64, ptr %arrayidx2, align 8 %add3 = add nsw i64 %1, %0 ret i64 %add3 } define void @test_sh3add_store(ptr %p, i64 %x, i64 %y) { ; RV32ZILSD-LABEL: test_sh3add_store: ; RV32ZILSD: # %bb.0: # %entry ; RV32ZILSD-NEXT: mv a5, a4 ; RV32ZILSD-NEXT: mv a7, a2 ; RV32ZILSD-NEXT: mv a4, a3 ; RV32ZILSD-NEXT: mv a6, a1 ; RV32ZILSD-NEXT: slli a1, a1, 3 ; RV32ZILSD-NEXT: slli a2, a3, 3 ; RV32ZILSD-NEXT: add a1, a0, a1 ; RV32ZILSD-NEXT: add a0, a0, a2 ; RV32ZILSD-NEXT: sd a6, 400(a1) ; RV32ZILSD-NEXT: sd a4, 400(a0) ; RV32ZILSD-NEXT: ret ; ; RV32ZILSDZBA-LABEL: test_sh3add_store: ; RV32ZILSDZBA: # %bb.0: # %entry ; RV32ZILSDZBA-NEXT: mv a5, a4 ; RV32ZILSDZBA-NEXT: mv a7, a2 ; RV32ZILSDZBA-NEXT: mv a4, a3 ; RV32ZILSDZBA-NEXT: mv a6, a1 ; RV32ZILSDZBA-NEXT: sh3add a1, a1, a0 ; RV32ZILSDZBA-NEXT: sh3add a0, a3, a0 ; RV32ZILSDZBA-NEXT: sd a6, 400(a1) ; RV32ZILSDZBA-NEXT: sd a4, 400(a0) ; RV32ZILSDZBA-NEXT: ret entry: %b = getelementptr inbounds nuw i8, ptr %p, i64 400 %arrayidx = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i64 %x store i64 %x, ptr %arrayidx, align 8 %arrayidx2 = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i64 %y store i64 %y , ptr %arrayidx2, align 8 ret void } define void @test_sh3add_store_optsize(ptr %p, i64 %x, i64 %y) optsize { ; RV32ZILSD-LABEL: test_sh3add_store_optsize: ; RV32ZILSD: # %bb.0: # %entry ; RV32ZILSD-NEXT: mv a5, a4 ; RV32ZILSD-NEXT: mv a7, a2 ; RV32ZILSD-NEXT: addi a0, a0, 400 ; RV32ZILSD-NEXT: mv a4, a3 ; RV32ZILSD-NEXT: mv a6, a1 ; RV32ZILSD-NEXT: slli a1, a1, 3 ; RV32ZILSD-NEXT: slli a2, a3, 3 ; RV32ZILSD-NEXT: add a1, a0, a1 ; RV32ZILSD-NEXT: add a0, a0, a2 ; RV32ZILSD-NEXT: sd a6, 0(a1) ; RV32ZILSD-NEXT: sd a4, 0(a0) ; RV32ZILSD-NEXT: ret ; ; RV32ZILSDZBA-LABEL: test_sh3add_store_optsize: ; RV32ZILSDZBA: # %bb.0: # %entry ; RV32ZILSDZBA-NEXT: mv a5, a4 ; RV32ZILSDZBA-NEXT: mv a7, a2 ; RV32ZILSDZBA-NEXT: addi a0, a0, 400 ; RV32ZILSDZBA-NEXT: mv a4, a3 ; RV32ZILSDZBA-NEXT: mv a6, a1 ; RV32ZILSDZBA-NEXT: sh3add a1, a1, a0 ; RV32ZILSDZBA-NEXT: sh3add a0, a3, a0 ; RV32ZILSDZBA-NEXT: sd a6, 0(a1) ; RV32ZILSDZBA-NEXT: sd a4, 0(a0) ; RV32ZILSDZBA-NEXT: ret entry: %b = getelementptr inbounds nuw i8, ptr %p, i64 400 %arrayidx = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i64 %x store i64 %x, ptr %arrayidx, align 8 %arrayidx2 = getelementptr inbounds nuw [100 x i64], ptr %b, i64 0, i64 %y store i64 %y , ptr %arrayidx2, align 8 ret void }