399 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=thumbv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-LE3; RUN: llc -mtriple=thumbebv8.1m.main-none-none-eabi -mattr=+mve -verify-machineinstrs %s -o - | FileCheck %s --check-prefix=CHECK-BE4 5define arm_aapcs_vfpcc <4 x i32> @bitcast_to_v4i1(i4 %b, <4 x i32> %a) {6; CHECK-LE-LABEL: bitcast_to_v4i1:7; CHECK-LE: @ %bb.0: @ %entry8; CHECK-LE-NEXT: .pad #49; CHECK-LE-NEXT: sub sp, #410; CHECK-LE-NEXT: and r0, r0, #1511; CHECK-LE-NEXT: vmov.i8 q1, #0x012; CHECK-LE-NEXT: vmov.i8 q2, #0xff13; CHECK-LE-NEXT: vmsr p0, r014; CHECK-LE-NEXT: vpsel q1, q2, q115; CHECK-LE-NEXT: vmov.u8 r0, q1[2]16; CHECK-LE-NEXT: vmov.u8 r1, q1[0]17; CHECK-LE-NEXT: vmov q2[2], q2[0], r1, r018; CHECK-LE-NEXT: vmov.u8 r0, q1[3]19; CHECK-LE-NEXT: vmov.u8 r1, q1[1]20; CHECK-LE-NEXT: vmov.i32 q1, #0x021; CHECK-LE-NEXT: vmov q2[3], q2[1], r1, r022; CHECK-LE-NEXT: vcmp.i32 ne, q2, zr23; CHECK-LE-NEXT: vpsel q0, q0, q124; CHECK-LE-NEXT: add sp, #425; CHECK-LE-NEXT: bx lr26;27; CHECK-BE-LABEL: bitcast_to_v4i1:28; CHECK-BE: @ %bb.0: @ %entry29; CHECK-BE-NEXT: .pad #430; CHECK-BE-NEXT: sub sp, #431; CHECK-BE-NEXT: rbit r0, r032; CHECK-BE-NEXT: vmov.i8 q1, #0x033; CHECK-BE-NEXT: vmov.i8 q2, #0xff34; CHECK-BE-NEXT: lsrs r0, r0, #2835; CHECK-BE-NEXT: vmsr p0, r036; CHECK-BE-NEXT: vpsel q1, q2, q137; CHECK-BE-NEXT: vmov.u8 r0, q1[2]38; CHECK-BE-NEXT: vmov.u8 r1, q1[0]39; CHECK-BE-NEXT: vmov q2[2], q2[0], r1, r040; CHECK-BE-NEXT: vmov.u8 r0, q1[3]41; CHECK-BE-NEXT: vmov.u8 r1, q1[1]42; CHECK-BE-NEXT: vrev64.32 q1, q043; CHECK-BE-NEXT: vmov q2[3], q2[1], r1, r044; CHECK-BE-NEXT: vmov.i32 q0, #0x045; CHECK-BE-NEXT: vcmp.i32 ne, q2, zr46; CHECK-BE-NEXT: vpsel q1, q1, q047; CHECK-BE-NEXT: vrev64.32 q0, q148; CHECK-BE-NEXT: add sp, #449; CHECK-BE-NEXT: bx lr50entry:51 %c = bitcast i4 %b to <4 x i1>52 %s = select <4 x i1> %c, <4 x i32> %a, <4 x i32> zeroinitializer53 ret <4 x i32> %s54}55 56define arm_aapcs_vfpcc <8 x i16> @bitcast_to_v8i1(i8 %b, <8 x i16> %a) {57; CHECK-LE-LABEL: bitcast_to_v8i1:58; CHECK-LE: @ %bb.0: @ %entry59; CHECK-LE-NEXT: .pad #460; CHECK-LE-NEXT: sub sp, #461; CHECK-LE-NEXT: uxtb r0, r062; CHECK-LE-NEXT: vmov.i8 q1, #0x063; CHECK-LE-NEXT: vmov.i8 q2, #0xff64; CHECK-LE-NEXT: vmsr p0, r065; CHECK-LE-NEXT: vpsel q2, q2, q166; CHECK-LE-NEXT: vmov.u8 r0, q2[0]67; CHECK-LE-NEXT: vmov.16 q1[0], r068; CHECK-LE-NEXT: vmov.u8 r0, q2[1]69; CHECK-LE-NEXT: vmov.16 q1[1], r070; CHECK-LE-NEXT: vmov.u8 r0, q2[2]71; CHECK-LE-NEXT: vmov.16 q1[2], r072; CHECK-LE-NEXT: vmov.u8 r0, q2[3]73; CHECK-LE-NEXT: vmov.16 q1[3], r074; CHECK-LE-NEXT: vmov.u8 r0, q2[4]75; CHECK-LE-NEXT: vmov.16 q1[4], r076; CHECK-LE-NEXT: vmov.u8 r0, q2[5]77; CHECK-LE-NEXT: vmov.16 q1[5], r078; CHECK-LE-NEXT: vmov.u8 r0, q2[6]79; CHECK-LE-NEXT: vmov.16 q1[6], r080; CHECK-LE-NEXT: vmov.u8 r0, q2[7]81; CHECK-LE-NEXT: vmov.16 q1[7], r082; CHECK-LE-NEXT: vcmp.i16 ne, q1, zr83; CHECK-LE-NEXT: vmov.i32 q1, #0x084; CHECK-LE-NEXT: vpsel q0, q0, q185; CHECK-LE-NEXT: add sp, #486; CHECK-LE-NEXT: bx lr87;88; CHECK-BE-LABEL: bitcast_to_v8i1:89; CHECK-BE: @ %bb.0: @ %entry90; CHECK-BE-NEXT: .pad #491; CHECK-BE-NEXT: sub sp, #492; CHECK-BE-NEXT: uxtb r0, r093; CHECK-BE-NEXT: vmov.i8 q1, #0x094; CHECK-BE-NEXT: rbit r0, r095; CHECK-BE-NEXT: vmov.i8 q2, #0xff96; CHECK-BE-NEXT: lsrs r0, r0, #2497; CHECK-BE-NEXT: vmsr p0, r098; CHECK-BE-NEXT: vpsel q2, q2, q199; CHECK-BE-NEXT: vmov.u8 r0, q2[0]100; CHECK-BE-NEXT: vmov.16 q1[0], r0101; CHECK-BE-NEXT: vmov.u8 r0, q2[1]102; CHECK-BE-NEXT: vmov.16 q1[1], r0103; CHECK-BE-NEXT: vmov.u8 r0, q2[2]104; CHECK-BE-NEXT: vmov.16 q1[2], r0105; CHECK-BE-NEXT: vmov.u8 r0, q2[3]106; CHECK-BE-NEXT: vmov.16 q1[3], r0107; CHECK-BE-NEXT: vmov.u8 r0, q2[4]108; CHECK-BE-NEXT: vmov.16 q1[4], r0109; CHECK-BE-NEXT: vmov.u8 r0, q2[5]110; CHECK-BE-NEXT: vmov.16 q1[5], r0111; CHECK-BE-NEXT: vmov.u8 r0, q2[6]112; CHECK-BE-NEXT: vmov.16 q1[6], r0113; CHECK-BE-NEXT: vmov.u8 r0, q2[7]114; CHECK-BE-NEXT: vmov.16 q1[7], r0115; CHECK-BE-NEXT: vcmp.i16 ne, q1, zr116; CHECK-BE-NEXT: vrev64.16 q1, q0117; CHECK-BE-NEXT: vmov.i32 q0, #0x0118; CHECK-BE-NEXT: vpsel q1, q1, q0119; CHECK-BE-NEXT: vrev64.16 q0, q1120; CHECK-BE-NEXT: add sp, #4121; CHECK-BE-NEXT: bx lr122entry:123 %c = bitcast i8 %b to <8 x i1>124 %s = select <8 x i1> %c, <8 x i16> %a, <8 x i16> zeroinitializer125 ret <8 x i16> %s126}127 128define arm_aapcs_vfpcc <16 x i8> @bitcast_to_v16i1(i16 %b, <16 x i8> %a) {129; CHECK-LE-LABEL: bitcast_to_v16i1:130; CHECK-LE: @ %bb.0: @ %entry131; CHECK-LE-NEXT: .pad #4132; CHECK-LE-NEXT: sub sp, #4133; CHECK-LE-NEXT: vmsr p0, r0134; CHECK-LE-NEXT: vmov.i32 q1, #0x0135; CHECK-LE-NEXT: vpsel q0, q0, q1136; CHECK-LE-NEXT: add sp, #4137; CHECK-LE-NEXT: bx lr138;139; CHECK-BE-LABEL: bitcast_to_v16i1:140; CHECK-BE: @ %bb.0: @ %entry141; CHECK-BE-NEXT: .pad #4142; CHECK-BE-NEXT: sub sp, #4143; CHECK-BE-NEXT: uxth r0, r0144; CHECK-BE-NEXT: vrev64.8 q1, q0145; CHECK-BE-NEXT: rbit r0, r0146; CHECK-BE-NEXT: vmov.i32 q0, #0x0147; CHECK-BE-NEXT: lsrs r0, r0, #16148; CHECK-BE-NEXT: vmsr p0, r0149; CHECK-BE-NEXT: vpsel q1, q1, q0150; CHECK-BE-NEXT: vrev64.8 q0, q1151; CHECK-BE-NEXT: add sp, #4152; CHECK-BE-NEXT: bx lr153entry:154 %c = bitcast i16 %b to <16 x i1>155 %s = select <16 x i1> %c, <16 x i8> %a, <16 x i8> zeroinitializer156 ret <16 x i8> %s157}158 159define arm_aapcs_vfpcc <2 x i64> @bitcast_to_v2i1(i2 %b, <2 x i64> %a) {160; CHECK-LE-LABEL: bitcast_to_v2i1:161; CHECK-LE: @ %bb.0: @ %entry162; CHECK-LE-NEXT: .pad #4163; CHECK-LE-NEXT: sub sp, #4164; CHECK-LE-NEXT: and r0, r0, #3165; CHECK-LE-NEXT: vmov.i8 q1, #0x0166; CHECK-LE-NEXT: vmov.i8 q2, #0xff167; CHECK-LE-NEXT: vmsr p0, r0168; CHECK-LE-NEXT: vpsel q1, q2, q1169; CHECK-LE-NEXT: vmov.u8 r0, q1[1]170; CHECK-LE-NEXT: vmov.u8 r1, q1[0]171; CHECK-LE-NEXT: vmov q1[2], q1[0], r1, r0172; CHECK-LE-NEXT: vmov q1[3], q1[1], r1, r0173; CHECK-LE-NEXT: vcmp.i32 ne, q1, zr174; CHECK-LE-NEXT: vmov.i32 q1, #0x0175; CHECK-LE-NEXT: vpsel q0, q0, q1176; CHECK-LE-NEXT: add sp, #4177; CHECK-LE-NEXT: bx lr178;179; CHECK-BE-LABEL: bitcast_to_v2i1:180; CHECK-BE: @ %bb.0: @ %entry181; CHECK-BE-NEXT: .pad #4182; CHECK-BE-NEXT: sub sp, #4183; CHECK-BE-NEXT: rbit r0, r0184; CHECK-BE-NEXT: vmov.i8 q1, #0x0185; CHECK-BE-NEXT: vmov.i8 q2, #0xff186; CHECK-BE-NEXT: lsrs r0, r0, #30187; CHECK-BE-NEXT: vmsr p0, r0188; CHECK-BE-NEXT: vpsel q1, q2, q1189; CHECK-BE-NEXT: vmov.u8 r0, q1[1]190; CHECK-BE-NEXT: vmov.u8 r1, q1[0]191; CHECK-BE-NEXT: vmov q1[2], q1[0], r1, r0192; CHECK-BE-NEXT: vmov q1[3], q1[1], r1, r0193; CHECK-BE-NEXT: vcmp.i32 ne, q1, zr194; CHECK-BE-NEXT: vmov.i32 q1, #0x0195; CHECK-BE-NEXT: vpsel q0, q0, q1196; CHECK-BE-NEXT: add sp, #4197; CHECK-BE-NEXT: bx lr198entry:199 %c = bitcast i2 %b to <2 x i1>200 %s = select <2 x i1> %c, <2 x i64> %a, <2 x i64> zeroinitializer201 ret <2 x i64> %s202}203 204 205define arm_aapcs_vfpcc i4 @bitcast_from_v4i1(<4 x i32> %a) {206; CHECK-LE-LABEL: bitcast_from_v4i1:207; CHECK-LE: @ %bb.0: @ %entry208; CHECK-LE-NEXT: .pad #4209; CHECK-LE-NEXT: sub sp, #4210; CHECK-LE-NEXT: vcmp.i32 eq, q0, zr211; CHECK-LE-NEXT: vmrs r1, p0212; CHECK-LE-NEXT: and r0, r1, #1213; CHECK-LE-NEXT: rsbs r2, r0, #0214; CHECK-LE-NEXT: movs r0, #0215; CHECK-LE-NEXT: bfi r0, r2, #0, #1216; CHECK-LE-NEXT: ubfx r2, r1, #4, #1217; CHECK-LE-NEXT: rsbs r2, r2, #0218; CHECK-LE-NEXT: bfi r0, r2, #1, #1219; CHECK-LE-NEXT: ubfx r2, r1, #8, #1220; CHECK-LE-NEXT: ubfx r1, r1, #12, #1221; CHECK-LE-NEXT: rsbs r2, r2, #0222; CHECK-LE-NEXT: bfi r0, r2, #2, #1223; CHECK-LE-NEXT: rsbs r1, r1, #0224; CHECK-LE-NEXT: bfi r0, r1, #3, #1225; CHECK-LE-NEXT: add sp, #4226; CHECK-LE-NEXT: bx lr227;228; CHECK-BE-LABEL: bitcast_from_v4i1:229; CHECK-BE: @ %bb.0: @ %entry230; CHECK-BE-NEXT: .pad #4231; CHECK-BE-NEXT: sub sp, #4232; CHECK-BE-NEXT: vrev64.32 q1, q0233; CHECK-BE-NEXT: vcmp.i32 eq, q1, zr234; CHECK-BE-NEXT: vmrs r1, p0235; CHECK-BE-NEXT: ubfx r0, r1, #12, #1236; CHECK-BE-NEXT: rsbs r2, r0, #0237; CHECK-BE-NEXT: movs r0, #0238; CHECK-BE-NEXT: bfi r0, r2, #0, #1239; CHECK-BE-NEXT: ubfx r2, r1, #8, #1240; CHECK-BE-NEXT: rsbs r2, r2, #0241; CHECK-BE-NEXT: bfi r0, r2, #1, #1242; CHECK-BE-NEXT: ubfx r2, r1, #4, #1243; CHECK-BE-NEXT: and r1, r1, #1244; CHECK-BE-NEXT: rsbs r2, r2, #0245; CHECK-BE-NEXT: bfi r0, r2, #2, #1246; CHECK-BE-NEXT: rsbs r1, r1, #0247; CHECK-BE-NEXT: bfi r0, r1, #3, #1248; CHECK-BE-NEXT: add sp, #4249; CHECK-BE-NEXT: bx lr250entry:251 %c = icmp eq <4 x i32> %a, zeroinitializer252 %b = bitcast <4 x i1> %c to i4253 ret i4 %b254}255 256define arm_aapcs_vfpcc i8 @bitcast_from_v8i1(<8 x i16> %a) {257; CHECK-LE-LABEL: bitcast_from_v8i1:258; CHECK-LE: @ %bb.0: @ %entry259; CHECK-LE-NEXT: .pad #4260; CHECK-LE-NEXT: sub sp, #4261; CHECK-LE-NEXT: vcmp.i16 eq, q0, zr262; CHECK-LE-NEXT: vmrs r1, p0263; CHECK-LE-NEXT: and r0, r1, #1264; CHECK-LE-NEXT: rsbs r2, r0, #0265; CHECK-LE-NEXT: movs r0, #0266; CHECK-LE-NEXT: bfi r0, r2, #0, #1267; CHECK-LE-NEXT: ubfx r2, r1, #2, #1268; CHECK-LE-NEXT: rsbs r2, r2, #0269; CHECK-LE-NEXT: bfi r0, r2, #1, #1270; CHECK-LE-NEXT: ubfx r2, r1, #4, #1271; CHECK-LE-NEXT: rsbs r2, r2, #0272; CHECK-LE-NEXT: bfi r0, r2, #2, #1273; CHECK-LE-NEXT: ubfx r2, r1, #6, #1274; CHECK-LE-NEXT: rsbs r2, r2, #0275; CHECK-LE-NEXT: bfi r0, r2, #3, #1276; CHECK-LE-NEXT: ubfx r2, r1, #8, #1277; CHECK-LE-NEXT: rsbs r2, r2, #0278; CHECK-LE-NEXT: bfi r0, r2, #4, #1279; CHECK-LE-NEXT: ubfx r2, r1, #10, #1280; CHECK-LE-NEXT: rsbs r2, r2, #0281; CHECK-LE-NEXT: bfi r0, r2, #5, #1282; CHECK-LE-NEXT: ubfx r2, r1, #12, #1283; CHECK-LE-NEXT: ubfx r1, r1, #14, #1284; CHECK-LE-NEXT: rsbs r2, r2, #0285; CHECK-LE-NEXT: bfi r0, r2, #6, #1286; CHECK-LE-NEXT: rsbs r1, r1, #0287; CHECK-LE-NEXT: bfi r0, r1, #7, #1288; CHECK-LE-NEXT: uxtb r0, r0289; CHECK-LE-NEXT: add sp, #4290; CHECK-LE-NEXT: bx lr291;292; CHECK-BE-LABEL: bitcast_from_v8i1:293; CHECK-BE: @ %bb.0: @ %entry294; CHECK-BE-NEXT: .pad #4295; CHECK-BE-NEXT: sub sp, #4296; CHECK-BE-NEXT: vrev64.16 q1, q0297; CHECK-BE-NEXT: vcmp.i16 eq, q1, zr298; CHECK-BE-NEXT: vmrs r1, p0299; CHECK-BE-NEXT: ubfx r0, r1, #14, #1300; CHECK-BE-NEXT: rsbs r2, r0, #0301; CHECK-BE-NEXT: movs r0, #0302; CHECK-BE-NEXT: bfi r0, r2, #0, #1303; CHECK-BE-NEXT: ubfx r2, r1, #12, #1304; CHECK-BE-NEXT: rsbs r2, r2, #0305; CHECK-BE-NEXT: bfi r0, r2, #1, #1306; CHECK-BE-NEXT: ubfx r2, r1, #10, #1307; CHECK-BE-NEXT: rsbs r2, r2, #0308; CHECK-BE-NEXT: bfi r0, r2, #2, #1309; CHECK-BE-NEXT: ubfx r2, r1, #8, #1310; CHECK-BE-NEXT: rsbs r2, r2, #0311; CHECK-BE-NEXT: bfi r0, r2, #3, #1312; CHECK-BE-NEXT: ubfx r2, r1, #6, #1313; CHECK-BE-NEXT: rsbs r2, r2, #0314; CHECK-BE-NEXT: bfi r0, r2, #4, #1315; CHECK-BE-NEXT: ubfx r2, r1, #4, #1316; CHECK-BE-NEXT: rsbs r2, r2, #0317; CHECK-BE-NEXT: bfi r0, r2, #5, #1318; CHECK-BE-NEXT: ubfx r2, r1, #2, #1319; CHECK-BE-NEXT: and r1, r1, #1320; CHECK-BE-NEXT: rsbs r2, r2, #0321; CHECK-BE-NEXT: bfi r0, r2, #6, #1322; CHECK-BE-NEXT: rsbs r1, r1, #0323; CHECK-BE-NEXT: bfi r0, r1, #7, #1324; CHECK-BE-NEXT: uxtb r0, r0325; CHECK-BE-NEXT: add sp, #4326; CHECK-BE-NEXT: bx lr327entry:328 %c = icmp eq <8 x i16> %a, zeroinitializer329 %b = bitcast <8 x i1> %c to i8330 ret i8 %b331}332 333define arm_aapcs_vfpcc i16 @bitcast_from_v16i1(<16 x i8> %a) {334; CHECK-LE-LABEL: bitcast_from_v16i1:335; CHECK-LE: @ %bb.0: @ %entry336; CHECK-LE-NEXT: .pad #4337; CHECK-LE-NEXT: sub sp, #4338; CHECK-LE-NEXT: vcmp.i8 eq, q0, zr339; CHECK-LE-NEXT: vmrs r0, p0340; CHECK-LE-NEXT: uxth r0, r0341; CHECK-LE-NEXT: add sp, #4342; CHECK-LE-NEXT: bx lr343;344; CHECK-BE-LABEL: bitcast_from_v16i1:345; CHECK-BE: @ %bb.0: @ %entry346; CHECK-BE-NEXT: .pad #4347; CHECK-BE-NEXT: sub sp, #4348; CHECK-BE-NEXT: vrev64.8 q1, q0349; CHECK-BE-NEXT: vcmp.i8 eq, q1, zr350; CHECK-BE-NEXT: vmrs r0, p0351; CHECK-BE-NEXT: rbit r0, r0352; CHECK-BE-NEXT: lsrs r0, r0, #16353; CHECK-BE-NEXT: add sp, #4354; CHECK-BE-NEXT: bx lr355entry:356 %c = icmp eq <16 x i8> %a, zeroinitializer357 %b = bitcast <16 x i1> %c to i16358 ret i16 %b359}360 361define arm_aapcs_vfpcc i2 @bitcast_from_v2i1(<2 x i64> %a) {362; CHECK-LE-LABEL: bitcast_from_v2i1:363; CHECK-LE: @ %bb.0: @ %entry364; CHECK-LE-NEXT: .pad #4365; CHECK-LE-NEXT: sub sp, #4366; CHECK-LE-NEXT: vmov r0, r1, d0367; CHECK-LE-NEXT: orrs r0, r1368; CHECK-LE-NEXT: csetm r1, eq369; CHECK-LE-NEXT: movs r0, #0370; CHECK-LE-NEXT: bfi r0, r1, #0, #1371; CHECK-LE-NEXT: vmov r1, r2, d1372; CHECK-LE-NEXT: orrs r1, r2373; CHECK-LE-NEXT: csetm r1, eq374; CHECK-LE-NEXT: bfi r0, r1, #1, #1375; CHECK-LE-NEXT: add sp, #4376; CHECK-LE-NEXT: bx lr377;378; CHECK-BE-LABEL: bitcast_from_v2i1:379; CHECK-BE: @ %bb.0: @ %entry380; CHECK-BE-NEXT: .pad #4381; CHECK-BE-NEXT: sub sp, #4382; CHECK-BE-NEXT: vrev64.32 q1, q0383; CHECK-BE-NEXT: vmov r0, r1, d3384; CHECK-BE-NEXT: orrs r0, r1385; CHECK-BE-NEXT: csetm r1, eq386; CHECK-BE-NEXT: movs r0, #0387; CHECK-BE-NEXT: bfi r0, r1, #0, #1388; CHECK-BE-NEXT: vmov r1, r2, d2389; CHECK-BE-NEXT: orrs r1, r2390; CHECK-BE-NEXT: csetm r1, eq391; CHECK-BE-NEXT: bfi r0, r1, #1, #1392; CHECK-BE-NEXT: add sp, #4393; CHECK-BE-NEXT: bx lr394entry:395 %c = icmp eq <2 x i64> %a, zeroinitializer396 %b = bitcast <2 x i1> %c to i2397 ret i2 %b398}399