767 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=riscv32 -mattr=+m,+v \3; RUN: | FileCheck %s --check-prefixes=RV32-BOTH,RV324; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+v \5; RUN: | FileCheck %s --check-prefixes=RV64-BOTH,RV646; RUN: llc < %s -mtriple=riscv32 -mattr=+m,+v,+unaligned-scalar-mem,,+unaligned-vector-mem \7; RUN: | FileCheck %s --check-prefixes=RV32-BOTH,RV32-FAST8; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+v,+unaligned-scalar-mem,+unaligned-vector-mem \9; RUN: | FileCheck %s --check-prefixes=RV64-BOTH,RV64-FAST10%struct.x = type { i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8 }11 12; /////////////////////////////////////////////////////////////////////////////13 14define void @memset_1(ptr %a, i8 %value) nounwind {15; RV32-BOTH-LABEL: memset_1:16; RV32-BOTH: # %bb.0:17; RV32-BOTH-NEXT: sb a1, 0(a0)18; RV32-BOTH-NEXT: ret19;20; RV64-BOTH-LABEL: memset_1:21; RV64-BOTH: # %bb.0:22; RV64-BOTH-NEXT: sb a1, 0(a0)23; RV64-BOTH-NEXT: ret24 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 %value, i64 1, i1 0)25 ret void26}27 28define void @memset_2(ptr %a, i8 %value) nounwind {29; RV32-LABEL: memset_2:30; RV32: # %bb.0:31; RV32-NEXT: sb a1, 0(a0)32; RV32-NEXT: sb a1, 1(a0)33; RV32-NEXT: ret34;35; RV64-LABEL: memset_2:36; RV64: # %bb.0:37; RV64-NEXT: sb a1, 0(a0)38; RV64-NEXT: sb a1, 1(a0)39; RV64-NEXT: ret40;41; RV32-FAST-LABEL: memset_2:42; RV32-FAST: # %bb.0:43; RV32-FAST-NEXT: zext.b a2, a144; RV32-FAST-NEXT: slli a1, a1, 845; RV32-FAST-NEXT: or a1, a1, a246; RV32-FAST-NEXT: sh a1, 0(a0)47; RV32-FAST-NEXT: ret48;49; RV64-FAST-LABEL: memset_2:50; RV64-FAST: # %bb.0:51; RV64-FAST-NEXT: zext.b a2, a152; RV64-FAST-NEXT: slli a1, a1, 853; RV64-FAST-NEXT: or a1, a1, a254; RV64-FAST-NEXT: sh a1, 0(a0)55; RV64-FAST-NEXT: ret56 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 %value, i64 2, i1 0)57 ret void58}59 60define void @memset_4(ptr %a, i8 %value) nounwind {61; RV32-LABEL: memset_4:62; RV32: # %bb.0:63; RV32-NEXT: sb a1, 0(a0)64; RV32-NEXT: sb a1, 1(a0)65; RV32-NEXT: sb a1, 2(a0)66; RV32-NEXT: sb a1, 3(a0)67; RV32-NEXT: ret68;69; RV64-LABEL: memset_4:70; RV64: # %bb.0:71; RV64-NEXT: sb a1, 0(a0)72; RV64-NEXT: sb a1, 1(a0)73; RV64-NEXT: sb a1, 2(a0)74; RV64-NEXT: sb a1, 3(a0)75; RV64-NEXT: ret76;77; RV32-FAST-LABEL: memset_4:78; RV32-FAST: # %bb.0:79; RV32-FAST-NEXT: zext.b a1, a180; RV32-FAST-NEXT: lui a2, 411281; RV32-FAST-NEXT: addi a2, a2, 25782; RV32-FAST-NEXT: mul a1, a1, a283; RV32-FAST-NEXT: sw a1, 0(a0)84; RV32-FAST-NEXT: ret85;86; RV64-FAST-LABEL: memset_4:87; RV64-FAST: # %bb.0:88; RV64-FAST-NEXT: slli a1, a1, 5689; RV64-FAST-NEXT: lui a2, 6579390; RV64-FAST-NEXT: slli a2, a2, 491; RV64-FAST-NEXT: addi a2, a2, 25692; RV64-FAST-NEXT: mulhu a1, a1, a293; RV64-FAST-NEXT: sw a1, 0(a0)94; RV64-FAST-NEXT: ret95 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 %value, i64 4, i1 0)96 ret void97}98 99define void @memset_8(ptr %a, i8 %value) nounwind {100; RV32-LABEL: memset_8:101; RV32: # %bb.0:102; RV32-NEXT: sb a1, 4(a0)103; RV32-NEXT: sb a1, 5(a0)104; RV32-NEXT: sb a1, 6(a0)105; RV32-NEXT: sb a1, 7(a0)106; RV32-NEXT: sb a1, 0(a0)107; RV32-NEXT: sb a1, 1(a0)108; RV32-NEXT: sb a1, 2(a0)109; RV32-NEXT: sb a1, 3(a0)110; RV32-NEXT: ret111;112; RV64-LABEL: memset_8:113; RV64: # %bb.0:114; RV64-NEXT: sb a1, 4(a0)115; RV64-NEXT: sb a1, 5(a0)116; RV64-NEXT: sb a1, 6(a0)117; RV64-NEXT: sb a1, 7(a0)118; RV64-NEXT: sb a1, 0(a0)119; RV64-NEXT: sb a1, 1(a0)120; RV64-NEXT: sb a1, 2(a0)121; RV64-NEXT: sb a1, 3(a0)122; RV64-NEXT: ret123;124; RV32-FAST-LABEL: memset_8:125; RV32-FAST: # %bb.0:126; RV32-FAST-NEXT: zext.b a1, a1127; RV32-FAST-NEXT: lui a2, 4112128; RV32-FAST-NEXT: addi a2, a2, 257129; RV32-FAST-NEXT: mul a1, a1, a2130; RV32-FAST-NEXT: sw a1, 0(a0)131; RV32-FAST-NEXT: sw a1, 4(a0)132; RV32-FAST-NEXT: ret133;134; RV64-FAST-LABEL: memset_8:135; RV64-FAST: # %bb.0:136; RV64-FAST-NEXT: zext.b a1, a1137; RV64-FAST-NEXT: lui a2, 4112138; RV64-FAST-NEXT: addi a2, a2, 257139; RV64-FAST-NEXT: slli a3, a2, 32140; RV64-FAST-NEXT: add a2, a2, a3141; RV64-FAST-NEXT: mul a1, a1, a2142; RV64-FAST-NEXT: sd a1, 0(a0)143; RV64-FAST-NEXT: ret144 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 %value, i64 8, i1 0)145 ret void146}147 148define void @memset_16(ptr %a, i8 %value) nounwind {149; RV32-BOTH-LABEL: memset_16:150; RV32-BOTH: # %bb.0:151; RV32-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma152; RV32-BOTH-NEXT: vmv.v.x v8, a1153; RV32-BOTH-NEXT: vse8.v v8, (a0)154; RV32-BOTH-NEXT: ret155;156; RV64-BOTH-LABEL: memset_16:157; RV64-BOTH: # %bb.0:158; RV64-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma159; RV64-BOTH-NEXT: vmv.v.x v8, a1160; RV64-BOTH-NEXT: vse8.v v8, (a0)161; RV64-BOTH-NEXT: ret162 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 %value, i64 16, i1 0)163 ret void164}165 166define void @memset_32(ptr %a, i8 %value) nounwind {167; RV32-BOTH-LABEL: memset_32:168; RV32-BOTH: # %bb.0:169; RV32-BOTH-NEXT: addi a2, a0, 16170; RV32-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma171; RV32-BOTH-NEXT: vmv.v.x v8, a1172; RV32-BOTH-NEXT: vse8.v v8, (a2)173; RV32-BOTH-NEXT: vse8.v v8, (a0)174; RV32-BOTH-NEXT: ret175;176; RV64-BOTH-LABEL: memset_32:177; RV64-BOTH: # %bb.0:178; RV64-BOTH-NEXT: addi a2, a0, 16179; RV64-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma180; RV64-BOTH-NEXT: vmv.v.x v8, a1181; RV64-BOTH-NEXT: vse8.v v8, (a2)182; RV64-BOTH-NEXT: vse8.v v8, (a0)183; RV64-BOTH-NEXT: ret184 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 %value, i64 32, i1 0)185 ret void186}187 188define void @memset_64(ptr %a, i8 %value) nounwind {189; RV32-BOTH-LABEL: memset_64:190; RV32-BOTH: # %bb.0:191; RV32-BOTH-NEXT: addi a2, a0, 48192; RV32-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma193; RV32-BOTH-NEXT: vmv.v.x v8, a1194; RV32-BOTH-NEXT: addi a1, a0, 32195; RV32-BOTH-NEXT: vse8.v v8, (a2)196; RV32-BOTH-NEXT: addi a2, a0, 16197; RV32-BOTH-NEXT: vse8.v v8, (a1)198; RV32-BOTH-NEXT: vse8.v v8, (a2)199; RV32-BOTH-NEXT: vse8.v v8, (a0)200; RV32-BOTH-NEXT: ret201;202; RV64-BOTH-LABEL: memset_64:203; RV64-BOTH: # %bb.0:204; RV64-BOTH-NEXT: addi a2, a0, 48205; RV64-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma206; RV64-BOTH-NEXT: vmv.v.x v8, a1207; RV64-BOTH-NEXT: addi a1, a0, 32208; RV64-BOTH-NEXT: vse8.v v8, (a2)209; RV64-BOTH-NEXT: addi a2, a0, 16210; RV64-BOTH-NEXT: vse8.v v8, (a1)211; RV64-BOTH-NEXT: vse8.v v8, (a2)212; RV64-BOTH-NEXT: vse8.v v8, (a0)213; RV64-BOTH-NEXT: ret214 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 %value, i64 64, i1 0)215 ret void216}217 218; /////////////////////////////////////////////////////////////////////////////219 220define void @aligned_memset_2(ptr align 2 %a, i8 %value) nounwind {221; RV32-BOTH-LABEL: aligned_memset_2:222; RV32-BOTH: # %bb.0:223; RV32-BOTH-NEXT: zext.b a2, a1224; RV32-BOTH-NEXT: slli a1, a1, 8225; RV32-BOTH-NEXT: or a1, a1, a2226; RV32-BOTH-NEXT: sh a1, 0(a0)227; RV32-BOTH-NEXT: ret228;229; RV64-BOTH-LABEL: aligned_memset_2:230; RV64-BOTH: # %bb.0:231; RV64-BOTH-NEXT: zext.b a2, a1232; RV64-BOTH-NEXT: slli a1, a1, 8233; RV64-BOTH-NEXT: or a1, a1, a2234; RV64-BOTH-NEXT: sh a1, 0(a0)235; RV64-BOTH-NEXT: ret236 tail call void @llvm.memset.inline.p0.i64(ptr align 2 %a, i8 %value, i64 2, i1 0)237 ret void238}239 240define void @aligned_memset_4(ptr align 4 %a, i8 %value) nounwind {241; RV32-BOTH-LABEL: aligned_memset_4:242; RV32-BOTH: # %bb.0:243; RV32-BOTH-NEXT: zext.b a1, a1244; RV32-BOTH-NEXT: lui a2, 4112245; RV32-BOTH-NEXT: addi a2, a2, 257246; RV32-BOTH-NEXT: mul a1, a1, a2247; RV32-BOTH-NEXT: sw a1, 0(a0)248; RV32-BOTH-NEXT: ret249;250; RV64-BOTH-LABEL: aligned_memset_4:251; RV64-BOTH: # %bb.0:252; RV64-BOTH-NEXT: slli a1, a1, 56253; RV64-BOTH-NEXT: lui a2, 65793254; RV64-BOTH-NEXT: slli a2, a2, 4255; RV64-BOTH-NEXT: addi a2, a2, 256256; RV64-BOTH-NEXT: mulhu a1, a1, a2257; RV64-BOTH-NEXT: sw a1, 0(a0)258; RV64-BOTH-NEXT: ret259 tail call void @llvm.memset.inline.p0.i64(ptr align 4 %a, i8 %value, i64 4, i1 0)260 ret void261}262 263define void @aligned_memset_8(ptr align 8 %a, i8 %value) nounwind {264; RV32-BOTH-LABEL: aligned_memset_8:265; RV32-BOTH: # %bb.0:266; RV32-BOTH-NEXT: zext.b a1, a1267; RV32-BOTH-NEXT: lui a2, 4112268; RV32-BOTH-NEXT: addi a2, a2, 257269; RV32-BOTH-NEXT: mul a1, a1, a2270; RV32-BOTH-NEXT: sw a1, 0(a0)271; RV32-BOTH-NEXT: sw a1, 4(a0)272; RV32-BOTH-NEXT: ret273;274; RV64-BOTH-LABEL: aligned_memset_8:275; RV64-BOTH: # %bb.0:276; RV64-BOTH-NEXT: zext.b a1, a1277; RV64-BOTH-NEXT: lui a2, 4112278; RV64-BOTH-NEXT: addi a2, a2, 257279; RV64-BOTH-NEXT: slli a3, a2, 32280; RV64-BOTH-NEXT: add a2, a2, a3281; RV64-BOTH-NEXT: mul a1, a1, a2282; RV64-BOTH-NEXT: sd a1, 0(a0)283; RV64-BOTH-NEXT: ret284 tail call void @llvm.memset.inline.p0.i64(ptr align 8 %a, i8 %value, i64 8, i1 0)285 ret void286}287 288define void @aligned_memset_16(ptr align 16 %a, i8 %value) nounwind {289; RV32-BOTH-LABEL: aligned_memset_16:290; RV32-BOTH: # %bb.0:291; RV32-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma292; RV32-BOTH-NEXT: vmv.v.x v8, a1293; RV32-BOTH-NEXT: vse8.v v8, (a0)294; RV32-BOTH-NEXT: ret295;296; RV64-BOTH-LABEL: aligned_memset_16:297; RV64-BOTH: # %bb.0:298; RV64-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma299; RV64-BOTH-NEXT: vmv.v.x v8, a1300; RV64-BOTH-NEXT: vse8.v v8, (a0)301; RV64-BOTH-NEXT: ret302 tail call void @llvm.memset.inline.p0.i64(ptr align 16 %a, i8 %value, i64 16, i1 0)303 ret void304}305 306define void @aligned_memset_32(ptr align 32 %a, i8 %value) nounwind {307; RV32-BOTH-LABEL: aligned_memset_32:308; RV32-BOTH: # %bb.0:309; RV32-BOTH-NEXT: addi a2, a0, 16310; RV32-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma311; RV32-BOTH-NEXT: vmv.v.x v8, a1312; RV32-BOTH-NEXT: vse8.v v8, (a2)313; RV32-BOTH-NEXT: vse8.v v8, (a0)314; RV32-BOTH-NEXT: ret315;316; RV64-BOTH-LABEL: aligned_memset_32:317; RV64-BOTH: # %bb.0:318; RV64-BOTH-NEXT: addi a2, a0, 16319; RV64-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma320; RV64-BOTH-NEXT: vmv.v.x v8, a1321; RV64-BOTH-NEXT: vse8.v v8, (a2)322; RV64-BOTH-NEXT: vse8.v v8, (a0)323; RV64-BOTH-NEXT: ret324 tail call void @llvm.memset.inline.p0.i64(ptr align 32 %a, i8 %value, i64 32, i1 0)325 ret void326}327 328define void @aligned_memset_64(ptr align 64 %a, i8 %value) nounwind {329; RV32-BOTH-LABEL: aligned_memset_64:330; RV32-BOTH: # %bb.0:331; RV32-BOTH-NEXT: addi a2, a0, 48332; RV32-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma333; RV32-BOTH-NEXT: vmv.v.x v8, a1334; RV32-BOTH-NEXT: addi a1, a0, 32335; RV32-BOTH-NEXT: vse8.v v8, (a2)336; RV32-BOTH-NEXT: addi a2, a0, 16337; RV32-BOTH-NEXT: vse8.v v8, (a1)338; RV32-BOTH-NEXT: vse8.v v8, (a2)339; RV32-BOTH-NEXT: vse8.v v8, (a0)340; RV32-BOTH-NEXT: ret341;342; RV64-BOTH-LABEL: aligned_memset_64:343; RV64-BOTH: # %bb.0:344; RV64-BOTH-NEXT: addi a2, a0, 48345; RV64-BOTH-NEXT: vsetivli zero, 16, e8, m1, ta, ma346; RV64-BOTH-NEXT: vmv.v.x v8, a1347; RV64-BOTH-NEXT: addi a1, a0, 32348; RV64-BOTH-NEXT: vse8.v v8, (a2)349; RV64-BOTH-NEXT: addi a2, a0, 16350; RV64-BOTH-NEXT: vse8.v v8, (a1)351; RV64-BOTH-NEXT: vse8.v v8, (a2)352; RV64-BOTH-NEXT: vse8.v v8, (a0)353; RV64-BOTH-NEXT: ret354 tail call void @llvm.memset.inline.p0.i64(ptr align 64 %a, i8 %value, i64 64, i1 0)355 ret void356}357 358; /////////////////////////////////////////////////////////////////////////////359 360define void @memset_zero_1(ptr %a) nounwind {361; RV32-BOTH-LABEL: memset_zero_1:362; RV32-BOTH: # %bb.0:363; RV32-BOTH-NEXT: sb zero, 0(a0)364; RV32-BOTH-NEXT: ret365;366; RV64-BOTH-LABEL: memset_zero_1:367; RV64-BOTH: # %bb.0:368; RV64-BOTH-NEXT: sb zero, 0(a0)369; RV64-BOTH-NEXT: ret370 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 0, i64 1, i1 0)371 ret void372}373 374define void @memset_zero_2(ptr %a) nounwind {375; RV32-LABEL: memset_zero_2:376; RV32: # %bb.0:377; RV32-NEXT: sb zero, 0(a0)378; RV32-NEXT: sb zero, 1(a0)379; RV32-NEXT: ret380;381; RV64-LABEL: memset_zero_2:382; RV64: # %bb.0:383; RV64-NEXT: sb zero, 0(a0)384; RV64-NEXT: sb zero, 1(a0)385; RV64-NEXT: ret386;387; RV32-FAST-LABEL: memset_zero_2:388; RV32-FAST: # %bb.0:389; RV32-FAST-NEXT: sh zero, 0(a0)390; RV32-FAST-NEXT: ret391;392; RV64-FAST-LABEL: memset_zero_2:393; RV64-FAST: # %bb.0:394; RV64-FAST-NEXT: sh zero, 0(a0)395; RV64-FAST-NEXT: ret396 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 0, i64 2, i1 0)397 ret void398}399 400define void @memset_zero_4(ptr %a) nounwind {401; RV32-LABEL: memset_zero_4:402; RV32: # %bb.0:403; RV32-NEXT: sb zero, 0(a0)404; RV32-NEXT: sb zero, 1(a0)405; RV32-NEXT: sb zero, 2(a0)406; RV32-NEXT: sb zero, 3(a0)407; RV32-NEXT: ret408;409; RV64-LABEL: memset_zero_4:410; RV64: # %bb.0:411; RV64-NEXT: sb zero, 0(a0)412; RV64-NEXT: sb zero, 1(a0)413; RV64-NEXT: sb zero, 2(a0)414; RV64-NEXT: sb zero, 3(a0)415; RV64-NEXT: ret416;417; RV32-FAST-LABEL: memset_zero_4:418; RV32-FAST: # %bb.0:419; RV32-FAST-NEXT: sw zero, 0(a0)420; RV32-FAST-NEXT: ret421;422; RV64-FAST-LABEL: memset_zero_4:423; RV64-FAST: # %bb.0:424; RV64-FAST-NEXT: sw zero, 0(a0)425; RV64-FAST-NEXT: ret426 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 0, i64 4, i1 0)427 ret void428}429 430define void @memset_zero_8(ptr %a) nounwind {431; RV32-LABEL: memset_zero_8:432; RV32: # %bb.0:433; RV32-NEXT: sb zero, 4(a0)434; RV32-NEXT: sb zero, 5(a0)435; RV32-NEXT: sb zero, 6(a0)436; RV32-NEXT: sb zero, 7(a0)437; RV32-NEXT: sb zero, 0(a0)438; RV32-NEXT: sb zero, 1(a0)439; RV32-NEXT: sb zero, 2(a0)440; RV32-NEXT: sb zero, 3(a0)441; RV32-NEXT: ret442;443; RV64-LABEL: memset_zero_8:444; RV64: # %bb.0:445; RV64-NEXT: sb zero, 4(a0)446; RV64-NEXT: sb zero, 5(a0)447; RV64-NEXT: sb zero, 6(a0)448; RV64-NEXT: sb zero, 7(a0)449; RV64-NEXT: sb zero, 0(a0)450; RV64-NEXT: sb zero, 1(a0)451; RV64-NEXT: sb zero, 2(a0)452; RV64-NEXT: sb zero, 3(a0)453; RV64-NEXT: ret454;455; RV32-FAST-LABEL: memset_zero_8:456; RV32-FAST: # %bb.0:457; RV32-FAST-NEXT: sw zero, 0(a0)458; RV32-FAST-NEXT: sw zero, 4(a0)459; RV32-FAST-NEXT: ret460;461; RV64-FAST-LABEL: memset_zero_8:462; RV64-FAST: # %bb.0:463; RV64-FAST-NEXT: sd zero, 0(a0)464; RV64-FAST-NEXT: ret465 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 0, i64 8, i1 0)466 ret void467}468 469define void @memset_zero_16(ptr %a) nounwind {470; RV32-LABEL: memset_zero_16:471; RV32: # %bb.0:472; RV32-NEXT: vsetivli zero, 16, e8, m1, ta, ma473; RV32-NEXT: vmv.v.i v8, 0474; RV32-NEXT: vse8.v v8, (a0)475; RV32-NEXT: ret476;477; RV64-LABEL: memset_zero_16:478; RV64: # %bb.0:479; RV64-NEXT: vsetivli zero, 16, e8, m1, ta, ma480; RV64-NEXT: vmv.v.i v8, 0481; RV64-NEXT: vse8.v v8, (a0)482; RV64-NEXT: ret483;484; RV32-FAST-LABEL: memset_zero_16:485; RV32-FAST: # %bb.0:486; RV32-FAST-NEXT: vsetivli zero, 2, e64, m1, ta, ma487; RV32-FAST-NEXT: vmv.v.i v8, 0488; RV32-FAST-NEXT: vse64.v v8, (a0)489; RV32-FAST-NEXT: ret490;491; RV64-FAST-LABEL: memset_zero_16:492; RV64-FAST: # %bb.0:493; RV64-FAST-NEXT: vsetivli zero, 2, e64, m1, ta, ma494; RV64-FAST-NEXT: vmv.v.i v8, 0495; RV64-FAST-NEXT: vse64.v v8, (a0)496; RV64-FAST-NEXT: ret497 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 0, i64 16, i1 0)498 ret void499}500 501define void @memset_zero_32(ptr %a) nounwind {502; RV32-LABEL: memset_zero_32:503; RV32: # %bb.0:504; RV32-NEXT: vsetivli zero, 16, e8, m1, ta, ma505; RV32-NEXT: vmv.v.i v8, 0506; RV32-NEXT: vse8.v v8, (a0)507; RV32-NEXT: addi a0, a0, 16508; RV32-NEXT: vse8.v v8, (a0)509; RV32-NEXT: ret510;511; RV64-LABEL: memset_zero_32:512; RV64: # %bb.0:513; RV64-NEXT: vsetivli zero, 16, e8, m1, ta, ma514; RV64-NEXT: vmv.v.i v8, 0515; RV64-NEXT: vse8.v v8, (a0)516; RV64-NEXT: addi a0, a0, 16517; RV64-NEXT: vse8.v v8, (a0)518; RV64-NEXT: ret519;520; RV32-FAST-LABEL: memset_zero_32:521; RV32-FAST: # %bb.0:522; RV32-FAST-NEXT: vsetivli zero, 2, e64, m1, ta, ma523; RV32-FAST-NEXT: vmv.v.i v8, 0524; RV32-FAST-NEXT: vse64.v v8, (a0)525; RV32-FAST-NEXT: addi a0, a0, 16526; RV32-FAST-NEXT: vse64.v v8, (a0)527; RV32-FAST-NEXT: ret528;529; RV64-FAST-LABEL: memset_zero_32:530; RV64-FAST: # %bb.0:531; RV64-FAST-NEXT: vsetivli zero, 2, e64, m1, ta, ma532; RV64-FAST-NEXT: vmv.v.i v8, 0533; RV64-FAST-NEXT: vse64.v v8, (a0)534; RV64-FAST-NEXT: addi a0, a0, 16535; RV64-FAST-NEXT: vse64.v v8, (a0)536; RV64-FAST-NEXT: ret537 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 0, i64 32, i1 0)538 ret void539}540 541define void @memset_zero_64(ptr %a) nounwind {542; RV32-LABEL: memset_zero_64:543; RV32: # %bb.0:544; RV32-NEXT: li a1, 64545; RV32-NEXT: vsetvli zero, a1, e8, m4, ta, ma546; RV32-NEXT: vmv.v.i v8, 0547; RV32-NEXT: vse8.v v8, (a0)548; RV32-NEXT: ret549;550; RV64-LABEL: memset_zero_64:551; RV64: # %bb.0:552; RV64-NEXT: li a1, 64553; RV64-NEXT: vsetvli zero, a1, e8, m4, ta, ma554; RV64-NEXT: vmv.v.i v8, 0555; RV64-NEXT: vse8.v v8, (a0)556; RV64-NEXT: ret557;558; RV32-FAST-LABEL: memset_zero_64:559; RV32-FAST: # %bb.0:560; RV32-FAST-NEXT: vsetivli zero, 8, e64, m4, ta, ma561; RV32-FAST-NEXT: vmv.v.i v8, 0562; RV32-FAST-NEXT: vse64.v v8, (a0)563; RV32-FAST-NEXT: ret564;565; RV64-FAST-LABEL: memset_zero_64:566; RV64-FAST: # %bb.0:567; RV64-FAST-NEXT: vsetivli zero, 8, e64, m4, ta, ma568; RV64-FAST-NEXT: vmv.v.i v8, 0569; RV64-FAST-NEXT: vse64.v v8, (a0)570; RV64-FAST-NEXT: ret571 tail call void @llvm.memset.inline.p0.i64(ptr %a, i8 0, i64 64, i1 0)572 ret void573}574 575; /////////////////////////////////////////////////////////////////////////////576 577define void @aligned_memset_zero_2(ptr %a) nounwind {578; RV32-BOTH-LABEL: aligned_memset_zero_2:579; RV32-BOTH: # %bb.0:580; RV32-BOTH-NEXT: sh zero, 0(a0)581; RV32-BOTH-NEXT: ret582;583; RV64-BOTH-LABEL: aligned_memset_zero_2:584; RV64-BOTH: # %bb.0:585; RV64-BOTH-NEXT: sh zero, 0(a0)586; RV64-BOTH-NEXT: ret587 tail call void @llvm.memset.inline.p0.i64(ptr align 2 %a, i8 0, i64 2, i1 0)588 ret void589}590 591define void @aligned_memset_zero_4(ptr %a) nounwind {592; RV32-BOTH-LABEL: aligned_memset_zero_4:593; RV32-BOTH: # %bb.0:594; RV32-BOTH-NEXT: sw zero, 0(a0)595; RV32-BOTH-NEXT: ret596;597; RV64-BOTH-LABEL: aligned_memset_zero_4:598; RV64-BOTH: # %bb.0:599; RV64-BOTH-NEXT: sw zero, 0(a0)600; RV64-BOTH-NEXT: ret601 tail call void @llvm.memset.inline.p0.i64(ptr align 4 %a, i8 0, i64 4, i1 0)602 ret void603}604 605define void @aligned_memset_zero_8(ptr %a) nounwind {606; RV32-BOTH-LABEL: aligned_memset_zero_8:607; RV32-BOTH: # %bb.0:608; RV32-BOTH-NEXT: sw zero, 0(a0)609; RV32-BOTH-NEXT: sw zero, 4(a0)610; RV32-BOTH-NEXT: ret611;612; RV64-BOTH-LABEL: aligned_memset_zero_8:613; RV64-BOTH: # %bb.0:614; RV64-BOTH-NEXT: sd zero, 0(a0)615; RV64-BOTH-NEXT: ret616 tail call void @llvm.memset.inline.p0.i64(ptr align 8 %a, i8 0, i64 8, i1 0)617 ret void618}619 620define void @aligned_memset_zero_16(ptr %a) nounwind {621; RV32-BOTH-LABEL: aligned_memset_zero_16:622; RV32-BOTH: # %bb.0:623; RV32-BOTH-NEXT: vsetivli zero, 2, e64, m1, ta, ma624; RV32-BOTH-NEXT: vmv.v.i v8, 0625; RV32-BOTH-NEXT: vse64.v v8, (a0)626; RV32-BOTH-NEXT: ret627;628; RV64-BOTH-LABEL: aligned_memset_zero_16:629; RV64-BOTH: # %bb.0:630; RV64-BOTH-NEXT: vsetivli zero, 2, e64, m1, ta, ma631; RV64-BOTH-NEXT: vmv.v.i v8, 0632; RV64-BOTH-NEXT: vse64.v v8, (a0)633; RV64-BOTH-NEXT: ret634 tail call void @llvm.memset.inline.p0.i64(ptr align 16 %a, i8 0, i64 16, i1 0)635 ret void636}637 638define void @aligned_memset_zero_32(ptr %a) nounwind {639; RV32-BOTH-LABEL: aligned_memset_zero_32:640; RV32-BOTH: # %bb.0:641; RV32-BOTH-NEXT: vsetivli zero, 2, e64, m1, ta, ma642; RV32-BOTH-NEXT: vmv.v.i v8, 0643; RV32-BOTH-NEXT: vse64.v v8, (a0)644; RV32-BOTH-NEXT: addi a0, a0, 16645; RV32-BOTH-NEXT: vse64.v v8, (a0)646; RV32-BOTH-NEXT: ret647;648; RV64-BOTH-LABEL: aligned_memset_zero_32:649; RV64-BOTH: # %bb.0:650; RV64-BOTH-NEXT: vsetivli zero, 2, e64, m1, ta, ma651; RV64-BOTH-NEXT: vmv.v.i v8, 0652; RV64-BOTH-NEXT: vse64.v v8, (a0)653; RV64-BOTH-NEXT: addi a0, a0, 16654; RV64-BOTH-NEXT: vse64.v v8, (a0)655; RV64-BOTH-NEXT: ret656 tail call void @llvm.memset.inline.p0.i64(ptr align 32 %a, i8 0, i64 32, i1 0)657 ret void658}659 660define void @aligned_memset_zero_64(ptr %a) nounwind {661; RV32-BOTH-LABEL: aligned_memset_zero_64:662; RV32-BOTH: # %bb.0:663; RV32-BOTH-NEXT: vsetivli zero, 8, e64, m4, ta, ma664; RV32-BOTH-NEXT: vmv.v.i v8, 0665; RV32-BOTH-NEXT: vse64.v v8, (a0)666; RV32-BOTH-NEXT: ret667;668; RV64-BOTH-LABEL: aligned_memset_zero_64:669; RV64-BOTH: # %bb.0:670; RV64-BOTH-NEXT: vsetivli zero, 8, e64, m4, ta, ma671; RV64-BOTH-NEXT: vmv.v.i v8, 0672; RV64-BOTH-NEXT: vse64.v v8, (a0)673; RV64-BOTH-NEXT: ret674 tail call void @llvm.memset.inline.p0.i64(ptr align 64 %a, i8 0, i64 64, i1 0)675 ret void676}677 678define void @aligned_memset_zero_66(ptr %a) nounwind {679; RV32-BOTH-LABEL: aligned_memset_zero_66:680; RV32-BOTH: # %bb.0:681; RV32-BOTH-NEXT: sh zero, 64(a0)682; RV32-BOTH-NEXT: vsetivli zero, 8, e64, m4, ta, ma683; RV32-BOTH-NEXT: vmv.v.i v8, 0684; RV32-BOTH-NEXT: vse64.v v8, (a0)685; RV32-BOTH-NEXT: ret686;687; RV64-BOTH-LABEL: aligned_memset_zero_66:688; RV64-BOTH: # %bb.0:689; RV64-BOTH-NEXT: sh zero, 64(a0)690; RV64-BOTH-NEXT: vsetivli zero, 8, e64, m4, ta, ma691; RV64-BOTH-NEXT: vmv.v.i v8, 0692; RV64-BOTH-NEXT: vse64.v v8, (a0)693; RV64-BOTH-NEXT: ret694 tail call void @llvm.memset.inline.p0.i64(ptr align 64 %a, i8 0, i64 66, i1 0)695 ret void696}697 698define void @aligned_memset_zero_96(ptr %a) nounwind {699; RV32-BOTH-LABEL: aligned_memset_zero_96:700; RV32-BOTH: # %bb.0:701; RV32-BOTH-NEXT: vsetivli zero, 8, e64, m4, ta, ma702; RV32-BOTH-NEXT: vmv.v.i v8, 0703; RV32-BOTH-NEXT: addi a1, a0, 80704; RV32-BOTH-NEXT: vse64.v v8, (a0)705; RV32-BOTH-NEXT: vsetivli zero, 2, e64, m1, ta, ma706; RV32-BOTH-NEXT: vmv.v.i v8, 0707; RV32-BOTH-NEXT: addi a0, a0, 64708; RV32-BOTH-NEXT: vse64.v v8, (a1)709; RV32-BOTH-NEXT: vse64.v v8, (a0)710; RV32-BOTH-NEXT: ret711;712; RV64-BOTH-LABEL: aligned_memset_zero_96:713; RV64-BOTH: # %bb.0:714; RV64-BOTH-NEXT: vsetivli zero, 8, e64, m4, ta, ma715; RV64-BOTH-NEXT: vmv.v.i v8, 0716; RV64-BOTH-NEXT: addi a1, a0, 80717; RV64-BOTH-NEXT: vse64.v v8, (a0)718; RV64-BOTH-NEXT: vsetivli zero, 2, e64, m1, ta, ma719; RV64-BOTH-NEXT: vmv.v.i v8, 0720; RV64-BOTH-NEXT: addi a0, a0, 64721; RV64-BOTH-NEXT: vse64.v v8, (a1)722; RV64-BOTH-NEXT: vse64.v v8, (a0)723; RV64-BOTH-NEXT: ret724 tail call void @llvm.memset.inline.p0.i64(ptr align 64 %a, i8 0, i64 96, i1 0)725 ret void726}727 728define void @aligned_memset_zero_128(ptr %a) nounwind {729; RV32-BOTH-LABEL: aligned_memset_zero_128:730; RV32-BOTH: # %bb.0:731; RV32-BOTH-NEXT: vsetivli zero, 16, e64, m8, ta, ma732; RV32-BOTH-NEXT: vmv.v.i v8, 0733; RV32-BOTH-NEXT: vse64.v v8, (a0)734; RV32-BOTH-NEXT: ret735;736; RV64-BOTH-LABEL: aligned_memset_zero_128:737; RV64-BOTH: # %bb.0:738; RV64-BOTH-NEXT: vsetivli zero, 16, e64, m8, ta, ma739; RV64-BOTH-NEXT: vmv.v.i v8, 0740; RV64-BOTH-NEXT: vse64.v v8, (a0)741; RV64-BOTH-NEXT: ret742 tail call void @llvm.memset.inline.p0.i64(ptr align 64 %a, i8 0, i64 128, i1 0)743 ret void744}745 746define void @aligned_memset_zero_256(ptr %a) nounwind {747; RV32-BOTH-LABEL: aligned_memset_zero_256:748; RV32-BOTH: # %bb.0:749; RV32-BOTH-NEXT: vsetivli zero, 16, e64, m8, ta, ma750; RV32-BOTH-NEXT: vmv.v.i v8, 0751; RV32-BOTH-NEXT: vse64.v v8, (a0)752; RV32-BOTH-NEXT: addi a0, a0, 128753; RV32-BOTH-NEXT: vse64.v v8, (a0)754; RV32-BOTH-NEXT: ret755;756; RV64-BOTH-LABEL: aligned_memset_zero_256:757; RV64-BOTH: # %bb.0:758; RV64-BOTH-NEXT: vsetivli zero, 16, e64, m8, ta, ma759; RV64-BOTH-NEXT: vmv.v.i v8, 0760; RV64-BOTH-NEXT: vse64.v v8, (a0)761; RV64-BOTH-NEXT: addi a0, a0, 128762; RV64-BOTH-NEXT: vse64.v v8, (a0)763; RV64-BOTH-NEXT: ret764 tail call void @llvm.memset.inline.p0.i64(ptr align 64 %a, i8 0, i64 256, i1 0)765 ret void766}767