AVRInstrInfo.td (321369) | AVRInstrInfo.td (326496) |
---|---|
1//===-- AVRInstrInfo.td - AVR Instruction defs -------------*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// --- 1138 unchanged lines hidden (view full) --- 1147 "ld\t$reg, $ptrreg", 1148 [(set GPR8:$reg, (load i16:$ptrreg))]>, 1149 Requires<[HasSRAM]>; 1150 1151 // LDW Rd+1:Rd, P 1152 // 1153 // Expands to: 1154 // ld Rd, P+ | 1//===-- AVRInstrInfo.td - AVR Instruction defs -------------*- tablegen -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// --- 1138 unchanged lines hidden (view full) --- 1147 "ld\t$reg, $ptrreg", 1148 [(set GPR8:$reg, (load i16:$ptrreg))]>, 1149 Requires<[HasSRAM]>; 1150 1151 // LDW Rd+1:Rd, P 1152 // 1153 // Expands to: 1154 // ld Rd, P+ |
1155 // ld Rd+1, P+ | 1155 // ld Rd+1, P |
1156 let Constraints = "@earlyclobber $reg" in 1157 def LDWRdPtr : Pseudo<(outs DREGS:$reg), | 1156 let Constraints = "@earlyclobber $reg" in 1157 def LDWRdPtr : Pseudo<(outs DREGS:$reg), |
1158 (ins PTRDISPREGS:$ptrreg), | 1158 (ins PTRREGS:$ptrreg), |
1159 "ldw\t$reg, $ptrreg", 1160 [(set i16:$reg, (load i16:$ptrreg))]>, 1161 Requires<[HasSRAM]>; 1162} 1163 1164// Indirect loads (with postincrement or predecrement). 1165let mayLoad = 1, 1166hasSideEffects = 0, | 1159 "ldw\t$reg, $ptrreg", 1160 [(set i16:$reg, (load i16:$ptrreg))]>, 1161 Requires<[HasSRAM]>; 1162} 1163 1164// Indirect loads (with postincrement or predecrement). 1165let mayLoad = 1, 1166hasSideEffects = 0, |
1167Constraints = "$ptrreg = $base_wb,@earlyclobber $reg,@earlyclobber $base_wb" in | 1167Constraints = "$ptrreg = $base_wb,@earlyclobber $reg" in |
1168{ 1169 def LDRdPtrPi : FSTLD<0, 1170 0b01, 1171 (outs GPR8:$reg, PTRREGS:$base_wb), 1172 (ins LDSTPtrReg:$ptrreg), 1173 "ld\t$reg, $ptrreg+", 1174 []>, 1175 Requires<[HasSRAM]>; --- 57 unchanged lines hidden (view full) --- 1233 Constraints = "@earlyclobber $dst" in 1234 def LDDWRdYQ : Pseudo<(outs DREGS:$dst), 1235 (ins memri:$memri), 1236 "lddw\t$dst, $memri", 1237 []>, 1238 Requires<[HasSRAM]>; 1239} 1240 | 1168{ 1169 def LDRdPtrPi : FSTLD<0, 1170 0b01, 1171 (outs GPR8:$reg, PTRREGS:$base_wb), 1172 (ins LDSTPtrReg:$ptrreg), 1173 "ld\t$reg, $ptrreg+", 1174 []>, 1175 Requires<[HasSRAM]>; --- 57 unchanged lines hidden (view full) --- 1233 Constraints = "@earlyclobber $dst" in 1234 def LDDWRdYQ : Pseudo<(outs DREGS:$dst), 1235 (ins memri:$memri), 1236 "lddw\t$dst, $memri", 1237 []>, 1238 Requires<[HasSRAM]>; 1239} 1240 |
1241class AtomicLoad<PatFrag Op, RegisterClass DRC> : 1242 Pseudo<(outs DRC:$rd), (ins PTRREGS:$rr), "atomic_op", | 1241class AtomicLoad<PatFrag Op, RegisterClass DRC, 1242 RegisterClass PTRRC> : 1243 Pseudo<(outs DRC:$rd), (ins PTRRC:$rr), "atomic_op", |
1243 [(set DRC:$rd, (Op i16:$rr))]>; 1244 | 1244 [(set DRC:$rd, (Op i16:$rr))]>; 1245 |
1245class AtomicStore<PatFrag Op, RegisterClass DRC> : 1246 Pseudo<(outs), (ins PTRDISPREGS:$rd, DRC:$rr), "atomic_op", | 1246class AtomicStore<PatFrag Op, RegisterClass DRC, 1247 RegisterClass PTRRC> : 1248 Pseudo<(outs), (ins PTRRC:$rd, DRC:$rr), "atomic_op", |
1247 [(Op i16:$rd, DRC:$rr)]>; 1248 | 1249 [(Op i16:$rd, DRC:$rr)]>; 1250 |
1249class AtomicLoadOp<PatFrag Op, RegisterClass DRC> : 1250 Pseudo<(outs DRC:$rd), (ins PTRREGS:$rr, DRC:$operand), | 1251class AtomicLoadOp<PatFrag Op, RegisterClass DRC, 1252 RegisterClass PTRRC> : 1253 Pseudo<(outs DRC:$rd), (ins PTRRC:$rr, DRC:$operand), |
1251 "atomic_op", 1252 [(set DRC:$rd, (Op i16:$rr, DRC:$operand))]>; 1253 | 1254 "atomic_op", 1255 [(set DRC:$rd, (Op i16:$rr, DRC:$operand))]>; 1256 |
1254def AtomicLoad8 : AtomicLoad<atomic_load_8, GPR8>; 1255def AtomicLoad16 : AtomicLoad<atomic_load_16, DREGS>; | 1257// FIXME: I think 16-bit atomic binary ops need to mark 1258// r0 as clobbered. |
1256 | 1259 |
1257def AtomicStore8 : AtomicStore<atomic_store_8, GPR8>; 1258def AtomicStore16 : AtomicStore<atomic_store_16, DREGS>; | 1260// Atomic instructions 1261// =================== 1262// 1263// These are all expanded by AVRExpandPseudoInsts 1264// 1265// 8-bit operations can use any pointer register because 1266// they are expanded directly into an LD/ST instruction. 1267// 1268// 16-bit operations use 16-bit load/store postincrement instructions, 1269// which require PTRDISPREGS. |
1259 | 1270 |
1260def AtomicLoadAdd8 : AtomicLoadOp<atomic_load_add_8, GPR8>; 1261def AtomicLoadAdd16 : AtomicLoadOp<atomic_load_add_16, DREGS>; 1262def AtomicLoadSub8 : AtomicLoadOp<atomic_load_sub_8, GPR8>; 1263def AtomicLoadSub16 : AtomicLoadOp<atomic_load_sub_16, DREGS>; 1264def AtomicLoadAnd8 : AtomicLoadOp<atomic_load_and_8, GPR8>; 1265def AtomicLoadAnd16 : AtomicLoadOp<atomic_load_and_16, DREGS>; 1266def AtomicLoadOr8 : AtomicLoadOp<atomic_load_or_8, GPR8>; 1267def AtomicLoadOr16 : AtomicLoadOp<atomic_load_or_16, DREGS>; 1268def AtomicLoadXor8 : AtomicLoadOp<atomic_load_xor_8, GPR8>; 1269def AtomicLoadXor16 : AtomicLoadOp<atomic_load_xor_16, DREGS>; | 1271def AtomicLoad8 : AtomicLoad<atomic_load_8, GPR8, PTRREGS>; 1272def AtomicLoad16 : AtomicLoad<atomic_load_16, DREGS, PTRDISPREGS>; 1273 1274def AtomicStore8 : AtomicStore<atomic_store_8, GPR8, PTRREGS>; 1275def AtomicStore16 : AtomicStore<atomic_store_16, DREGS, PTRDISPREGS>; 1276 1277class AtomicLoadOp8<PatFrag Op> : AtomicLoadOp<Op, GPR8, PTRREGS>; 1278class AtomicLoadOp16<PatFrag Op> : AtomicLoadOp<Op, DREGS, PTRDISPREGS>; 1279 1280def AtomicLoadAdd8 : AtomicLoadOp8<atomic_load_add_8>; 1281def AtomicLoadAdd16 : AtomicLoadOp16<atomic_load_add_16>; 1282def AtomicLoadSub8 : AtomicLoadOp8<atomic_load_sub_8>; 1283def AtomicLoadSub16 : AtomicLoadOp16<atomic_load_sub_16>; 1284def AtomicLoadAnd8 : AtomicLoadOp8<atomic_load_and_8>; 1285def AtomicLoadAnd16 : AtomicLoadOp16<atomic_load_and_16>; 1286def AtomicLoadOr8 : AtomicLoadOp8<atomic_load_or_8>; 1287def AtomicLoadOr16 : AtomicLoadOp16<atomic_load_or_16>; 1288def AtomicLoadXor8 : AtomicLoadOp8<atomic_load_xor_8>; 1289def AtomicLoadXor16 : AtomicLoadOp16<atomic_load_xor_16>; |
1270def AtomicFence : Pseudo<(outs), (ins), "atomic_fence", 1271 [(atomic_fence imm, imm)]>; 1272 1273// Indirect store from register to data space. 1274def STSKRr : F32DM<0b1, 1275 (outs), 1276 (ins imm16:$k, GPR8:$rd), 1277 "sts\t$k, $rd", --- 114 unchanged lines hidden (view full) --- 1392 "stdw\t$memri, $src", 1393 [(store i16:$src, addr:$memri)]>, 1394 Requires<[HasSRAM]>; 1395 1396 1397// Load program memory operations. 1398let canFoldAsLoad = 1, 1399isReMaterializable = 1, | 1290def AtomicFence : Pseudo<(outs), (ins), "atomic_fence", 1291 [(atomic_fence imm, imm)]>; 1292 1293// Indirect store from register to data space. 1294def STSKRr : F32DM<0b1, 1295 (outs), 1296 (ins imm16:$k, GPR8:$rd), 1297 "sts\t$k, $rd", --- 114 unchanged lines hidden (view full) --- 1412 "stdw\t$memri, $src", 1413 [(store i16:$src, addr:$memri)]>, 1414 Requires<[HasSRAM]>; 1415 1416 1417// Load program memory operations. 1418let canFoldAsLoad = 1, 1419isReMaterializable = 1, |
1420mayLoad = 1, |
|
1400hasSideEffects = 0 in 1401{ 1402 let Defs = [R0], 1403 Uses = [R31R30] in 1404 def LPM : F16<0b1001010111001000, 1405 (outs), 1406 (ins), 1407 "lpm", --- 4 unchanged lines hidden (view full) --- 1412 0, 1413 (outs GPR8:$dst), 1414 (ins ZREG:$z), 1415 "lpm\t$dst, $z", 1416 []>, 1417 Requires<[HasLPMX]>; 1418 1419 // Load program memory, while postincrementing the Z register. | 1421hasSideEffects = 0 in 1422{ 1423 let Defs = [R0], 1424 Uses = [R31R30] in 1425 def LPM : F16<0b1001010111001000, 1426 (outs), 1427 (ins), 1428 "lpm", --- 4 unchanged lines hidden (view full) --- 1433 0, 1434 (outs GPR8:$dst), 1435 (ins ZREG:$z), 1436 "lpm\t$dst, $z", 1437 []>, 1438 Requires<[HasLPMX]>; 1439 1440 // Load program memory, while postincrementing the Z register. |
1420 let mayLoad = 1, 1421 Defs = [R31R30] in | 1441 let Defs = [R31R30] in |
1422 { 1423 def LPMRdZPi : FLPMX<0, 1424 1, 1425 (outs GPR8:$dst), 1426 (ins ZREG:$z), 1427 "lpm\t$dst, $z+", 1428 []>, 1429 Requires<[HasLPMX]>; --- 646 unchanged lines hidden --- | 1442 { 1443 def LPMRdZPi : FLPMX<0, 1444 1, 1445 (outs GPR8:$dst), 1446 (ins ZREG:$z), 1447 "lpm\t$dst, $z+", 1448 []>, 1449 Requires<[HasLPMX]>; --- 646 unchanged lines hidden --- |