85 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=aarch64-- -O2 -mattr=+neon < %s | FileCheck %s --check-prefixes=CHECK-SD3; RUN: llc -mtriple=aarch64-- -O2 -mattr=+neon -global-isel < %s | FileCheck %s --check-prefixes=CHECK-GI4 5define <8 x i8> @avgceil_u_i8_to_i16(<8 x i8> %a, <8 x i8> %b) {6; CHECK-SD-LABEL: avgceil_u_i8_to_i16:7; CHECK-SD: // %bb.0:8; CHECK-SD-NEXT: urhadd v0.8b, v0.8b, v1.8b9; CHECK-SD-NEXT: ret10;11; CHECK-GI-LABEL: avgceil_u_i8_to_i16:12; CHECK-GI: // %bb.0:13; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #014; CHECK-GI-NEXT: ushll v1.8h, v1.8b, #015; CHECK-GI-NEXT: urhadd v0.8h, v0.8h, v1.8h16; CHECK-GI-NEXT: xtn v0.8b, v0.8h17; CHECK-GI-NEXT: ret18 %a16 = zext <8 x i8> %a to <8 x i16>19 %b16 = zext <8 x i8> %b to <8 x i16>20 %avg16 = call <8 x i16> @llvm.aarch64.neon.urhadd.v8i16(<8 x i16> %a16, <8 x i16> %b16)21 %r = trunc <8 x i16> %avg16 to <8 x i8>22 ret <8 x i8> %r23}24 25 26define <8 x i8> @test_avgceil_s(<8 x i8> %a, <8 x i8> %b) {27; CHECK-SD-LABEL: test_avgceil_s:28; CHECK-SD: // %bb.0:29; CHECK-SD-NEXT: srhadd v0.8b, v0.8b, v1.8b30; CHECK-SD-NEXT: ret31;32; CHECK-GI-LABEL: test_avgceil_s:33; CHECK-GI: // %bb.0:34; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #035; CHECK-GI-NEXT: sshll v1.8h, v1.8b, #036; CHECK-GI-NEXT: srhadd v0.8h, v0.8h, v1.8h37; CHECK-GI-NEXT: xtn v0.8b, v0.8h38; CHECK-GI-NEXT: ret39 %a16 = sext <8 x i8> %a to <8 x i16>40 %b16 = sext <8 x i8> %b to <8 x i16>41 %avg16 = call <8 x i16> @llvm.aarch64.neon.srhadd.v8i16(<8 x i16> %a16, <8 x i16> %b16)42 %res = trunc <8 x i16> %avg16 to <8 x i8>43 ret <8 x i8> %res44}45 46define <8 x i8> @avgfloor_u_i8_to_i16(<8 x i8> %a, <8 x i8> %b) {47; CHECK-SD-LABEL: avgfloor_u_i8_to_i16:48; CHECK-SD: // %bb.0:49; CHECK-SD-NEXT: uhadd v0.8b, v0.8b, v1.8b50; CHECK-SD-NEXT: ret51;52; CHECK-GI-LABEL: avgfloor_u_i8_to_i16:53; CHECK-GI: // %bb.0:54; CHECK-GI-NEXT: ushll v0.8h, v0.8b, #055; CHECK-GI-NEXT: ushll v1.8h, v1.8b, #056; CHECK-GI-NEXT: uhadd v0.8h, v0.8h, v1.8h57; CHECK-GI-NEXT: xtn v0.8b, v0.8h58; CHECK-GI-NEXT: ret59 %a16 = zext <8 x i8> %a to <8 x i16>60 %b16 = zext <8 x i8> %b to <8 x i16>61 %avg16 = call <8 x i16> @llvm.aarch64.neon.uhadd.v8i16(<8 x i16> %a16, <8 x i16> %b16)62 %res = trunc <8 x i16> %avg16 to <8 x i8>63 ret <8 x i8> %res64}65 66define <8 x i8> @test_avgfloor_s(<8 x i8> %a, <8 x i8> %b) {67; CHECK-SD-LABEL: test_avgfloor_s:68; CHECK-SD: // %bb.0:69; CHECK-SD-NEXT: shadd v0.8b, v0.8b, v1.8b70; CHECK-SD-NEXT: ret71;72; CHECK-GI-LABEL: test_avgfloor_s:73; CHECK-GI: // %bb.0:74; CHECK-GI-NEXT: sshll v0.8h, v0.8b, #075; CHECK-GI-NEXT: sshll v1.8h, v1.8b, #076; CHECK-GI-NEXT: shadd v0.8h, v0.8h, v1.8h77; CHECK-GI-NEXT: xtn v0.8b, v0.8h78; CHECK-GI-NEXT: ret79 %a16 = sext <8 x i8> %a to <8 x i16>80 %b16 = sext <8 x i8> %b to <8 x i16>81 %avg16 = call <8 x i16> @llvm.aarch64.neon.shadd.v8i16(<8 x i16> %a16, <8 x i16> %b16)82 %res = trunc <8 x i16> %avg16 to <8 x i8>83 ret <8 x i8> %res84}85