Skip to content

Commit

Permalink
[PowerPC][altivec] Correct modulo number of vec_promote on vector char
Browse files Browse the repository at this point in the history
According to https://www.ibm.com/docs/en/xl-c-and-cpp-linux/16.1.1?topic=functions-vec-promote, the index should be input modulo the number of elements in the vector. When the type is `vector char`, the number of elements should be 16.

Reviewed By: qiucf

Differential Revision: https://reviews.llvm.org/D158484
  • Loading branch information
bzEq committed Aug 23, 2023
1 parent 668f261 commit 6b6ea93
Show file tree
Hide file tree
Showing 2 changed files with 6 additions and 6 deletions.
4 changes: 2 additions & 2 deletions clang/lib/Headers/altivec.h
Original file line number Diff line number Diff line change
Expand Up @@ -14648,14 +14648,14 @@ static __inline__ void __ATTRS_o_ai vec_stvrxl(vector float __a, int __b,
static __inline__ vector signed char __ATTRS_o_ai vec_promote(signed char __a,
int __b) {
vector signed char __res = (vector signed char)(0);
__res[__b & 0x7] = __a;
__res[__b & 0xf] = __a;
return __res;
}

static __inline__ vector unsigned char __ATTRS_o_ai
vec_promote(unsigned char __a, int __b) {
vector unsigned char __res = (vector unsigned char)(0);
__res[__b & 0x7] = __a;
__res[__b & 0xf] = __a;
return __res;
}

Expand Down
8 changes: 4 additions & 4 deletions clang/test/CodeGen/PowerPC/builtins-ppc-vsx.c
Original file line number Diff line number Diff line change
Expand Up @@ -2250,18 +2250,18 @@ res_vull = vec_promote(ull, 0);

res_vsc = vec_promote(asc[0], 8);
// CHECK: store <16 x i8> zeroinitializer
// CHECK: [[IDX:%.*]] = and i32 {{.*}}, 7
// CHECK: [[IDX:%.*]] = and i32 {{.*}}, 15
// CHECK: insertelement <16 x i8> {{.*}}, i8 {{.*}}, i32 [[IDX]]
// CHECK-LE: store <16 x i8> zeroinitializer
// CHECK-LE: [[IDX:%.*]] = and i32 {{.*}}, 7
// CHECK-LE: [[IDX:%.*]] = and i32 {{.*}}, 15
// CHECK-LE: insertelement <16 x i8> {{.*}}, i8 {{.*}}, i32 [[IDX]]

res_vuc = vec_promote(auc[0], 8);
// CHECK: store <16 x i8> zeroinitializer
// CHECK: [[IDX:%.*]] = and i32 {{.*}}, 7
// CHECK: [[IDX:%.*]] = and i32 {{.*}}, 15
// CHECK: insertelement <16 x i8> {{.*}}, i8 {{.*}}, i32 [[IDX]]
// CHECK-LE: store <16 x i8> zeroinitializer
// CHECK-LE: [[IDX:%.*]] = and i32 {{.*}}, 7
// CHECK-LE: [[IDX:%.*]] = and i32 {{.*}}, 15
// CHECK-LE: insertelement <16 x i8> {{.*}}, i8 {{.*}}, i32 [[IDX]]
}

Expand Down

0 comments on commit 6b6ea93

Please sign in to comment.