333 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; Test file to verify the emission of Vector Evaluate instructions when ternary operators are used.3 4; RUN: llc -verify-machineinstrs -mcpu=pwr10 -mtriple=powerpc64le-unknown-unknown \5; RUN: -ppc-asm-full-reg-names --ppc-vsr-nums-as-vr < %s | FileCheck %s6 7; RUN: llc -verify-machineinstrs -mcpu=pwr10 -mtriple=powerpc-ibm-aix-xcoff \8; RUN: -ppc-asm-full-reg-names --ppc-vsr-nums-as-vr < %s | FileCheck %s9 10; RUN: llc -verify-machineinstrs -mcpu=pwr10 -mtriple=powerpc64-ibm-aix-xcoff \11; RUN: -ppc-asm-full-reg-names --ppc-vsr-nums-as-vr < %s | FileCheck %s12 13; Function to test ternary(A, and(B, C), xor(B, C)) for <4 x i32>14define <4 x i32> @ternary_A_and_BC_xor_BC_4x32(<4 x i1> %A, <4 x i32> %B, <4 x i32> %C) {15; CHECK-LABEL: ternary_A_and_BC_xor_BC_4x32:16; CHECK: # %bb.0: # %entry17; CHECK-NEXT: xxleqv v5, v5, v518; CHECK-NEXT: vslw v2, v2, v519; CHECK-NEXT: vsraw v2, v2, v520; CHECK-NEXT: xxeval v2, v2, v3, v4, 9721; CHECK-NEXT: blr22entry:23 %and = and <4 x i32> %B, %C24 %xor = xor <4 x i32> %B, %C25 %res = select <4 x i1> %A, <4 x i32> %and, <4 x i32> %xor26 ret <4 x i32> %res27}28 29; Function to test ternary(A, and(B, C), xor(B, C)) for <2 x i64>30define <2 x i64> @ternary_A_and_BC_xor_BC_2x64(<2 x i1> %A, <2 x i64> %B, <2 x i64> %C) {31; CHECK-LABEL: ternary_A_and_BC_xor_BC_2x64:32; CHECK: # %bb.0: # %entry33; CHECK-NEXT: xxlxor v5, v5, v534; CHECK-NEXT: xxsplti32dx v5, 1, 6335; CHECK-NEXT: vsld v2, v2, v536; CHECK-NEXT: vsrad v2, v2, v537; CHECK-NEXT: xxeval v2, v2, v3, v4, 9738; CHECK-NEXT: blr39entry:40 %and = and <2 x i64> %B, %C41 %xor = xor <2 x i64> %B, %C42 %res = select <2 x i1> %A, <2 x i64> %and, <2 x i64> %xor43 ret <2 x i64> %res44}45 46; Function to test ternary(A, and(B, C), xor(B, C)) for <16 x i8>47define <16 x i8> @ternary_A_and_BC_xor_BC_16x8(<16 x i1> %A, <16 x i8> %B, <16 x i8> %C) {48; CHECK-LABEL: ternary_A_and_BC_xor_BC_16x8:49; CHECK: # %bb.0: # %entry50; CHECK-NEXT: xxspltib v5, 751; CHECK-NEXT: vslb v2, v2, v552; CHECK-NEXT: vsrab v2, v2, v553; CHECK-NEXT: xxeval v2, v2, v3, v4, 9754; CHECK-NEXT: blr55entry:56 %and = and <16 x i8> %B, %C57 %xor = xor <16 x i8> %B, %C58 %res = select <16 x i1> %A, <16 x i8> %and, <16 x i8> %xor59 ret <16 x i8> %res60}61 62; Function to test ternary(A, and(B, C), xor(B, C)) for <8 x i16>63define <8 x i16> @ternary_A_and_BC_xor_BC_8x16(<8 x i1> %A, <8 x i16> %B, <8 x i16> %C) {64; CHECK-LABEL: ternary_A_and_BC_xor_BC_8x16:65; CHECK: # %bb.0: # %entry66; CHECK-NEXT: xxspltiw v5, 98305567; CHECK-NEXT: vslh v2, v2, v568; CHECK-NEXT: vsrah v2, v2, v569; CHECK-NEXT: xxeval v2, v2, v3, v4, 9770; CHECK-NEXT: blr71entry:72 %and = and <8 x i16> %B, %C73 %xor = xor <8 x i16> %B, %C74 %res = select <8 x i1> %A, <8 x i16> %and, <8 x i16> %xor75 ret <8 x i16> %res76}77 78; Function to test ternary(A, B, xor(B, C)) for <4 x i32>79define <4 x i32> @ternary_A_B_xor_BC_4x32(<4 x i1> %A, <4 x i32> %B, <4 x i32> %C) {80; CHECK-LABEL: ternary_A_B_xor_BC_4x32:81; CHECK: # %bb.0: # %entry82; CHECK-NEXT: xxleqv v5, v5, v583; CHECK-NEXT: vslw v2, v2, v584; CHECK-NEXT: vsraw v2, v2, v585; CHECK-NEXT: xxeval v2, v2, v3, v4, 9986; CHECK-NEXT: blr87entry:88 %xor = xor <4 x i32> %B, %C89 %res = select <4 x i1> %A, <4 x i32> %B, <4 x i32> %xor90 ret <4 x i32> %res91}92 93; Function to test ternary(A, B, xor(B, C)) for <2 x i64>94define <2 x i64> @ternary_A_B_xor_BC_2x64(<2 x i1> %A, <2 x i64> %B, <2 x i64> %C) {95; CHECK-LABEL: ternary_A_B_xor_BC_2x64:96; CHECK: # %bb.0: # %entry97; CHECK-NEXT: xxlxor v5, v5, v598; CHECK-NEXT: xxsplti32dx v5, 1, 6399; CHECK-NEXT: vsld v2, v2, v5100; CHECK-NEXT: vsrad v2, v2, v5101; CHECK-NEXT: xxeval v2, v2, v3, v4, 99102; CHECK-NEXT: blr103entry:104 %xor = xor <2 x i64> %B, %C105 %res = select <2 x i1> %A, <2 x i64> %B, <2 x i64> %xor106 ret <2 x i64> %res107}108 109; Function to test ternary(A, B, xor(B, C)) for <16 x i8>110define <16 x i8> @ternary_A_B_xor_BC_16x8(<16 x i1> %A, <16 x i8> %B, <16 x i8> %C) {111; CHECK-LABEL: ternary_A_B_xor_BC_16x8:112; CHECK: # %bb.0: # %entry113; CHECK-NEXT: xxspltib v5, 7114; CHECK-NEXT: vslb v2, v2, v5115; CHECK-NEXT: vsrab v2, v2, v5116; CHECK-NEXT: xxeval v2, v2, v3, v4, 99117; CHECK-NEXT: blr118entry:119 %xor = xor <16 x i8> %B, %C120 %res = select <16 x i1> %A, <16 x i8> %B, <16 x i8> %xor121 ret <16 x i8> %res122}123 124; Function to test ternary(A, B, xor(B, C)) for <8 x i16>125define <8 x i16> @ternary_A_B_xor_BC_8x16(<8 x i1> %A, <8 x i16> %B, <8 x i16> %C) {126; CHECK-LABEL: ternary_A_B_xor_BC_8x16:127; CHECK: # %bb.0: # %entry128; CHECK-NEXT: xxspltiw v5, 983055129; CHECK-NEXT: vslh v2, v2, v5130; CHECK-NEXT: vsrah v2, v2, v5131; CHECK-NEXT: xxeval v2, v2, v3, v4, 99132; CHECK-NEXT: blr133entry:134 %xor = xor <8 x i16> %B, %C135 %res = select <8 x i1> %A, <8 x i16> %B, <8 x i16> %xor136 ret <8 x i16> %res137}138 139; Function to test ternary(A, C, xor(B, C)) for <4 x i32>140define <4 x i32> @ternary_A_C_xor_BC_4x32(<4 x i1> %A, <4 x i32> %B, <4 x i32> %C) {141; CHECK-LABEL: ternary_A_C_xor_BC_4x32:142; CHECK: # %bb.0: # %entry143; CHECK-NEXT: xxleqv v5, v5, v5144; CHECK-NEXT: vslw v2, v2, v5145; CHECK-NEXT: vsraw v2, v2, v5146; CHECK-NEXT: xxeval v2, v2, v3, v4, 101147; CHECK-NEXT: blr148entry:149 %xor = xor <4 x i32> %B, %C150 %res = select <4 x i1> %A, <4 x i32> %C, <4 x i32> %xor151 ret <4 x i32> %res152}153 154; Function to test ternary(A, C, xor(B, C)) for <2 x i64>155define <2 x i64> @ternary_A_C_xor_BC_2x64(<2 x i1> %A, <2 x i64> %B, <2 x i64> %C) {156; CHECK-LABEL: ternary_A_C_xor_BC_2x64:157; CHECK: # %bb.0: # %entry158; CHECK-NEXT: xxlxor v5, v5, v5159; CHECK-NEXT: xxsplti32dx v5, 1, 63160; CHECK-NEXT: vsld v2, v2, v5161; CHECK-NEXT: vsrad v2, v2, v5162; CHECK-NEXT: xxeval v2, v2, v3, v4, 101163; CHECK-NEXT: blr164entry:165 %xor = xor <2 x i64> %B, %C166 %res = select <2 x i1> %A, <2 x i64> %C, <2 x i64> %xor167 ret <2 x i64> %res168}169 170; Function to test ternary(A, C, xor(B, C)) for <16 x i8>171define <16 x i8> @ternary_A_C_xor_BC_16x8(<16 x i1> %A, <16 x i8> %B, <16 x i8> %C) {172; CHECK-LABEL: ternary_A_C_xor_BC_16x8:173; CHECK: # %bb.0: # %entry174; CHECK-NEXT: xxspltib v5, 7175; CHECK-NEXT: vslb v2, v2, v5176; CHECK-NEXT: vsrab v2, v2, v5177; CHECK-NEXT: xxeval v2, v2, v3, v4, 101178; CHECK-NEXT: blr179entry:180 %xor = xor <16 x i8> %B, %C181 %res = select <16 x i1> %A, <16 x i8> %C, <16 x i8> %xor182 ret <16 x i8> %res183}184 185; Function to test ternary(A, C, xor(B, C)) for <8 x i16>186define <8 x i16> @ternary_A_C_xor_BC_8x16(<8 x i1> %A, <8 x i16> %B, <8 x i16> %C) {187; CHECK-LABEL: ternary_A_C_xor_BC_8x16:188; CHECK: # %bb.0: # %entry189; CHECK-NEXT: xxspltiw v5, 983055190; CHECK-NEXT: vslh v2, v2, v5191; CHECK-NEXT: vsrah v2, v2, v5192; CHECK-NEXT: xxeval v2, v2, v3, v4, 101193; CHECK-NEXT: blr194entry:195 %xor = xor <8 x i16> %B, %C196 %res = select <8 x i1> %A, <8 x i16> %C, <8 x i16> %xor197 ret <8 x i16> %res198}199 200; Function to test ternary(A, or(B, C), xor(B, C)) for <4 x i32>201define <4 x i32> @ternary_A_or_BC_xor_BC_4x32(<4 x i1> %A, <4 x i32> %B, <4 x i32> %C) {202; CHECK-LABEL: ternary_A_or_BC_xor_BC_4x32:203; CHECK: # %bb.0: # %entry204; CHECK-NEXT: xxleqv v5, v5, v5205; CHECK-NEXT: vslw v2, v2, v5206; CHECK-NEXT: vsraw v2, v2, v5207; CHECK-NEXT: xxeval v2, v2, v3, v4, 103208; CHECK-NEXT: blr209entry:210 %or = or <4 x i32> %B, %C211 %xor = xor <4 x i32> %B, %C212 %res = select <4 x i1> %A, <4 x i32> %or, <4 x i32> %xor213 ret <4 x i32> %res214}215 216; Function to test ternary(A, or(B, C), xor(B, C)) for <2 x i64>217define <2 x i64> @ternary_A_or_BC_xor_BC_2x64(<2 x i1> %A, <2 x i64> %B, <2 x i64> %C) {218; CHECK-LABEL: ternary_A_or_BC_xor_BC_2x64:219; CHECK: # %bb.0: # %entry220; CHECK-NEXT: xxlxor v5, v5, v5221; CHECK-NEXT: xxsplti32dx v5, 1, 63222; CHECK-NEXT: vsld v2, v2, v5223; CHECK-NEXT: vsrad v2, v2, v5224; CHECK-NEXT: xxeval v2, v2, v3, v4, 103225; CHECK-NEXT: blr226entry:227 %or = or <2 x i64> %B, %C228 %xor = xor <2 x i64> %B, %C229 %res = select <2 x i1> %A, <2 x i64> %or, <2 x i64> %xor230 ret <2 x i64> %res231}232 233; Function to test ternary(A, or(B, C), xor(B, C)) for <16 x i8>234define <16 x i8> @ternary_A_or_BC_xor_BC_16x8(<16 x i1> %A, <16 x i8> %B, <16 x i8> %C) {235; CHECK-LABEL: ternary_A_or_BC_xor_BC_16x8:236; CHECK: # %bb.0: # %entry237; CHECK-NEXT: xxspltib v5, 7238; CHECK-NEXT: vslb v2, v2, v5239; CHECK-NEXT: vsrab v2, v2, v5240; CHECK-NEXT: xxeval v2, v2, v3, v4, 103241; CHECK-NEXT: blr242entry:243 %or = or <16 x i8> %B, %C244 %xor = xor <16 x i8> %B, %C245 %res = select <16 x i1> %A, <16 x i8> %or, <16 x i8> %xor246 ret <16 x i8> %res247}248 249; Function to test ternary(A, or(B, C), xor(B, C)) for <8 x i16>250define <8 x i16> @ternary_A_or_BC_xor_BC_8x16(<8 x i1> %A, <8 x i16> %B, <8 x i16> %C) {251; CHECK-LABEL: ternary_A_or_BC_xor_BC_8x16:252; CHECK: # %bb.0: # %entry253; CHECK-NEXT: xxspltiw v5, 983055254; CHECK-NEXT: vslh v2, v2, v5255; CHECK-NEXT: vsrah v2, v2, v5256; CHECK-NEXT: xxeval v2, v2, v3, v4, 103257; CHECK-NEXT: blr258entry:259 %or = or <8 x i16> %B, %C260 %xor = xor <8 x i16> %B, %C261 %res = select <8 x i1> %A, <8 x i16> %or, <8 x i16> %xor262 ret <8 x i16> %res263}264 265; Function to test ternary(A, nor(B, C), xor(B, C)) for <4 x i32>266define <4 x i32> @ternary_A_nor_BC_xor_BC_4x32(<4 x i1> %A, <4 x i32> %B, <4 x i32> %C) {267; CHECK-LABEL: ternary_A_nor_BC_xor_BC_4x32:268; CHECK: # %bb.0: # %entry269; CHECK-NEXT: xxleqv v5, v5, v5270; CHECK-NEXT: vslw v2, v2, v5271; CHECK-NEXT: vsraw v2, v2, v5272; CHECK-NEXT: xxeval v2, v2, v3, v4, 104273; CHECK-NEXT: blr274entry:275 %or = or <4 x i32> %B, %C276 %nor = xor <4 x i32> %or, <i32 -1, i32 -1, i32 -1, i32 -1> ; vector nor operation277 %xor = xor <4 x i32> %B, %C278 %res = select <4 x i1> %A, <4 x i32> %nor, <4 x i32> %xor279 ret <4 x i32> %res280}281 282; Function to test ternary(A, nor(B, C), xor(B, C)) for <2 x i64>283define <2 x i64> @ternary_A_nor_BC_xor_BC_2x64(<2 x i1> %A, <2 x i64> %B, <2 x i64> %C) {284; CHECK-LABEL: ternary_A_nor_BC_xor_BC_2x64:285; CHECK: # %bb.0: # %entry286; CHECK-NEXT: xxlxor v5, v5, v5287; CHECK-NEXT: xxsplti32dx v5, 1, 63288; CHECK-NEXT: vsld v2, v2, v5289; CHECK-NEXT: vsrad v2, v2, v5290; CHECK-NEXT: xxeval v2, v2, v3, v4, 104291; CHECK-NEXT: blr292entry:293 %or = or <2 x i64> %B, %C294 %nor = xor <2 x i64> %or, <i64 -1, i64 -1> ; vector nor operation295 %xor = xor <2 x i64> %B, %C296 %res = select <2 x i1> %A, <2 x i64> %nor, <2 x i64> %xor297 ret <2 x i64> %res298}299 300; Function to test ternary(A, nor(B, C), xor(B, C)) for <16 x i8>301define <16 x i8> @ternary_A_nor_BC_xor_BC_16x8(<16 x i1> %A, <16 x i8> %B, <16 x i8> %C) {302; CHECK-LABEL: ternary_A_nor_BC_xor_BC_16x8:303; CHECK: # %bb.0: # %entry304; CHECK-NEXT: xxspltib v5, 7305; CHECK-NEXT: vslb v2, v2, v5306; CHECK-NEXT: vsrab v2, v2, v5307; CHECK-NEXT: xxeval v2, v2, v3, v4, 104308; CHECK-NEXT: blr309entry:310 %or = or <16 x i8> %B, %C311 %nor = xor <16 x i8> %or, <i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1, i8 -1> ; vector nor operation312 %xor = xor <16 x i8> %B, %C313 %res = select <16 x i1> %A, <16 x i8> %nor, <16 x i8> %xor314 ret <16 x i8> %res315}316 317; Function to test ternary(A, nor(B, C), xor(B, C)) for <8 x i16>318define <8 x i16> @ternary_A_nor_BC_xor_BC_8x16(<8 x i1> %A, <8 x i16> %B, <8 x i16> %C) {319; CHECK-LABEL: ternary_A_nor_BC_xor_BC_8x16:320; CHECK: # %bb.0: # %entry321; CHECK-NEXT: xxspltiw v5, 983055322; CHECK-NEXT: vslh v2, v2, v5323; CHECK-NEXT: vsrah v2, v2, v5324; CHECK-NEXT: xxeval v2, v2, v3, v4, 104325; CHECK-NEXT: blr326entry:327 %or = or <8 x i16> %B, %C328 %nor = xor <8 x i16> %or, <i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1, i16 -1> ; vector nor operation329 %xor = xor <8 x i16> %B, %C330 %res = select <8 x i1> %A, <8 x i16> %nor, <8 x i16> %xor331 ret <8 x i16> %res332}333