mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-24 11:42:57 +01:00
383f076bfc
The AArch64 instruction set has a few "widening" instructions (e.g., uaddl, saddl, uaddw, etc.) that take one or more doubleword operands and produce quadword results. The operands are automatically sign- or zero-extended as appropriate. However, in LLVM IR, these extends are explicit. This patch updates TTI to consider these widening instructions as single operations whose cost is attached to the arithmetic instruction. It marks extends that are part of a widening operation "free" and applies a sub-target specified overhead (zero by default) to the arithmetic instructions. Differential Revision: https://reviews.llvm.org/D32706 llvm-svn: 302582
623 lines
24 KiB
LLVM
623 lines
24 KiB
LLVM
; RUN: opt < %s -mtriple=aarch64--linux-gnu -cost-model -analyze | FileCheck %s --check-prefix=COST
|
|
; RUN: llc < %s -mtriple=aarch64--linux-gnu | FileCheck %s --check-prefix=CODE
|
|
|
|
; COST-LABEL: uaddl_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <8 x i8> %b to <8 x i16>
|
|
; CODE-LABEL: uaddl_8h
|
|
; CODE: uaddl v0.8h, v0.8b, v1.8b
|
|
define <8 x i16> @uaddl_8h(<8 x i8> %a, <8 x i8> %b) {
|
|
%tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = zext <8 x i8> %b to <8 x i16>
|
|
%tmp2 = add <8 x i16> %tmp0, %tmp1
|
|
ret <8 x i16> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: uaddl_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <4 x i16> %a to <4 x i32>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <4 x i16> %b to <4 x i32>
|
|
; CODE-LABEL: uaddl_4s
|
|
; CODE: uaddl v0.4s, v0.4h, v1.4h
|
|
define <4 x i32> @uaddl_4s(<4 x i16> %a, <4 x i16> %b) {
|
|
%tmp0 = zext <4 x i16> %a to <4 x i32>
|
|
%tmp1 = zext <4 x i16> %b to <4 x i32>
|
|
%tmp2 = add <4 x i32> %tmp0, %tmp1
|
|
ret <4 x i32> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: uaddl_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <2 x i32> %a to <2 x i64>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <2 x i32> %b to <2 x i64>
|
|
; CODE-LABEL: uaddl_2d
|
|
; CODE: uaddl v0.2d, v0.2s, v1.2s
|
|
define <2 x i64> @uaddl_2d(<2 x i32> %a, <2 x i32> %b) {
|
|
%tmp0 = zext <2 x i32> %a to <2 x i64>
|
|
%tmp1 = zext <2 x i32> %b to <2 x i64>
|
|
%tmp2 = add <2 x i64> %tmp0, %tmp1
|
|
ret <2 x i64> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: uaddl2_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <16 x i8> %a to <16 x i16>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <16 x i8> %b to <16 x i16>
|
|
; CODE-LABEL: uaddl2_8h
|
|
; CODE: uaddl2 v2.8h, v0.16b, v1.16b
|
|
; CODE-NEXT: uaddl v0.8h, v0.8b, v1.8b
|
|
define <16 x i16> @uaddl2_8h(<16 x i8> %a, <16 x i8> %b) {
|
|
%tmp0 = zext <16 x i8> %a to <16 x i16>
|
|
%tmp1 = zext <16 x i8> %b to <16 x i16>
|
|
%tmp2 = add <16 x i16> %tmp0, %tmp1
|
|
ret <16 x i16> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: uaddl2_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <8 x i16> %a to <8 x i32>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <8 x i16> %b to <8 x i32>
|
|
; CODE-LABEL: uaddl2_4s
|
|
; CODE: uaddl2 v2.4s, v0.8h, v1.8h
|
|
; CODE-NEXT: uaddl v0.4s, v0.4h, v1.4h
|
|
define <8 x i32> @uaddl2_4s(<8 x i16> %a, <8 x i16> %b) {
|
|
%tmp0 = zext <8 x i16> %a to <8 x i32>
|
|
%tmp1 = zext <8 x i16> %b to <8 x i32>
|
|
%tmp2 = add <8 x i32> %tmp0, %tmp1
|
|
ret <8 x i32> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: uaddl2_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <4 x i32> %a to <4 x i64>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <4 x i32> %b to <4 x i64>
|
|
; CODE-LABEL: uaddl2_2d
|
|
; CODE: uaddl2 v2.2d, v0.4s, v1.4s
|
|
; CODE-NEXT: uaddl v0.2d, v0.2s, v1.2s
|
|
define <4 x i64> @uaddl2_2d(<4 x i32> %a, <4 x i32> %b) {
|
|
%tmp0 = zext <4 x i32> %a to <4 x i64>
|
|
%tmp1 = zext <4 x i32> %b to <4 x i64>
|
|
%tmp2 = add <4 x i64> %tmp0, %tmp1
|
|
ret <4 x i64> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: saddl_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <8 x i8> %b to <8 x i16>
|
|
; CODE-LABEL: saddl_8h
|
|
; CODE: saddl v0.8h, v0.8b, v1.8b
|
|
define <8 x i16> @saddl_8h(<8 x i8> %a, <8 x i8> %b) {
|
|
%tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = sext <8 x i8> %b to <8 x i16>
|
|
%tmp2 = add <8 x i16> %tmp0, %tmp1
|
|
ret <8 x i16> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: saddl_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <4 x i16> %a to <4 x i32>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <4 x i16> %b to <4 x i32>
|
|
; CODE-LABEL: saddl_4s
|
|
; CODE: saddl v0.4s, v0.4h, v1.4h
|
|
define <4 x i32> @saddl_4s(<4 x i16> %a, <4 x i16> %b) {
|
|
%tmp0 = sext <4 x i16> %a to <4 x i32>
|
|
%tmp1 = sext <4 x i16> %b to <4 x i32>
|
|
%tmp2 = add <4 x i32> %tmp0, %tmp1
|
|
ret <4 x i32> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: saddl_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <2 x i32> %a to <2 x i64>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <2 x i32> %b to <2 x i64>
|
|
; CODE-LABEL: saddl_2d
|
|
; CODE: saddl v0.2d, v0.2s, v1.2s
|
|
define <2 x i64> @saddl_2d(<2 x i32> %a, <2 x i32> %b) {
|
|
%tmp0 = sext <2 x i32> %a to <2 x i64>
|
|
%tmp1 = sext <2 x i32> %b to <2 x i64>
|
|
%tmp2 = add <2 x i64> %tmp0, %tmp1
|
|
ret <2 x i64> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: saddl2_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <16 x i8> %a to <16 x i16>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <16 x i8> %b to <16 x i16>
|
|
; CODE-LABEL: saddl2_8h
|
|
; CODE: saddl2 v2.8h, v0.16b, v1.16b
|
|
; CODE-NEXT: saddl v0.8h, v0.8b, v1.8b
|
|
define <16 x i16> @saddl2_8h(<16 x i8> %a, <16 x i8> %b) {
|
|
%tmp0 = sext <16 x i8> %a to <16 x i16>
|
|
%tmp1 = sext <16 x i8> %b to <16 x i16>
|
|
%tmp2 = add <16 x i16> %tmp0, %tmp1
|
|
ret <16 x i16> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: saddl2_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <8 x i16> %a to <8 x i32>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <8 x i16> %b to <8 x i32>
|
|
; CODE-LABEL: saddl2_4s
|
|
; CODE: saddl2 v2.4s, v0.8h, v1.8h
|
|
; CODE-NEXT: saddl v0.4s, v0.4h, v1.4h
|
|
define <8 x i32> @saddl2_4s(<8 x i16> %a, <8 x i16> %b) {
|
|
%tmp0 = sext <8 x i16> %a to <8 x i32>
|
|
%tmp1 = sext <8 x i16> %b to <8 x i32>
|
|
%tmp2 = add <8 x i32> %tmp0, %tmp1
|
|
ret <8 x i32> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: saddl2_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <4 x i32> %a to <4 x i64>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <4 x i32> %b to <4 x i64>
|
|
; CODE-LABEL: saddl2_2d
|
|
; CODE: saddl2 v2.2d, v0.4s, v1.4s
|
|
; CODE-NEXT: saddl v0.2d, v0.2s, v1.2s
|
|
define <4 x i64> @saddl2_2d(<4 x i32> %a, <4 x i32> %b) {
|
|
%tmp0 = sext <4 x i32> %a to <4 x i64>
|
|
%tmp1 = sext <4 x i32> %b to <4 x i64>
|
|
%tmp2 = add <4 x i64> %tmp0, %tmp1
|
|
ret <4 x i64> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: usubl_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <8 x i8> %b to <8 x i16>
|
|
; CODE-LABEL: usubl_8h
|
|
; CODE: usubl v0.8h, v0.8b, v1.8b
|
|
define <8 x i16> @usubl_8h(<8 x i8> %a, <8 x i8> %b) {
|
|
%tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = zext <8 x i8> %b to <8 x i16>
|
|
%tmp2 = sub <8 x i16> %tmp0, %tmp1
|
|
ret <8 x i16> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: usubl_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <4 x i16> %a to <4 x i32>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <4 x i16> %b to <4 x i32>
|
|
; CODE-LABEL: usubl_4s
|
|
; CODE: usubl v0.4s, v0.4h, v1.4h
|
|
define <4 x i32> @usubl_4s(<4 x i16> %a, <4 x i16> %b) {
|
|
%tmp0 = zext <4 x i16> %a to <4 x i32>
|
|
%tmp1 = zext <4 x i16> %b to <4 x i32>
|
|
%tmp2 = sub <4 x i32> %tmp0, %tmp1
|
|
ret <4 x i32> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: usubl_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <2 x i32> %a to <2 x i64>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <2 x i32> %b to <2 x i64>
|
|
; CODE-LABEL: usubl_2d
|
|
; CODE: usubl v0.2d, v0.2s, v1.2s
|
|
define <2 x i64> @usubl_2d(<2 x i32> %a, <2 x i32> %b) {
|
|
%tmp0 = zext <2 x i32> %a to <2 x i64>
|
|
%tmp1 = zext <2 x i32> %b to <2 x i64>
|
|
%tmp2 = sub <2 x i64> %tmp0, %tmp1
|
|
ret <2 x i64> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: usubl2_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <16 x i8> %a to <16 x i16>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <16 x i8> %b to <16 x i16>
|
|
; CODE-LABEL: usubl2_8h
|
|
; CODE: usubl2 v2.8h, v0.16b, v1.16b
|
|
; CODE-NEXT: usubl v0.8h, v0.8b, v1.8b
|
|
define <16 x i16> @usubl2_8h(<16 x i8> %a, <16 x i8> %b) {
|
|
%tmp0 = zext <16 x i8> %a to <16 x i16>
|
|
%tmp1 = zext <16 x i8> %b to <16 x i16>
|
|
%tmp2 = sub <16 x i16> %tmp0, %tmp1
|
|
ret <16 x i16> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: usubl2_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <8 x i16> %a to <8 x i32>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <8 x i16> %b to <8 x i32>
|
|
; CODE-LABEL: usubl2_4s
|
|
; CODE: usubl2 v2.4s, v0.8h, v1.8h
|
|
; CODE-NEXT: usubl v0.4s, v0.4h, v1.4h
|
|
define <8 x i32> @usubl2_4s(<8 x i16> %a, <8 x i16> %b) {
|
|
%tmp0 = zext <8 x i16> %a to <8 x i32>
|
|
%tmp1 = zext <8 x i16> %b to <8 x i32>
|
|
%tmp2 = sub <8 x i32> %tmp0, %tmp1
|
|
ret <8 x i32> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: usubl2_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <4 x i32> %a to <4 x i64>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <4 x i32> %b to <4 x i64>
|
|
; CODE-LABEL: usubl2_2d
|
|
; CODE: usubl2 v2.2d, v0.4s, v1.4s
|
|
; CODE-NEXT: usubl v0.2d, v0.2s, v1.2s
|
|
define <4 x i64> @usubl2_2d(<4 x i32> %a, <4 x i32> %b) {
|
|
%tmp0 = zext <4 x i32> %a to <4 x i64>
|
|
%tmp1 = zext <4 x i32> %b to <4 x i64>
|
|
%tmp2 = sub <4 x i64> %tmp0, %tmp1
|
|
ret <4 x i64> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: ssubl_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <8 x i8> %b to <8 x i16>
|
|
; CODE-LABEL: ssubl_8h
|
|
; CODE: ssubl v0.8h, v0.8b, v1.8b
|
|
define <8 x i16> @ssubl_8h(<8 x i8> %a, <8 x i8> %b) {
|
|
%tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = sext <8 x i8> %b to <8 x i16>
|
|
%tmp2 = sub <8 x i16> %tmp0, %tmp1
|
|
ret <8 x i16> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: ssubl_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <4 x i16> %a to <4 x i32>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <4 x i16> %b to <4 x i32>
|
|
; CODE-LABEL: ssubl_4s
|
|
; CODE: ssubl v0.4s, v0.4h, v1.4h
|
|
define <4 x i32> @ssubl_4s(<4 x i16> %a, <4 x i16> %b) {
|
|
%tmp0 = sext <4 x i16> %a to <4 x i32>
|
|
%tmp1 = sext <4 x i16> %b to <4 x i32>
|
|
%tmp2 = sub <4 x i32> %tmp0, %tmp1
|
|
ret <4 x i32> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: ssubl_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <2 x i32> %a to <2 x i64>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <2 x i32> %b to <2 x i64>
|
|
; CODE-LABEL: ssubl_2d
|
|
; CODE: ssubl v0.2d, v0.2s, v1.2s
|
|
define <2 x i64> @ssubl_2d(<2 x i32> %a, <2 x i32> %b) {
|
|
%tmp0 = sext <2 x i32> %a to <2 x i64>
|
|
%tmp1 = sext <2 x i32> %b to <2 x i64>
|
|
%tmp2 = sub <2 x i64> %tmp0, %tmp1
|
|
ret <2 x i64> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: ssubl2_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <16 x i8> %a to <16 x i16>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <16 x i8> %b to <16 x i16>
|
|
; CODE-LABEL: ssubl2_8h
|
|
; CODE: ssubl2 v2.8h, v0.16b, v1.16b
|
|
; CODE-NEXT: ssubl v0.8h, v0.8b, v1.8b
|
|
define <16 x i16> @ssubl2_8h(<16 x i8> %a, <16 x i8> %b) {
|
|
%tmp0 = sext <16 x i8> %a to <16 x i16>
|
|
%tmp1 = sext <16 x i8> %b to <16 x i16>
|
|
%tmp2 = sub <16 x i16> %tmp0, %tmp1
|
|
ret <16 x i16> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: ssubl2_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <8 x i16> %a to <8 x i32>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <8 x i16> %b to <8 x i32>
|
|
; CODE-LABEL: ssubl2_4s
|
|
; CODE: ssubl2 v2.4s, v0.8h, v1.8h
|
|
; CODE-NEXT: ssubl v0.4s, v0.4h, v1.4h
|
|
define <8 x i32> @ssubl2_4s(<8 x i16> %a, <8 x i16> %b) {
|
|
%tmp0 = sext <8 x i16> %a to <8 x i32>
|
|
%tmp1 = sext <8 x i16> %b to <8 x i32>
|
|
%tmp2 = sub <8 x i32> %tmp0, %tmp1
|
|
ret <8 x i32> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: ssubl2_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <4 x i32> %a to <4 x i64>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = sext <4 x i32> %b to <4 x i64>
|
|
; CODE-LABEL: ssubl2_2d
|
|
; CODE: ssubl2 v2.2d, v0.4s, v1.4s
|
|
; CODE-NEXT: ssubl v0.2d, v0.2s, v1.2s
|
|
define <4 x i64> @ssubl2_2d(<4 x i32> %a, <4 x i32> %b) {
|
|
%tmp0 = sext <4 x i32> %a to <4 x i64>
|
|
%tmp1 = sext <4 x i32> %b to <4 x i64>
|
|
%tmp2 = sub <4 x i64> %tmp0, %tmp1
|
|
ret <4 x i64> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: uaddw_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
; CODE-LABEL: uaddw_8h
|
|
; CODE: uaddw v0.8h, v1.8h, v0.8b
|
|
define <8 x i16> @uaddw_8h(<8 x i8> %a, <8 x i16> %b) {
|
|
%tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = add <8 x i16> %b, %tmp0
|
|
ret <8 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: uaddw_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <4 x i16> %a to <4 x i32>
|
|
; CODE-LABEL: uaddw_4s
|
|
; CODE: uaddw v0.4s, v1.4s, v0.4h
|
|
define <4 x i32> @uaddw_4s(<4 x i16> %a, <4 x i32> %b) {
|
|
%tmp0 = zext <4 x i16> %a to <4 x i32>
|
|
%tmp1 = add <4 x i32> %b, %tmp0
|
|
ret <4 x i32> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: uaddw_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <2 x i32> %a to <2 x i64>
|
|
; CODE-LABEL: uaddw_2d
|
|
; CODE: uaddw v0.2d, v1.2d, v0.2s
|
|
define <2 x i64> @uaddw_2d(<2 x i32> %a, <2 x i64> %b) {
|
|
%tmp0 = zext <2 x i32> %a to <2 x i64>
|
|
%tmp1 = add <2 x i64> %b, %tmp0
|
|
ret <2 x i64> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: uaddw2_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <16 x i8> %a to <16 x i16>
|
|
; CODE-LABEL: uaddw2_8h
|
|
; CODE: uaddw2 v2.8h, v2.8h, v0.16b
|
|
; CODE-NEXT: uaddw v0.8h, v1.8h, v0.8b
|
|
define <16 x i16> @uaddw2_8h(<16 x i8> %a, <16 x i16> %b) {
|
|
%tmp0 = zext <16 x i8> %a to <16 x i16>
|
|
%tmp1 = add <16 x i16> %b, %tmp0
|
|
ret <16 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: uaddw2_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <8 x i16> %a to <8 x i32>
|
|
; CODE-LABEL: uaddw2_4s
|
|
; CODE: uaddw2 v2.4s, v2.4s, v0.8h
|
|
; CODE-NEXT: uaddw v0.4s, v1.4s, v0.4h
|
|
define <8 x i32> @uaddw2_4s(<8 x i16> %a, <8 x i32> %b) {
|
|
%tmp0 = zext <8 x i16> %a to <8 x i32>
|
|
%tmp1 = add <8 x i32> %b, %tmp0
|
|
ret <8 x i32> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: uaddw2_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <4 x i32> %a to <4 x i64>
|
|
; CODE-LABEL: uaddw2_2d
|
|
; CODE: uaddw2 v2.2d, v2.2d, v0.4s
|
|
; CODE-NEXT: uaddw v0.2d, v1.2d, v0.2s
|
|
define <4 x i64> @uaddw2_2d(<4 x i32> %a, <4 x i64> %b) {
|
|
%tmp0 = zext <4 x i32> %a to <4 x i64>
|
|
%tmp1 = add <4 x i64> %b, %tmp0
|
|
ret <4 x i64> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: saddw_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
; CODE-LABEL: saddw_8h
|
|
; CODE: saddw v0.8h, v1.8h, v0.8b
|
|
define <8 x i16> @saddw_8h(<8 x i8> %a, <8 x i16> %b) {
|
|
%tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = add <8 x i16> %b, %tmp0
|
|
ret <8 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: saddw_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <4 x i16> %a to <4 x i32>
|
|
; CODE-LABEL: saddw_4s
|
|
; CODE: saddw v0.4s, v1.4s, v0.4h
|
|
define <4 x i32> @saddw_4s(<4 x i16> %a, <4 x i32> %b) {
|
|
%tmp0 = sext <4 x i16> %a to <4 x i32>
|
|
%tmp1 = add <4 x i32> %b, %tmp0
|
|
ret <4 x i32> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: saddw_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <2 x i32> %a to <2 x i64>
|
|
; CODE-LABEL: saddw_2d
|
|
; CODE: saddw v0.2d, v1.2d, v0.2s
|
|
define <2 x i64> @saddw_2d(<2 x i32> %a, <2 x i64> %b) {
|
|
%tmp0 = sext <2 x i32> %a to <2 x i64>
|
|
%tmp1 = add <2 x i64> %b, %tmp0
|
|
ret <2 x i64> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: saddw2_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <16 x i8> %a to <16 x i16>
|
|
; CODE-LABEL: saddw2_8h
|
|
; CODE: saddw2 v2.8h, v2.8h, v0.16b
|
|
; CODE-NEXT: saddw v0.8h, v1.8h, v0.8b
|
|
define <16 x i16> @saddw2_8h(<16 x i8> %a, <16 x i16> %b) {
|
|
%tmp0 = sext <16 x i8> %a to <16 x i16>
|
|
%tmp1 = add <16 x i16> %b, %tmp0
|
|
ret <16 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: saddw2_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <8 x i16> %a to <8 x i32>
|
|
; CODE-LABEL: saddw2_4s
|
|
; CODE: saddw2 v2.4s, v2.4s, v0.8h
|
|
; CODE-NEXT: saddw v0.4s, v1.4s, v0.4h
|
|
define <8 x i32> @saddw2_4s(<8 x i16> %a, <8 x i32> %b) {
|
|
%tmp0 = sext <8 x i16> %a to <8 x i32>
|
|
%tmp1 = add <8 x i32> %b, %tmp0
|
|
ret <8 x i32> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: saddw2_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <4 x i32> %a to <4 x i64>
|
|
; CODE-LABEL: saddw2_2d
|
|
; CODE: saddw2 v2.2d, v2.2d, v0.4s
|
|
; CODE-NEXT: saddw v0.2d, v1.2d, v0.2s
|
|
define <4 x i64> @saddw2_2d(<4 x i32> %a, <4 x i64> %b) {
|
|
%tmp0 = sext <4 x i32> %a to <4 x i64>
|
|
%tmp1 = add <4 x i64> %b, %tmp0
|
|
ret <4 x i64> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: usubw_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
; CODE-LABEL: usubw_8h
|
|
; CODE: usubw v0.8h, v1.8h, v0.8b
|
|
define <8 x i16> @usubw_8h(<8 x i8> %a, <8 x i16> %b) {
|
|
%tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = sub <8 x i16> %b, %tmp0
|
|
ret <8 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: usubw_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <4 x i16> %a to <4 x i32>
|
|
; CODE-LABEL: usubw_4s
|
|
; CODE: usubw v0.4s, v1.4s, v0.4h
|
|
define <4 x i32> @usubw_4s(<4 x i16> %a, <4 x i32> %b) {
|
|
%tmp0 = zext <4 x i16> %a to <4 x i32>
|
|
%tmp1 = sub <4 x i32> %b, %tmp0
|
|
ret <4 x i32> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: usubw_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <2 x i32> %a to <2 x i64>
|
|
; CODE-LABEL: usubw_2d
|
|
; CODE: usubw v0.2d, v1.2d, v0.2s
|
|
define <2 x i64> @usubw_2d(<2 x i32> %a, <2 x i64> %b) {
|
|
%tmp0 = zext <2 x i32> %a to <2 x i64>
|
|
%tmp1 = sub <2 x i64> %b, %tmp0
|
|
ret <2 x i64> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: usubw2_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <16 x i8> %a to <16 x i16>
|
|
; CODE-LABEL: usubw2_8h
|
|
; CODE: usubw2 v2.8h, v2.8h, v0.16b
|
|
; CODE-NEXT: usubw v0.8h, v1.8h, v0.8b
|
|
define <16 x i16> @usubw2_8h(<16 x i8> %a, <16 x i16> %b) {
|
|
%tmp0 = zext <16 x i8> %a to <16 x i16>
|
|
%tmp1 = sub <16 x i16> %b, %tmp0
|
|
ret <16 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: usubw2_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <8 x i16> %a to <8 x i32>
|
|
; CODE-LABEL: usubw2_4s
|
|
; CODE: usubw2 v2.4s, v2.4s, v0.8h
|
|
; CODE-NEXT: usubw v0.4s, v1.4s, v0.4h
|
|
define <8 x i32> @usubw2_4s(<8 x i16> %a, <8 x i32> %b) {
|
|
%tmp0 = zext <8 x i16> %a to <8 x i32>
|
|
%tmp1 = sub <8 x i32> %b, %tmp0
|
|
ret <8 x i32> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: usubw2_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = zext <4 x i32> %a to <4 x i64>
|
|
; CODE-LABEL: usubw2_2d
|
|
; CODE: usubw2 v2.2d, v2.2d, v0.4s
|
|
; CODE-NEXT: usubw v0.2d, v1.2d, v0.2s
|
|
define <4 x i64> @usubw2_2d(<4 x i32> %a, <4 x i64> %b) {
|
|
%tmp0 = zext <4 x i32> %a to <4 x i64>
|
|
%tmp1 = sub <4 x i64> %b, %tmp0
|
|
ret <4 x i64> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: ssubw_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
; CODE-LABEL: ssubw_8h
|
|
; CODE: ssubw v0.8h, v1.8h, v0.8b
|
|
define <8 x i16> @ssubw_8h(<8 x i8> %a, <8 x i16> %b) {
|
|
%tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = sub <8 x i16> %b, %tmp0
|
|
ret <8 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: ssubw_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <4 x i16> %a to <4 x i32>
|
|
; CODE-LABEL: ssubw_4s
|
|
; CODE: ssubw v0.4s, v1.4s, v0.4h
|
|
define <4 x i32> @ssubw_4s(<4 x i16> %a, <4 x i32> %b) {
|
|
%tmp0 = sext <4 x i16> %a to <4 x i32>
|
|
%tmp1 = sub <4 x i32> %b, %tmp0
|
|
ret <4 x i32> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: ssubw_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <2 x i32> %a to <2 x i64>
|
|
; CODE-LABEL: ssubw_2d
|
|
; CODE: ssubw v0.2d, v1.2d, v0.2s
|
|
define <2 x i64> @ssubw_2d(<2 x i32> %a, <2 x i64> %b) {
|
|
%tmp0 = sext <2 x i32> %a to <2 x i64>
|
|
%tmp1 = sub <2 x i64> %b, %tmp0
|
|
ret <2 x i64> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: ssubw2_8h
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <16 x i8> %a to <16 x i16>
|
|
; CODE-LABEL: ssubw2_8h
|
|
; CODE: ssubw2 v2.8h, v2.8h, v0.16b
|
|
; CODE-NEXT: ssubw v0.8h, v1.8h, v0.8b
|
|
define <16 x i16> @ssubw2_8h(<16 x i8> %a, <16 x i16> %b) {
|
|
%tmp0 = sext <16 x i8> %a to <16 x i16>
|
|
%tmp1 = sub <16 x i16> %b, %tmp0
|
|
ret <16 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: ssubw2_4s
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <8 x i16> %a to <8 x i32>
|
|
; CODE-LABEL: ssubw2_4s
|
|
; CODE: ssubw2 v2.4s, v2.4s, v0.8h
|
|
; CODE-NEXT: ssubw v0.4s, v1.4s, v0.4h
|
|
define <8 x i32> @ssubw2_4s(<8 x i16> %a, <8 x i32> %b) {
|
|
%tmp0 = sext <8 x i16> %a to <8 x i32>
|
|
%tmp1 = sub <8 x i32> %b, %tmp0
|
|
ret <8 x i32> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: ssubw2_2d
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp0 = sext <4 x i32> %a to <4 x i64>
|
|
; CODE-LABEL: ssubw2_2d
|
|
; CODE: ssubw2 v2.2d, v2.2d, v0.4s
|
|
; CODE-NEXT: ssubw v0.2d, v1.2d, v0.2s
|
|
define <4 x i64> @ssubw2_2d(<4 x i32> %a, <4 x i64> %b) {
|
|
%tmp0 = sext <4 x i32> %a to <4 x i64>
|
|
%tmp1 = sub <4 x i64> %b, %tmp0
|
|
ret <4 x i64> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: neg_wrong_operand_order
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
define <8 x i16> @neg_wrong_operand_order(<8 x i8> %a, <8 x i16> %b) {
|
|
%tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = sub <8 x i16> %tmp0, %b
|
|
ret <8 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: neg_non_widening_op
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
define <8 x i16> @neg_non_widening_op(<8 x i8> %a, <8 x i16> %b) {
|
|
%tmp0 = zext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = udiv <8 x i16> %b, %tmp0
|
|
ret <8 x i16> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: neg_dissimilar_operand_kind_0
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <8 x i8> %b to <8 x i16>
|
|
define <8 x i16> @neg_dissimilar_operand_kind_0(<8 x i8> %a, <8 x i8> %b) {
|
|
%tmp0 = sext <8 x i8> %a to <8 x i16>
|
|
%tmp1 = zext <8 x i8> %b to <8 x i16>
|
|
%tmp2 = add <8 x i16> %tmp0, %tmp1
|
|
ret <8 x i16> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: neg_dissimilar_operand_kind_1
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %tmp0 = zext <4 x i8> %a to <4 x i32>
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 0 for instruction: %tmp1 = zext <4 x i16> %b to <4 x i32>
|
|
define <4 x i32> @neg_dissimilar_operand_kind_1(<4 x i8> %a, <4 x i16> %b) {
|
|
%tmp0 = zext <4 x i8> %a to <4 x i32>
|
|
%tmp1 = zext <4 x i16> %b to <4 x i32>
|
|
%tmp2 = add <4 x i32> %tmp0, %tmp1
|
|
ret <4 x i32> %tmp2
|
|
}
|
|
|
|
; COST-LABEL: neg_illegal_vector_type_0
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %tmp0 = zext <16 x i4> %a to <16 x i8>
|
|
define <16 x i8> @neg_illegal_vector_type_0(<16 x i4> %a, <16 x i8> %b) {
|
|
%tmp0 = zext <16 x i4> %a to <16 x i8>
|
|
%tmp1 = sub <16 x i8> %b, %tmp0
|
|
ret <16 x i8> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: neg_llegal_vector_type_1
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 1 for instruction: %tmp0 = zext <1 x i16> %a to <1 x i32>
|
|
define <1 x i32> @neg_llegal_vector_type_1(<1 x i16> %a, <1 x i32> %b) {
|
|
%tmp0 = zext <1 x i16> %a to <1 x i32>
|
|
%tmp1 = add <1 x i32> %b, %tmp0
|
|
ret <1 x i32> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: neg_llegal_vector_type_2
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %tmp0 = zext <4 x i16> %a to <4 x i64>
|
|
define <4 x i64> @neg_llegal_vector_type_2(<4 x i16> %a, <4 x i64> %b) {
|
|
%tmp0 = zext <4 x i16> %a to <4 x i64>
|
|
%tmp1 = add <4 x i64> %b, %tmp0
|
|
ret <4 x i64> %tmp1
|
|
}
|
|
|
|
; COST-LABEL: neg_llegal_vector_type_3
|
|
; COST-NEXT: Cost Model: Found an estimated cost of 3 for instruction: %tmp0 = zext <3 x i34> %a to <3 x i68>
|
|
define <3 x i68> @neg_llegal_vector_type_3(<3 x i34> %a, <3 x i68> %b) {
|
|
%tmp0 = zext <3 x i34> %a to <3 x i68>
|
|
%tmp1 = add <3 x i68> %b, %tmp0
|
|
ret <3 x i68> %tmp1
|
|
}
|