Hi Andrew, Thanks for explaining the process.
On 5 February 2016 at 21:49, Pinski, Andrew < andrew.pin...@caviumnetworks.com> wrote: > aarch64_legitimate_address_hook_p is the place where the result of > aarch64_classify_address is returned to the middle-end. The middle-end > then knows that possibility for a+b is a legitimate address so it forces x3 > << 3 into a register and tries aarch64_legitimate_address_hook_p again. > > > > Thanks, > > Andrew Pinski > > > > *From:* linaro-toolchain [mailto:linaro-toolchain-boun...@lists.linaro.org] > *On Behalf Of *Virendra Kumar Pathak > *Sent:* Friday, February 5, 2016 6:58 AM > *To:* Linaro Toolchain Mailman List <linaro-toolchain@lists.linaro.org> > *Subject:* ldr instruction selection in the aarch64 backend > > > > Hi Linaro Toolchain Group, > > > > I have a question on the ldr instruction selection in the aarch64 backend. > > Could someone help me in this regards, please? > > > > I am trying to allow only type A instructions while disabling the type B. > > Type A example: ldr x4, [x20,x1] ---> allow > > Type B example: ldr x1, [x9,x3,lsl #3] ---> > disable > > > > > > Experiment/My Understanding - > > aarch64_classify_address() returns true if rtx X is a valid address. If > allow_reg_index_p=true then it calls aarch64_classify_index(). > > aarch64_classify_index() identify the address mode of second operand (op1) > and accordingly calculate the shift. > > If shift=0 then type A is generated otherwise Type B will be generated. > > > > Thus if (shift != 0) then I am returning 'false' from > aarch64_classify_index(). > > -------------------------patch--------- > > --- a/gcc/config/aarch64/aarch64.c > > +++ b/gcc/config/aarch64/aarch64.c > > @@ -3586,6 +3586,9 @@ aarch64_classify_index (struct aarch64_address_info > *info, rtx x, > > if (GET_CODE (index) == SUBREG) > > index = SUBREG_REG (index); > > + if (shift != 0) > > + return false; > > if ((shift == 0 || > > (shift > 0 && shift <= 3 > > && (1 << shift) == GET_MODE_SIZE (mode))) > > --------------------------------------- > > > > Result - > > Before change > > ldr x0, [x13,x0,lsl #3] > > After Change > > lsl x1, x1, #3 > > ldr x0, [x15,x1] > > > > Question - > > How the returning 'false' from aarch64_classify_index() is resulting in > the selection of type A versus type B? > > I could not find the function which is taking the decision based on return > from aarch64_classify_address(). > > Could someone please explain this process or point me to the relevant > files or code? > > Please correct me if my understanding is wrong. > > > > Thanks in advance for your time and patience. > > > > > > -- > > with regards, > Virendra Kumar Pathak > -- with regards, Virendra Kumar Pathak
_______________________________________________ linaro-toolchain mailing list linaro-toolchain@lists.linaro.org https://lists.linaro.org/mailman/listinfo/linaro-toolchain