Hi Segher, Thanks for the comments!
on 2022/11/17 02:58, Segher Boessenkool wrote: > Hi! > > On Wed, Nov 16, 2022 at 02:51:04PM +0800, Kewen.Lin wrote: >> The current handlings in rs6000_emit_vector_compare is a bit >> complicated to me, especially after we emit vector float >> comparison insn with the given code directly. This patch is >> to refine the handlings for vector integer comparison operators, >> it becomes not recursive, and we don't need the helper function >> rs6000_emit_vector_compare_inner any more. > > That sounds nice. > >> /* In vector.md, we support all kinds of vector float point >> comparison operators in a comparison rtl pattern, we can >> just emit the comparison rtx insn directly here. Besides, >> we should have a centralized place to handle the possibility >> - of raising invalid exception. */ >> - if (GET_MODE_CLASS (dmode) == MODE_VECTOR_FLOAT) >> + of raising invalid exception. Also emit directly for vector >> + integer comparison operators EQ/GT/GTU. */ >> + if (GET_MODE_CLASS (dmode) == MODE_VECTOR_FLOAT >> + || rcode == EQ >> + || rcode == GT >> + || rcode == GTU) > > The comment still says it handles FP only. That would be best to keep > imo: add a separate block of code to handle the integer stuff you want > to add. You get the same or better generated code, the compiler is > smart enough. Code is for the user to read, and C is not a portable > assembler language. OK, I'll make two blocks for FP and integer respectively. I struggled a bit updating this hunk with comments for integer comparison consideration, someone could argue that both can share the same handling if updating the condition. > > This whole series needs to be factored better, it does way too many > things, and only marginally related things, at every step. Or I don't > see it anyway :-) OK, I was thinking patch 1/2 is to unify the current vector float comparison handlings, patch 2/2 is to refine the remaining handlings for vector integer comparison. I'm pleased to factor it better, any suggestions on concrete code is highly appreciated. :) btw, I constructed one test case as below, there is no assembly change before and after this patch. #define GT(a, b) (((a) > (b))) #define GE(a, b) (((a) >= (b))) #define LT(a, b) (((a) < (b))) #define LE(a, b) (((a) <= (b))) #define EQ(a, b) (((a) == (b))) #define NE(a, b) (((a) != (b))) #define TEST_VECT(NAME, TYPE) \ __attribute__ ((noipa)) void test_##NAME##_##TYPE (TYPE *x, TYPE *y, \ int *res, int n) \ { \ for (int i = 0; i < n; i++) \ res[i] = NAME (x[i], y[i]); \ } #include "stdint.h" #define TEST(TYPE) \ TEST_VECT (GT, TYPE) \ TEST_VECT (GE, TYPE) \ TEST_VECT (LT, TYPE) \ TEST_VECT (LE, TYPE) \ TEST_VECT (EQ, TYPE) \ TEST_VECT (NE, TYPE) TEST (int64_t) TEST (uint64_t) TEST (int32_t) TEST (uint32_t) TEST (int16_t) TEST (uint16_t) TEST (int8_t) TEST (uint8_t) BR, Kewen