Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
Hi, Jiufu Guo via Gcc-patches writes: > Hi Kewen, > > "Kewen.Lin" writes: >> on 2022/12/1 20:16, guojiufu wrote: >>> On 2022-12-01 15:10, Jiufu Guo via Gcc-patches wrote: Hi Kewen, cut... >>> From 8aa8e1234b6ec34473434951a3a6177253aac770 Mon Sep 17 00:00:00 2001 >>> From: Jiufu Guo >>> Date: Wed, 30 Nov 2022 13:13:37 +0800 >>> Subject: [PATCH 2/2]rs6000: update ((v&0xf..f)^0x80..0) - 0x80..0 with >>> code: like sext_hwi >>> >> >> May be shorter with "rs6000: Update sign extension computation with >> sext_hwi"? > Thanks for your great suggestions! >> >>> This patch just replaces the expression like: >>> ((value & 0xf..f) ^ 0x80..0) - 0x80..0 to better code(e.g. sext_hwi) for >>> rs6000.cc, rs6000.md and predicates.md (files under rs6000/). >> >> >>> Bootstrap and regtest pass on ppc64{,le}. >>> >> >> Thanks for updating and testing, this patch is OK. Committed via r13-4556. Thanks again! BR, Jeff (Jiufu) > > BR, > Jeff (Jiufu) > >> >> BR, >> Kewen
Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
Hi Kewen, "Kewen.Lin" writes: > on 2022/12/1 20:16, guojiufu wrote: >> On 2022-12-01 15:10, Jiufu Guo via Gcc-patches wrote: >>> Hi Kewen, >>> >>> 在 12/1/22 2:11 PM, Kewen.Lin 写道: on 2022/12/1 13:35, Jiufu Guo wrote: > Hi Kewen, > > Thanks for your quick and insight review! > > 在 12/1/22 1:17 PM, Kewen.Lin 写道: >> Hi Jeff, >> >> on 2022/12/1 09:36, Jiufu Guo wrote: >>> Hi, >>> >>> This patch just uses sext_hwi to replace the expression like: >>> ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. >>> >>> Bootstrap & regtest pass on ppc64{,le}. >>> Is this ok for trunk? >> >> You didn't say it clearly but I guessed you have grepped in the whole >> config/rs6000 directory, right? I noticed there are still two places >> using this kind of expression in function constant_generates_xxspltiw, >> but I assumed it's intentional as their types are not HOST_WIDE_INT. >> >> gcc/config/rs6000/rs6000.cc: short sign_h_word = ((h_word & 0x) >> ^ 0x8000) - 0x8000; >> gcc/config/rs6000/rs6000.cc: int sign_word = ((word & 0x) ^ >> 0x8000) - 0x8000; >> >> If so, could you state it clearly in commit log like "with type >> signed/unsigned HOST_WIDE_INT" or similar? >> > Good question! > > And as you said sext_hwi is more for "signed/unsigned HOST_WIDE_INT". > For these two places, it seems sext_hwi is not needed actually! > And I did see why these expressions are used, may be just an assignment > is ok. ah, I see. I agree using the assignment is quite enough. Could you please also simplify them together? Since they are with the form "((value & 0xf..f) ^ 0x80..0) - 0x80..0" too, and can be refactored in a better way. Thanks! >>> >>> Sure, I believe just "short sign_h_word = vsx_const->half_words[0];" >>> should be correct :-), and included in the updated patch. >>> >>> Updated patch is attached, bootstrap is on going. >> > > on 2022/12/1 15:10, Jiufu Guo wrote: >> From 8aa8e1234b6ec34473434951a3a6177253aac770 Mon Sep 17 00:00:00 2001 >> From: Jiufu Guo >> Date: Wed, 30 Nov 2022 13:13:37 +0800 >> Subject: [PATCH 2/2]rs6000: update ((v&0xf..f)^0x80..0) - 0x80..0 with code: >> like sext_hwi >> > > May be shorter with "rs6000: Update sign extension computation with > sext_hwi"? Thanks for your great suggestions! > >> This patch just replaces the expression like: >> ((value & 0xf..f) ^ 0x80..0) - 0x80..0 to better code(e.g. sext_hwi) for >> rs6000.cc, rs6000.md and predicates.md (files under rs6000/). > > >> Bootstrap and regtest pass on ppc64{,le}. >> > > Thanks for updating and testing, this patch is OK. BR, Jeff (Jiufu) > > BR, > Kewen
Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
on 2022/12/1 20:16, guojiufu wrote: > On 2022-12-01 15:10, Jiufu Guo via Gcc-patches wrote: >> Hi Kewen, >> >> 在 12/1/22 2:11 PM, Kewen.Lin 写道: >>> on 2022/12/1 13:35, Jiufu Guo wrote: Hi Kewen, Thanks for your quick and insight review! 在 12/1/22 1:17 PM, Kewen.Lin 写道: > Hi Jeff, > > on 2022/12/1 09:36, Jiufu Guo wrote: >> Hi, >> >> This patch just uses sext_hwi to replace the expression like: >> ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. >> >> Bootstrap & regtest pass on ppc64{,le}. >> Is this ok for trunk? > > You didn't say it clearly but I guessed you have grepped in the whole > config/rs6000 directory, right? I noticed there are still two places > using this kind of expression in function constant_generates_xxspltiw, > but I assumed it's intentional as their types are not HOST_WIDE_INT. > > gcc/config/rs6000/rs6000.cc: short sign_h_word = ((h_word & 0x) > ^ 0x8000) - 0x8000; > gcc/config/rs6000/rs6000.cc: int sign_word = ((word & 0x) ^ > 0x8000) - 0x8000; > > If so, could you state it clearly in commit log like "with type > signed/unsigned HOST_WIDE_INT" or similar? > Good question! And as you said sext_hwi is more for "signed/unsigned HOST_WIDE_INT". For these two places, it seems sext_hwi is not needed actually! And I did see why these expressions are used, may be just an assignment is ok. >>> >>> ah, I see. I agree using the assignment is quite enough. Could you >>> please also simplify them together? Since they are with the form >>> "((value & 0xf..f) ^ 0x80..0) - 0x80..0" too, and can be refactored >>> in a better way. Thanks! >> >> Sure, I believe just "short sign_h_word = vsx_const->half_words[0];" >> should be correct :-), and included in the updated patch. >> >> Updated patch is attached, bootstrap is on going. > on 2022/12/1 15:10, Jiufu Guo wrote: > From 8aa8e1234b6ec34473434951a3a6177253aac770 Mon Sep 17 00:00:00 2001 > From: Jiufu Guo > Date: Wed, 30 Nov 2022 13:13:37 +0800 > Subject: [PATCH 2/2]rs6000: update ((v&0xf..f)^0x80..0) - 0x80..0 with code: > like sext_hwi > May be shorter with "rs6000: Update sign extension computation with sext_hwi"? > This patch just replaces the expression like: > ((value & 0xf..f) ^ 0x80..0) - 0x80..0 to better code(e.g. sext_hwi) for > rs6000.cc, rs6000.md and predicates.md (files under rs6000/). > Bootstrap and regtest pass on ppc64{,le}. > Thanks for updating and testing, this patch is OK. BR, Kewen
Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
On 2022-12-01 15:10, Jiufu Guo via Gcc-patches wrote: Hi Kewen, 在 12/1/22 2:11 PM, Kewen.Lin 写道: on 2022/12/1 13:35, Jiufu Guo wrote: Hi Kewen, Thanks for your quick and insight review! 在 12/1/22 1:17 PM, Kewen.Lin 写道: Hi Jeff, on 2022/12/1 09:36, Jiufu Guo wrote: Hi, This patch just uses sext_hwi to replace the expression like: ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. Bootstrap & regtest pass on ppc64{,le}. Is this ok for trunk? You didn't say it clearly but I guessed you have grepped in the whole config/rs6000 directory, right? I noticed there are still two places using this kind of expression in function constant_generates_xxspltiw, but I assumed it's intentional as their types are not HOST_WIDE_INT. gcc/config/rs6000/rs6000.cc: short sign_h_word = ((h_word & 0x) ^ 0x8000) - 0x8000; gcc/config/rs6000/rs6000.cc: int sign_word = ((word & 0x) ^ 0x8000) - 0x8000; If so, could you state it clearly in commit log like "with type signed/unsigned HOST_WIDE_INT" or similar? Good question! And as you said sext_hwi is more for "signed/unsigned HOST_WIDE_INT". For these two places, it seems sext_hwi is not needed actually! And I did see why these expressions are used, may be just an assignment is ok. ah, I see. I agree using the assignment is quite enough. Could you please also simplify them together? Since they are with the form "((value & 0xf..f) ^ 0x80..0) - 0x80..0" too, and can be refactored in a better way. Thanks! Sure, I believe just "short sign_h_word = vsx_const->half_words[0];" should be correct :-), and included in the updated patch. Updated patch is attached, bootstrap is on going. Bootstrap and regtest pass on ppc64{,le}. BR, Jeff (Jiufu) BR, Jeff (Jiufu) BR, Kewen
Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
Hi Kewen, 在 12/1/22 2:11 PM, Kewen.Lin 写道: > on 2022/12/1 13:35, Jiufu Guo wrote: >> Hi Kewen, >> >> Thanks for your quick and insight review! >> >> 在 12/1/22 1:17 PM, Kewen.Lin 写道: >>> Hi Jeff, >>> >>> on 2022/12/1 09:36, Jiufu Guo wrote: Hi, This patch just uses sext_hwi to replace the expression like: ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. Bootstrap & regtest pass on ppc64{,le}. Is this ok for trunk? >>> >>> You didn't say it clearly but I guessed you have grepped in the whole >>> config/rs6000 directory, right? I noticed there are still two places >>> using this kind of expression in function constant_generates_xxspltiw, >>> but I assumed it's intentional as their types are not HOST_WIDE_INT. >>> >>> gcc/config/rs6000/rs6000.cc: short sign_h_word = ((h_word & 0x) ^ >>> 0x8000) - 0x8000; >>> gcc/config/rs6000/rs6000.cc: int sign_word = ((word & 0x) ^ >>> 0x8000) - 0x8000; >>> >>> If so, could you state it clearly in commit log like "with type >>> signed/unsigned HOST_WIDE_INT" or similar? >>> >> Good question! >> >> And as you said sext_hwi is more for "signed/unsigned HOST_WIDE_INT". >> For these two places, it seems sext_hwi is not needed actually! >> And I did see why these expressions are used, may be just an assignment >> is ok. > > ah, I see. I agree using the assignment is quite enough. Could you > please also simplify them together? Since they are with the form > "((value & 0xf..f) ^ 0x80..0) - 0x80..0" too, and can be refactored > in a better way. Thanks! Sure, I believe just "short sign_h_word = vsx_const->half_words[0];" should be correct :-), and included in the updated patch. Updated patch is attached, bootstrap is on going. BR, Jeff (Jiufu) > > BR, > Kewen > From 8aa8e1234b6ec34473434951a3a6177253aac770 Mon Sep 17 00:00:00 2001 From: Jiufu Guo Date: Wed, 30 Nov 2022 13:13:37 +0800 Subject: [PATCH 2/2]rs6000: update ((v&0xf..f)^0x80..0) - 0x80..0 with code: like sext_hwi This patch just replaces the expression like: ((value & 0xf..f) ^ 0x80..0) - 0x80..0 to better code(e.g. sext_hwi) for rs6000.cc, rs6000.md and predicates.md (files under rs6000/). gcc/ChangeLog: * config/rs6000/predicates.md: Use sext_hwi. * config/rs6000/rs6000.cc (num_insns_constant_gpr): Likewise. (darwin_rs6000_legitimate_lo_sum_const_p): Likewise. (mem_operand_gpr): Likewise. (mem_operand_ds_form): Likewise. (rs6000_legitimize_address): Likewise. (rs6000_emit_set_const): Likewise. (rs6000_emit_set_long_const): Likewise. (print_operand): Likewise. (constant_generates_xxspltiw): Remove unnecessary expressions. * config/rs6000/rs6000.md: Use sext_hwi. --- gcc/config/rs6000/predicates.md | 2 +- gcc/config/rs6000/rs6000.cc | 36 ++--- gcc/config/rs6000/rs6000.md | 10 - 3 files changed, 21 insertions(+), 27 deletions(-) diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index b1fcc69bb60..a1764018545 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -760,7 +760,7 @@ (define_predicate "easy_vector_constant_add_self" return 0; elt = BYTES_BIG_ENDIAN ? GET_MODE_NUNITS (mode) - 1 : 0; val = const_vector_elt_as_int (op, elt); - val = ((val & 0xff) ^ 0x80) - 0x80; + val = sext_hwi (val, 8); return EASY_VECTOR_15_ADD_SELF (val); }) diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 5efe9b22d8b..dff9a0d8835 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -6021,7 +6021,7 @@ num_insns_constant_gpr (HOST_WIDE_INT value) else if (TARGET_POWERPC64) { - HOST_WIDE_INT low = ((value & 0x) ^ 0x8000) - 0x8000; + HOST_WIDE_INT low = sext_hwi (value, 32); HOST_WIDE_INT high = value >> 31; if (high == 0 || high == -1) @@ -8456,7 +8456,7 @@ darwin_rs6000_legitimate_lo_sum_const_p (rtx x, machine_mode mode) } /* We only care if the access(es) would cause a change to the high part. */ - offset = ((offset & 0x) ^ 0x8000) - 0x8000; + offset = sext_hwi (offset, 16); return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); } @@ -8522,7 +8522,7 @@ mem_operand_gpr (rtx op, machine_mode mode) if (GET_CODE (addr) == LO_SUM) /* For lo_sum addresses, we must allow any offset except one that causes a wrap, so test only the low 16 bits. */ -offset = ((offset & 0x) ^ 0x8000) - 0x8000; +offset = sext_hwi (offset, 16); return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); } @@ -8562,7 +8562,7 @@ mem_operand_ds_form (rtx op, machine_mode mode) if (GET_CODE (addr) == LO_SUM) /* For lo_sum addresses, we must allow any offset except one that causes a wrap, so test only the low 16 bits. */ -offset = ((offset & 0x) ^ 0x8000) - 0x8000; +offset =
Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
Hi Kewen, 在 12/1/22 1:30 PM, Kewen.Lin 写道: > on 2022/12/1 13:17, Kewen.Lin via Gcc-patches wrote: >> Hi Jeff, >> >> on 2022/12/1 09:36, Jiufu Guo wrote: >>> Hi, >>> >>> This patch just uses sext_hwi to replace the expression like: >>> ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. >>> >>> Bootstrap & regtest pass on ppc64{,le}. >>> Is this ok for trunk? >> >> You didn't say it clearly but I guessed you have grepped in the whole >> config/rs6000 directory, right? I noticed there are still two places >> using this kind of expression in function constant_generates_xxspltiw, >> but I assumed it's intentional as their types are not HOST_WIDE_INT. >> >> gcc/config/rs6000/rs6000.cc: short sign_h_word = ((h_word & 0x) ^ >> 0x8000) - 0x8000; >> gcc/config/rs6000/rs6000.cc: int sign_word = ((word & 0x) ^ >> 0x8000) - 0x8000; >> > > oh, one place in gcc/config/rs6000/predicates.md got missed. > > ./predicates.md-756-{ > ./predicates.md-757- HOST_WIDE_INT val; > ... > ./predicates.md-762- val = const_vector_elt_as_int (op, elt); > ./predicates.md:763: val = ((val & 0xff) ^ 0x80) - 0x80; > ./predicates.md-764- return EASY_VECTOR_15_ADD_SELF (val); > ./predicates.md-765-}) > > Do you mind to have a further check? Good catch, thanks! I will update the patch to cover this one. Bootstrap and testing. I would be better to check all files under rs6000/. I just rechecked with grep -r "^.*0x8.*-.*0x8" for rs6000. No other place is missed. BR, Jeff (Jiufu) Updated patch as attached(add predicates.md). > > Thanks! > > KewenFrom 0059e2175cac5353890965ba782ff58743d2f486 Mon Sep 17 00:00:00 2001 From: Jiufu Guo Date: Wed, 30 Nov 2022 13:13:37 +0800 Subject: [PATCH 2/2]rs6000: use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0 This patch just uses sext_hwi to replace the expression like: ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc, rs6000.md and predicates.md (all occurance under rs6000/). gcc/ChangeLog: * config/rs6000/predicates.md: Use sext_hwi. * config/rs6000/rs6000.cc (num_insns_constant_gpr): Use sext_hwi. (darwin_rs6000_legitimate_lo_sum_const_p): Likewise. (mem_operand_gpr): Likewise. (mem_operand_ds_form): Likewise. (rs6000_legitimize_address): Likewise. (rs6000_emit_set_const): Likewise. (rs6000_emit_set_long_const): Likewise. (print_operand): Likewise. * config/rs6000/rs6000.md: Likewise. --- gcc/config/rs6000/predicates.md | 2 +- gcc/config/rs6000/rs6000.cc | 30 +- gcc/config/rs6000/rs6000.md | 10 +- 3 files changed, 19 insertions(+), 23 deletions(-) diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index b1fcc69bb60..a1764018545 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -760,7 +760,7 @@ (define_predicate "easy_vector_constant_add_self" return 0; elt = BYTES_BIG_ENDIAN ? GET_MODE_NUNITS (mode) - 1 : 0; val = const_vector_elt_as_int (op, elt); - val = ((val & 0xff) ^ 0x80) - 0x80; + val = sext_hwi (val, 8); return EASY_VECTOR_15_ADD_SELF (val); }) diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 5efe9b22d8b..718072cc9a1 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -6021,7 +6021,7 @@ num_insns_constant_gpr (HOST_WIDE_INT value) else if (TARGET_POWERPC64) { - HOST_WIDE_INT low = ((value & 0x) ^ 0x8000) - 0x8000; + HOST_WIDE_INT low = sext_hwi (value, 32); HOST_WIDE_INT high = value >> 31; if (high == 0 || high == -1) @@ -8456,7 +8456,7 @@ darwin_rs6000_legitimate_lo_sum_const_p (rtx x, machine_mode mode) } /* We only care if the access(es) would cause a change to the high part. */ - offset = ((offset & 0x) ^ 0x8000) - 0x8000; + offset = sext_hwi (offset, 16); return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); } @@ -8522,7 +8522,7 @@ mem_operand_gpr (rtx op, machine_mode mode) if (GET_CODE (addr) == LO_SUM) /* For lo_sum addresses, we must allow any offset except one that causes a wrap, so test only the low 16 bits. */ -offset = ((offset & 0x) ^ 0x8000) - 0x8000; +offset = sext_hwi (offset, 16); return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); } @@ -8562,7 +8562,7 @@ mem_operand_ds_form (rtx op, machine_mode mode) if (GET_CODE (addr) == LO_SUM) /* For lo_sum addresses, we must allow any offset except one that causes a wrap, so test only the low 16 bits. */ -offset = ((offset & 0x) ^ 0x8000) - 0x8000; +offset = sext_hwi (offset, 16); return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); } @@ -9136,7 +9136,7 @@ rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, { HOST_WIDE_INT high_int, low_int; rtx sum; - low_int = ((INTVAL (XEXP (x, 1)) & 0x) ^ 0x8000) - 0x8000; +
Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
on 2022/12/1 13:35, Jiufu Guo wrote: > Hi Kewen, > > Thanks for your quick and insight review! > > 在 12/1/22 1:17 PM, Kewen.Lin 写道: >> Hi Jeff, >> >> on 2022/12/1 09:36, Jiufu Guo wrote: >>> Hi, >>> >>> This patch just uses sext_hwi to replace the expression like: >>> ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. >>> >>> Bootstrap & regtest pass on ppc64{,le}. >>> Is this ok for trunk? >> >> You didn't say it clearly but I guessed you have grepped in the whole >> config/rs6000 directory, right? I noticed there are still two places >> using this kind of expression in function constant_generates_xxspltiw, >> but I assumed it's intentional as their types are not HOST_WIDE_INT. >> >> gcc/config/rs6000/rs6000.cc: short sign_h_word = ((h_word & 0x) ^ >> 0x8000) - 0x8000; >> gcc/config/rs6000/rs6000.cc: int sign_word = ((word & 0x) ^ >> 0x8000) - 0x8000; >> >> If so, could you state it clearly in commit log like "with type >> signed/unsigned HOST_WIDE_INT" or similar? >> > Good question! > > And as you said sext_hwi is more for "signed/unsigned HOST_WIDE_INT". > For these two places, it seems sext_hwi is not needed actually! > And I did see why these expressions are used, may be just an assignment > is ok. ah, I see. I agree using the assignment is quite enough. Could you please also simplify them together? Since they are with the form "((value & 0xf..f) ^ 0x80..0) - 0x80..0" too, and can be refactored in a better way. Thanks! BR, Kewen
Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
Hi Kewen, Thanks for your quick and insight review! 在 12/1/22 1:17 PM, Kewen.Lin 写道: > Hi Jeff, > > on 2022/12/1 09:36, Jiufu Guo wrote: >> Hi, >> >> This patch just uses sext_hwi to replace the expression like: >> ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. >> >> Bootstrap & regtest pass on ppc64{,le}. >> Is this ok for trunk? > > You didn't say it clearly but I guessed you have grepped in the whole > config/rs6000 directory, right? I noticed there are still two places > using this kind of expression in function constant_generates_xxspltiw, > but I assumed it's intentional as their types are not HOST_WIDE_INT. > > gcc/config/rs6000/rs6000.cc: short sign_h_word = ((h_word & 0x) ^ > 0x8000) - 0x8000; > gcc/config/rs6000/rs6000.cc: int sign_word = ((word & 0x) ^ > 0x8000) - 0x8000; > > If so, could you state it clearly in commit log like "with type > signed/unsigned HOST_WIDE_INT" or similar? > Good question! And as you said sext_hwi is more for "signed/unsigned HOST_WIDE_INT". For these two places, it seems sext_hwi is not needed actually! And I did see why these expressions are used, may be just an assignment is ok. So, this patch does not cover these two places. BR, Jeff (Jiufu) > This patch is OK once the above question gets confirmed, thanks! > > BR, > Kewen > >> >> BR, >> Jeff (Jiufu) >> >> gcc/ChangeLog: >> >> * config/rs6000/rs6000.cc (num_insns_constant_gpr): Use sext_hwi. >> (darwin_rs6000_legitimate_lo_sum_const_p): Likewise. >> (mem_operand_gpr): Likewise. >> (mem_operand_ds_form): Likewise. >> (rs6000_legitimize_address): Likewise. >> (rs6000_emit_set_const): Likewise. >> (rs6000_emit_set_long_const): Likewise. >> (print_operand): Likewise. >> * config/rs6000/rs6000.md: Likewise. >> >> --- >> gcc/config/rs6000/rs6000.cc | 30 +- >> gcc/config/rs6000/rs6000.md | 10 +- >> 2 files changed, 18 insertions(+), 22 deletions(-) >> >> diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc >> index 5efe9b22d8b..718072cc9a1 100644 >> --- a/gcc/config/rs6000/rs6000.cc >> +++ b/gcc/config/rs6000/rs6000.cc >> @@ -6021,7 +6021,7 @@ num_insns_constant_gpr (HOST_WIDE_INT value) >> >>else if (TARGET_POWERPC64) >> { >> - HOST_WIDE_INT low = ((value & 0x) ^ 0x8000) - 0x8000; >> + HOST_WIDE_INT low = sext_hwi (value, 32); >>HOST_WIDE_INT high = value >> 31; >> >>if (high == 0 || high == -1) >> @@ -8456,7 +8456,7 @@ darwin_rs6000_legitimate_lo_sum_const_p (rtx x, >> machine_mode mode) >> } >> >>/* We only care if the access(es) would cause a change to the high part. >> */ >> - offset = ((offset & 0x) ^ 0x8000) - 0x8000; >> + offset = sext_hwi (offset, 16); >>return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); >> } >> >> @@ -8522,7 +8522,7 @@ mem_operand_gpr (rtx op, machine_mode mode) >>if (GET_CODE (addr) == LO_SUM) >> /* For lo_sum addresses, we must allow any offset except one that >> causes a wrap, so test only the low 16 bits. */ >> -offset = ((offset & 0x) ^ 0x8000) - 0x8000; >> +offset = sext_hwi (offset, 16); >> >>return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); >> } >> @@ -8562,7 +8562,7 @@ mem_operand_ds_form (rtx op, machine_mode mode) >>if (GET_CODE (addr) == LO_SUM) >> /* For lo_sum addresses, we must allow any offset except one that >> causes a wrap, so test only the low 16 bits. */ >> -offset = ((offset & 0x) ^ 0x8000) - 0x8000; >> +offset = sext_hwi (offset, 16); >> >>return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); >> } >> @@ -9136,7 +9136,7 @@ rs6000_legitimize_address (rtx x, rtx oldx >> ATTRIBUTE_UNUSED, >> { >>HOST_WIDE_INT high_int, low_int; >>rtx sum; >> - low_int = ((INTVAL (XEXP (x, 1)) & 0x) ^ 0x8000) - 0x8000; >> + low_int = sext_hwi (INTVAL (XEXP (x, 1)), 16); >>if (low_int >= 0x8000 - extra) >> low_int = 0; >>high_int = INTVAL (XEXP (x, 1)) - low_int; >> @@ -10203,7 +10203,7 @@ rs6000_emit_set_const (rtx dest, rtx source) >>lo = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0, >>DImode); >>emit_move_insn (hi, GEN_INT (c >> 32)); >> - c = ((c & 0x) ^ 0x8000) - 0x8000; >> + c = sext_hwi (c, 32); >>emit_move_insn (lo, GEN_INT (c)); >> } >>else >> @@ -10242,7 +10242,7 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT >> c) >> >>if ((ud4 == 0x && ud3 == 0x && ud2 == 0x && (ud1 & 0x8000)) >>|| (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000))) >> -emit_move_insn (dest, GEN_INT ((ud1 ^ 0x8000) - 0x8000)); >> +emit_move_insn (dest, GEN_INT (sext_hwi (ud1, 16))); >> >>else if ((ud4 == 0x && ud3 == 0x && (ud2 & 0x8000)) >> || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000)))
Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
on 2022/12/1 13:17, Kewen.Lin via Gcc-patches wrote: > Hi Jeff, > > on 2022/12/1 09:36, Jiufu Guo wrote: >> Hi, >> >> This patch just uses sext_hwi to replace the expression like: >> ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. >> >> Bootstrap & regtest pass on ppc64{,le}. >> Is this ok for trunk? > > You didn't say it clearly but I guessed you have grepped in the whole > config/rs6000 directory, right? I noticed there are still two places > using this kind of expression in function constant_generates_xxspltiw, > but I assumed it's intentional as their types are not HOST_WIDE_INT. > > gcc/config/rs6000/rs6000.cc: short sign_h_word = ((h_word & 0x) ^ > 0x8000) - 0x8000; > gcc/config/rs6000/rs6000.cc: int sign_word = ((word & 0x) ^ > 0x8000) - 0x8000; > oh, one place in gcc/config/rs6000/predicates.md got missed. ./predicates.md-756-{ ./predicates.md-757- HOST_WIDE_INT val; ... ./predicates.md-762- val = const_vector_elt_as_int (op, elt); ./predicates.md:763: val = ((val & 0xff) ^ 0x80) - 0x80; ./predicates.md-764- return EASY_VECTOR_15_ADD_SELF (val); ./predicates.md-765-}) Do you mind to have a further check? Thanks! Kewen
Re: [PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
Hi Jeff, on 2022/12/1 09:36, Jiufu Guo wrote: > Hi, > > This patch just uses sext_hwi to replace the expression like: > ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. > > Bootstrap & regtest pass on ppc64{,le}. > Is this ok for trunk? You didn't say it clearly but I guessed you have grepped in the whole config/rs6000 directory, right? I noticed there are still two places using this kind of expression in function constant_generates_xxspltiw, but I assumed it's intentional as their types are not HOST_WIDE_INT. gcc/config/rs6000/rs6000.cc: short sign_h_word = ((h_word & 0x) ^ 0x8000) - 0x8000; gcc/config/rs6000/rs6000.cc: int sign_word = ((word & 0x) ^ 0x8000) - 0x8000; If so, could you state it clearly in commit log like "with type signed/unsigned HOST_WIDE_INT" or similar? This patch is OK once the above question gets confirmed, thanks! BR, Kewen > > BR, > Jeff (Jiufu) > > gcc/ChangeLog: > > * config/rs6000/rs6000.cc (num_insns_constant_gpr): Use sext_hwi. > (darwin_rs6000_legitimate_lo_sum_const_p): Likewise. > (mem_operand_gpr): Likewise. > (mem_operand_ds_form): Likewise. > (rs6000_legitimize_address): Likewise. > (rs6000_emit_set_const): Likewise. > (rs6000_emit_set_long_const): Likewise. > (print_operand): Likewise. > * config/rs6000/rs6000.md: Likewise. > > --- > gcc/config/rs6000/rs6000.cc | 30 +- > gcc/config/rs6000/rs6000.md | 10 +- > 2 files changed, 18 insertions(+), 22 deletions(-) > > diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc > index 5efe9b22d8b..718072cc9a1 100644 > --- a/gcc/config/rs6000/rs6000.cc > +++ b/gcc/config/rs6000/rs6000.cc > @@ -6021,7 +6021,7 @@ num_insns_constant_gpr (HOST_WIDE_INT value) > >else if (TARGET_POWERPC64) > { > - HOST_WIDE_INT low = ((value & 0x) ^ 0x8000) - 0x8000; > + HOST_WIDE_INT low = sext_hwi (value, 32); >HOST_WIDE_INT high = value >> 31; > >if (high == 0 || high == -1) > @@ -8456,7 +8456,7 @@ darwin_rs6000_legitimate_lo_sum_const_p (rtx x, > machine_mode mode) > } > >/* We only care if the access(es) would cause a change to the high part. > */ > - offset = ((offset & 0x) ^ 0x8000) - 0x8000; > + offset = sext_hwi (offset, 16); >return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); > } > > @@ -8522,7 +8522,7 @@ mem_operand_gpr (rtx op, machine_mode mode) >if (GET_CODE (addr) == LO_SUM) > /* For lo_sum addresses, we must allow any offset except one that > causes a wrap, so test only the low 16 bits. */ > -offset = ((offset & 0x) ^ 0x8000) - 0x8000; > +offset = sext_hwi (offset, 16); > >return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); > } > @@ -8562,7 +8562,7 @@ mem_operand_ds_form (rtx op, machine_mode mode) >if (GET_CODE (addr) == LO_SUM) > /* For lo_sum addresses, we must allow any offset except one that > causes a wrap, so test only the low 16 bits. */ > -offset = ((offset & 0x) ^ 0x8000) - 0x8000; > +offset = sext_hwi (offset, 16); > >return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); > } > @@ -9136,7 +9136,7 @@ rs6000_legitimize_address (rtx x, rtx oldx > ATTRIBUTE_UNUSED, > { >HOST_WIDE_INT high_int, low_int; >rtx sum; > - low_int = ((INTVAL (XEXP (x, 1)) & 0x) ^ 0x8000) - 0x8000; > + low_int = sext_hwi (INTVAL (XEXP (x, 1)), 16); >if (low_int >= 0x8000 - extra) > low_int = 0; >high_int = INTVAL (XEXP (x, 1)) - low_int; > @@ -10203,7 +10203,7 @@ rs6000_emit_set_const (rtx dest, rtx source) > lo = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0, > DImode); > emit_move_insn (hi, GEN_INT (c >> 32)); > - c = ((c & 0x) ^ 0x8000) - 0x8000; > + c = sext_hwi (c, 32); > emit_move_insn (lo, GEN_INT (c)); > } >else > @@ -10242,7 +10242,7 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c) > >if ((ud4 == 0x && ud3 == 0x && ud2 == 0x && (ud1 & 0x8000)) >|| (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000))) > -emit_move_insn (dest, GEN_INT ((ud1 ^ 0x8000) - 0x8000)); > +emit_move_insn (dest, GEN_INT (sext_hwi (ud1, 16))); > >else if ((ud4 == 0x && ud3 == 0x && (ud2 & 0x8000)) > || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000))) > @@ -10250,7 +10250,7 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c) >temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode); > >emit_move_insn (ud1 != 0 ? copy_rtx (temp) : dest, > - GEN_INT (((ud2 << 16) ^ 0x8000) - 0x8000)); > + GEN_INT (sext_hwi (ud2 << 16, 32))); >if (ud1 != 0) > emit_move_insn (dest, > gen_rtx_IOR (DImode, copy_rtx (temp), > @@ -10261,8 +10261,7 @@
[PATCH 2/3]rs6000: NFC use sext_hwi to replace ((v&0xf..f)^0x80..0) - 0x80..0
Hi, This patch just uses sext_hwi to replace the expression like: ((value & 0xf..f) ^ 0x80..0) - 0x80..0 for rs6000.cc and rs6000.md. Bootstrap & regtest pass on ppc64{,le}. Is this ok for trunk? BR, Jeff (Jiufu) gcc/ChangeLog: * config/rs6000/rs6000.cc (num_insns_constant_gpr): Use sext_hwi. (darwin_rs6000_legitimate_lo_sum_const_p): Likewise. (mem_operand_gpr): Likewise. (mem_operand_ds_form): Likewise. (rs6000_legitimize_address): Likewise. (rs6000_emit_set_const): Likewise. (rs6000_emit_set_long_const): Likewise. (print_operand): Likewise. * config/rs6000/rs6000.md: Likewise. --- gcc/config/rs6000/rs6000.cc | 30 +- gcc/config/rs6000/rs6000.md | 10 +- 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 5efe9b22d8b..718072cc9a1 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -6021,7 +6021,7 @@ num_insns_constant_gpr (HOST_WIDE_INT value) else if (TARGET_POWERPC64) { - HOST_WIDE_INT low = ((value & 0x) ^ 0x8000) - 0x8000; + HOST_WIDE_INT low = sext_hwi (value, 32); HOST_WIDE_INT high = value >> 31; if (high == 0 || high == -1) @@ -8456,7 +8456,7 @@ darwin_rs6000_legitimate_lo_sum_const_p (rtx x, machine_mode mode) } /* We only care if the access(es) would cause a change to the high part. */ - offset = ((offset & 0x) ^ 0x8000) - 0x8000; + offset = sext_hwi (offset, 16); return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); } @@ -8522,7 +8522,7 @@ mem_operand_gpr (rtx op, machine_mode mode) if (GET_CODE (addr) == LO_SUM) /* For lo_sum addresses, we must allow any offset except one that causes a wrap, so test only the low 16 bits. */ -offset = ((offset & 0x) ^ 0x8000) - 0x8000; +offset = sext_hwi (offset, 16); return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); } @@ -8562,7 +8562,7 @@ mem_operand_ds_form (rtx op, machine_mode mode) if (GET_CODE (addr) == LO_SUM) /* For lo_sum addresses, we must allow any offset except one that causes a wrap, so test only the low 16 bits. */ -offset = ((offset & 0x) ^ 0x8000) - 0x8000; +offset = sext_hwi (offset, 16); return SIGNED_16BIT_OFFSET_EXTRA_P (offset, extra); } @@ -9136,7 +9136,7 @@ rs6000_legitimize_address (rtx x, rtx oldx ATTRIBUTE_UNUSED, { HOST_WIDE_INT high_int, low_int; rtx sum; - low_int = ((INTVAL (XEXP (x, 1)) & 0x) ^ 0x8000) - 0x8000; + low_int = sext_hwi (INTVAL (XEXP (x, 1)), 16); if (low_int >= 0x8000 - extra) low_int = 0; high_int = INTVAL (XEXP (x, 1)) - low_int; @@ -10203,7 +10203,7 @@ rs6000_emit_set_const (rtx dest, rtx source) lo = operand_subword_force (dest, WORDS_BIG_ENDIAN != 0, DImode); emit_move_insn (hi, GEN_INT (c >> 32)); - c = ((c & 0x) ^ 0x8000) - 0x8000; + c = sext_hwi (c, 32); emit_move_insn (lo, GEN_INT (c)); } else @@ -10242,7 +10242,7 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c) if ((ud4 == 0x && ud3 == 0x && ud2 == 0x && (ud1 & 0x8000)) || (ud4 == 0 && ud3 == 0 && ud2 == 0 && ! (ud1 & 0x8000))) -emit_move_insn (dest, GEN_INT ((ud1 ^ 0x8000) - 0x8000)); +emit_move_insn (dest, GEN_INT (sext_hwi (ud1, 16))); else if ((ud4 == 0x && ud3 == 0x && (ud2 & 0x8000)) || (ud4 == 0 && ud3 == 0 && ! (ud2 & 0x8000))) @@ -10250,7 +10250,7 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c) temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode); emit_move_insn (ud1 != 0 ? copy_rtx (temp) : dest, - GEN_INT (((ud2 << 16) ^ 0x8000) - 0x8000)); + GEN_INT (sext_hwi (ud2 << 16, 32))); if (ud1 != 0) emit_move_insn (dest, gen_rtx_IOR (DImode, copy_rtx (temp), @@ -10261,8 +10261,7 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c) temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode); gcc_assert (ud2 & 0x8000); - emit_move_insn (copy_rtx (temp), - GEN_INT (((ud2 << 16) ^ 0x8000) - 0x8000)); + emit_move_insn (copy_rtx (temp), GEN_INT (sext_hwi (ud2 << 16, 32))); if (ud1 != 0) emit_move_insn (copy_rtx (temp), gen_rtx_IOR (DImode, copy_rtx (temp), @@ -10273,7 +10272,7 @@ rs6000_emit_set_long_const (rtx dest, HOST_WIDE_INT c) { temp = !can_create_pseudo_p () ? dest : gen_reg_rtx (DImode); HOST_WIDE_INT num = (ud2 << 16) | ud1; - rs6000_emit_set_long_const (temp, (num ^ 0x8000) - 0x8000); + rs6000_emit_set_long_const (temp, sext_hwi (num, 32)); rtx one = gen_rtx_AND (DImode, temp, GEN_INT