@@ -224,10 +224,9 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
224224 .clampScalar (0 , s8, sMax );
225225
226226 getActionDefinitionsBuilder (
227- {G_SDIVREM, G_UDIVREM, G_ABS, G_DYN_STACKALLOC, G_SEXT_INREG,
228- G_BSWAP, G_SMULO, G_SMULH, G_UMULH, G_SMIN,
229- G_SMAX, G_UMIN, G_UMAX, G_UADDSAT, G_SADDSAT,
230- G_USUBSAT, G_SSUBSAT, G_USHLSAT, G_SSHLSAT, G_FPOWI})
227+ {G_SDIVREM, G_UDIVREM, G_ABS, G_DYN_STACKALLOC, G_SEXT_INREG, G_SMULO,
228+ G_SMULH, G_UMULH, G_SMIN, G_SMAX, G_UMIN, G_UMAX, G_UADDSAT, G_SADDSAT,
229+ G_USUBSAT, G_SSUBSAT, G_USHLSAT, G_SSHLSAT, G_FPOWI})
231230 .lower ();
232231
233232 getActionDefinitionsBuilder ({G_CTTZ, G_CTTZ_ZERO_UNDEF, G_CTLZ_ZERO_UNDEF})
@@ -242,6 +241,11 @@ Z80LegalizerInfo::Z80LegalizerInfo(const Z80Subtarget &STI,
242241 .libcallForCartesianProduct ({s8}, LegalLibcallScalars)
243242 .clampScalar (0 , s8, s8);
244243
244+ getActionDefinitionsBuilder (G_BSWAP)
245+ .legalFor ({s16})
246+ .libcallFor ({s32, s64})
247+ .clampScalar (0 , s16, s64);
248+
245249 getActionDefinitionsBuilder (G_BITREVERSE)
246250 .libcallFor (LegalLibcallScalars)
247251 .clampScalar (0 , s8, s64);
@@ -448,8 +452,8 @@ Z80LegalizerInfo::legalizeVAStart(LegalizerHelper &Helper,
448452LegalizerHelper::LegalizeResult
449453Z80LegalizerInfo::legalizeShift (LegalizerHelper &Helper, MachineInstr &MI,
450454 LostDebugLocObserver &LocObserver) const {
451- assert ((MI. getOpcode () == G_SHL || MI.getOpcode () == G_LSHR ||
452- MI. getOpcode () == G_ASHR) &&
455+ unsigned Opc = MI.getOpcode ();
456+ assert ((Opc == G_SHL || Opc == G_LSHR || Opc == G_ASHR) &&
453457 " Unexpected opcode" );
454458 MachineRegisterInfo &MRI = *Helper.MIRBuilder .getMRI ();
455459 Register DstReg = MI.getOperand (0 ).getReg ();
@@ -458,17 +462,13 @@ Z80LegalizerInfo::legalizeShift(LegalizerHelper &Helper, MachineInstr &MI,
458462 getIConstantVRegValWithLookThrough (MI.getOperand (2 ).getReg (), MRI)) {
459463 if (Ty == LLT::scalar (8 ) && Amt->Value == 1 )
460464 return LegalizerHelper::AlreadyLegal;
461- if (MI.getOpcode () == G_SHL && Amt->Value == 1 ) {
462- Helper.Observer .changingInstr (MI);
463- MI.setDesc (Helper.MIRBuilder .getTII ().get (G_ADD));
464- MI.getOperand (2 ).setReg (MI.getOperand (1 ).getReg ());
465- Helper.Observer .changedInstr (MI);
466- return LegalizerHelper::Legalized;
467- }
465+ if ((Opc == G_SHL || Opc == G_LSHR) && Ty == LLT::scalar (16 ) &&
466+ Amt->Value == 8 )
467+ return LegalizerHelper::AlreadyLegal;
468468 if (MI.getOpcode () == G_ASHR && Amt->Value == Ty.getSizeInBits () - 1 &&
469469 (Ty == LLT::scalar (8 ) || Ty == LLT::scalar (16 ) ||
470470 (Subtarget.is24Bit () && Ty == LLT::scalar (24 ))))
471- return LegalizerHelper::Legalized ;
471+ return LegalizerHelper::AlreadyLegal ;
472472 }
473473 return Helper.libcall (MI, LocObserver);
474474}
0 commit comments