366 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -mtriple=aarch64 -mattr=+sha3 < %s | FileCheck --check-prefix=SHA3 %s3; RUN: llc -mtriple=aarch64 -mattr=-sha3 < %s | FileCheck --check-prefix=NOSHA3 %s4; RUN: llc -mtriple=aarch64 -mattr=+sve2 < %s | FileCheck --check-prefix=SVE2 %s5 6/* 128-bit vectors */7 8define <2 x i64> @xar(<2 x i64> %x, <2 x i64> %y) {9; SHA3-LABEL: xar:10; SHA3: // %bb.0:11; SHA3-NEXT: xar v0.2d, v0.2d, v1.2d, #5412; SHA3-NEXT: ret13;14; NOSHA3-LABEL: xar:15; NOSHA3: // %bb.0:16; NOSHA3-NEXT: eor v1.16b, v0.16b, v1.16b17; NOSHA3-NEXT: shl v0.2d, v1.2d, #1018; NOSHA3-NEXT: usra v0.2d, v1.2d, #5419; NOSHA3-NEXT: ret20;21; SVE2-LABEL: xar:22; SVE2: // %bb.0:23; SVE2-NEXT: // kill: def $q0 killed $q0 def $z024; SVE2-NEXT: // kill: def $q1 killed $q1 def $z125; SVE2-NEXT: xar z0.d, z0.d, z1.d, #5426; SVE2-NEXT: // kill: def $q0 killed $q0 killed $z027; SVE2-NEXT: ret28 %a = xor <2 x i64> %x, %y29 %b = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %a, <2 x i64> %a, <2 x i64> <i64 10, i64 10>)30 ret <2 x i64> %b31}32 33define <1 x i64> @xar_v1i64(<1 x i64> %a, <1 x i64> %b) {34; SHA3-LABEL: xar_v1i64:35; SHA3: // %bb.0:36; SHA3-NEXT: // kill: def $d0 killed $d0 def $q037; SHA3-NEXT: // kill: def $d1 killed $d1 def $q138; SHA3-NEXT: xar v0.2d, v0.2d, v1.2d, #6339; SHA3-NEXT: // kill: def $d0 killed $d0 killed $q040; SHA3-NEXT: ret41;42; NOSHA3-LABEL: xar_v1i64:43; NOSHA3: // %bb.0:44; NOSHA3-NEXT: eor v1.8b, v0.8b, v1.8b45; NOSHA3-NEXT: shl d0, d1, #146; NOSHA3-NEXT: usra d0, d1, #6347; NOSHA3-NEXT: ret48;49; SVE2-LABEL: xar_v1i64:50; SVE2: // %bb.0:51; SVE2-NEXT: // kill: def $d0 killed $d0 def $z052; SVE2-NEXT: // kill: def $d1 killed $d1 def $z153; SVE2-NEXT: xar z0.d, z0.d, z1.d, #6354; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z055; SVE2-NEXT: ret56 %v.val = xor <1 x i64> %a, %b57 %fshl = tail call <1 x i64> @llvm.fshl.v1i64(<1 x i64> %v.val, <1 x i64> %v.val, <1 x i64> splat (i64 1))58 ret <1 x i64> %fshl59}60 61define <2 x i64> @xar_instead_of_or_v2i64(<2 x i64> %r) {62; SHA3-LABEL: xar_instead_of_or_v2i64:63; SHA3: // %bb.0: // %entry64; SHA3-NEXT: movi v1.2d, #000000000000000065; SHA3-NEXT: xar v0.2d, v0.2d, v1.2d, #3966; SHA3-NEXT: ret67;68; NOSHA3-LABEL: xar_instead_of_or_v2i64:69; NOSHA3: // %bb.0: // %entry70; NOSHA3-NEXT: shl v1.2d, v0.2d, #2571; NOSHA3-NEXT: usra v1.2d, v0.2d, #3972; NOSHA3-NEXT: mov v0.16b, v1.16b73; NOSHA3-NEXT: ret74;75; SVE2-LABEL: xar_instead_of_or_v2i64:76; SVE2: // %bb.0: // %entry77; SVE2-NEXT: movi v1.2d, #000000000000000078; SVE2-NEXT: // kill: def $q0 killed $q0 def $z079; SVE2-NEXT: xar z0.d, z0.d, z1.d, #3980; SVE2-NEXT: // kill: def $q0 killed $q0 killed $z081; SVE2-NEXT: ret82entry:83 %or = call <2 x i64> @llvm.fshl.v2i64(<2 x i64> %r, <2 x i64> %r, <2 x i64> splat (i64 25))84 ret <2 x i64> %or85}86 87define <1 x i64> @xar_instead_of_or_v1i64(<1 x i64> %v.val) {88; SHA3-LABEL: xar_instead_of_or_v1i64:89; SHA3: // %bb.0:90; SHA3-NEXT: movi v1.2d, #000000000000000091; SHA3-NEXT: // kill: def $d0 killed $d0 def $q092; SHA3-NEXT: xar v0.2d, v0.2d, v1.2d, #6393; SHA3-NEXT: // kill: def $d0 killed $d0 killed $q094; SHA3-NEXT: ret95;96; NOSHA3-LABEL: xar_instead_of_or_v1i64:97; NOSHA3: // %bb.0:98; NOSHA3-NEXT: shl d1, d0, #199; NOSHA3-NEXT: usra d1, d0, #63100; NOSHA3-NEXT: fmov d0, d1101; NOSHA3-NEXT: ret102;103; SVE2-LABEL: xar_instead_of_or_v1i64:104; SVE2: // %bb.0:105; SVE2-NEXT: movi v1.2d, #0000000000000000106; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0107; SVE2-NEXT: xar z0.d, z0.d, z1.d, #63108; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0109; SVE2-NEXT: ret110 %fshl = tail call <1 x i64> @llvm.fshl.v1i64(<1 x i64> %v.val, <1 x i64> %v.val, <1 x i64> splat (i64 1))111 ret <1 x i64> %fshl112}113 114define <4 x i32> @xar_instead_of_or_v4i32(<4 x i32> %r) {115; SHA3-LABEL: xar_instead_of_or_v4i32:116; SHA3: // %bb.0: // %entry117; SHA3-NEXT: shl v1.4s, v0.4s, #25118; SHA3-NEXT: usra v1.4s, v0.4s, #7119; SHA3-NEXT: mov v0.16b, v1.16b120; SHA3-NEXT: ret121;122; NOSHA3-LABEL: xar_instead_of_or_v4i32:123; NOSHA3: // %bb.0: // %entry124; NOSHA3-NEXT: shl v1.4s, v0.4s, #25125; NOSHA3-NEXT: usra v1.4s, v0.4s, #7126; NOSHA3-NEXT: mov v0.16b, v1.16b127; NOSHA3-NEXT: ret128;129; SVE2-LABEL: xar_instead_of_or_v4i32:130; SVE2: // %bb.0: // %entry131; SVE2-NEXT: movi v1.2d, #0000000000000000132; SVE2-NEXT: // kill: def $q0 killed $q0 def $z0133; SVE2-NEXT: xar z0.s, z0.s, z1.s, #7134; SVE2-NEXT: // kill: def $q0 killed $q0 killed $z0135; SVE2-NEXT: ret136entry:137 %or = call <4 x i32> @llvm.fshl.v2i32(<4 x i32> %r, <4 x i32> %r, <4 x i32> splat (i32 25))138 ret <4 x i32> %or139}140 141define <8 x i16> @xar_instead_of_or_v8i16(<8 x i16> %r) {142; SHA3-LABEL: xar_instead_of_or_v8i16:143; SHA3: // %bb.0: // %entry144; SHA3-NEXT: shl v1.8h, v0.8h, #9145; SHA3-NEXT: usra v1.8h, v0.8h, #7146; SHA3-NEXT: mov v0.16b, v1.16b147; SHA3-NEXT: ret148;149; NOSHA3-LABEL: xar_instead_of_or_v8i16:150; NOSHA3: // %bb.0: // %entry151; NOSHA3-NEXT: shl v1.8h, v0.8h, #9152; NOSHA3-NEXT: usra v1.8h, v0.8h, #7153; NOSHA3-NEXT: mov v0.16b, v1.16b154; NOSHA3-NEXT: ret155;156; SVE2-LABEL: xar_instead_of_or_v8i16:157; SVE2: // %bb.0: // %entry158; SVE2-NEXT: movi v1.2d, #0000000000000000159; SVE2-NEXT: // kill: def $q0 killed $q0 def $z0160; SVE2-NEXT: xar z0.h, z0.h, z1.h, #7161; SVE2-NEXT: // kill: def $q0 killed $q0 killed $z0162; SVE2-NEXT: ret163entry:164 %or = call <8 x i16> @llvm.fshl.v2i16(<8 x i16> %r, <8 x i16> %r, <8 x i16> splat (i16 25))165 ret <8 x i16> %or166}167 168define <16 x i8> @xar_instead_of_or_v16i8(<16 x i8> %r) {169; SHA3-LABEL: xar_instead_of_or_v16i8:170; SHA3: // %bb.0: // %entry171; SHA3-NEXT: add v1.16b, v0.16b, v0.16b172; SHA3-NEXT: usra v1.16b, v0.16b, #7173; SHA3-NEXT: mov v0.16b, v1.16b174; SHA3-NEXT: ret175;176; NOSHA3-LABEL: xar_instead_of_or_v16i8:177; NOSHA3: // %bb.0: // %entry178; NOSHA3-NEXT: add v1.16b, v0.16b, v0.16b179; NOSHA3-NEXT: usra v1.16b, v0.16b, #7180; NOSHA3-NEXT: mov v0.16b, v1.16b181; NOSHA3-NEXT: ret182;183; SVE2-LABEL: xar_instead_of_or_v16i8:184; SVE2: // %bb.0: // %entry185; SVE2-NEXT: movi v1.2d, #0000000000000000186; SVE2-NEXT: // kill: def $q0 killed $q0 def $z0187; SVE2-NEXT: xar z0.b, z0.b, z1.b, #7188; SVE2-NEXT: // kill: def $q0 killed $q0 killed $z0189; SVE2-NEXT: ret190entry:191 %or = call <16 x i8> @llvm.fshl.v2i8(<16 x i8> %r, <16 x i8> %r, <16 x i8> splat (i8 25))192 ret <16 x i8> %or193}194 195/* 64 bit vectors */196 197define <2 x i32> @xar_v2i32(<2 x i32> %x, <2 x i32> %y) {198; SHA3-LABEL: xar_v2i32:199; SHA3: // %bb.0: // %entry200; SHA3-NEXT: eor v1.8b, v0.8b, v1.8b201; SHA3-NEXT: shl v0.2s, v1.2s, #25202; SHA3-NEXT: usra v0.2s, v1.2s, #7203; SHA3-NEXT: ret204;205; NOSHA3-LABEL: xar_v2i32:206; NOSHA3: // %bb.0: // %entry207; NOSHA3-NEXT: eor v1.8b, v0.8b, v1.8b208; NOSHA3-NEXT: shl v0.2s, v1.2s, #25209; NOSHA3-NEXT: usra v0.2s, v1.2s, #7210; NOSHA3-NEXT: ret211;212; SVE2-LABEL: xar_v2i32:213; SVE2: // %bb.0: // %entry214; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0215; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1216; SVE2-NEXT: xar z0.s, z0.s, z1.s, #7217; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0218; SVE2-NEXT: ret219entry:220 %a = xor <2 x i32> %x, %y221 %b = call <2 x i32> @llvm.fshl(<2 x i32> %a, <2 x i32> %a, <2 x i32> <i32 25, i32 25>)222 ret <2 x i32> %b223}224 225define <2 x i32> @xar_instead_of_or_v2i32(<2 x i32> %r) {226; SHA3-LABEL: xar_instead_of_or_v2i32:227; SHA3: // %bb.0: // %entry228; SHA3-NEXT: shl v1.2s, v0.2s, #25229; SHA3-NEXT: usra v1.2s, v0.2s, #7230; SHA3-NEXT: fmov d0, d1231; SHA3-NEXT: ret232;233; NOSHA3-LABEL: xar_instead_of_or_v2i32:234; NOSHA3: // %bb.0: // %entry235; NOSHA3-NEXT: shl v1.2s, v0.2s, #25236; NOSHA3-NEXT: usra v1.2s, v0.2s, #7237; NOSHA3-NEXT: fmov d0, d1238; NOSHA3-NEXT: ret239;240; SVE2-LABEL: xar_instead_of_or_v2i32:241; SVE2: // %bb.0: // %entry242; SVE2-NEXT: movi v1.2d, #0000000000000000243; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0244; SVE2-NEXT: xar z0.s, z0.s, z1.s, #7245; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0246; SVE2-NEXT: ret247entry:248 %or = call <2 x i32> @llvm.fshl(<2 x i32> %r, <2 x i32> %r, <2 x i32> splat (i32 25))249 ret <2 x i32> %or250}251 252define <4 x i16> @xar_v4i16(<4 x i16> %x, <4 x i16> %y) {253; SHA3-LABEL: xar_v4i16:254; SHA3: // %bb.0: // %entry255; SHA3-NEXT: eor v1.8b, v0.8b, v1.8b256; SHA3-NEXT: shl v0.4h, v1.4h, #9257; SHA3-NEXT: usra v0.4h, v1.4h, #7258; SHA3-NEXT: ret259;260; NOSHA3-LABEL: xar_v4i16:261; NOSHA3: // %bb.0: // %entry262; NOSHA3-NEXT: eor v1.8b, v0.8b, v1.8b263; NOSHA3-NEXT: shl v0.4h, v1.4h, #9264; NOSHA3-NEXT: usra v0.4h, v1.4h, #7265; NOSHA3-NEXT: ret266;267; SVE2-LABEL: xar_v4i16:268; SVE2: // %bb.0: // %entry269; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0270; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1271; SVE2-NEXT: xar z0.h, z0.h, z1.h, #7272; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0273; SVE2-NEXT: ret274entry:275 %a = xor <4 x i16> %x, %y276 %b = call <4 x i16> @llvm.fshl(<4 x i16> %a, <4 x i16> %a, <4 x i16> splat (i16 25))277 ret <4 x i16> %b278}279 280define <4 x i16> @xar_instead_of_or_v4i16(<4 x i16> %r) {281; SHA3-LABEL: xar_instead_of_or_v4i16:282; SHA3: // %bb.0: // %entry283; SHA3-NEXT: shl v1.4h, v0.4h, #9284; SHA3-NEXT: usra v1.4h, v0.4h, #7285; SHA3-NEXT: fmov d0, d1286; SHA3-NEXT: ret287;288; NOSHA3-LABEL: xar_instead_of_or_v4i16:289; NOSHA3: // %bb.0: // %entry290; NOSHA3-NEXT: shl v1.4h, v0.4h, #9291; NOSHA3-NEXT: usra v1.4h, v0.4h, #7292; NOSHA3-NEXT: fmov d0, d1293; NOSHA3-NEXT: ret294;295; SVE2-LABEL: xar_instead_of_or_v4i16:296; SVE2: // %bb.0: // %entry297; SVE2-NEXT: movi v1.2d, #0000000000000000298; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0299; SVE2-NEXT: xar z0.h, z0.h, z1.h, #7300; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0301; SVE2-NEXT: ret302entry:303 %or = call <4 x i16> @llvm.fshl(<4 x i16> %r, <4 x i16> %r, <4 x i16> splat (i16 25))304 ret <4 x i16> %or305}306 307define <8 x i8> @xar_v8i8(<8 x i8> %x, <8 x i8> %y) {308; SHA3-LABEL: xar_v8i8:309; SHA3: // %bb.0: // %entry310; SHA3-NEXT: eor v1.8b, v0.8b, v1.8b311; SHA3-NEXT: add v0.8b, v1.8b, v1.8b312; SHA3-NEXT: usra v0.8b, v1.8b, #7313; SHA3-NEXT: ret314;315; NOSHA3-LABEL: xar_v8i8:316; NOSHA3: // %bb.0: // %entry317; NOSHA3-NEXT: eor v1.8b, v0.8b, v1.8b318; NOSHA3-NEXT: add v0.8b, v1.8b, v1.8b319; NOSHA3-NEXT: usra v0.8b, v1.8b, #7320; NOSHA3-NEXT: ret321;322; SVE2-LABEL: xar_v8i8:323; SVE2: // %bb.0: // %entry324; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0325; SVE2-NEXT: // kill: def $d1 killed $d1 def $z1326; SVE2-NEXT: xar z0.b, z0.b, z1.b, #7327; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0328; SVE2-NEXT: ret329entry:330 %a = xor <8 x i8> %x, %y331 %b = call <8 x i8> @llvm.fshl(<8 x i8> %a, <8 x i8> %a, <8 x i8> splat (i8 25))332 ret <8 x i8> %b333}334 335define <8 x i8> @xar_instead_of_or_v8i8(<8 x i8> %r) {336; SHA3-LABEL: xar_instead_of_or_v8i8:337; SHA3: // %bb.0: // %entry338; SHA3-NEXT: add v1.8b, v0.8b, v0.8b339; SHA3-NEXT: usra v1.8b, v0.8b, #7340; SHA3-NEXT: fmov d0, d1341; SHA3-NEXT: ret342;343; NOSHA3-LABEL: xar_instead_of_or_v8i8:344; NOSHA3: // %bb.0: // %entry345; NOSHA3-NEXT: add v1.8b, v0.8b, v0.8b346; NOSHA3-NEXT: usra v1.8b, v0.8b, #7347; NOSHA3-NEXT: fmov d0, d1348; NOSHA3-NEXT: ret349;350; SVE2-LABEL: xar_instead_of_or_v8i8:351; SVE2: // %bb.0: // %entry352; SVE2-NEXT: movi v1.2d, #0000000000000000353; SVE2-NEXT: // kill: def $d0 killed $d0 def $z0354; SVE2-NEXT: xar z0.b, z0.b, z1.b, #7355; SVE2-NEXT: // kill: def $d0 killed $d0 killed $z0356; SVE2-NEXT: ret357entry:358 %or = call <8 x i8> @llvm.fshl(<8 x i8> %r, <8 x i8> %r, <8 x i8> splat (i8 25))359 ret <8 x i8> %or360}361 362declare <2 x i64> @llvm.fshl.v2i64(<2 x i64>, <2 x i64>, <2 x i64>)363declare <4 x i32> @llvm.fshl.v4i32(<4 x i32>, <4 x i32>, <4 x i32>)364declare <8 x i16> @llvm.fshl.v8i16(<8 x i16>, <8 x i16>, <8 x i16>)365declare <16 x i8> @llvm.fshl.v16i8(<16 x i8>, <16 x i8>, <16 x i8>)366