Files
2026-10-04 04:07:15 +00:00

67 lines
1.9 KiB
C++

--- src/nvtt/icbc.h.orig 2020-08-24 06:27:21 UTC
+++ src/nvtt/icbc.h
@@ -1195,7 +1195,7 @@ union VFloat {
constexpr int VEC_SIZE = 4;
union VFloat {
- vectro float v;
+ vector float v;
float e[4];
VFloat() {}
VFloat(vector float v) : v(v) {}
@@ -1221,7 +1221,11 @@ ICBC_FORCEINLINE VFloat vload(const float * ptr) {
}
ICBC_FORCEINLINE VFloat vload(const float * ptr) {
- return vec_ld(ptr)
+#if defined(__VSX__)
+ return vec_xl(0, ptr);
+#else
+ return vec_ld(0, ptr);
+#endif
}
ICBC_FORCEINLINE VFloat operator+(VFloat a, VFloat b) {
@@ -1245,7 +1249,7 @@ ICBC_FORCEINLINE VFloat vrcp(VFloat a) {
vector float diff = vec_nmsub( estimate, v.vec, vec_splats( 1.0f ) );
return vec_madd(diff, estimate, estimate );
#else
- return vec_div(vec_splats(1),a);
+ return vec_div(vec_splats(1.0f), a);
#endif
}
@@ -1276,7 +1280,7 @@ ICBC_FORCEINLINE VFloat lane_id() {
}
ICBC_FORCEINLINE VFloat lane_id() {
- return (VFloat){ 0, 1, 2, 3 };
+ return (vector float){ 0, 1, 2, 3 };
}
ICBC_FORCEINLINE VMask operator> (VFloat A, VFloat B) { return { vec_cmpgt(A, B) }; }
@@ -1291,6 +1295,23 @@ ICBC_FORCEINLINE VFloat vselect(VMask mask, VFloat a,
// mask ? b : a
ICBC_FORCEINLINE VFloat vselect(VMask mask, VFloat a, VFloat b) {
return vec_sel(a, b, mask);
+}
+
+ICBC_FORCEINLINE bool all(VMask mask) {
+ return vec_all_ne(mask.v, vec_splats(0u));
+}
+
+ICBC_FORCEINLINE bool any(VMask mask) {
+ return vec_any_ne(mask.v, vec_splats(0u));
+}
+
+ICBC_FORCEINLINE uint mask(VMask mask) {
+ const vector unsigned int movemask = { 1, 2, 4, 8 };
+ const vector unsigned int highbit = { 0x80000000, 0x80000000, 0x80000000, 0x80000000 };
+
+ vector unsigned int bits = vec_and(vec_cmpeq(vec_and(mask.v, highbit), highbit), movemask);
+
+ return bits[0] | bits[1] | bits[2] | bits[3];
}
ICBC_FORCEINLINE int reduce_min_index(VFloat v) {