brintos

brintos / llvm-project-archived public Read only

0
0
Text · 35.3 KiB · 90a8c68 Raw
1112 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=riscv32 -mattr=+v \3; RUN:   | FileCheck %s --check-prefixes=RV32-BOTH,RV324; RUN: llc < %s -mtriple=riscv64 -mattr=+v \5; RUN:   | FileCheck %s --check-prefixes=RV64-BOTH,RV646; RUN: llc < %s -mtriple=riscv32 -mattr=+v,+unaligned-scalar-mem,+unaligned-vector-mem \7; RUN:   | FileCheck %s --check-prefixes=RV32-BOTH,RV32-FAST8; RUN: llc < %s -mtriple=riscv64 -mattr=+v,+unaligned-scalar-mem,+unaligned-vector-mem \9; RUN:   | FileCheck %s --check-prefixes=RV64-BOTH,RV64-FAST10 11; ----------------------------------------------------------------------12; Fully unaligned cases13 14define void @unaligned_memcpy1(ptr nocapture %dest, ptr %src) nounwind {15; RV32-BOTH-LABEL: unaligned_memcpy1:16; RV32-BOTH:       # %bb.0: # %entry17; RV32-BOTH-NEXT:    lbu a1, 0(a1)18; RV32-BOTH-NEXT:    sb a1, 0(a0)19; RV32-BOTH-NEXT:    ret20;21; RV64-BOTH-LABEL: unaligned_memcpy1:22; RV64-BOTH:       # %bb.0: # %entry23; RV64-BOTH-NEXT:    lbu a1, 0(a1)24; RV64-BOTH-NEXT:    sb a1, 0(a0)25; RV64-BOTH-NEXT:    ret26entry:27  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 1, i1 false)28  ret void29}30 31define void @unaligned_memcpy2(ptr nocapture %dest, ptr %src) nounwind {32; RV32-LABEL: unaligned_memcpy2:33; RV32:       # %bb.0: # %entry34; RV32-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma35; RV32-NEXT:    vle8.v v8, (a1)36; RV32-NEXT:    vse8.v v8, (a0)37; RV32-NEXT:    ret38;39; RV64-LABEL: unaligned_memcpy2:40; RV64:       # %bb.0: # %entry41; RV64-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma42; RV64-NEXT:    vle8.v v8, (a1)43; RV64-NEXT:    vse8.v v8, (a0)44; RV64-NEXT:    ret45;46; RV32-FAST-LABEL: unaligned_memcpy2:47; RV32-FAST:       # %bb.0: # %entry48; RV32-FAST-NEXT:    lh a1, 0(a1)49; RV32-FAST-NEXT:    sh a1, 0(a0)50; RV32-FAST-NEXT:    ret51;52; RV64-FAST-LABEL: unaligned_memcpy2:53; RV64-FAST:       # %bb.0: # %entry54; RV64-FAST-NEXT:    lh a1, 0(a1)55; RV64-FAST-NEXT:    sh a1, 0(a0)56; RV64-FAST-NEXT:    ret57entry:58  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 2, i1 false)59  ret void60}61 62define void @unaligned_memcpy3(ptr nocapture %dest, ptr %src) nounwind {63; RV32-LABEL: unaligned_memcpy3:64; RV32:       # %bb.0: # %entry65; RV32-NEXT:    lbu a2, 2(a1)66; RV32-NEXT:    sb a2, 2(a0)67; RV32-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma68; RV32-NEXT:    vle8.v v8, (a1)69; RV32-NEXT:    vse8.v v8, (a0)70; RV32-NEXT:    ret71;72; RV64-LABEL: unaligned_memcpy3:73; RV64:       # %bb.0: # %entry74; RV64-NEXT:    lbu a2, 2(a1)75; RV64-NEXT:    sb a2, 2(a0)76; RV64-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma77; RV64-NEXT:    vle8.v v8, (a1)78; RV64-NEXT:    vse8.v v8, (a0)79; RV64-NEXT:    ret80;81; RV32-FAST-LABEL: unaligned_memcpy3:82; RV32-FAST:       # %bb.0: # %entry83; RV32-FAST-NEXT:    lbu a2, 2(a1)84; RV32-FAST-NEXT:    sb a2, 2(a0)85; RV32-FAST-NEXT:    lh a1, 0(a1)86; RV32-FAST-NEXT:    sh a1, 0(a0)87; RV32-FAST-NEXT:    ret88;89; RV64-FAST-LABEL: unaligned_memcpy3:90; RV64-FAST:       # %bb.0: # %entry91; RV64-FAST-NEXT:    lbu a2, 2(a1)92; RV64-FAST-NEXT:    sb a2, 2(a0)93; RV64-FAST-NEXT:    lh a1, 0(a1)94; RV64-FAST-NEXT:    sh a1, 0(a0)95; RV64-FAST-NEXT:    ret96entry:97  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 3, i1 false)98  ret void99}100 101define void @unaligned_memcpy4(ptr nocapture %dest, ptr %src) nounwind {102; RV32-LABEL: unaligned_memcpy4:103; RV32:       # %bb.0: # %entry104; RV32-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma105; RV32-NEXT:    vle8.v v8, (a1)106; RV32-NEXT:    vse8.v v8, (a0)107; RV32-NEXT:    ret108;109; RV64-LABEL: unaligned_memcpy4:110; RV64:       # %bb.0: # %entry111; RV64-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma112; RV64-NEXT:    vle8.v v8, (a1)113; RV64-NEXT:    vse8.v v8, (a0)114; RV64-NEXT:    ret115;116; RV32-FAST-LABEL: unaligned_memcpy4:117; RV32-FAST:       # %bb.0: # %entry118; RV32-FAST-NEXT:    lw a1, 0(a1)119; RV32-FAST-NEXT:    sw a1, 0(a0)120; RV32-FAST-NEXT:    ret121;122; RV64-FAST-LABEL: unaligned_memcpy4:123; RV64-FAST:       # %bb.0: # %entry124; RV64-FAST-NEXT:    lw a1, 0(a1)125; RV64-FAST-NEXT:    sw a1, 0(a0)126; RV64-FAST-NEXT:    ret127entry:128  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 4, i1 false)129  ret void130}131 132define void @unaligned_memcpy7(ptr nocapture %dest, ptr %src) nounwind {133; RV32-LABEL: unaligned_memcpy7:134; RV32:       # %bb.0: # %entry135; RV32-NEXT:    lbu a2, 6(a1)136; RV32-NEXT:    sb a2, 6(a0)137; RV32-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma138; RV32-NEXT:    vle8.v v8, (a1)139; RV32-NEXT:    vse8.v v8, (a0)140; RV32-NEXT:    addi a1, a1, 4141; RV32-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma142; RV32-NEXT:    vle8.v v8, (a1)143; RV32-NEXT:    addi a0, a0, 4144; RV32-NEXT:    vse8.v v8, (a0)145; RV32-NEXT:    ret146;147; RV64-LABEL: unaligned_memcpy7:148; RV64:       # %bb.0: # %entry149; RV64-NEXT:    lbu a2, 6(a1)150; RV64-NEXT:    sb a2, 6(a0)151; RV64-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma152; RV64-NEXT:    vle8.v v8, (a1)153; RV64-NEXT:    vse8.v v8, (a0)154; RV64-NEXT:    addi a1, a1, 4155; RV64-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma156; RV64-NEXT:    vle8.v v8, (a1)157; RV64-NEXT:    addi a0, a0, 4158; RV64-NEXT:    vse8.v v8, (a0)159; RV64-NEXT:    ret160;161; RV32-FAST-LABEL: unaligned_memcpy7:162; RV32-FAST:       # %bb.0: # %entry163; RV32-FAST-NEXT:    lw a2, 3(a1)164; RV32-FAST-NEXT:    sw a2, 3(a0)165; RV32-FAST-NEXT:    lw a1, 0(a1)166; RV32-FAST-NEXT:    sw a1, 0(a0)167; RV32-FAST-NEXT:    ret168;169; RV64-FAST-LABEL: unaligned_memcpy7:170; RV64-FAST:       # %bb.0: # %entry171; RV64-FAST-NEXT:    lw a2, 3(a1)172; RV64-FAST-NEXT:    sw a2, 3(a0)173; RV64-FAST-NEXT:    lw a1, 0(a1)174; RV64-FAST-NEXT:    sw a1, 0(a0)175; RV64-FAST-NEXT:    ret176entry:177  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 7, i1 false)178  ret void179}180 181define void @unaligned_memcpy8(ptr nocapture %dest, ptr %src) nounwind {182; RV32-LABEL: unaligned_memcpy8:183; RV32:       # %bb.0: # %entry184; RV32-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma185; RV32-NEXT:    vle8.v v8, (a1)186; RV32-NEXT:    vse8.v v8, (a0)187; RV32-NEXT:    ret188;189; RV64-LABEL: unaligned_memcpy8:190; RV64:       # %bb.0: # %entry191; RV64-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma192; RV64-NEXT:    vle8.v v8, (a1)193; RV64-NEXT:    vse8.v v8, (a0)194; RV64-NEXT:    ret195;196; RV32-FAST-LABEL: unaligned_memcpy8:197; RV32-FAST:       # %bb.0: # %entry198; RV32-FAST-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma199; RV32-FAST-NEXT:    vle32.v v8, (a1)200; RV32-FAST-NEXT:    vse32.v v8, (a0)201; RV32-FAST-NEXT:    ret202;203; RV64-FAST-LABEL: unaligned_memcpy8:204; RV64-FAST:       # %bb.0: # %entry205; RV64-FAST-NEXT:    ld a1, 0(a1)206; RV64-FAST-NEXT:    sd a1, 0(a0)207; RV64-FAST-NEXT:    ret208entry:209  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 8, i1 false)210  ret void211}212 213define void @unaligned_memcpy15(ptr nocapture %dest, ptr %src) nounwind {214; RV32-LABEL: unaligned_memcpy15:215; RV32:       # %bb.0: # %entry216; RV32-NEXT:    lbu a2, 14(a1)217; RV32-NEXT:    sb a2, 14(a0)218; RV32-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma219; RV32-NEXT:    vle8.v v8, (a1)220; RV32-NEXT:    addi a2, a1, 12221; RV32-NEXT:    vse8.v v8, (a0)222; RV32-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma223; RV32-NEXT:    vle8.v v8, (a2)224; RV32-NEXT:    addi a2, a0, 12225; RV32-NEXT:    vse8.v v8, (a2)226; RV32-NEXT:    addi a1, a1, 8227; RV32-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma228; RV32-NEXT:    vle8.v v8, (a1)229; RV32-NEXT:    addi a0, a0, 8230; RV32-NEXT:    vse8.v v8, (a0)231; RV32-NEXT:    ret232;233; RV64-LABEL: unaligned_memcpy15:234; RV64:       # %bb.0: # %entry235; RV64-NEXT:    lbu a2, 14(a1)236; RV64-NEXT:    sb a2, 14(a0)237; RV64-NEXT:    vsetivli zero, 8, e8, mf2, ta, ma238; RV64-NEXT:    vle8.v v8, (a1)239; RV64-NEXT:    addi a2, a1, 12240; RV64-NEXT:    vse8.v v8, (a0)241; RV64-NEXT:    vsetivli zero, 2, e8, mf8, ta, ma242; RV64-NEXT:    vle8.v v8, (a2)243; RV64-NEXT:    addi a2, a0, 12244; RV64-NEXT:    vse8.v v8, (a2)245; RV64-NEXT:    addi a1, a1, 8246; RV64-NEXT:    vsetivli zero, 4, e8, mf4, ta, ma247; RV64-NEXT:    vle8.v v8, (a1)248; RV64-NEXT:    addi a0, a0, 8249; RV64-NEXT:    vse8.v v8, (a0)250; RV64-NEXT:    ret251;252; RV32-FAST-LABEL: unaligned_memcpy15:253; RV32-FAST:       # %bb.0: # %entry254; RV32-FAST-NEXT:    lw a2, 11(a1)255; RV32-FAST-NEXT:    sw a2, 11(a0)256; RV32-FAST-NEXT:    lw a2, 8(a1)257; RV32-FAST-NEXT:    sw a2, 8(a0)258; RV32-FAST-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma259; RV32-FAST-NEXT:    vle32.v v8, (a1)260; RV32-FAST-NEXT:    vse32.v v8, (a0)261; RV32-FAST-NEXT:    ret262;263; RV64-FAST-LABEL: unaligned_memcpy15:264; RV64-FAST:       # %bb.0: # %entry265; RV64-FAST-NEXT:    ld a2, 7(a1)266; RV64-FAST-NEXT:    sd a2, 7(a0)267; RV64-FAST-NEXT:    ld a1, 0(a1)268; RV64-FAST-NEXT:    sd a1, 0(a0)269; RV64-FAST-NEXT:    ret270entry:271  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 15, i1 false)272  ret void273}274 275define void @unaligned_memcpy16(ptr nocapture %dest, ptr %src) nounwind {276; RV32-LABEL: unaligned_memcpy16:277; RV32:       # %bb.0: # %entry278; RV32-NEXT:    vsetivli zero, 16, e8, m1, ta, ma279; RV32-NEXT:    vle8.v v8, (a1)280; RV32-NEXT:    vse8.v v8, (a0)281; RV32-NEXT:    ret282;283; RV64-LABEL: unaligned_memcpy16:284; RV64:       # %bb.0: # %entry285; RV64-NEXT:    vsetivli zero, 16, e8, m1, ta, ma286; RV64-NEXT:    vle8.v v8, (a1)287; RV64-NEXT:    vse8.v v8, (a0)288; RV64-NEXT:    ret289;290; RV32-FAST-LABEL: unaligned_memcpy16:291; RV32-FAST:       # %bb.0: # %entry292; RV32-FAST-NEXT:    vsetivli zero, 2, e64, m1, ta, ma293; RV32-FAST-NEXT:    vle64.v v8, (a1)294; RV32-FAST-NEXT:    vse64.v v8, (a0)295; RV32-FAST-NEXT:    ret296;297; RV64-FAST-LABEL: unaligned_memcpy16:298; RV64-FAST:       # %bb.0: # %entry299; RV64-FAST-NEXT:    vsetivli zero, 2, e64, m1, ta, ma300; RV64-FAST-NEXT:    vle64.v v8, (a1)301; RV64-FAST-NEXT:    vse64.v v8, (a0)302; RV64-FAST-NEXT:    ret303entry:304  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 16, i1 false)305  ret void306}307 308define void @unaligned_memcpy31(ptr nocapture %dest, ptr %src) nounwind {309; RV32-LABEL: unaligned_memcpy31:310; RV32:       # %bb.0: # %entry311; RV32-NEXT:    vsetivli zero, 16, e8, m1, ta, ma312; RV32-NEXT:    vle8.v v8, (a1)313; RV32-NEXT:    vse8.v v8, (a0)314; RV32-NEXT:    addi a1, a1, 15315; RV32-NEXT:    vle8.v v8, (a1)316; RV32-NEXT:    addi a0, a0, 15317; RV32-NEXT:    vse8.v v8, (a0)318; RV32-NEXT:    ret319;320; RV64-LABEL: unaligned_memcpy31:321; RV64:       # %bb.0: # %entry322; RV64-NEXT:    vsetivli zero, 16, e8, m1, ta, ma323; RV64-NEXT:    vle8.v v8, (a1)324; RV64-NEXT:    vse8.v v8, (a0)325; RV64-NEXT:    addi a1, a1, 15326; RV64-NEXT:    vle8.v v8, (a1)327; RV64-NEXT:    addi a0, a0, 15328; RV64-NEXT:    vse8.v v8, (a0)329; RV64-NEXT:    ret330;331; RV32-FAST-LABEL: unaligned_memcpy31:332; RV32-FAST:       # %bb.0: # %entry333; RV32-FAST-NEXT:    vsetivli zero, 2, e64, m1, ta, ma334; RV32-FAST-NEXT:    vle64.v v8, (a1)335; RV32-FAST-NEXT:    vse64.v v8, (a0)336; RV32-FAST-NEXT:    addi a1, a1, 15337; RV32-FAST-NEXT:    vle64.v v8, (a1)338; RV32-FAST-NEXT:    addi a0, a0, 15339; RV32-FAST-NEXT:    vse64.v v8, (a0)340; RV32-FAST-NEXT:    ret341;342; RV64-FAST-LABEL: unaligned_memcpy31:343; RV64-FAST:       # %bb.0: # %entry344; RV64-FAST-NEXT:    vsetivli zero, 2, e64, m1, ta, ma345; RV64-FAST-NEXT:    vle64.v v8, (a1)346; RV64-FAST-NEXT:    vse64.v v8, (a0)347; RV64-FAST-NEXT:    addi a1, a1, 15348; RV64-FAST-NEXT:    vle64.v v8, (a1)349; RV64-FAST-NEXT:    addi a0, a0, 15350; RV64-FAST-NEXT:    vse64.v v8, (a0)351; RV64-FAST-NEXT:    ret352entry:353  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 31, i1 false)354  ret void355}356 357define void @unaligned_memcpy32(ptr nocapture %dest, ptr %src) nounwind {358; RV32-LABEL: unaligned_memcpy32:359; RV32:       # %bb.0: # %entry360; RV32-NEXT:    li a2, 32361; RV32-NEXT:    vsetvli zero, a2, e8, m2, ta, ma362; RV32-NEXT:    vle8.v v8, (a1)363; RV32-NEXT:    vse8.v v8, (a0)364; RV32-NEXT:    ret365;366; RV64-LABEL: unaligned_memcpy32:367; RV64:       # %bb.0: # %entry368; RV64-NEXT:    li a2, 32369; RV64-NEXT:    vsetvli zero, a2, e8, m2, ta, ma370; RV64-NEXT:    vle8.v v8, (a1)371; RV64-NEXT:    vse8.v v8, (a0)372; RV64-NEXT:    ret373;374; RV32-FAST-LABEL: unaligned_memcpy32:375; RV32-FAST:       # %bb.0: # %entry376; RV32-FAST-NEXT:    vsetivli zero, 4, e64, m2, ta, ma377; RV32-FAST-NEXT:    vle64.v v8, (a1)378; RV32-FAST-NEXT:    vse64.v v8, (a0)379; RV32-FAST-NEXT:    ret380;381; RV64-FAST-LABEL: unaligned_memcpy32:382; RV64-FAST:       # %bb.0: # %entry383; RV64-FAST-NEXT:    vsetivli zero, 4, e64, m2, ta, ma384; RV64-FAST-NEXT:    vle64.v v8, (a1)385; RV64-FAST-NEXT:    vse64.v v8, (a0)386; RV64-FAST-NEXT:    ret387entry:388  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 32, i1 false)389  ret void390}391 392define void @unaligned_memcpy64(ptr nocapture %dest, ptr %src) nounwind {393; RV32-LABEL: unaligned_memcpy64:394; RV32:       # %bb.0: # %entry395; RV32-NEXT:    li a2, 64396; RV32-NEXT:    vsetvli zero, a2, e8, m4, ta, ma397; RV32-NEXT:    vle8.v v8, (a1)398; RV32-NEXT:    vse8.v v8, (a0)399; RV32-NEXT:    ret400;401; RV64-LABEL: unaligned_memcpy64:402; RV64:       # %bb.0: # %entry403; RV64-NEXT:    li a2, 64404; RV64-NEXT:    vsetvli zero, a2, e8, m4, ta, ma405; RV64-NEXT:    vle8.v v8, (a1)406; RV64-NEXT:    vse8.v v8, (a0)407; RV64-NEXT:    ret408;409; RV32-FAST-LABEL: unaligned_memcpy64:410; RV32-FAST:       # %bb.0: # %entry411; RV32-FAST-NEXT:    vsetivli zero, 8, e64, m4, ta, ma412; RV32-FAST-NEXT:    vle64.v v8, (a1)413; RV32-FAST-NEXT:    vse64.v v8, (a0)414; RV32-FAST-NEXT:    ret415;416; RV64-FAST-LABEL: unaligned_memcpy64:417; RV64-FAST:       # %bb.0: # %entry418; RV64-FAST-NEXT:    vsetivli zero, 8, e64, m4, ta, ma419; RV64-FAST-NEXT:    vle64.v v8, (a1)420; RV64-FAST-NEXT:    vse64.v v8, (a0)421; RV64-FAST-NEXT:    ret422entry:423  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 64, i1 false)424  ret void425}426 427define void @unaligned_memcpy96(ptr nocapture %dest, ptr %src) nounwind {428; RV32-LABEL: unaligned_memcpy96:429; RV32:       # %bb.0: # %entry430; RV32-NEXT:    li a2, 64431; RV32-NEXT:    vsetvli zero, a2, e8, m4, ta, ma432; RV32-NEXT:    vle8.v v8, (a1)433; RV32-NEXT:    addi a1, a1, 64434; RV32-NEXT:    vse8.v v8, (a0)435; RV32-NEXT:    li a2, 32436; RV32-NEXT:    vsetvli zero, a2, e8, m2, ta, ma437; RV32-NEXT:    vle8.v v8, (a1)438; RV32-NEXT:    addi a0, a0, 64439; RV32-NEXT:    vse8.v v8, (a0)440; RV32-NEXT:    ret441;442; RV64-LABEL: unaligned_memcpy96:443; RV64:       # %bb.0: # %entry444; RV64-NEXT:    li a2, 64445; RV64-NEXT:    vsetvli zero, a2, e8, m4, ta, ma446; RV64-NEXT:    vle8.v v8, (a1)447; RV64-NEXT:    addi a1, a1, 64448; RV64-NEXT:    vse8.v v8, (a0)449; RV64-NEXT:    li a2, 32450; RV64-NEXT:    vsetvli zero, a2, e8, m2, ta, ma451; RV64-NEXT:    vle8.v v8, (a1)452; RV64-NEXT:    addi a0, a0, 64453; RV64-NEXT:    vse8.v v8, (a0)454; RV64-NEXT:    ret455;456; RV32-FAST-LABEL: unaligned_memcpy96:457; RV32-FAST:       # %bb.0: # %entry458; RV32-FAST-NEXT:    vsetivli zero, 8, e64, m4, ta, ma459; RV32-FAST-NEXT:    vle64.v v8, (a1)460; RV32-FAST-NEXT:    vse64.v v8, (a0)461; RV32-FAST-NEXT:    addi a1, a1, 64462; RV32-FAST-NEXT:    vsetivli zero, 4, e64, m2, ta, ma463; RV32-FAST-NEXT:    vle64.v v8, (a1)464; RV32-FAST-NEXT:    addi a0, a0, 64465; RV32-FAST-NEXT:    vse64.v v8, (a0)466; RV32-FAST-NEXT:    ret467;468; RV64-FAST-LABEL: unaligned_memcpy96:469; RV64-FAST:       # %bb.0: # %entry470; RV64-FAST-NEXT:    vsetivli zero, 8, e64, m4, ta, ma471; RV64-FAST-NEXT:    vle64.v v8, (a1)472; RV64-FAST-NEXT:    vse64.v v8, (a0)473; RV64-FAST-NEXT:    addi a1, a1, 64474; RV64-FAST-NEXT:    vsetivli zero, 4, e64, m2, ta, ma475; RV64-FAST-NEXT:    vle64.v v8, (a1)476; RV64-FAST-NEXT:    addi a0, a0, 64477; RV64-FAST-NEXT:    vse64.v v8, (a0)478; RV64-FAST-NEXT:    ret479entry:480  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 96, i1 false)481  ret void482}483 484define void @unaligned_memcpy128(ptr nocapture %dest, ptr %src) nounwind {485; RV32-LABEL: unaligned_memcpy128:486; RV32:       # %bb.0: # %entry487; RV32-NEXT:    li a2, 128488; RV32-NEXT:    vsetvli zero, a2, e8, m8, ta, ma489; RV32-NEXT:    vle8.v v8, (a1)490; RV32-NEXT:    vse8.v v8, (a0)491; RV32-NEXT:    ret492;493; RV64-LABEL: unaligned_memcpy128:494; RV64:       # %bb.0: # %entry495; RV64-NEXT:    li a2, 128496; RV64-NEXT:    vsetvli zero, a2, e8, m8, ta, ma497; RV64-NEXT:    vle8.v v8, (a1)498; RV64-NEXT:    vse8.v v8, (a0)499; RV64-NEXT:    ret500;501; RV32-FAST-LABEL: unaligned_memcpy128:502; RV32-FAST:       # %bb.0: # %entry503; RV32-FAST-NEXT:    vsetivli zero, 16, e64, m8, ta, ma504; RV32-FAST-NEXT:    vle64.v v8, (a1)505; RV32-FAST-NEXT:    vse64.v v8, (a0)506; RV32-FAST-NEXT:    ret507;508; RV64-FAST-LABEL: unaligned_memcpy128:509; RV64-FAST:       # %bb.0: # %entry510; RV64-FAST-NEXT:    vsetivli zero, 16, e64, m8, ta, ma511; RV64-FAST-NEXT:    vle64.v v8, (a1)512; RV64-FAST-NEXT:    vse64.v v8, (a0)513; RV64-FAST-NEXT:    ret514entry:515  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 128, i1 false)516  ret void517}518 519define void @unaligned_memcpy196(ptr nocapture %dest, ptr %src) nounwind {520; RV32-LABEL: unaligned_memcpy196:521; RV32:       # %bb.0: # %entry522; RV32-NEXT:    li a2, 128523; RV32-NEXT:    vsetvli zero, a2, e8, m8, ta, ma524; RV32-NEXT:    vle8.v v8, (a1)525; RV32-NEXT:    addi a2, a1, 128526; RV32-NEXT:    vse8.v v8, (a0)527; RV32-NEXT:    li a3, 64528; RV32-NEXT:    vsetvli zero, a3, e8, m4, ta, ma529; RV32-NEXT:    vle8.v v8, (a2)530; RV32-NEXT:    addi a2, a0, 128531; RV32-NEXT:    vse8.v v8, (a2)532; RV32-NEXT:    lbu a2, 195(a1)533; RV32-NEXT:    sb a2, 195(a0)534; RV32-NEXT:    lbu a2, 194(a1)535; RV32-NEXT:    sb a2, 194(a0)536; RV32-NEXT:    lbu a2, 193(a1)537; RV32-NEXT:    sb a2, 193(a0)538; RV32-NEXT:    lbu a1, 192(a1)539; RV32-NEXT:    sb a1, 192(a0)540; RV32-NEXT:    ret541;542; RV64-LABEL: unaligned_memcpy196:543; RV64:       # %bb.0: # %entry544; RV64-NEXT:    li a2, 128545; RV64-NEXT:    vsetvli zero, a2, e8, m8, ta, ma546; RV64-NEXT:    vle8.v v8, (a1)547; RV64-NEXT:    addi a2, a1, 128548; RV64-NEXT:    vse8.v v8, (a0)549; RV64-NEXT:    li a3, 64550; RV64-NEXT:    vsetvli zero, a3, e8, m4, ta, ma551; RV64-NEXT:    vle8.v v8, (a2)552; RV64-NEXT:    addi a2, a0, 128553; RV64-NEXT:    vse8.v v8, (a2)554; RV64-NEXT:    lbu a2, 195(a1)555; RV64-NEXT:    sb a2, 195(a0)556; RV64-NEXT:    lbu a2, 194(a1)557; RV64-NEXT:    sb a2, 194(a0)558; RV64-NEXT:    lbu a2, 193(a1)559; RV64-NEXT:    sb a2, 193(a0)560; RV64-NEXT:    lbu a1, 192(a1)561; RV64-NEXT:    sb a1, 192(a0)562; RV64-NEXT:    ret563;564; RV32-FAST-LABEL: unaligned_memcpy196:565; RV32-FAST:       # %bb.0: # %entry566; RV32-FAST-NEXT:    lw a2, 192(a1)567; RV32-FAST-NEXT:    sw a2, 192(a0)568; RV32-FAST-NEXT:    vsetivli zero, 16, e64, m8, ta, ma569; RV32-FAST-NEXT:    vle64.v v8, (a1)570; RV32-FAST-NEXT:    vse64.v v8, (a0)571; RV32-FAST-NEXT:    addi a1, a1, 128572; RV32-FAST-NEXT:    vsetivli zero, 8, e64, m4, ta, ma573; RV32-FAST-NEXT:    vle64.v v8, (a1)574; RV32-FAST-NEXT:    addi a0, a0, 128575; RV32-FAST-NEXT:    vse64.v v8, (a0)576; RV32-FAST-NEXT:    ret577;578; RV64-FAST-LABEL: unaligned_memcpy196:579; RV64-FAST:       # %bb.0: # %entry580; RV64-FAST-NEXT:    lw a2, 192(a1)581; RV64-FAST-NEXT:    sw a2, 192(a0)582; RV64-FAST-NEXT:    vsetivli zero, 16, e64, m8, ta, ma583; RV64-FAST-NEXT:    vle64.v v8, (a1)584; RV64-FAST-NEXT:    vse64.v v8, (a0)585; RV64-FAST-NEXT:    addi a1, a1, 128586; RV64-FAST-NEXT:    vsetivli zero, 8, e64, m4, ta, ma587; RV64-FAST-NEXT:    vle64.v v8, (a1)588; RV64-FAST-NEXT:    addi a0, a0, 128589; RV64-FAST-NEXT:    vse64.v v8, (a0)590; RV64-FAST-NEXT:    ret591entry:592  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 196, i1 false)593  ret void594}595 596define void @unaligned_memcpy256(ptr nocapture %dest, ptr %src) nounwind {597; RV32-LABEL: unaligned_memcpy256:598; RV32:       # %bb.0: # %entry599; RV32-NEXT:    li a2, 128600; RV32-NEXT:    vsetvli zero, a2, e8, m8, ta, ma601; RV32-NEXT:    vle8.v v8, (a1)602; RV32-NEXT:    vse8.v v8, (a0)603; RV32-NEXT:    addi a1, a1, 128604; RV32-NEXT:    vle8.v v8, (a1)605; RV32-NEXT:    addi a0, a0, 128606; RV32-NEXT:    vse8.v v8, (a0)607; RV32-NEXT:    ret608;609; RV64-LABEL: unaligned_memcpy256:610; RV64:       # %bb.0: # %entry611; RV64-NEXT:    li a2, 128612; RV64-NEXT:    vsetvli zero, a2, e8, m8, ta, ma613; RV64-NEXT:    vle8.v v8, (a1)614; RV64-NEXT:    vse8.v v8, (a0)615; RV64-NEXT:    addi a1, a1, 128616; RV64-NEXT:    vle8.v v8, (a1)617; RV64-NEXT:    addi a0, a0, 128618; RV64-NEXT:    vse8.v v8, (a0)619; RV64-NEXT:    ret620;621; RV32-FAST-LABEL: unaligned_memcpy256:622; RV32-FAST:       # %bb.0: # %entry623; RV32-FAST-NEXT:    vsetivli zero, 16, e64, m8, ta, ma624; RV32-FAST-NEXT:    vle64.v v8, (a1)625; RV32-FAST-NEXT:    vse64.v v8, (a0)626; RV32-FAST-NEXT:    addi a1, a1, 128627; RV32-FAST-NEXT:    vle64.v v8, (a1)628; RV32-FAST-NEXT:    addi a0, a0, 128629; RV32-FAST-NEXT:    vse64.v v8, (a0)630; RV32-FAST-NEXT:    ret631;632; RV64-FAST-LABEL: unaligned_memcpy256:633; RV64-FAST:       # %bb.0: # %entry634; RV64-FAST-NEXT:    vsetivli zero, 16, e64, m8, ta, ma635; RV64-FAST-NEXT:    vle64.v v8, (a1)636; RV64-FAST-NEXT:    vse64.v v8, (a0)637; RV64-FAST-NEXT:    addi a1, a1, 128638; RV64-FAST-NEXT:    vle64.v v8, (a1)639; RV64-FAST-NEXT:    addi a0, a0, 128640; RV64-FAST-NEXT:    vse64.v v8, (a0)641; RV64-FAST-NEXT:    ret642entry:643  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr %dest, ptr %src, i64 256, i1 false)644  ret void645}646 647; ----------------------------------------------------------------------648; Fully aligned cases649 650define void @aligned_memcpy2(ptr nocapture %dest, ptr %src) nounwind {651; RV32-BOTH-LABEL: aligned_memcpy2:652; RV32-BOTH:       # %bb.0: # %entry653; RV32-BOTH-NEXT:    lh a1, 0(a1)654; RV32-BOTH-NEXT:    sh a1, 0(a0)655; RV32-BOTH-NEXT:    ret656;657; RV64-BOTH-LABEL: aligned_memcpy2:658; RV64-BOTH:       # %bb.0: # %entry659; RV64-BOTH-NEXT:    lh a1, 0(a1)660; RV64-BOTH-NEXT:    sh a1, 0(a0)661; RV64-BOTH-NEXT:    ret662entry:663  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 2, i1 false)664  ret void665}666 667define void @aligned_memcpy3(ptr nocapture %dest, ptr %src) nounwind {668; RV32-BOTH-LABEL: aligned_memcpy3:669; RV32-BOTH:       # %bb.0: # %entry670; RV32-BOTH-NEXT:    lbu a2, 2(a1)671; RV32-BOTH-NEXT:    sb a2, 2(a0)672; RV32-BOTH-NEXT:    lh a1, 0(a1)673; RV32-BOTH-NEXT:    sh a1, 0(a0)674; RV32-BOTH-NEXT:    ret675;676; RV64-BOTH-LABEL: aligned_memcpy3:677; RV64-BOTH:       # %bb.0: # %entry678; RV64-BOTH-NEXT:    lbu a2, 2(a1)679; RV64-BOTH-NEXT:    sb a2, 2(a0)680; RV64-BOTH-NEXT:    lh a1, 0(a1)681; RV64-BOTH-NEXT:    sh a1, 0(a0)682; RV64-BOTH-NEXT:    ret683entry:684  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 3, i1 false)685  ret void686}687 688define void @aligned_memcpy4(ptr nocapture %dest, ptr %src) nounwind {689; RV32-BOTH-LABEL: aligned_memcpy4:690; RV32-BOTH:       # %bb.0: # %entry691; RV32-BOTH-NEXT:    lw a1, 0(a1)692; RV32-BOTH-NEXT:    sw a1, 0(a0)693; RV32-BOTH-NEXT:    ret694;695; RV64-BOTH-LABEL: aligned_memcpy4:696; RV64-BOTH:       # %bb.0: # %entry697; RV64-BOTH-NEXT:    lw a1, 0(a1)698; RV64-BOTH-NEXT:    sw a1, 0(a0)699; RV64-BOTH-NEXT:    ret700entry:701  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 4, i1 false)702  ret void703}704 705define void @aligned_memcpy7(ptr nocapture %dest, ptr %src) nounwind {706; RV32-LABEL: aligned_memcpy7:707; RV32:       # %bb.0: # %entry708; RV32-NEXT:    lbu a2, 6(a1)709; RV32-NEXT:    sb a2, 6(a0)710; RV32-NEXT:    lh a2, 4(a1)711; RV32-NEXT:    sh a2, 4(a0)712; RV32-NEXT:    lw a1, 0(a1)713; RV32-NEXT:    sw a1, 0(a0)714; RV32-NEXT:    ret715;716; RV64-LABEL: aligned_memcpy7:717; RV64:       # %bb.0: # %entry718; RV64-NEXT:    lbu a2, 6(a1)719; RV64-NEXT:    sb a2, 6(a0)720; RV64-NEXT:    lh a2, 4(a1)721; RV64-NEXT:    sh a2, 4(a0)722; RV64-NEXT:    lw a1, 0(a1)723; RV64-NEXT:    sw a1, 0(a0)724; RV64-NEXT:    ret725;726; RV32-FAST-LABEL: aligned_memcpy7:727; RV32-FAST:       # %bb.0: # %entry728; RV32-FAST-NEXT:    lw a2, 3(a1)729; RV32-FAST-NEXT:    sw a2, 3(a0)730; RV32-FAST-NEXT:    lw a1, 0(a1)731; RV32-FAST-NEXT:    sw a1, 0(a0)732; RV32-FAST-NEXT:    ret733;734; RV64-FAST-LABEL: aligned_memcpy7:735; RV64-FAST:       # %bb.0: # %entry736; RV64-FAST-NEXT:    lw a2, 3(a1)737; RV64-FAST-NEXT:    sw a2, 3(a0)738; RV64-FAST-NEXT:    lw a1, 0(a1)739; RV64-FAST-NEXT:    sw a1, 0(a0)740; RV64-FAST-NEXT:    ret741entry:742  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 7, i1 false)743  ret void744}745 746define void @aligned_memcpy8(ptr nocapture %dest, ptr %src) nounwind {747; RV32-BOTH-LABEL: aligned_memcpy8:748; RV32-BOTH:       # %bb.0: # %entry749; RV32-BOTH-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma750; RV32-BOTH-NEXT:    vle32.v v8, (a1)751; RV32-BOTH-NEXT:    vse32.v v8, (a0)752; RV32-BOTH-NEXT:    ret753;754; RV64-BOTH-LABEL: aligned_memcpy8:755; RV64-BOTH:       # %bb.0: # %entry756; RV64-BOTH-NEXT:    ld a1, 0(a1)757; RV64-BOTH-NEXT:    sd a1, 0(a0)758; RV64-BOTH-NEXT:    ret759entry:760  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 8, i1 false)761  ret void762}763 764define void @aligned_memcpy15(ptr nocapture %dest, ptr %src) nounwind {765; RV32-LABEL: aligned_memcpy15:766; RV32:       # %bb.0: # %entry767; RV32-NEXT:    lbu a2, 14(a1)768; RV32-NEXT:    sb a2, 14(a0)769; RV32-NEXT:    lh a2, 12(a1)770; RV32-NEXT:    sh a2, 12(a0)771; RV32-NEXT:    lw a2, 8(a1)772; RV32-NEXT:    sw a2, 8(a0)773; RV32-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma774; RV32-NEXT:    vle32.v v8, (a1)775; RV32-NEXT:    vse32.v v8, (a0)776; RV32-NEXT:    ret777;778; RV64-LABEL: aligned_memcpy15:779; RV64:       # %bb.0: # %entry780; RV64-NEXT:    lbu a2, 14(a1)781; RV64-NEXT:    sb a2, 14(a0)782; RV64-NEXT:    lh a2, 12(a1)783; RV64-NEXT:    sh a2, 12(a0)784; RV64-NEXT:    lw a2, 8(a1)785; RV64-NEXT:    sw a2, 8(a0)786; RV64-NEXT:    ld a1, 0(a1)787; RV64-NEXT:    sd a1, 0(a0)788; RV64-NEXT:    ret789;790; RV32-FAST-LABEL: aligned_memcpy15:791; RV32-FAST:       # %bb.0: # %entry792; RV32-FAST-NEXT:    lw a2, 11(a1)793; RV32-FAST-NEXT:    sw a2, 11(a0)794; RV32-FAST-NEXT:    lw a2, 8(a1)795; RV32-FAST-NEXT:    sw a2, 8(a0)796; RV32-FAST-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma797; RV32-FAST-NEXT:    vle32.v v8, (a1)798; RV32-FAST-NEXT:    vse32.v v8, (a0)799; RV32-FAST-NEXT:    ret800;801; RV64-FAST-LABEL: aligned_memcpy15:802; RV64-FAST:       # %bb.0: # %entry803; RV64-FAST-NEXT:    ld a2, 7(a1)804; RV64-FAST-NEXT:    sd a2, 7(a0)805; RV64-FAST-NEXT:    ld a1, 0(a1)806; RV64-FAST-NEXT:    sd a1, 0(a0)807; RV64-FAST-NEXT:    ret808entry:809  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 15, i1 false)810  ret void811}812 813define void @aligned_memcpy16(ptr nocapture %dest, ptr %src) nounwind {814; RV32-BOTH-LABEL: aligned_memcpy16:815; RV32-BOTH:       # %bb.0: # %entry816; RV32-BOTH-NEXT:    vsetivli zero, 2, e64, m1, ta, ma817; RV32-BOTH-NEXT:    vle64.v v8, (a1)818; RV32-BOTH-NEXT:    vse64.v v8, (a0)819; RV32-BOTH-NEXT:    ret820;821; RV64-BOTH-LABEL: aligned_memcpy16:822; RV64-BOTH:       # %bb.0: # %entry823; RV64-BOTH-NEXT:    vsetivli zero, 2, e64, m1, ta, ma824; RV64-BOTH-NEXT:    vle64.v v8, (a1)825; RV64-BOTH-NEXT:    vse64.v v8, (a0)826; RV64-BOTH-NEXT:    ret827entry:828  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 16, i1 false)829  ret void830}831 832define void @aligned_memcpy31(ptr nocapture %dest, ptr %src) nounwind {833; RV32-LABEL: aligned_memcpy31:834; RV32:       # %bb.0: # %entry835; RV32-NEXT:    vsetivli zero, 2, e64, m1, ta, ma836; RV32-NEXT:    vle64.v v8, (a1)837; RV32-NEXT:    vse64.v v8, (a0)838; RV32-NEXT:    addi a1, a1, 15839; RV32-NEXT:    vsetivli zero, 16, e8, m1, ta, ma840; RV32-NEXT:    vle8.v v8, (a1)841; RV32-NEXT:    addi a0, a0, 15842; RV32-NEXT:    vse8.v v8, (a0)843; RV32-NEXT:    ret844;845; RV64-LABEL: aligned_memcpy31:846; RV64:       # %bb.0: # %entry847; RV64-NEXT:    vsetivli zero, 2, e64, m1, ta, ma848; RV64-NEXT:    vle64.v v8, (a1)849; RV64-NEXT:    vse64.v v8, (a0)850; RV64-NEXT:    addi a1, a1, 15851; RV64-NEXT:    vsetivli zero, 16, e8, m1, ta, ma852; RV64-NEXT:    vle8.v v8, (a1)853; RV64-NEXT:    addi a0, a0, 15854; RV64-NEXT:    vse8.v v8, (a0)855; RV64-NEXT:    ret856;857; RV32-FAST-LABEL: aligned_memcpy31:858; RV32-FAST:       # %bb.0: # %entry859; RV32-FAST-NEXT:    vsetivli zero, 2, e64, m1, ta, ma860; RV32-FAST-NEXT:    vle64.v v8, (a1)861; RV32-FAST-NEXT:    vse64.v v8, (a0)862; RV32-FAST-NEXT:    addi a1, a1, 15863; RV32-FAST-NEXT:    vle64.v v8, (a1)864; RV32-FAST-NEXT:    addi a0, a0, 15865; RV32-FAST-NEXT:    vse64.v v8, (a0)866; RV32-FAST-NEXT:    ret867;868; RV64-FAST-LABEL: aligned_memcpy31:869; RV64-FAST:       # %bb.0: # %entry870; RV64-FAST-NEXT:    vsetivli zero, 2, e64, m1, ta, ma871; RV64-FAST-NEXT:    vle64.v v8, (a1)872; RV64-FAST-NEXT:    vse64.v v8, (a0)873; RV64-FAST-NEXT:    addi a1, a1, 15874; RV64-FAST-NEXT:    vle64.v v8, (a1)875; RV64-FAST-NEXT:    addi a0, a0, 15876; RV64-FAST-NEXT:    vse64.v v8, (a0)877; RV64-FAST-NEXT:    ret878entry:879  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 31, i1 false)880  ret void881}882 883define void @aligned_memcpy32(ptr nocapture %dest, ptr %src) nounwind {884; RV32-BOTH-LABEL: aligned_memcpy32:885; RV32-BOTH:       # %bb.0: # %entry886; RV32-BOTH-NEXT:    vsetivli zero, 4, e64, m2, ta, ma887; RV32-BOTH-NEXT:    vle64.v v8, (a1)888; RV32-BOTH-NEXT:    vse64.v v8, (a0)889; RV32-BOTH-NEXT:    ret890;891; RV64-BOTH-LABEL: aligned_memcpy32:892; RV64-BOTH:       # %bb.0: # %entry893; RV64-BOTH-NEXT:    vsetivli zero, 4, e64, m2, ta, ma894; RV64-BOTH-NEXT:    vle64.v v8, (a1)895; RV64-BOTH-NEXT:    vse64.v v8, (a0)896; RV64-BOTH-NEXT:    ret897entry:898  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 32, i1 false)899  ret void900}901 902define void @aligned_memcpy64(ptr nocapture %dest, ptr %src) nounwind {903; RV32-BOTH-LABEL: aligned_memcpy64:904; RV32-BOTH:       # %bb.0: # %entry905; RV32-BOTH-NEXT:    vsetivli zero, 8, e64, m4, ta, ma906; RV32-BOTH-NEXT:    vle64.v v8, (a1)907; RV32-BOTH-NEXT:    vse64.v v8, (a0)908; RV32-BOTH-NEXT:    ret909;910; RV64-BOTH-LABEL: aligned_memcpy64:911; RV64-BOTH:       # %bb.0: # %entry912; RV64-BOTH-NEXT:    vsetivli zero, 8, e64, m4, ta, ma913; RV64-BOTH-NEXT:    vle64.v v8, (a1)914; RV64-BOTH-NEXT:    vse64.v v8, (a0)915; RV64-BOTH-NEXT:    ret916entry:917  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 64, i1 false)918  ret void919}920 921define void @aligned_memcpy96(ptr nocapture %dest, ptr %src) nounwind {922; RV32-BOTH-LABEL: aligned_memcpy96:923; RV32-BOTH:       # %bb.0: # %entry924; RV32-BOTH-NEXT:    vsetivli zero, 8, e64, m4, ta, ma925; RV32-BOTH-NEXT:    vle64.v v8, (a1)926; RV32-BOTH-NEXT:    vse64.v v8, (a0)927; RV32-BOTH-NEXT:    addi a1, a1, 64928; RV32-BOTH-NEXT:    vsetivli zero, 4, e64, m2, ta, ma929; RV32-BOTH-NEXT:    vle64.v v8, (a1)930; RV32-BOTH-NEXT:    addi a0, a0, 64931; RV32-BOTH-NEXT:    vse64.v v8, (a0)932; RV32-BOTH-NEXT:    ret933;934; RV64-BOTH-LABEL: aligned_memcpy96:935; RV64-BOTH:       # %bb.0: # %entry936; RV64-BOTH-NEXT:    vsetivli zero, 8, e64, m4, ta, ma937; RV64-BOTH-NEXT:    vle64.v v8, (a1)938; RV64-BOTH-NEXT:    vse64.v v8, (a0)939; RV64-BOTH-NEXT:    addi a1, a1, 64940; RV64-BOTH-NEXT:    vsetivli zero, 4, e64, m2, ta, ma941; RV64-BOTH-NEXT:    vle64.v v8, (a1)942; RV64-BOTH-NEXT:    addi a0, a0, 64943; RV64-BOTH-NEXT:    vse64.v v8, (a0)944; RV64-BOTH-NEXT:    ret945entry:946  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 96, i1 false)947  ret void948}949 950define void @aligned_memcpy128(ptr nocapture %dest, ptr %src) nounwind {951; RV32-BOTH-LABEL: aligned_memcpy128:952; RV32-BOTH:       # %bb.0: # %entry953; RV32-BOTH-NEXT:    vsetivli zero, 16, e64, m8, ta, ma954; RV32-BOTH-NEXT:    vle64.v v8, (a1)955; RV32-BOTH-NEXT:    vse64.v v8, (a0)956; RV32-BOTH-NEXT:    ret957;958; RV64-BOTH-LABEL: aligned_memcpy128:959; RV64-BOTH:       # %bb.0: # %entry960; RV64-BOTH-NEXT:    vsetivli zero, 16, e64, m8, ta, ma961; RV64-BOTH-NEXT:    vle64.v v8, (a1)962; RV64-BOTH-NEXT:    vse64.v v8, (a0)963; RV64-BOTH-NEXT:    ret964entry:965  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 128, i1 false)966  ret void967}968 969define void @aligned_memcpy196(ptr nocapture %dest, ptr %src) nounwind {970; RV32-BOTH-LABEL: aligned_memcpy196:971; RV32-BOTH:       # %bb.0: # %entry972; RV32-BOTH-NEXT:    lw a2, 192(a1)973; RV32-BOTH-NEXT:    sw a2, 192(a0)974; RV32-BOTH-NEXT:    vsetivli zero, 16, e64, m8, ta, ma975; RV32-BOTH-NEXT:    vle64.v v8, (a1)976; RV32-BOTH-NEXT:    vse64.v v8, (a0)977; RV32-BOTH-NEXT:    addi a1, a1, 128978; RV32-BOTH-NEXT:    vsetivli zero, 8, e64, m4, ta, ma979; RV32-BOTH-NEXT:    vle64.v v8, (a1)980; RV32-BOTH-NEXT:    addi a0, a0, 128981; RV32-BOTH-NEXT:    vse64.v v8, (a0)982; RV32-BOTH-NEXT:    ret983;984; RV64-BOTH-LABEL: aligned_memcpy196:985; RV64-BOTH:       # %bb.0: # %entry986; RV64-BOTH-NEXT:    lw a2, 192(a1)987; RV64-BOTH-NEXT:    sw a2, 192(a0)988; RV64-BOTH-NEXT:    vsetivli zero, 16, e64, m8, ta, ma989; RV64-BOTH-NEXT:    vle64.v v8, (a1)990; RV64-BOTH-NEXT:    vse64.v v8, (a0)991; RV64-BOTH-NEXT:    addi a1, a1, 128992; RV64-BOTH-NEXT:    vsetivli zero, 8, e64, m4, ta, ma993; RV64-BOTH-NEXT:    vle64.v v8, (a1)994; RV64-BOTH-NEXT:    addi a0, a0, 128995; RV64-BOTH-NEXT:    vse64.v v8, (a0)996; RV64-BOTH-NEXT:    ret997entry:998  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 196, i1 false)999  ret void1000}1001 1002define void @aligned_memcpy256(ptr nocapture %dest, ptr %src) nounwind {1003; RV32-BOTH-LABEL: aligned_memcpy256:1004; RV32-BOTH:       # %bb.0: # %entry1005; RV32-BOTH-NEXT:    vsetivli zero, 16, e64, m8, ta, ma1006; RV32-BOTH-NEXT:    vle64.v v8, (a1)1007; RV32-BOTH-NEXT:    vse64.v v8, (a0)1008; RV32-BOTH-NEXT:    addi a1, a1, 1281009; RV32-BOTH-NEXT:    vle64.v v8, (a1)1010; RV32-BOTH-NEXT:    addi a0, a0, 1281011; RV32-BOTH-NEXT:    vse64.v v8, (a0)1012; RV32-BOTH-NEXT:    ret1013;1014; RV64-BOTH-LABEL: aligned_memcpy256:1015; RV64-BOTH:       # %bb.0: # %entry1016; RV64-BOTH-NEXT:    vsetivli zero, 16, e64, m8, ta, ma1017; RV64-BOTH-NEXT:    vle64.v v8, (a1)1018; RV64-BOTH-NEXT:    vse64.v v8, (a0)1019; RV64-BOTH-NEXT:    addi a1, a1, 1281020; RV64-BOTH-NEXT:    vle64.v v8, (a1)1021; RV64-BOTH-NEXT:    addi a0, a0, 1281022; RV64-BOTH-NEXT:    vse64.v v8, (a0)1023; RV64-BOTH-NEXT:    ret1024entry:1025  tail call void @llvm.memcpy.inline.p0.p0.i64(ptr align 8 %dest, ptr align 8 %src, i64 256, i1 false)1026  ret void1027}1028 1029; ------------------------------------------------------------------------1030; A few partially aligned cases1031 1032define void @memcpy16_align4(ptr nocapture %dest, ptr nocapture %src) nounwind {1033; RV32-LABEL: memcpy16_align4:1034; RV32:       # %bb.0: # %entry1035; RV32-NEXT:    vsetivli zero, 4, e32, m1, ta, ma1036; RV32-NEXT:    vle32.v v8, (a1)1037; RV32-NEXT:    vse32.v v8, (a0)1038; RV32-NEXT:    ret1039;1040; RV64-LABEL: memcpy16_align4:1041; RV64:       # %bb.0: # %entry1042; RV64-NEXT:    vsetivli zero, 4, e32, m1, ta, ma1043; RV64-NEXT:    vle32.v v8, (a1)1044; RV64-NEXT:    vse32.v v8, (a0)1045; RV64-NEXT:    ret1046;1047; RV32-FAST-LABEL: memcpy16_align4:1048; RV32-FAST:       # %bb.0: # %entry1049; RV32-FAST-NEXT:    vsetivli zero, 2, e64, m1, ta, ma1050; RV32-FAST-NEXT:    vle64.v v8, (a1)1051; RV32-FAST-NEXT:    vse64.v v8, (a0)1052; RV32-FAST-NEXT:    ret1053;1054; RV64-FAST-LABEL: memcpy16_align4:1055; RV64-FAST:       # %bb.0: # %entry1056; RV64-FAST-NEXT:    vsetivli zero, 2, e64, m1, ta, ma1057; RV64-FAST-NEXT:    vle64.v v8, (a1)1058; RV64-FAST-NEXT:    vse64.v v8, (a0)1059; RV64-FAST-NEXT:    ret1060entry:1061  tail call void @llvm.memcpy.inline.p0.p0.i32(ptr align 4 %dest, ptr align 4 %src, i32 16, i1 false)1062  ret void1063}1064 1065define i32 @memcpy11_align8(ptr nocapture %dest, ptr %src) {1066; RV32-LABEL: memcpy11_align8:1067; RV32:       # %bb.0: # %entry1068; RV32-NEXT:    lbu a2, 10(a1)1069; RV32-NEXT:    sb a2, 10(a0)1070; RV32-NEXT:    lh a2, 8(a1)1071; RV32-NEXT:    sh a2, 8(a0)1072; RV32-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma1073; RV32-NEXT:    vle32.v v8, (a1)1074; RV32-NEXT:    vse32.v v8, (a0)1075; RV32-NEXT:    li a0, 01076; RV32-NEXT:    ret1077;1078; RV64-LABEL: memcpy11_align8:1079; RV64:       # %bb.0: # %entry1080; RV64-NEXT:    lbu a2, 10(a1)1081; RV64-NEXT:    sb a2, 10(a0)1082; RV64-NEXT:    lh a2, 8(a1)1083; RV64-NEXT:    sh a2, 8(a0)1084; RV64-NEXT:    ld a1, 0(a1)1085; RV64-NEXT:    sd a1, 0(a0)1086; RV64-NEXT:    li a0, 01087; RV64-NEXT:    ret1088;1089; RV32-FAST-LABEL: memcpy11_align8:1090; RV32-FAST:       # %bb.0: # %entry1091; RV32-FAST-NEXT:    lw a2, 7(a1)1092; RV32-FAST-NEXT:    sw a2, 7(a0)1093; RV32-FAST-NEXT:    vsetivli zero, 2, e32, mf2, ta, ma1094; RV32-FAST-NEXT:    vle32.v v8, (a1)1095; RV32-FAST-NEXT:    vse32.v v8, (a0)1096; RV32-FAST-NEXT:    li a0, 01097; RV32-FAST-NEXT:    ret1098;1099; RV64-FAST-LABEL: memcpy11_align8:1100; RV64-FAST:       # %bb.0: # %entry1101; RV64-FAST-NEXT:    lw a2, 7(a1)1102; RV64-FAST-NEXT:    sw a2, 7(a0)1103; RV64-FAST-NEXT:    ld a1, 0(a1)1104; RV64-FAST-NEXT:    sd a1, 0(a0)1105; RV64-FAST-NEXT:    li a0, 01106; RV64-FAST-NEXT:    ret1107entry:1108  call void @llvm.memcpy.inline.p0.p0.i32(ptr align 8 %dest, ptr align 8 %src, i32 11, i1 false)1109  ret i32 01110}1111 1112