@@ -298,7 +298,8 @@ let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
298
298
class BranchCC_rri<bits<3> funct3, string opcodestr>
299
299
: RVInstB<funct3, OPC_BRANCH, (outs),
300
300
(ins GPR:$rs1, GPR:$rs2, simm13_lsb0:$imm12),
301
- opcodestr, "$rs1, $rs2, $imm12"> {
301
+ opcodestr, "$rs1, $rs2, $imm12">,
302
+ Sched<[WriteJmp]> {
302
303
let isBranch = 1;
303
304
let isTerminator = 1;
304
305
}
@@ -320,13 +321,15 @@ class Store_rri<bits<3> funct3, string opcodestr>
320
321
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
321
322
class ALU_ri<bits<3> funct3, string opcodestr>
322
323
: RVInstI<funct3, OPC_OP_IMM, (outs GPR:$rd), (ins GPR:$rs1, simm12:$imm12),
323
- opcodestr, "$rd, $rs1, $imm12">;
324
+ opcodestr, "$rd, $rs1, $imm12">,
325
+ Sched<[WriteIALU, ReadIALU]>;
324
326
325
327
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
326
328
class Shift_ri<bit arithshift, bits<3> funct3, string opcodestr>
327
329
: RVInstIShift<arithshift, funct3, OPC_OP_IMM, (outs GPR:$rd),
328
330
(ins GPR:$rs1, uimmlog2xlen:$shamt), opcodestr,
329
- "$rd, $rs1, $shamt">;
331
+ "$rd, $rs1, $shamt">,
332
+ Sched<[WriteShift, ReadShift]>;
330
333
331
334
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
332
335
class ALU_rr<bits<7> funct7, bits<3> funct3, string opcodestr>
@@ -336,19 +339,20 @@ class ALU_rr<bits<7> funct7, bits<3> funct3, string opcodestr>
336
339
let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
337
340
class CSR_ir<bits<3> funct3, string opcodestr>
338
341
: RVInstI<funct3, OPC_SYSTEM, (outs GPR:$rd), (ins csr_sysreg:$imm12, GPR:$rs1),
339
- opcodestr, "$rd, $imm12, $rs1">;
342
+ opcodestr, "$rd, $imm12, $rs1">, Sched<[WriteCSR, ReadCSR]> ;
340
343
341
344
let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
342
345
class CSR_ii<bits<3> funct3, string opcodestr>
343
346
: RVInstI<funct3, OPC_SYSTEM, (outs GPR:$rd),
344
347
(ins csr_sysreg:$imm12, uimm5:$rs1),
345
- opcodestr, "$rd, $imm12, $rs1">;
348
+ opcodestr, "$rd, $imm12, $rs1">, Sched<[WriteCSR]> ;
346
349
347
350
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
348
351
class ShiftW_ri<bit arithshift, bits<3> funct3, string opcodestr>
349
352
: RVInstIShiftW<arithshift, funct3, OPC_OP_IMM_32, (outs GPR:$rd),
350
353
(ins GPR:$rs1, uimm5:$shamt), opcodestr,
351
- "$rd, $rs1, $shamt">;
354
+ "$rd, $rs1, $shamt">,
355
+ Sched<[WriteShift32, ReadShift32]>;
352
356
353
357
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
354
358
class ALUW_rr<bits<7> funct7, bits<3> funct3, string opcodestr>
@@ -367,19 +371,20 @@ class Priv<string opcodestr, bits<7> funct7>
367
371
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in {
368
372
let isReMaterializable = 1, isAsCheapAsAMove = 1 in
369
373
def LUI : RVInstU<OPC_LUI, (outs GPR:$rd), (ins uimm20_lui:$imm20),
370
- "lui", "$rd, $imm20">;
374
+ "lui", "$rd, $imm20">, Sched<[WriteIALU]> ;
371
375
372
376
def AUIPC : RVInstU<OPC_AUIPC, (outs GPR:$rd), (ins uimm20_auipc:$imm20),
373
- "auipc", "$rd, $imm20">;
377
+ "auipc", "$rd, $imm20">, Sched<[WriteIALU]> ;
374
378
375
379
let isCall = 1 in
376
380
def JAL : RVInstJ<OPC_JAL, (outs GPR:$rd), (ins simm21_lsb0_jal:$imm20),
377
- "jal", "$rd, $imm20">;
381
+ "jal", "$rd, $imm20">, Sched<[WriteJal]> ;
378
382
379
383
let isCall = 1 in
380
384
def JALR : RVInstI<0b000, OPC_JALR, (outs GPR:$rd),
381
385
(ins GPR:$rs1, simm12:$imm12),
382
- "jalr", "$rd, ${imm12}(${rs1})">;
386
+ "jalr", "$rd, ${imm12}(${rs1})">,
387
+ Sched<[WriteJalr, ReadJalr]>;
383
388
} // hasSideEffects = 0, mayLoad = 0, mayStore = 0
384
389
385
390
def BEQ : BranchCC_rri<0b000, "beq">;
@@ -389,15 +394,15 @@ def BGE : BranchCC_rri<0b101, "bge">;
389
394
def BLTU : BranchCC_rri<0b110, "bltu">;
390
395
def BGEU : BranchCC_rri<0b111, "bgeu">;
391
396
392
- def LB : Load_ri<0b000, "lb">;
393
- def LH : Load_ri<0b001, "lh">;
394
- def LW : Load_ri<0b010, "lw">;
395
- def LBU : Load_ri<0b100, "lbu">;
396
- def LHU : Load_ri<0b101, "lhu">;
397
+ def LB : Load_ri<0b000, "lb">, Sched<[WriteLDB, ReadMemBase]> ;
398
+ def LH : Load_ri<0b001, "lh">, Sched<[WriteLDH, ReadMemBase]> ;
399
+ def LW : Load_ri<0b010, "lw">, Sched<[WriteLDW, ReadMemBase]> ;
400
+ def LBU : Load_ri<0b100, "lbu">, Sched<[WriteLDB, ReadMemBase]> ;
401
+ def LHU : Load_ri<0b101, "lhu">, Sched<[WriteLDH, ReadMemBase]> ;
397
402
398
- def SB : Store_rri<0b000, "sb">;
399
- def SH : Store_rri<0b001, "sh">;
400
- def SW : Store_rri<0b010, "sw">;
403
+ def SB : Store_rri<0b000, "sb">, Sched<[WriteSTB, ReadStoreData, ReadMemBase]> ;
404
+ def SH : Store_rri<0b001, "sh">, Sched<[WriteSTH, ReadStoreData, ReadMemBase]> ;
405
+ def SW : Store_rri<0b010, "sw">, Sched<[WriteSTW, ReadStoreData, ReadMemBase]> ;
401
406
402
407
// ADDI isn't always rematerializable, but isReMaterializable will be used as
403
408
// a hint which is verified in isReallyTriviallyReMaterializable.
@@ -418,21 +423,21 @@ def SLLI : Shift_ri<0, 0b001, "slli">;
418
423
def SRLI : Shift_ri<0, 0b101, "srli">;
419
424
def SRAI : Shift_ri<1, 0b101, "srai">;
420
425
421
- def ADD : ALU_rr<0b0000000, 0b000, "add">;
422
- def SUB : ALU_rr<0b0100000, 0b000, "sub">;
423
- def SLL : ALU_rr<0b0000000, 0b001, "sll">;
424
- def SLT : ALU_rr<0b0000000, 0b010, "slt">;
425
- def SLTU : ALU_rr<0b0000000, 0b011, "sltu">;
426
- def XOR : ALU_rr<0b0000000, 0b100, "xor">;
427
- def SRL : ALU_rr<0b0000000, 0b101, "srl">;
428
- def SRA : ALU_rr<0b0100000, 0b101, "sra">;
429
- def OR : ALU_rr<0b0000000, 0b110, "or">;
430
- def AND : ALU_rr<0b0000000, 0b111, "and">;
426
+ def ADD : ALU_rr<0b0000000, 0b000, "add">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
427
+ def SUB : ALU_rr<0b0100000, 0b000, "sub">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
428
+ def SLL : ALU_rr<0b0000000, 0b001, "sll">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
429
+ def SLT : ALU_rr<0b0000000, 0b010, "slt">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
430
+ def SLTU : ALU_rr<0b0000000, 0b011, "sltu">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
431
+ def XOR : ALU_rr<0b0000000, 0b100, "xor">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
432
+ def SRL : ALU_rr<0b0000000, 0b101, "srl">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
433
+ def SRA : ALU_rr<0b0100000, 0b101, "sra">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
434
+ def OR : ALU_rr<0b0000000, 0b110, "or">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
435
+ def AND : ALU_rr<0b0000000, 0b111, "and">, Sched<[WriteIALU, ReadIALU, ReadIALU]> ;
431
436
432
437
let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in {
433
438
def FENCE : RVInstI<0b000, OPC_MISC_MEM, (outs),
434
439
(ins fencearg:$pred, fencearg:$succ),
435
- "fence", "$pred, $succ"> {
440
+ "fence", "$pred, $succ">, Sched<[]> {
436
441
bits<4> pred;
437
442
bits<4> succ;
438
443
@@ -441,25 +446,26 @@ def FENCE : RVInstI<0b000, OPC_MISC_MEM, (outs),
441
446
let imm12 = {0b0000,pred,succ};
442
447
}
443
448
444
- def FENCE_TSO : RVInstI<0b000, OPC_MISC_MEM, (outs), (ins), "fence.tso", ""> {
449
+ def FENCE_TSO : RVInstI<0b000, OPC_MISC_MEM, (outs), (ins), "fence.tso", "">, Sched<[]> {
445
450
let rs1 = 0;
446
451
let rd = 0;
447
452
let imm12 = {0b1000,0b0011,0b0011};
448
453
}
449
454
450
- def FENCE_I : RVInstI<0b001, OPC_MISC_MEM, (outs), (ins), "fence.i", ""> {
455
+ def FENCE_I : RVInstI<0b001, OPC_MISC_MEM, (outs), (ins), "fence.i", "">, Sched<[]> {
451
456
let rs1 = 0;
452
457
let rd = 0;
453
458
let imm12 = 0;
454
459
}
455
460
456
- def ECALL : RVInstI<0b000, OPC_SYSTEM, (outs), (ins), "ecall", ""> {
461
+ def ECALL : RVInstI<0b000, OPC_SYSTEM, (outs), (ins), "ecall", "">, Sched<[WriteJmp]> {
457
462
let rs1 = 0;
458
463
let rd = 0;
459
464
let imm12 = 0;
460
465
}
461
466
462
- def EBREAK : RVInstI<0b000, OPC_SYSTEM, (outs), (ins), "ebreak", ""> {
467
+ def EBREAK : RVInstI<0b000, OPC_SYSTEM, (outs), (ins), "ebreak", "">,
468
+ Sched<[]> {
463
469
let rs1 = 0;
464
470
let rd = 0;
465
471
let imm12 = 1;
@@ -468,7 +474,8 @@ def EBREAK : RVInstI<0b000, OPC_SYSTEM, (outs), (ins), "ebreak", ""> {
468
474
// This is a de facto standard (as set by GNU binutils) 32-bit unimplemented
469
475
// instruction (i.e., it should always trap, if your implementation has invalid
470
476
// instruction traps).
471
- def UNIMP : RVInstI<0b001, OPC_SYSTEM, (outs), (ins), "unimp", ""> {
477
+ def UNIMP : RVInstI<0b001, OPC_SYSTEM, (outs), (ins), "unimp", "">,
478
+ Sched<[]> {
472
479
let rs1 = 0;
473
480
let rd = 0;
474
481
let imm12 = 0b110000000000;
@@ -486,51 +493,57 @@ def CSRRCI : CSR_ii<0b111, "csrrci">;
486
493
/// RV64I instructions
487
494
488
495
let Predicates = [IsRV64] in {
489
- def LWU : Load_ri<0b110, "lwu">;
490
- def LD : Load_ri<0b011, "ld">;
491
- def SD : Store_rri<0b011, "sd">;
496
+ def LWU : Load_ri<0b110, "lwu">, Sched<[WriteLDWU, ReadMemBase]> ;
497
+ def LD : Load_ri<0b011, "ld">, Sched<[WriteLDD, ReadMemBase]> ;
498
+ def SD : Store_rri<0b011, "sd">, Sched<[WriteSTD, ReadStoreData, ReadMemBase]> ;
492
499
493
500
let hasSideEffects = 0, mayLoad = 0, mayStore = 0 in
494
501
def ADDIW : RVInstI<0b000, OPC_OP_IMM_32, (outs GPR:$rd),
495
502
(ins GPR:$rs1, simm12:$imm12),
496
- "addiw", "$rd, $rs1, $imm12">;
503
+ "addiw", "$rd, $rs1, $imm12">,
504
+ Sched<[WriteIALU32, ReadIALU32]>;
497
505
498
506
def SLLIW : ShiftW_ri<0, 0b001, "slliw">;
499
507
def SRLIW : ShiftW_ri<0, 0b101, "srliw">;
500
508
def SRAIW : ShiftW_ri<1, 0b101, "sraiw">;
501
509
502
- def ADDW : ALUW_rr<0b0000000, 0b000, "addw">;
503
- def SUBW : ALUW_rr<0b0100000, 0b000, "subw">;
504
- def SLLW : ALUW_rr<0b0000000, 0b001, "sllw">;
505
- def SRLW : ALUW_rr<0b0000000, 0b101, "srlw">;
506
- def SRAW : ALUW_rr<0b0100000, 0b101, "sraw">;
510
+ def ADDW : ALUW_rr<0b0000000, 0b000, "addw">,
511
+ Sched<[WriteIALU32, ReadIALU32, ReadIALU32]>;
512
+ def SUBW : ALUW_rr<0b0100000, 0b000, "subw">,
513
+ Sched<[WriteIALU32, ReadIALU32, ReadIALU32]>;
514
+ def SLLW : ALUW_rr<0b0000000, 0b001, "sllw">,
515
+ Sched<[WriteIALU32, ReadIALU32, ReadIALU32]>;
516
+ def SRLW : ALUW_rr<0b0000000, 0b101, "srlw">,
517
+ Sched<[WriteIALU32, ReadIALU32, ReadIALU32]>;
518
+ def SRAW : ALUW_rr<0b0100000, 0b101, "sraw">,
519
+ Sched<[WriteIALU32, ReadIALU32, ReadIALU32]>;
507
520
} // Predicates = [IsRV64]
508
521
509
522
//===----------------------------------------------------------------------===//
510
523
// Privileged instructions
511
524
//===----------------------------------------------------------------------===//
512
525
513
526
let isBarrier = 1, isReturn = 1, isTerminator = 1 in {
514
- def URET : Priv<"uret", 0b0000000> {
527
+ def URET : Priv<"uret", 0b0000000>, Sched<[]> {
515
528
let rd = 0;
516
529
let rs1 = 0;
517
530
let rs2 = 0b00010;
518
531
}
519
532
520
- def SRET : Priv<"sret", 0b0001000> {
533
+ def SRET : Priv<"sret", 0b0001000>, Sched<[]> {
521
534
let rd = 0;
522
535
let rs1 = 0;
523
536
let rs2 = 0b00010;
524
537
}
525
538
526
- def MRET : Priv<"mret", 0b0011000> {
539
+ def MRET : Priv<"mret", 0b0011000>, Sched<[]> {
527
540
let rd = 0;
528
541
let rs1 = 0;
529
542
let rs2 = 0b00010;
530
543
}
531
544
} // isBarrier = 1, isReturn = 1, isTerminator = 1
532
545
533
- def WFI : Priv<"wfi", 0b0001000> {
546
+ def WFI : Priv<"wfi", 0b0001000>, Sched<[]> {
534
547
let rd = 0;
535
548
let rs1 = 0;
536
549
let rs2 = 0b00101;
@@ -539,7 +552,7 @@ def WFI : Priv<"wfi", 0b0001000> {
539
552
let hasSideEffects = 1, mayLoad = 0, mayStore = 0 in
540
553
def SFENCE_VMA : RVInstR<0b0001001, 0b000, OPC_SYSTEM, (outs),
541
554
(ins GPR:$rs1, GPR:$rs2),
542
- "sfence.vma", "$rs1, $rs2"> {
555
+ "sfence.vma", "$rs1, $rs2">, Sched<[]> {
543
556
let rd = 0;
544
557
}
545
558
0 commit comments