brintos

brintos / llvm-project-archived public Read only

0
0
Text · 20.0 KiB · 1fffe35 Raw
669 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=riscv32 \3; RUN:   | FileCheck %s --check-prefixes=RV32-BOTH,RV324; RUN: llc < %s -mtriple=riscv64 \5; RUN:   | FileCheck %s --check-prefixes=RV64-BOTH,RV646; RUN: llc < %s -mtriple=riscv32 -mattr=+unaligned-scalar-mem \7; RUN:   | FileCheck %s --check-prefixes=RV32-BOTH,RV32-FAST8; RUN: llc < %s -mtriple=riscv64 -mattr=+unaligned-scalar-mem \9; RUN:   | FileCheck %s --check-prefixes=RV64-BOTH,RV64-FAST10 11; ----------------------------------------------------------------------12; Fully unaligned cases13 14define void @unaligned_memmove0(ptr nocapture %dest, ptr %src) nounwind {15; RV32-BOTH-LABEL: unaligned_memmove0:16; RV32-BOTH:       # %bb.0: # %entry17; RV32-BOTH-NEXT:    ret18;19; RV64-BOTH-LABEL: unaligned_memmove0:20; RV64-BOTH:       # %bb.0: # %entry21; RV64-BOTH-NEXT:    ret22entry:23  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 0, i1 false)24  ret void25}26 27define void @unaligned_memmove1(ptr nocapture %dest, ptr %src) nounwind {28; RV32-BOTH-LABEL: unaligned_memmove1:29; RV32-BOTH:       # %bb.0: # %entry30; RV32-BOTH-NEXT:    lbu a1, 0(a1)31; RV32-BOTH-NEXT:    sb a1, 0(a0)32; RV32-BOTH-NEXT:    ret33;34; RV64-BOTH-LABEL: unaligned_memmove1:35; RV64-BOTH:       # %bb.0: # %entry36; RV64-BOTH-NEXT:    lbu a1, 0(a1)37; RV64-BOTH-NEXT:    sb a1, 0(a0)38; RV64-BOTH-NEXT:    ret39entry:40  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 1, i1 false)41  ret void42}43 44define void @unaligned_memmove2(ptr nocapture %dest, ptr %src) nounwind {45; RV32-LABEL: unaligned_memmove2:46; RV32:       # %bb.0: # %entry47; RV32-NEXT:    lbu a2, 0(a1)48; RV32-NEXT:    lbu a1, 1(a1)49; RV32-NEXT:    sb a2, 0(a0)50; RV32-NEXT:    sb a1, 1(a0)51; RV32-NEXT:    ret52;53; RV64-LABEL: unaligned_memmove2:54; RV64:       # %bb.0: # %entry55; RV64-NEXT:    lbu a2, 0(a1)56; RV64-NEXT:    lbu a1, 1(a1)57; RV64-NEXT:    sb a2, 0(a0)58; RV64-NEXT:    sb a1, 1(a0)59; RV64-NEXT:    ret60;61; RV32-FAST-LABEL: unaligned_memmove2:62; RV32-FAST:       # %bb.0: # %entry63; RV32-FAST-NEXT:    lh a1, 0(a1)64; RV32-FAST-NEXT:    sh a1, 0(a0)65; RV32-FAST-NEXT:    ret66;67; RV64-FAST-LABEL: unaligned_memmove2:68; RV64-FAST:       # %bb.0: # %entry69; RV64-FAST-NEXT:    lh a1, 0(a1)70; RV64-FAST-NEXT:    sh a1, 0(a0)71; RV64-FAST-NEXT:    ret72entry:73  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 2, i1 false)74  ret void75}76 77define void @unaligned_memmove3(ptr nocapture %dest, ptr %src) nounwind {78; RV32-LABEL: unaligned_memmove3:79; RV32:       # %bb.0: # %entry80; RV32-NEXT:    lbu a2, 0(a1)81; RV32-NEXT:    lbu a3, 1(a1)82; RV32-NEXT:    lbu a1, 2(a1)83; RV32-NEXT:    sb a2, 0(a0)84; RV32-NEXT:    sb a3, 1(a0)85; RV32-NEXT:    sb a1, 2(a0)86; RV32-NEXT:    ret87;88; RV64-LABEL: unaligned_memmove3:89; RV64:       # %bb.0: # %entry90; RV64-NEXT:    lbu a2, 0(a1)91; RV64-NEXT:    lbu a3, 1(a1)92; RV64-NEXT:    lbu a1, 2(a1)93; RV64-NEXT:    sb a2, 0(a0)94; RV64-NEXT:    sb a3, 1(a0)95; RV64-NEXT:    sb a1, 2(a0)96; RV64-NEXT:    ret97;98; RV32-FAST-LABEL: unaligned_memmove3:99; RV32-FAST:       # %bb.0: # %entry100; RV32-FAST-NEXT:    lh a2, 0(a1)101; RV32-FAST-NEXT:    lbu a1, 2(a1)102; RV32-FAST-NEXT:    sh a2, 0(a0)103; RV32-FAST-NEXT:    sb a1, 2(a0)104; RV32-FAST-NEXT:    ret105;106; RV64-FAST-LABEL: unaligned_memmove3:107; RV64-FAST:       # %bb.0: # %entry108; RV64-FAST-NEXT:    lh a2, 0(a1)109; RV64-FAST-NEXT:    lbu a1, 2(a1)110; RV64-FAST-NEXT:    sh a2, 0(a0)111; RV64-FAST-NEXT:    sb a1, 2(a0)112; RV64-FAST-NEXT:    ret113entry:114  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 3, i1 false)115  ret void116}117 118define void @unaligned_memmove4(ptr nocapture %dest, ptr %src) nounwind {119; RV32-LABEL: unaligned_memmove4:120; RV32:       # %bb.0: # %entry121; RV32-NEXT:    lbu a2, 0(a1)122; RV32-NEXT:    lbu a3, 1(a1)123; RV32-NEXT:    lbu a4, 2(a1)124; RV32-NEXT:    lbu a1, 3(a1)125; RV32-NEXT:    sb a2, 0(a0)126; RV32-NEXT:    sb a3, 1(a0)127; RV32-NEXT:    sb a4, 2(a0)128; RV32-NEXT:    sb a1, 3(a0)129; RV32-NEXT:    ret130;131; RV64-LABEL: unaligned_memmove4:132; RV64:       # %bb.0: # %entry133; RV64-NEXT:    lbu a2, 0(a1)134; RV64-NEXT:    lbu a3, 1(a1)135; RV64-NEXT:    lbu a4, 2(a1)136; RV64-NEXT:    lbu a1, 3(a1)137; RV64-NEXT:    sb a2, 0(a0)138; RV64-NEXT:    sb a3, 1(a0)139; RV64-NEXT:    sb a4, 2(a0)140; RV64-NEXT:    sb a1, 3(a0)141; RV64-NEXT:    ret142;143; RV32-FAST-LABEL: unaligned_memmove4:144; RV32-FAST:       # %bb.0: # %entry145; RV32-FAST-NEXT:    lw a1, 0(a1)146; RV32-FAST-NEXT:    sw a1, 0(a0)147; RV32-FAST-NEXT:    ret148;149; RV64-FAST-LABEL: unaligned_memmove4:150; RV64-FAST:       # %bb.0: # %entry151; RV64-FAST-NEXT:    lw a1, 0(a1)152; RV64-FAST-NEXT:    sw a1, 0(a0)153; RV64-FAST-NEXT:    ret154entry:155  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 4, i1 false)156  ret void157}158 159define void @unaligned_memmove7(ptr nocapture %dest, ptr %src) nounwind {160; RV32-LABEL: unaligned_memmove7:161; RV32:       # %bb.0: # %entry162; RV32-NEXT:    lbu a2, 4(a1)163; RV32-NEXT:    lbu a3, 5(a1)164; RV32-NEXT:    lbu a4, 6(a1)165; RV32-NEXT:    lbu a5, 0(a1)166; RV32-NEXT:    lbu a6, 1(a1)167; RV32-NEXT:    lbu a7, 2(a1)168; RV32-NEXT:    lbu a1, 3(a1)169; RV32-NEXT:    sb a2, 4(a0)170; RV32-NEXT:    sb a3, 5(a0)171; RV32-NEXT:    sb a4, 6(a0)172; RV32-NEXT:    sb a5, 0(a0)173; RV32-NEXT:    sb a6, 1(a0)174; RV32-NEXT:    sb a7, 2(a0)175; RV32-NEXT:    sb a1, 3(a0)176; RV32-NEXT:    ret177;178; RV64-LABEL: unaligned_memmove7:179; RV64:       # %bb.0: # %entry180; RV64-NEXT:    lbu a2, 4(a1)181; RV64-NEXT:    lbu a3, 5(a1)182; RV64-NEXT:    lbu a4, 6(a1)183; RV64-NEXT:    lbu a5, 0(a1)184; RV64-NEXT:    lbu a6, 1(a1)185; RV64-NEXT:    lbu a7, 2(a1)186; RV64-NEXT:    lbu a1, 3(a1)187; RV64-NEXT:    sb a2, 4(a0)188; RV64-NEXT:    sb a3, 5(a0)189; RV64-NEXT:    sb a4, 6(a0)190; RV64-NEXT:    sb a5, 0(a0)191; RV64-NEXT:    sb a6, 1(a0)192; RV64-NEXT:    sb a7, 2(a0)193; RV64-NEXT:    sb a1, 3(a0)194; RV64-NEXT:    ret195;196; RV32-FAST-LABEL: unaligned_memmove7:197; RV32-FAST:       # %bb.0: # %entry198; RV32-FAST-NEXT:    lw a2, 0(a1)199; RV32-FAST-NEXT:    lh a3, 4(a1)200; RV32-FAST-NEXT:    lbu a1, 6(a1)201; RV32-FAST-NEXT:    sw a2, 0(a0)202; RV32-FAST-NEXT:    sh a3, 4(a0)203; RV32-FAST-NEXT:    sb a1, 6(a0)204; RV32-FAST-NEXT:    ret205;206; RV64-FAST-LABEL: unaligned_memmove7:207; RV64-FAST:       # %bb.0: # %entry208; RV64-FAST-NEXT:    lw a2, 0(a1)209; RV64-FAST-NEXT:    lh a3, 4(a1)210; RV64-FAST-NEXT:    lbu a1, 6(a1)211; RV64-FAST-NEXT:    sw a2, 0(a0)212; RV64-FAST-NEXT:    sh a3, 4(a0)213; RV64-FAST-NEXT:    sb a1, 6(a0)214; RV64-FAST-NEXT:    ret215entry:216  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 7, i1 false)217  ret void218}219 220define void @unaligned_memmove8(ptr nocapture %dest, ptr %src) nounwind {221; RV32-LABEL: unaligned_memmove8:222; RV32:       # %bb.0: # %entry223; RV32-NEXT:    lbu a2, 0(a1)224; RV32-NEXT:    lbu a3, 1(a1)225; RV32-NEXT:    lbu a4, 2(a1)226; RV32-NEXT:    lbu a5, 3(a1)227; RV32-NEXT:    lbu a6, 4(a1)228; RV32-NEXT:    lbu a7, 5(a1)229; RV32-NEXT:    lbu t0, 6(a1)230; RV32-NEXT:    lbu a1, 7(a1)231; RV32-NEXT:    sb a6, 4(a0)232; RV32-NEXT:    sb a7, 5(a0)233; RV32-NEXT:    sb t0, 6(a0)234; RV32-NEXT:    sb a1, 7(a0)235; RV32-NEXT:    sb a2, 0(a0)236; RV32-NEXT:    sb a3, 1(a0)237; RV32-NEXT:    sb a4, 2(a0)238; RV32-NEXT:    sb a5, 3(a0)239; RV32-NEXT:    ret240;241; RV64-LABEL: unaligned_memmove8:242; RV64:       # %bb.0: # %entry243; RV64-NEXT:    lbu a2, 0(a1)244; RV64-NEXT:    lbu a3, 1(a1)245; RV64-NEXT:    lbu a4, 2(a1)246; RV64-NEXT:    lbu a5, 3(a1)247; RV64-NEXT:    lbu a6, 4(a1)248; RV64-NEXT:    lbu a7, 5(a1)249; RV64-NEXT:    lbu t0, 6(a1)250; RV64-NEXT:    lbu a1, 7(a1)251; RV64-NEXT:    sb a6, 4(a0)252; RV64-NEXT:    sb a7, 5(a0)253; RV64-NEXT:    sb t0, 6(a0)254; RV64-NEXT:    sb a1, 7(a0)255; RV64-NEXT:    sb a2, 0(a0)256; RV64-NEXT:    sb a3, 1(a0)257; RV64-NEXT:    sb a4, 2(a0)258; RV64-NEXT:    sb a5, 3(a0)259; RV64-NEXT:    ret260;261; RV32-FAST-LABEL: unaligned_memmove8:262; RV32-FAST:       # %bb.0: # %entry263; RV32-FAST-NEXT:    lw a2, 0(a1)264; RV32-FAST-NEXT:    lw a1, 4(a1)265; RV32-FAST-NEXT:    sw a2, 0(a0)266; RV32-FAST-NEXT:    sw a1, 4(a0)267; RV32-FAST-NEXT:    ret268;269; RV64-FAST-LABEL: unaligned_memmove8:270; RV64-FAST:       # %bb.0: # %entry271; RV64-FAST-NEXT:    ld a1, 0(a1)272; RV64-FAST-NEXT:    sd a1, 0(a0)273; RV64-FAST-NEXT:    ret274entry:275  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 8, i1 false)276  ret void277}278 279define void @unaligned_memmove15(ptr nocapture %dest, ptr %src) nounwind {280; RV32-LABEL: unaligned_memmove15:281; RV32:       # %bb.0: # %entry282; RV32-NEXT:    li a2, 15283; RV32-NEXT:    tail memmove284;285; RV64-LABEL: unaligned_memmove15:286; RV64:       # %bb.0: # %entry287; RV64-NEXT:    li a2, 15288; RV64-NEXT:    tail memmove289;290; RV32-FAST-LABEL: unaligned_memmove15:291; RV32-FAST:       # %bb.0: # %entry292; RV32-FAST-NEXT:    lbu a2, 14(a1)293; RV32-FAST-NEXT:    lw a3, 0(a1)294; RV32-FAST-NEXT:    lw a4, 4(a1)295; RV32-FAST-NEXT:    lw a5, 8(a1)296; RV32-FAST-NEXT:    lh a1, 12(a1)297; RV32-FAST-NEXT:    sb a2, 14(a0)298; RV32-FAST-NEXT:    sw a3, 0(a0)299; RV32-FAST-NEXT:    sw a4, 4(a0)300; RV32-FAST-NEXT:    sw a5, 8(a0)301; RV32-FAST-NEXT:    sh a1, 12(a0)302; RV32-FAST-NEXT:    ret303;304; RV64-FAST-LABEL: unaligned_memmove15:305; RV64-FAST:       # %bb.0: # %entry306; RV64-FAST-NEXT:    ld a2, 0(a1)307; RV64-FAST-NEXT:    lw a3, 8(a1)308; RV64-FAST-NEXT:    lh a4, 12(a1)309; RV64-FAST-NEXT:    lbu a1, 14(a1)310; RV64-FAST-NEXT:    sd a2, 0(a0)311; RV64-FAST-NEXT:    sw a3, 8(a0)312; RV64-FAST-NEXT:    sh a4, 12(a0)313; RV64-FAST-NEXT:    sb a1, 14(a0)314; RV64-FAST-NEXT:    ret315entry:316  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 15, i1 false)317  ret void318}319 320define void @unaligned_memmove16(ptr nocapture %dest, ptr %src) nounwind {321; RV32-LABEL: unaligned_memmove16:322; RV32:       # %bb.0: # %entry323; RV32-NEXT:    li a2, 16324; RV32-NEXT:    tail memmove325;326; RV64-LABEL: unaligned_memmove16:327; RV64:       # %bb.0: # %entry328; RV64-NEXT:    li a2, 16329; RV64-NEXT:    tail memmove330;331; RV32-FAST-LABEL: unaligned_memmove16:332; RV32-FAST:       # %bb.0: # %entry333; RV32-FAST-NEXT:    lw a2, 0(a1)334; RV32-FAST-NEXT:    lw a3, 4(a1)335; RV32-FAST-NEXT:    lw a4, 8(a1)336; RV32-FAST-NEXT:    lw a1, 12(a1)337; RV32-FAST-NEXT:    sw a2, 0(a0)338; RV32-FAST-NEXT:    sw a3, 4(a0)339; RV32-FAST-NEXT:    sw a4, 8(a0)340; RV32-FAST-NEXT:    sw a1, 12(a0)341; RV32-FAST-NEXT:    ret342;343; RV64-FAST-LABEL: unaligned_memmove16:344; RV64-FAST:       # %bb.0: # %entry345; RV64-FAST-NEXT:    ld a2, 0(a1)346; RV64-FAST-NEXT:    ld a1, 8(a1)347; RV64-FAST-NEXT:    sd a2, 0(a0)348; RV64-FAST-NEXT:    sd a1, 8(a0)349; RV64-FAST-NEXT:    ret350entry:351  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 16, i1 false)352  ret void353}354 355define void @unaligned_memmove31(ptr nocapture %dest, ptr %src) nounwind {356; RV32-BOTH-LABEL: unaligned_memmove31:357; RV32-BOTH:       # %bb.0: # %entry358; RV32-BOTH-NEXT:    li a2, 31359; RV32-BOTH-NEXT:    tail memmove360;361; RV64-LABEL: unaligned_memmove31:362; RV64:       # %bb.0: # %entry363; RV64-NEXT:    li a2, 31364; RV64-NEXT:    tail memmove365;366; RV64-FAST-LABEL: unaligned_memmove31:367; RV64-FAST:       # %bb.0: # %entry368; RV64-FAST-NEXT:    lh a2, 28(a1)369; RV64-FAST-NEXT:    lbu a3, 30(a1)370; RV64-FAST-NEXT:    ld a4, 0(a1)371; RV64-FAST-NEXT:    ld a5, 8(a1)372; RV64-FAST-NEXT:    ld a6, 16(a1)373; RV64-FAST-NEXT:    lw a1, 24(a1)374; RV64-FAST-NEXT:    sh a2, 28(a0)375; RV64-FAST-NEXT:    sb a3, 30(a0)376; RV64-FAST-NEXT:    sd a4, 0(a0)377; RV64-FAST-NEXT:    sd a5, 8(a0)378; RV64-FAST-NEXT:    sd a6, 16(a0)379; RV64-FAST-NEXT:    sw a1, 24(a0)380; RV64-FAST-NEXT:    ret381entry:382  tail call void @llvm.memmove.p0.p0.i64(ptr %dest, ptr %src, i64 31, i1 false)383  ret void384}385 386; ----------------------------------------------------------------------387; Fully aligned cases388 389define void @aligned_memmove0(ptr nocapture %dest, ptr %src) nounwind {390; RV32-BOTH-LABEL: aligned_memmove0:391; RV32-BOTH:       # %bb.0: # %entry392; RV32-BOTH-NEXT:    ret393;394; RV64-BOTH-LABEL: aligned_memmove0:395; RV64-BOTH:       # %bb.0: # %entry396; RV64-BOTH-NEXT:    ret397entry:398  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 0, i1 false)399  ret void400}401 402define void @aligned_memmove1(ptr nocapture %dest, ptr %src) nounwind {403; RV32-BOTH-LABEL: aligned_memmove1:404; RV32-BOTH:       # %bb.0: # %entry405; RV32-BOTH-NEXT:    lbu a1, 0(a1)406; RV32-BOTH-NEXT:    sb a1, 0(a0)407; RV32-BOTH-NEXT:    ret408;409; RV64-BOTH-LABEL: aligned_memmove1:410; RV64-BOTH:       # %bb.0: # %entry411; RV64-BOTH-NEXT:    lbu a1, 0(a1)412; RV64-BOTH-NEXT:    sb a1, 0(a0)413; RV64-BOTH-NEXT:    ret414entry:415  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 1, i1 false)416  ret void417}418 419define void @aligned_memmove2(ptr nocapture %dest, ptr %src) nounwind {420; RV32-BOTH-LABEL: aligned_memmove2:421; RV32-BOTH:       # %bb.0: # %entry422; RV32-BOTH-NEXT:    lh a1, 0(a1)423; RV32-BOTH-NEXT:    sh a1, 0(a0)424; RV32-BOTH-NEXT:    ret425;426; RV64-BOTH-LABEL: aligned_memmove2:427; RV64-BOTH:       # %bb.0: # %entry428; RV64-BOTH-NEXT:    lh a1, 0(a1)429; RV64-BOTH-NEXT:    sh a1, 0(a0)430; RV64-BOTH-NEXT:    ret431entry:432  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 2, i1 false)433  ret void434}435 436define void @aligned_memmove3(ptr nocapture %dest, ptr %src) nounwind {437; RV32-BOTH-LABEL: aligned_memmove3:438; RV32-BOTH:       # %bb.0: # %entry439; RV32-BOTH-NEXT:    lh a2, 0(a1)440; RV32-BOTH-NEXT:    lbu a1, 2(a1)441; RV32-BOTH-NEXT:    sh a2, 0(a0)442; RV32-BOTH-NEXT:    sb a1, 2(a0)443; RV32-BOTH-NEXT:    ret444;445; RV64-BOTH-LABEL: aligned_memmove3:446; RV64-BOTH:       # %bb.0: # %entry447; RV64-BOTH-NEXT:    lh a2, 0(a1)448; RV64-BOTH-NEXT:    lbu a1, 2(a1)449; RV64-BOTH-NEXT:    sh a2, 0(a0)450; RV64-BOTH-NEXT:    sb a1, 2(a0)451; RV64-BOTH-NEXT:    ret452entry:453  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 3, i1 false)454  ret void455}456 457define void @aligned_memmove4(ptr nocapture %dest, ptr %src) nounwind {458; RV32-BOTH-LABEL: aligned_memmove4:459; RV32-BOTH:       # %bb.0: # %entry460; RV32-BOTH-NEXT:    lw a1, 0(a1)461; RV32-BOTH-NEXT:    sw a1, 0(a0)462; RV32-BOTH-NEXT:    ret463;464; RV64-BOTH-LABEL: aligned_memmove4:465; RV64-BOTH:       # %bb.0: # %entry466; RV64-BOTH-NEXT:    lw a1, 0(a1)467; RV64-BOTH-NEXT:    sw a1, 0(a0)468; RV64-BOTH-NEXT:    ret469entry:470  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 4, i1 false)471  ret void472}473 474define void @aligned_memmove7(ptr nocapture %dest, ptr %src) nounwind {475; RV32-BOTH-LABEL: aligned_memmove7:476; RV32-BOTH:       # %bb.0: # %entry477; RV32-BOTH-NEXT:    lw a2, 0(a1)478; RV32-BOTH-NEXT:    lh a3, 4(a1)479; RV32-BOTH-NEXT:    lbu a1, 6(a1)480; RV32-BOTH-NEXT:    sw a2, 0(a0)481; RV32-BOTH-NEXT:    sh a3, 4(a0)482; RV32-BOTH-NEXT:    sb a1, 6(a0)483; RV32-BOTH-NEXT:    ret484;485; RV64-BOTH-LABEL: aligned_memmove7:486; RV64-BOTH:       # %bb.0: # %entry487; RV64-BOTH-NEXT:    lw a2, 0(a1)488; RV64-BOTH-NEXT:    lh a3, 4(a1)489; RV64-BOTH-NEXT:    lbu a1, 6(a1)490; RV64-BOTH-NEXT:    sw a2, 0(a0)491; RV64-BOTH-NEXT:    sh a3, 4(a0)492; RV64-BOTH-NEXT:    sb a1, 6(a0)493; RV64-BOTH-NEXT:    ret494entry:495  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 7, i1 false)496  ret void497}498 499define void @aligned_memmove8(ptr nocapture %dest, ptr %src) nounwind {500; RV32-BOTH-LABEL: aligned_memmove8:501; RV32-BOTH:       # %bb.0: # %entry502; RV32-BOTH-NEXT:    lw a2, 0(a1)503; RV32-BOTH-NEXT:    sw a2, 0(a0)504; RV32-BOTH-NEXT:    lw a1, 4(a1)505; RV32-BOTH-NEXT:    sw a1, 4(a0)506; RV32-BOTH-NEXT:    ret507;508; RV64-BOTH-LABEL: aligned_memmove8:509; RV64-BOTH:       # %bb.0: # %entry510; RV64-BOTH-NEXT:    ld a1, 0(a1)511; RV64-BOTH-NEXT:    sd a1, 0(a0)512; RV64-BOTH-NEXT:    ret513entry:514  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 8, i1 false)515  ret void516}517 518define void @aligned_memmove15(ptr nocapture %dest, ptr %src) nounwind {519; RV32-BOTH-LABEL: aligned_memmove15:520; RV32-BOTH:       # %bb.0: # %entry521; RV32-BOTH-NEXT:    lw a2, 0(a1)522; RV32-BOTH-NEXT:    lw a3, 8(a1)523; RV32-BOTH-NEXT:    lh a4, 12(a1)524; RV32-BOTH-NEXT:    lbu a5, 14(a1)525; RV32-BOTH-NEXT:    sw a2, 0(a0)526; RV32-BOTH-NEXT:    lw a1, 4(a1)527; RV32-BOTH-NEXT:    sw a1, 4(a0)528; RV32-BOTH-NEXT:    sw a3, 8(a0)529; RV32-BOTH-NEXT:    sh a4, 12(a0)530; RV32-BOTH-NEXT:    sb a5, 14(a0)531; RV32-BOTH-NEXT:    ret532;533; RV64-BOTH-LABEL: aligned_memmove15:534; RV64-BOTH:       # %bb.0: # %entry535; RV64-BOTH-NEXT:    ld a2, 0(a1)536; RV64-BOTH-NEXT:    lw a3, 8(a1)537; RV64-BOTH-NEXT:    lh a4, 12(a1)538; RV64-BOTH-NEXT:    lbu a1, 14(a1)539; RV64-BOTH-NEXT:    sd a2, 0(a0)540; RV64-BOTH-NEXT:    sw a3, 8(a0)541; RV64-BOTH-NEXT:    sh a4, 12(a0)542; RV64-BOTH-NEXT:    sb a1, 14(a0)543; RV64-BOTH-NEXT:    ret544entry:545  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 15, i1 false)546  ret void547}548 549define void @aligned_memmove16(ptr nocapture %dest, ptr %src) nounwind {550; RV32-BOTH-LABEL: aligned_memmove16:551; RV32-BOTH:       # %bb.0: # %entry552; RV32-BOTH-NEXT:    lw a2, 0(a1)553; RV32-BOTH-NEXT:    lw a3, 8(a1)554; RV32-BOTH-NEXT:    sw a2, 0(a0)555; RV32-BOTH-NEXT:    lw a2, 4(a1)556; RV32-BOTH-NEXT:    lw a1, 12(a1)557; RV32-BOTH-NEXT:    sw a2, 4(a0)558; RV32-BOTH-NEXT:    sw a3, 8(a0)559; RV32-BOTH-NEXT:    sw a1, 12(a0)560; RV32-BOTH-NEXT:    ret561;562; RV64-BOTH-LABEL: aligned_memmove16:563; RV64-BOTH:       # %bb.0: # %entry564; RV64-BOTH-NEXT:    ld a2, 0(a1)565; RV64-BOTH-NEXT:    ld a1, 8(a1)566; RV64-BOTH-NEXT:    sd a2, 0(a0)567; RV64-BOTH-NEXT:    sd a1, 8(a0)568; RV64-BOTH-NEXT:    ret569entry:570  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 16, i1 false)571  ret void572}573 574define void @aligned_memmove31(ptr nocapture %dest, ptr %src) nounwind {575; RV32-BOTH-LABEL: aligned_memmove31:576; RV32-BOTH:       # %bb.0: # %entry577; RV32-BOTH-NEXT:    li a2, 31578; RV32-BOTH-NEXT:    tail memmove579;580; RV64-BOTH-LABEL: aligned_memmove31:581; RV64-BOTH:       # %bb.0: # %entry582; RV64-BOTH-NEXT:    lh a2, 28(a1)583; RV64-BOTH-NEXT:    lbu a3, 30(a1)584; RV64-BOTH-NEXT:    ld a4, 0(a1)585; RV64-BOTH-NEXT:    ld a5, 8(a1)586; RV64-BOTH-NEXT:    ld a6, 16(a1)587; RV64-BOTH-NEXT:    lw a1, 24(a1)588; RV64-BOTH-NEXT:    sh a2, 28(a0)589; RV64-BOTH-NEXT:    sb a3, 30(a0)590; RV64-BOTH-NEXT:    sd a4, 0(a0)591; RV64-BOTH-NEXT:    sd a5, 8(a0)592; RV64-BOTH-NEXT:    sd a6, 16(a0)593; RV64-BOTH-NEXT:    sw a1, 24(a0)594; RV64-BOTH-NEXT:    ret595entry:596  tail call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 31, i1 false)597  ret void598}599 600; ------------------------------------------------------------------------601; A few partially aligned cases602 603define void @memmove16_align4(ptr nocapture %dest, ptr nocapture %src) nounwind {604; RV32-BOTH-LABEL: memmove16_align4:605; RV32-BOTH:       # %bb.0: # %entry606; RV32-BOTH-NEXT:    lw a2, 0(a1)607; RV32-BOTH-NEXT:    lw a3, 4(a1)608; RV32-BOTH-NEXT:    lw a4, 8(a1)609; RV32-BOTH-NEXT:    lw a1, 12(a1)610; RV32-BOTH-NEXT:    sw a2, 0(a0)611; RV32-BOTH-NEXT:    sw a3, 4(a0)612; RV32-BOTH-NEXT:    sw a4, 8(a0)613; RV32-BOTH-NEXT:    sw a1, 12(a0)614; RV32-BOTH-NEXT:    ret615;616; RV64-LABEL: memmove16_align4:617; RV64:       # %bb.0: # %entry618; RV64-NEXT:    lw a2, 0(a1)619; RV64-NEXT:    lw a3, 4(a1)620; RV64-NEXT:    lw a4, 8(a1)621; RV64-NEXT:    lw a1, 12(a1)622; RV64-NEXT:    sw a2, 0(a0)623; RV64-NEXT:    sw a3, 4(a0)624; RV64-NEXT:    sw a4, 8(a0)625; RV64-NEXT:    sw a1, 12(a0)626; RV64-NEXT:    ret627;628; RV64-FAST-LABEL: memmove16_align4:629; RV64-FAST:       # %bb.0: # %entry630; RV64-FAST-NEXT:    ld a2, 0(a1)631; RV64-FAST-NEXT:    ld a1, 8(a1)632; RV64-FAST-NEXT:    sd a2, 0(a0)633; RV64-FAST-NEXT:    sd a1, 8(a0)634; RV64-FAST-NEXT:    ret635entry:636  tail call void @llvm.memmove.p0.p0.i64(ptr align 4 %dest, ptr align 4 %src, i64 16, i1 false)637  ret void638}639 640define i32 @memmove11_align8(ptr nocapture %dest, ptr %src) {641; RV32-BOTH-LABEL: memmove11_align8:642; RV32-BOTH:       # %bb.0: # %entry643; RV32-BOTH-NEXT:    lw a2, 0(a1)644; RV32-BOTH-NEXT:    lh a3, 8(a1)645; RV32-BOTH-NEXT:    lbu a4, 10(a1)646; RV32-BOTH-NEXT:    sw a2, 0(a0)647; RV32-BOTH-NEXT:    lw a1, 4(a1)648; RV32-BOTH-NEXT:    sw a1, 4(a0)649; RV32-BOTH-NEXT:    sh a3, 8(a0)650; RV32-BOTH-NEXT:    sb a4, 10(a0)651; RV32-BOTH-NEXT:    li a0, 0652; RV32-BOTH-NEXT:    ret653;654; RV64-BOTH-LABEL: memmove11_align8:655; RV64-BOTH:       # %bb.0: # %entry656; RV64-BOTH-NEXT:    ld a2, 0(a1)657; RV64-BOTH-NEXT:    lh a3, 8(a1)658; RV64-BOTH-NEXT:    lbu a1, 10(a1)659; RV64-BOTH-NEXT:    sd a2, 0(a0)660; RV64-BOTH-NEXT:    sh a3, 8(a0)661; RV64-BOTH-NEXT:    sb a1, 10(a0)662; RV64-BOTH-NEXT:    li a0, 0663; RV64-BOTH-NEXT:    ret664entry:665  call void @llvm.memmove.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 11, i1 false)666  ret i32 0667}668 669