[PPC] Add vec_absd functions to altivec.h

This patch corresponds to review https://reviews.llvm.org/D26073.
Committing on behalf of Sean Fertile.

llvm-svn: 285679
This commit is contained in:
Nemanja Ivanovic 2016-11-01 08:39:56 +00:00
parent dd313b0673
commit 251f6dd93d
3 changed files with 41 additions and 0 deletions

View File

@ -284,6 +284,11 @@ BUILTIN(__builtin_altivec_vpopcnth, "V8UsV8Us", "")
BUILTIN(__builtin_altivec_vpopcntw, "V4UiV4Ui", "")
BUILTIN(__builtin_altivec_vpopcntd, "V2ULLiV2ULLi", "")
// Absolute difference built-ins
BUILTIN(__builtin_altivec_vabsdub, "V16UcV16UcV16Uc", "")
BUILTIN(__builtin_altivec_vabsduh, "V8UsV8UsV8Us", "")
BUILTIN(__builtin_altivec_vabsduw, "V4UiV4UiV4Ui", "")
// VSX built-ins.
BUILTIN(__builtin_vsx_lxvd2x, "V2divC*", "")

View File

@ -163,6 +163,26 @@ vec_abss(vector signed int __a) {
__a, __builtin_altivec_vsubsws((vector signed int)(0), __a));
}
/* vec_absd */
#if defined(__POWER9_VECTOR__)
static __inline__ vector unsigned char __ATTRS_o_ai
vec_absd(vector unsigned char __a, vector unsigned char __b) {
return __builtin_altivec_vabsdub(__a, __b);
}
static __inline__ vector unsigned short __ATTRS_o_ai
vec_absd(vector unsigned short __a, vector unsigned short __b) {
return __builtin_altivec_vabsduh(__a, __b);
}
static __inline__ vector unsigned int __ATTRS_o_ai
vec_absd(vector unsigned int __a, vector unsigned int __b) {
return __builtin_altivec_vabsduw(__a, __b);
}
#endif /* End __POWER9_VECTOR__ */
/* vec_add */
static __inline__ vector signed char __ATTRS_o_ai

View File

@ -803,3 +803,19 @@ vector unsigned __int128 test68(void) {
// CHECK-NEXT: ret <1 x i128>
return vec_parity_lsbb (vsi128a);
}
vector unsigned char test69(void) {
// CHECK-BE: call <16 x i8> @llvm.ppc.altivec.vabsdub(<16 x i8> {{.+}}, <16 x i8> {{.+}})
// CHECK: call <16 x i8> @llvm.ppc.altivec.vabsdub(<16 x i8> {{.+}}, <16 x i8> {{.+}})
return vec_absd(vuca, vucb);
}
vector unsigned short test70(void) {
// CHECK-BE: call <8 x i16> @llvm.ppc.altivec.vabsduh(<8 x i16> {{.+}}, <8 x i16> {{.+}})
// CHECK: call <8 x i16> @llvm.ppc.altivec.vabsduh(<8 x i16> {{.+}}, <8 x i16> {{.+}})
return vec_absd(vusa, vusb);
}
vector unsigned int test71(void) {
// CHECK-BE: call <4 x i32> @llvm.ppc.altivec.vabsduw(<4 x i32> {{.+}}, <4 x i32> {{.+}})
// CHECK: call <4 x i32> @llvm.ppc.altivec.vabsduw(<4 x i32> {{.+}}, <4 x i32> {{.+}})
return vec_absd(vuia, vuib);
}