@@ -1057,45 +1057,66 @@ bool AVRExpandPseudo::expand<AVR::AtomicFence>(Block &MBB, BlockIt MBBI) {
10571057
10581058template <>
10591059bool AVRExpandPseudo::expand<AVR::STSWKRr>(Block &MBB, BlockIt MBBI) {
1060+ const AVRSubtarget &STI = MBB.getParent ()->getSubtarget <AVRSubtarget>();
10601061 MachineInstr &MI = *MBBI;
10611062 Register SrcLoReg, SrcHiReg;
10621063 Register SrcReg = MI.getOperand (1 ).getReg ();
10631064 bool SrcIsKill = MI.getOperand (1 ).isKill ();
1064- unsigned OpLo = AVR::STSKRr;
1065- unsigned OpHi = AVR::STSKRr;
10661065 TRI->splitReg (SrcReg, SrcLoReg, SrcHiReg);
10671066
1068- // Write the high byte first in case this address belongs to a special
1069- // I/O address with a special temporary register.
1070- auto MIBHI = buildMI (MBB, MBBI, OpHi);
1071- auto MIBLO = buildMI (MBB, MBBI, OpLo);
1067+ auto MIB0 = buildMI (MBB, MBBI, AVR::STSKRr);
1068+ auto MIB1 = buildMI (MBB, MBBI, AVR::STSKRr);
10721069
10731070 switch (MI.getOperand (0 ).getType ()) {
10741071 case MachineOperand::MO_GlobalAddress: {
10751072 const GlobalValue *GV = MI.getOperand (0 ).getGlobal ();
10761073 int64_t Offs = MI.getOperand (0 ).getOffset ();
10771074 unsigned TF = MI.getOperand (0 ).getTargetFlags ();
10781075
1079- MIBLO.addGlobalAddress (GV, Offs, TF);
1080- MIBHI.addGlobalAddress (GV, Offs + 1 , TF);
1076+ if (STI.hasLowByteFirst ()) {
1077+ // Write the low byte first for XMEGA devices.
1078+ MIB0.addGlobalAddress (GV, Offs, TF);
1079+ MIB1.addGlobalAddress (GV, Offs + 1 , TF);
1080+ } else {
1081+ // Write the high byte first for traditional devices.
1082+ MIB0.addGlobalAddress (GV, Offs + 1 , TF);
1083+ MIB1.addGlobalAddress (GV, Offs, TF);
1084+ }
1085+
10811086 break ;
10821087 }
10831088 case MachineOperand::MO_Immediate: {
10841089 unsigned Imm = MI.getOperand (0 ).getImm ();
10851090
1086- MIBLO.addImm (Imm);
1087- MIBHI.addImm (Imm + 1 );
1091+ if (STI.hasLowByteFirst ()) {
1092+ // Write the low byte first for XMEGA devices.
1093+ MIB0.addImm (Imm);
1094+ MIB1.addImm (Imm + 1 );
1095+ } else {
1096+ // Write the high byte first for traditional devices.
1097+ MIB0.addImm (Imm + 1 );
1098+ MIB1.addImm (Imm);
1099+ }
1100+
10881101 break ;
10891102 }
10901103 default :
10911104 llvm_unreachable (" Unknown operand type!" );
10921105 }
10931106
1094- MIBLO.addReg (SrcLoReg, getKillRegState (SrcIsKill));
1095- MIBHI.addReg (SrcHiReg, getKillRegState (SrcIsKill));
1096-
1097- MIBLO.setMemRefs (MI.memoperands ());
1098- MIBHI.setMemRefs (MI.memoperands ());
1107+ if (STI.hasLowByteFirst ()) {
1108+ // Write the low byte first for XMEGA devices.
1109+ MIB0.addReg (SrcLoReg, getKillRegState (SrcIsKill))
1110+ .setMemRefs (MI.memoperands ());
1111+ MIB1.addReg (SrcHiReg, getKillRegState (SrcIsKill))
1112+ .setMemRefs (MI.memoperands ());
1113+ } else {
1114+ // Write the high byte first for traditional devices.
1115+ MIB0.addReg (SrcHiReg, getKillRegState (SrcIsKill))
1116+ .setMemRefs (MI.memoperands ());
1117+ MIB1.addReg (SrcLoReg, getKillRegState (SrcIsKill))
1118+ .setMemRefs (MI.memoperands ());
1119+ }
10991120
11001121 MI.eraseFromParent ();
11011122 return true ;
@@ -1126,16 +1147,27 @@ bool AVRExpandPseudo::expand<AVR::STWPtrRr>(Block &MBB, BlockIt MBBI) {
11261147 } else {
11271148 Register SrcLoReg, SrcHiReg;
11281149 TRI->splitReg (SrcReg, SrcLoReg, SrcHiReg);
1129- buildMI (MBB, MBBI, AVR::STPtrRr)
1130- .addReg (DstReg, getUndefRegState (DstIsUndef))
1131- .addReg (SrcLoReg, getKillRegState (SrcIsKill))
1132- .setMemRefs (MI.memoperands ());
1133-
1134- buildMI (MBB, MBBI, AVR::STDPtrQRr)
1135- .addReg (DstReg, getUndefRegState (DstIsUndef))
1136- .addImm (1 )
1137- .addReg (SrcHiReg, getKillRegState (SrcIsKill))
1138- .setMemRefs (MI.memoperands ());
1150+ if (STI.hasLowByteFirst ()) {
1151+ buildMI (MBB, MBBI, AVR::STPtrRr)
1152+ .addReg (DstReg, getUndefRegState (DstIsUndef))
1153+ .addReg (SrcLoReg, getKillRegState (SrcIsKill))
1154+ .setMemRefs (MI.memoperands ());
1155+ buildMI (MBB, MBBI, AVR::STDPtrQRr)
1156+ .addReg (DstReg, getUndefRegState (DstIsUndef))
1157+ .addImm (1 )
1158+ .addReg (SrcHiReg, getKillRegState (SrcIsKill))
1159+ .setMemRefs (MI.memoperands ());
1160+ } else {
1161+ buildMI (MBB, MBBI, AVR::STDPtrQRr)
1162+ .addReg (DstReg, getUndefRegState (DstIsUndef))
1163+ .addImm (1 )
1164+ .addReg (SrcHiReg, getKillRegState (SrcIsKill))
1165+ .setMemRefs (MI.memoperands ());
1166+ buildMI (MBB, MBBI, AVR::STPtrRr)
1167+ .addReg (DstReg, getUndefRegState (DstIsUndef))
1168+ .addReg (SrcLoReg, getKillRegState (SrcIsKill))
1169+ .setMemRefs (MI.memoperands ());
1170+ }
11391171 }
11401172
11411173 MI.eraseFromParent ();
@@ -1252,23 +1284,32 @@ bool AVRExpandPseudo::expand<AVR::STDWPtrQRr>(Block &MBB, BlockIt MBBI) {
12521284 .addImm (Imm + 2 );
12531285 }
12541286 } else {
1255- unsigned OpLo = AVR::STDPtrQRr;
1256- unsigned OpHi = AVR::STDPtrQRr;
12571287 Register SrcLoReg, SrcHiReg;
12581288 TRI->splitReg (SrcReg, SrcLoReg, SrcHiReg);
12591289
1260- auto MIBLO = buildMI (MBB, MBBI, OpLo)
1261- .addReg (DstReg)
1262- .addImm (Imm)
1263- .addReg (SrcLoReg, getKillRegState (SrcIsKill));
1264-
1265- auto MIBHI = buildMI (MBB, MBBI, OpHi)
1266- .addReg (DstReg, getKillRegState (DstIsKill))
1267- .addImm (Imm + 1 )
1268- .addReg (SrcHiReg, getKillRegState (SrcIsKill));
1269-
1270- MIBLO.setMemRefs (MI.memoperands ());
1271- MIBHI.setMemRefs (MI.memoperands ());
1290+ if (STI.hasLowByteFirst ()) {
1291+ buildMI (MBB, MBBI, AVR::STDPtrQRr)
1292+ .addReg (DstReg)
1293+ .addImm (Imm)
1294+ .addReg (SrcLoReg, getKillRegState (SrcIsKill))
1295+ .setMemRefs (MI.memoperands ());
1296+ buildMI (MBB, MBBI, AVR::STDPtrQRr)
1297+ .addReg (DstReg, getKillRegState (DstIsKill))
1298+ .addImm (Imm + 1 )
1299+ .addReg (SrcHiReg, getKillRegState (SrcIsKill))
1300+ .setMemRefs (MI.memoperands ());
1301+ } else {
1302+ buildMI (MBB, MBBI, AVR::STDPtrQRr)
1303+ .addReg (DstReg)
1304+ .addImm (Imm + 1 )
1305+ .addReg (SrcHiReg, getKillRegState (SrcIsKill))
1306+ .setMemRefs (MI.memoperands ());
1307+ buildMI (MBB, MBBI, AVR::STDPtrQRr)
1308+ .addReg (DstReg, getKillRegState (DstIsKill))
1309+ .addImm (Imm)
1310+ .addReg (SrcLoReg, getKillRegState (SrcIsKill))
1311+ .setMemRefs (MI.memoperands ());
1312+ }
12721313 }
12731314
12741315 MI.eraseFromParent ();
@@ -1347,27 +1388,28 @@ bool AVRExpandPseudo::expand<AVR::INWRdA>(Block &MBB, BlockIt MBBI) {
13471388
13481389template <>
13491390bool AVRExpandPseudo::expand<AVR::OUTWARr>(Block &MBB, BlockIt MBBI) {
1391+ const AVRSubtarget &STI = MBB.getParent ()->getSubtarget <AVRSubtarget>();
13501392 MachineInstr &MI = *MBBI;
13511393 Register SrcLoReg, SrcHiReg;
13521394 unsigned Imm = MI.getOperand (0 ).getImm ();
13531395 Register SrcReg = MI.getOperand (1 ).getReg ();
13541396 bool SrcIsKill = MI.getOperand (1 ).isKill ();
1355- unsigned OpLo = AVR::OUTARr;
1356- unsigned OpHi = AVR::OUTARr;
13571397 TRI->splitReg (SrcReg, SrcLoReg, SrcHiReg);
13581398
13591399 // Since we add 1 to the Imm value for the high byte below, and 63 is the
13601400 // highest Imm value allowed for the instruction, 62 is the limit here.
13611401 assert (Imm <= 62 && " Address is out of range" );
13621402
1363- // 16 bit I/O writes need the high byte first
1364- auto MIBHI = buildMI (MBB, MBBI, OpHi)
1365- .addImm (Imm + 1 )
1366- .addReg (SrcHiReg, getKillRegState (SrcIsKill));
1367-
1368- auto MIBLO = buildMI (MBB, MBBI, OpLo)
1369- .addImm (Imm)
1370- .addReg (SrcLoReg, getKillRegState (SrcIsKill));
1403+ // 16 bit I/O writes need the high byte first on normal AVR devices,
1404+ // and in reverse order for the XMEGA/XMEGA3/XMEGAU families.
1405+ auto MIBHI = buildMI (MBB, MBBI, AVR::OUTARr)
1406+ .addImm (STI.hasLowByteFirst () ? Imm : Imm + 1 )
1407+ .addReg (STI.hasLowByteFirst () ? SrcLoReg : SrcHiReg,
1408+ getKillRegState (SrcIsKill));
1409+ auto MIBLO = buildMI (MBB, MBBI, AVR::OUTARr)
1410+ .addImm (STI.hasLowByteFirst () ? Imm + 1 : Imm)
1411+ .addReg (STI.hasLowByteFirst () ? SrcHiReg : SrcLoReg,
1412+ getKillRegState (SrcIsKill));
13711413
13721414 MIBLO.setMemRefs (MI.memoperands ());
13731415 MIBHI.setMemRefs (MI.memoperands ());
0 commit comments