On 18 October 2016 at 02:46, Jeff Law <l...@redhat.com> wrote: > On 10/15/2016 11:59 PM, Prathamesh Kulkarni wrote: >> >> This patch is mostly the same as previous one, except it drops >> targeting __udivmoddi4() because it gave undefined reference link >> error for calling __udivmoddi4() on aarch64-linux-gnu. It appears >> aarch64 has hardware insn for DImode div, so __udivmoddi4() isn't >> needed for the target (it was a bug in my patch that called >> __udivmoddi4() even though aarch64 supported hardware div). > > This touches on the one high level question I had. Namely what is the code > generation strategy if the hardware has a div, but not divmod. The divmod transform isn't enabled if target supports hardware div in the same or wider mode even if divmod libfunc is available for the given mode. > > ISTM in that case I think we want to use the div instruction and synthesize > mod from that result rather than relying on a software divmod. So it looks > like you ought to be doing the right thing for that case now based on your > comment above. >> >> >> However this makes me wonder if it's guaranteed that __udivmoddi4() >> will be available for a target if it doesn't have hardware div and >> divmod insn and doesn't have target-specific libfunc for DImode >> divmod ? To be conservative, the attached patch doesn't generate call >> to __udivmoddi4. > > I don't think that's a safe assumption. Addition of the divmod routines > into libgcc is controlled by the target and have to be explicitly added > AFAICT. > > So on a target like the fr30 which has no div or mod insn and doesn't define > the right bits in libgcc, there is no divmod libcall available. (On these > targets there's a div libcall and a mod libcall, but not a combined one). Thanks. I had erroneously assumed __udivimoddi4() was available for all targets because it was defined in libgcc2.c and generated call to it as "last resort" for unsigned DImode case if target didn't support hardware div and divmod insn and didn't have target-specific divmod libfunc for DImode. The reason why it generated undefined reference on aarch64-linux-gnu was because I didn't properly check in the patch if target supported hardware div, and ended up generating call to __udivmoddi4() even though aarch64 has hardware div. I rectified that before posting the patch. > > I don't even think we have a way of knowing in the compiler if the target > has enabled divmod support in libgcc. Well the arm and c6x backends register target-specific divmod libfunc via set_optab_libfunc(). I suppose that's sufficient to know if target has divmod enabled in libgcc ? > > ISTM that for now we have to limit to cases where we have a divmod > insn/libcall defined. Indeed. The transform is enabled only if the target has hardware divmod insn or divmod libfunc (in the libfunc case, no hardware div insn). Please see divmod_candidate_p() in the patch for cases when the transform gets enabled.
Thanks, Prathamesh > > jeff >