299 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc < %s -mtriple=thumbv8.1m.main-none-eabihf -mattr=+mve.fp | FileCheck %s --check-prefix=CHECKLE3; RUN: llc < %s -mtriple=thumbebv8.1m.main-none-eabihf -mattr=+mve.fp | FileCheck %s --check-prefix=CHECKBE4 5 6define <8 x i8> @inserti8_first(ptr %p) {7; CHECKLE-LABEL: inserti8_first:8; CHECKLE: @ %bb.0:9; CHECKLE-NEXT: vldrb.u16 q0, [r0]10; CHECKLE-NEXT: bx lr11;12; CHECKBE-LABEL: inserti8_first:13; CHECKBE: @ %bb.0:14; CHECKBE-NEXT: vldrb.u16 q1, [r0]15; CHECKBE-NEXT: vrev64.16 q0, q116; CHECKBE-NEXT: bx lr17 %q = getelementptr inbounds i8, ptr %p, i32 118 %l1 = load <8 x i8>, ptr %q19 %l2 = load i8, ptr %p20 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>21 %ins = insertelement <8 x i8> %s, i8 %l2, i32 022 ret <8 x i8> %ins23}24 25define <8 x i8> @inserti8_last(ptr %p) {26; CHECKLE-LABEL: inserti8_last:27; CHECKLE: @ %bb.0:28; CHECKLE-NEXT: vldrb.u16 q0, [r0, #1]29; CHECKLE-NEXT: bx lr30;31; CHECKBE-LABEL: inserti8_last:32; CHECKBE: @ %bb.0:33; CHECKBE-NEXT: vldrb.u16 q1, [r0, #1]34; CHECKBE-NEXT: vrev64.16 q0, q135; CHECKBE-NEXT: bx lr36 %q = getelementptr inbounds i8, ptr %p, i32 837 %l1 = load <8 x i8>, ptr %p38 %l2 = load i8, ptr %q39 %s = shufflevector <8 x i8> %l1, <8 x i8> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>40 %ins = insertelement <8 x i8> %s, i8 %l2, i32 741 ret <8 x i8> %ins42}43 44define <8 x i16> @inserti8_first_sext(ptr %p) {45; CHECKLE-LABEL: inserti8_first_sext:46; CHECKLE: @ %bb.0:47; CHECKLE-NEXT: vldrb.s16 q0, [r0]48; CHECKLE-NEXT: bx lr49;50; CHECKBE-LABEL: inserti8_first_sext:51; CHECKBE: @ %bb.0:52; CHECKBE-NEXT: vldrb.s16 q1, [r0]53; CHECKBE-NEXT: vrev64.16 q0, q154; CHECKBE-NEXT: bx lr55 %q = getelementptr inbounds i8, ptr %p, i32 156 %l1 = load <8 x i8>, ptr %q57 %s1 = sext <8 x i8> %l1 to <8 x i16>58 %l2 = load i8, ptr %p59 %s2 = sext i8 %l2 to i1660 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>61 %ins = insertelement <8 x i16> %s, i16 %s2, i32 062 ret <8 x i16> %ins63}64 65define <8 x i16> @inserti8_last_sext(ptr %p) {66; CHECKLE-LABEL: inserti8_last_sext:67; CHECKLE: @ %bb.0:68; CHECKLE-NEXT: vldrb.s16 q0, [r0, #1]69; CHECKLE-NEXT: bx lr70;71; CHECKBE-LABEL: inserti8_last_sext:72; CHECKBE: @ %bb.0:73; CHECKBE-NEXT: vldrb.s16 q1, [r0, #1]74; CHECKBE-NEXT: vrev64.16 q0, q175; CHECKBE-NEXT: bx lr76 %q = getelementptr inbounds i8, ptr %p, i32 877 %l1 = load <8 x i8>, ptr %p78 %s1 = sext <8 x i8> %l1 to <8 x i16>79 %l2 = load i8, ptr %q80 %s2 = sext i8 %l2 to i1681 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>82 %ins = insertelement <8 x i16> %s, i16 %s2, i32 783 ret <8 x i16> %ins84}85 86define <8 x i16> @inserti8_first_zext(ptr %p) {87; CHECKLE-LABEL: inserti8_first_zext:88; CHECKLE: @ %bb.0:89; CHECKLE-NEXT: vldrb.u16 q0, [r0]90; CHECKLE-NEXT: bx lr91;92; CHECKBE-LABEL: inserti8_first_zext:93; CHECKBE: @ %bb.0:94; CHECKBE-NEXT: vldrb.u16 q1, [r0]95; CHECKBE-NEXT: vrev64.16 q0, q196; CHECKBE-NEXT: bx lr97 %q = getelementptr inbounds i8, ptr %p, i32 198 %l1 = load <8 x i8>, ptr %q99 %s1 = zext <8 x i8> %l1 to <8 x i16>100 %l2 = load i8, ptr %p101 %s2 = zext i8 %l2 to i16102 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>103 %ins = insertelement <8 x i16> %s, i16 %s2, i32 0104 ret <8 x i16> %ins105}106 107define <8 x i16> @inserti8_last_zext(ptr %p) {108; CHECKLE-LABEL: inserti8_last_zext:109; CHECKLE: @ %bb.0:110; CHECKLE-NEXT: vldrb.u16 q0, [r0, #1]111; CHECKLE-NEXT: bx lr112;113; CHECKBE-LABEL: inserti8_last_zext:114; CHECKBE: @ %bb.0:115; CHECKBE-NEXT: vldrb.u16 q1, [r0, #1]116; CHECKBE-NEXT: vrev64.16 q0, q1117; CHECKBE-NEXT: bx lr118 %q = getelementptr inbounds i8, ptr %p, i32 8119 %l1 = load <8 x i8>, ptr %p120 %s1 = zext <8 x i8> %l1 to <8 x i16>121 %l2 = load i8, ptr %q122 %s2 = zext i8 %l2 to i16123 %s = shufflevector <8 x i16> %s1, <8 x i16> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>124 %ins = insertelement <8 x i16> %s, i16 %s2, i32 7125 ret <8 x i16> %ins126}127 128define <8 x i32> @inserti32_first(ptr %p) {129; CHECKLE-LABEL: inserti32_first:130; CHECKLE: @ %bb.0:131; CHECKLE-NEXT: vldrw.u32 q2, [r0, #20]132; CHECKLE-NEXT: vldr s4, [r0, #16]133; CHECKLE-NEXT: vldrw.u32 q0, [r0]134; CHECKLE-NEXT: vmov.f32 s5, s8135; CHECKLE-NEXT: vmov.f32 s6, s9136; CHECKLE-NEXT: vmov.f32 s7, s10137; CHECKLE-NEXT: bx lr138;139; CHECKBE-LABEL: inserti32_first:140; CHECKBE: @ %bb.0:141; CHECKBE-NEXT: vldrw.u32 q3, [r0, #20]142; CHECKBE-NEXT: vldrb.u8 q1, [r0]143; CHECKBE-NEXT: vldr s8, [r0, #16]144; CHECKBE-NEXT: vmov.f32 s9, s12145; CHECKBE-NEXT: vrev64.8 q0, q1146; CHECKBE-NEXT: vmov.f32 s10, s13147; CHECKBE-NEXT: vmov.f32 s11, s14148; CHECKBE-NEXT: vrev64.32 q1, q2149; CHECKBE-NEXT: bx lr150 %q = getelementptr inbounds i8, ptr %p, i32 4151 %l1 = load <8 x i32>, ptr %q152 %l2 = load i32, ptr %p153 %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>154 %ins = insertelement <8 x i32> %s, i32 %l2, i32 0155 ret <8 x i32> %ins156}157 158define <8 x i32> @inserti32_last(ptr %p) {159; CHECKLE-LABEL: inserti32_last:160; CHECKLE: @ %bb.0:161; CHECKLE-NEXT: vldrw.u32 q2, [r0]162; CHECKLE-NEXT: vldr s3, [r0, #16]163; CHECKLE-NEXT: vldrw.u32 q1, [r0, #20]164; CHECKLE-NEXT: vmov.f32 s0, s9165; CHECKLE-NEXT: vmov.f32 s1, s10166; CHECKLE-NEXT: vmov.f32 s2, s11167; CHECKLE-NEXT: bx lr168;169; CHECKBE-LABEL: inserti32_last:170; CHECKBE: @ %bb.0:171; CHECKBE-NEXT: vldrw.u32 q3, [r0]172; CHECKBE-NEXT: vldrb.u8 q0, [r0, #20]173; CHECKBE-NEXT: vldr s11, [r0, #16]174; CHECKBE-NEXT: vmov.f32 s8, s13175; CHECKBE-NEXT: vrev64.8 q1, q0176; CHECKBE-NEXT: vmov.f32 s9, s14177; CHECKBE-NEXT: vmov.f32 s10, s15178; CHECKBE-NEXT: vrev64.32 q0, q2179; CHECKBE-NEXT: bx lr180 %q = getelementptr inbounds i8, ptr %p, i32 32181 %l1 = load <8 x i32>, ptr %p182 %l2 = load i32, ptr %q183 %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>184 %ins = insertelement <8 x i32> %s, i32 %l2, i32 7185 ret <8 x i32> %ins186}187 188define <8 x i32> @inserti32_first_multiuse(ptr %p) {189; CHECKLE-LABEL: inserti32_first_multiuse:190; CHECKLE: @ %bb.0:191; CHECKLE-NEXT: vldrw.u32 q0, [r0, #20]192; CHECKLE-NEXT: vldrw.u32 q2, [r0, #4]193; CHECKLE-NEXT: vmov.f32 s4, s11194; CHECKLE-NEXT: vmov.f32 s5, s0195; CHECKLE-NEXT: vmov.f32 s6, s1196; CHECKLE-NEXT: vmov.f32 s7, s2197; CHECKLE-NEXT: vadd.i32 q1, q0, q1198; CHECKLE-NEXT: vldrw.u32 q0, [r0]199; CHECKLE-NEXT: vadd.i32 q0, q2, q0200; CHECKLE-NEXT: bx lr201;202; CHECKBE-LABEL: inserti32_first_multiuse:203; CHECKBE: @ %bb.0:204; CHECKBE-NEXT: vldrw.u32 q0, [r0, #20]205; CHECKBE-NEXT: vldrw.u32 q2, [r0, #4]206; CHECKBE-NEXT: vmov.f32 s4, s11207; CHECKBE-NEXT: vmov.f32 s5, s0208; CHECKBE-NEXT: vmov.f32 s6, s1209; CHECKBE-NEXT: vmov.f32 s7, s2210; CHECKBE-NEXT: vadd.i32 q0, q0, q1211; CHECKBE-NEXT: vrev64.32 q1, q0212; CHECKBE-NEXT: vldrw.u32 q0, [r0]213; CHECKBE-NEXT: vadd.i32 q2, q2, q0214; CHECKBE-NEXT: vrev64.32 q0, q2215; CHECKBE-NEXT: bx lr216 %q = getelementptr inbounds i8, ptr %p, i32 4217 %l1 = load <8 x i32>, ptr %q218 %l2 = load i32, ptr %p219 %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 undef, i32 0, i32 1, i32 2, i32 3, i32 4, i32 5, i32 6>220 %ins = insertelement <8 x i32> %s, i32 %l2, i32 0221 %a = add <8 x i32> %l1, %ins222 ret <8 x i32> %a223}224 225define <8 x i32> @inserti32_last_multiuse(ptr %p) {226; CHECKLE-LABEL: inserti32_last_multiuse:227; CHECKLE: @ %bb.0:228; CHECKLE-NEXT: vldrw.u32 q0, [r0]229; CHECKLE-NEXT: vldrw.u32 q1, [r0, #16]230; CHECKLE-NEXT: vmov.f32 s8, s1231; CHECKLE-NEXT: vmov.f32 s9, s2232; CHECKLE-NEXT: vmov.f32 s10, s3233; CHECKLE-NEXT: vmov.f32 s11, s4234; CHECKLE-NEXT: vadd.i32 q0, q0, q2235; CHECKLE-NEXT: vldrw.u32 q2, [r0, #20]236; CHECKLE-NEXT: vadd.i32 q1, q1, q2237; CHECKLE-NEXT: bx lr238;239; CHECKBE-LABEL: inserti32_last_multiuse:240; CHECKBE: @ %bb.0:241; CHECKBE-NEXT: vldrw.u32 q0, [r0]242; CHECKBE-NEXT: vldrw.u32 q1, [r0, #16]243; CHECKBE-NEXT: vmov.f32 s8, s1244; CHECKBE-NEXT: vmov.f32 s9, s2245; CHECKBE-NEXT: vmov.f32 s10, s3246; CHECKBE-NEXT: vmov.f32 s11, s4247; CHECKBE-NEXT: vadd.i32 q2, q0, q2248; CHECKBE-NEXT: vrev64.32 q0, q2249; CHECKBE-NEXT: vldrw.u32 q2, [r0, #20]250; CHECKBE-NEXT: vadd.i32 q2, q1, q2251; CHECKBE-NEXT: vrev64.32 q1, q2252; CHECKBE-NEXT: bx lr253 %q = getelementptr inbounds i8, ptr %p, i32 32254 %l1 = load <8 x i32>, ptr %p255 %l2 = load i32, ptr %q256 %s = shufflevector <8 x i32> %l1, <8 x i32> undef, <8 x i32> <i32 1, i32 2, i32 3, i32 4, i32 5, i32 6, i32 7, i32 undef>257 %ins = insertelement <8 x i32> %s, i32 %l2, i32 7258 %a = add <8 x i32> %l1, %ins259 ret <8 x i32> %a260}261 262define <4 x float> @insertf32_first(ptr %p) {263; CHECKLE-LABEL: insertf32_first:264; CHECKLE: @ %bb.0:265; CHECKLE-NEXT: vldrw.u32 q0, [r0]266; CHECKLE-NEXT: bx lr267;268; CHECKBE-LABEL: insertf32_first:269; CHECKBE: @ %bb.0:270; CHECKBE-NEXT: vldrb.u8 q1, [r0]271; CHECKBE-NEXT: vrev64.8 q0, q1272; CHECKBE-NEXT: bx lr273 %q = getelementptr inbounds i8, ptr %p, i32 4274 %l1 = load <4 x float>, ptr %q275 %l2 = load float, ptr %p276 %s = shufflevector <4 x float> %l1, <4 x float> undef, <4 x i32> <i32 undef, i32 0, i32 1, i32 2>277 %ins = insertelement <4 x float> %s, float %l2, i32 0278 ret <4 x float> %ins279}280 281define <4 x float> @insertf32_last(ptr %p) {282; CHECKLE-LABEL: insertf32_last:283; CHECKLE: @ %bb.0:284; CHECKLE-NEXT: vldrw.u32 q0, [r0, #4]285; CHECKLE-NEXT: bx lr286;287; CHECKBE-LABEL: insertf32_last:288; CHECKBE: @ %bb.0:289; CHECKBE-NEXT: vldrb.u8 q1, [r0, #4]290; CHECKBE-NEXT: vrev64.8 q0, q1291; CHECKBE-NEXT: bx lr292 %q = getelementptr inbounds i8, ptr %p, i32 16293 %l1 = load <4 x float>, ptr %p294 %l2 = load float, ptr %q295 %s = shufflevector <4 x float> %l1, <4 x float> undef, <4 x i32> <i32 1, i32 2, i32 3, i32 undef>296 %ins = insertelement <4 x float> %s, float %l2, i32 3297 ret <4 x float> %ins298}299