@@ -1057,45 +1057,66 @@ bool AVRExpandPseudo::expand<AVR::AtomicFence>(Block &MBB, BlockIt MBBI) {
1057
1057
1058
1058
template <>
1059
1059
bool AVRExpandPseudo::expand<AVR::STSWKRr>(Block &MBB, BlockIt MBBI) {
1060
+ const AVRSubtarget &STI = MBB.getParent ()->getSubtarget <AVRSubtarget>();
1060
1061
MachineInstr &MI = *MBBI;
1061
1062
Register SrcLoReg, SrcHiReg;
1062
1063
Register SrcReg = MI.getOperand (1 ).getReg ();
1063
1064
bool SrcIsKill = MI.getOperand (1 ).isKill ();
1064
- unsigned OpLo = AVR::STSKRr;
1065
- unsigned OpHi = AVR::STSKRr;
1066
1065
TRI->splitReg (SrcReg, SrcLoReg, SrcHiReg);
1067
1066
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);
1072
1069
1073
1070
switch (MI.getOperand (0 ).getType ()) {
1074
1071
case MachineOperand::MO_GlobalAddress: {
1075
1072
const GlobalValue *GV = MI.getOperand (0 ).getGlobal ();
1076
1073
int64_t Offs = MI.getOperand (0 ).getOffset ();
1077
1074
unsigned TF = MI.getOperand (0 ).getTargetFlags ();
1078
1075
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
+
1081
1086
break ;
1082
1087
}
1083
1088
case MachineOperand::MO_Immediate: {
1084
1089
unsigned Imm = MI.getOperand (0 ).getImm ();
1085
1090
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
+
1088
1101
break ;
1089
1102
}
1090
1103
default :
1091
1104
llvm_unreachable (" Unknown operand type!" );
1092
1105
}
1093
1106
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
+ }
1099
1120
1100
1121
MI.eraseFromParent ();
1101
1122
return true ;
@@ -1126,16 +1147,27 @@ bool AVRExpandPseudo::expand<AVR::STWPtrRr>(Block &MBB, BlockIt MBBI) {
1126
1147
} else {
1127
1148
Register SrcLoReg, SrcHiReg;
1128
1149
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
+ }
1139
1171
}
1140
1172
1141
1173
MI.eraseFromParent ();
@@ -1252,23 +1284,32 @@ bool AVRExpandPseudo::expand<AVR::STDWPtrQRr>(Block &MBB, BlockIt MBBI) {
1252
1284
.addImm (Imm + 2 );
1253
1285
}
1254
1286
} else {
1255
- unsigned OpLo = AVR::STDPtrQRr;
1256
- unsigned OpHi = AVR::STDPtrQRr;
1257
1287
Register SrcLoReg, SrcHiReg;
1258
1288
TRI->splitReg (SrcReg, SrcLoReg, SrcHiReg);
1259
1289
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
+ }
1272
1313
}
1273
1314
1274
1315
MI.eraseFromParent ();
@@ -1347,27 +1388,28 @@ bool AVRExpandPseudo::expand<AVR::INWRdA>(Block &MBB, BlockIt MBBI) {
1347
1388
1348
1389
template <>
1349
1390
bool AVRExpandPseudo::expand<AVR::OUTWARr>(Block &MBB, BlockIt MBBI) {
1391
+ const AVRSubtarget &STI = MBB.getParent ()->getSubtarget <AVRSubtarget>();
1350
1392
MachineInstr &MI = *MBBI;
1351
1393
Register SrcLoReg, SrcHiReg;
1352
1394
unsigned Imm = MI.getOperand (0 ).getImm ();
1353
1395
Register SrcReg = MI.getOperand (1 ).getReg ();
1354
1396
bool SrcIsKill = MI.getOperand (1 ).isKill ();
1355
- unsigned OpLo = AVR::OUTARr;
1356
- unsigned OpHi = AVR::OUTARr;
1357
1397
TRI->splitReg (SrcReg, SrcLoReg, SrcHiReg);
1358
1398
1359
1399
// Since we add 1 to the Imm value for the high byte below, and 63 is the
1360
1400
// highest Imm value allowed for the instruction, 62 is the limit here.
1361
1401
assert (Imm <= 62 && " Address is out of range" );
1362
1402
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));
1371
1413
1372
1414
MIBLO.setMemRefs (MI.memoperands ());
1373
1415
MIBHI.setMemRefs (MI.memoperands ());
0 commit comments