+the list again On Sep 17, 2013, at 3:48 PM, reed kotler <rkotler at mips.com> wrote:> On 09/17/2013 03:46 PM, Owen Anderson wrote: >> On Sep 17, 2013, at 3:08 PM, reed kotler <rkotler at mips.com> wrote: >> >>> Is there any way, except for using bundles, to force two instructions to be sequentially executed? >> What level of codegen are you working at? There are various mechanisms that can be applied, depending on exactly what the constraints are that you need to preserve. >> >> —Owen > I have two machine instructions that I need to be together. > > BuildMI(MBB, I, DL, TII.get(Mips::LiRxImmAlignX16), V0) > .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI); > BuildMI(MBB, I, DL, TII.get(Mips::AddiuRxPcImmX16), V1) > .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO); > > It's in Mips16ISelDagToDag.cpp > > these two have to be together because they are both part of a complex pc relative calculation. > > I have not used bundles yet and was just looking for an easy way to join these two.Bundles is one way you can go. Another is to use a pseudo instruction that is broken up immediately before (or during!) MC emission. —Owen
On 09/17/2013 03:52 PM, Owen Anderson wrote:> +the list again > On Sep 17, 2013, at 3:48 PM, reed kotler <rkotler at mips.com> wrote: > >> On 09/17/2013 03:46 PM, Owen Anderson wrote: >>> On Sep 17, 2013, at 3:08 PM, reed kotler <rkotler at mips.com> wrote: >>> >>>> Is there any way, except for using bundles, to force two instructions to be sequentially executed? >>> What level of codegen are you working at? There are various mechanisms that can be applied, depending on exactly what the constraints are that you need to preserve. >>> >>> —Owen >> I have two machine instructions that I need to be together. >> >> BuildMI(MBB, I, DL, TII.get(Mips::LiRxImmAlignX16), V0) >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI); >> BuildMI(MBB, I, DL, TII.get(Mips::AddiuRxPcImmX16), V1) >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO); >> >> It's in Mips16ISelDagToDag.cpp >> >> these two have to be together because they are both part of a complex pc relative calculation. >> >> I have not used bundles yet and was just looking for an easy way to join these two. > Bundles is one way you can go. Another is to use a pseudo instruction that is broken up immediately before (or during!) MC emission. > > —OwenI just tried this but something is wrong here. Well, I have not used bundles at all. I just know how they work conceptually. This compiled okay but I got some constraint errors. MIBundleBuilder(MBB, I) .append(BuildMI(MF, DL, TII.get(Mips::LiRxImmAlignX16), V0) .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI)) .append(BuildMI(MF, DL, TII.get(Mips::AddiuRxPcImmX16), V1) .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO));
Reed, Couldn't you also use instruction scheduling classes and specify that the second instruction has a bypass from the first instruction? The scheduler should always schedule them together in that case. Micah> -----Original Message----- > From: llvmdev-bounces at cs.uiuc.edu [mailto:llvmdev-bounces at cs.uiuc.edu] On > Behalf Of reed kotler > Sent: Tuesday, September 17, 2013 3:59 PM > To: Owen Anderson > Cc: llvmdev Mailing List > Subject: Re: [LLVMdev] forcing two instructions to be together > > On 09/17/2013 03:52 PM, Owen Anderson wrote: > > +the list again > > On Sep 17, 2013, at 3:48 PM, reed kotler <rkotler at mips.com> wrote: > > > >> On 09/17/2013 03:46 PM, Owen Anderson wrote: > >>> On Sep 17, 2013, at 3:08 PM, reed kotler <rkotler at mips.com> wrote: > >>> > >>>> Is there any way, except for using bundles, to force two instructions to be > sequentially executed? > >>> What level of codegen are you working at? There are various mechanisms > that can be applied, depending on exactly what the constraints are that you > need to preserve. > >>> > >>> -Owen > >> I have two machine instructions that I need to be together. > >> > >> BuildMI(MBB, I, DL, TII.get(Mips::LiRxImmAlignX16), V0) > >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI); > >> BuildMI(MBB, I, DL, TII.get(Mips::AddiuRxPcImmX16), V1) > >> .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO); > >> > >> It's in Mips16ISelDagToDag.cpp > >> > >> these two have to be together because they are both part of a complex pc > relative calculation. > >> > >> I have not used bundles yet and was just looking for an easy way to join > these two. > > Bundles is one way you can go. Another is to use a pseudo instruction that is > broken up immediately before (or during!) MC emission. > > > > -Owen > I just tried this but something is wrong here. Well, I have not used bundles at > all. > I just know how they work conceptually. This compiled okay but I got some > constraint errors. > > MIBundleBuilder(MBB, I) > .append(BuildMI(MF, DL, TII.get(Mips::LiRxImmAlignX16), V0) > .addExternalSymbol("_gp_disp", MipsII::MO_ABS_HI)) > .append(BuildMI(MF, DL, TII.get(Mips::AddiuRxPcImmX16), V1) > .addExternalSymbol("_gp_disp", MipsII::MO_ABS_LO)); > > > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev