OpenCores
URL https://opencores.org/ocsvn/ao486/ao486/trunk

Subversion Repositories ao486

[/] [ao486/] [trunk/] [rtl/] [ao486/] [commands/] [CMD_INC_DEC.txt] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
 
2
3
`define CMD_INC_DEC         #AUTOGEN_NEXT_CMD
4
 
5
`define CMDEX_INC_DEC_implicit              4'd0
6
`define CMDEX_INC_DEC_increment_implicit    4'd0
7
`define CMDEX_INC_DEC_decrement_implicit    4'd1
8
`define CMDEX_INC_DEC_modregrm              4'd2
9
`define CMDEX_INC_DEC_increment_modregrm    4'd2
10
`define CMDEX_INC_DEC_decrement_modregrm    4'd3
11
12
 
13
14
dec_ready_one && decoder[7:4] == 4'h4
15
`CMD_INC_DEC
16
SET(dec_cmdex, `CMDEX_INC_DEC_increment_implicit | { 3'd0, decoder[3] });
17
SET(consume_one);
18
19
 
20
21
dec_ready_modregrm_one && { decoder[7:1], 1'b0 } == 8'hFE && { decoder[13:12], 1'b0 } == 3'b000
22
prefix_group_1_lock && `DEC_MODREGRM_IS_MOD_11
23
`CMD_INC_DEC
24
SET(dec_cmdex, `CMDEX_INC_DEC_increment_modregrm | { 3'd0, decoder[11] });
25
IF(decoder[0] == 1'b0); SET(dec_is_8bit); ENDIF();
26
SET(consume_modregrm_one);
27
28
 
29
30
IF(rd_cmd == `CMD_INC_DEC && { rd_cmdex[3:1], 1'b0 } == `CMDEX_INC_DEC_modregrm);
31
 
32
    SET(rd_req_eflags);
33
 
34
    SET(rd_src_is_1);
35
 
36
    // dst: reg, src: reg
37
    IF(rd_modregrm_mod == 2'b11);
38
 
39
        IF(rd_mutex_busy_modregrm_rm); SET(rd_waiting);
40
        ELSE();
41
            // reg, reg
42
 
43
            SET(rd_dst_is_rm);
44
 
45
            SET(rd_req_rm);
46
        ENDIF();
47
    ENDIF();
48
 
49
    // dst: memory, src: reg
50
    IF(rd_modregrm_mod != 2'b11);
51
 
52
        SET(rd_dst_is_memory);
53
 
54
        SET(rd_req_memory);
55
 
56
        IF(rd_mutex_busy_memory); SET(rd_waiting);
57
        ELSE();
58
            SET(read_rmw_virtual);
59
 
60
            IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
61
        ENDIF();
62
    ENDIF();
63
ENDIF();
64
65
 
66
67
IF(rd_cmd == `CMD_INC_DEC && { rd_cmdex[3:1], 1'b0 } == `CMDEX_INC_DEC_implicit);
68
 
69
    SET(rd_src_is_1);
70
    SET(rd_dst_is_implicit_reg);
71
 
72
    SET(rd_req_eflags);
73
    SET(rd_req_implicit_reg);
74
 
75
    // dst: implicit reg, src: imm
76
    IF(rd_mutex_busy_implicit_reg); SET(rd_waiting); ENDIF();
77
ENDIF();
78
79
 
80
81
IF(exe_cmd == `CMD_INC_DEC);
82
 
83
    SET(exe_arith_index, (exe_cmdex[0] == `FALSE)? (`ARITH_VALID | `ARITH_ADD) : (`ARITH_VALID | `ARITH_SUB));
84
 
85
    SET(exe_result, (exe_cmdex[0] == `FALSE)? exe_arith_add[31:0] : exe_arith_sub[31:0]);
86
 
87
ENDIF();
88
89
 
90
91
IF(wr_cmd == `CMD_INC_DEC);
92
 
93
    IF(wr_dst_is_memory && ~(write_for_wr_ready)); SET(wr_waiting); ENDIF();
94
 
95
    SET(write_rmw_virtual,   wr_dst_is_memory);
96
    SET(write_regrm,         wr_dst_is_implicit_reg || wr_dst_is_rm);
97
 
98
    // no carry flag
99
    SAVE(zflag, zflag_result);
100
    SAVE(sflag, sflag_result);
101
    SAVE(pflag, pflag_result);
102
 
103
    SAVE(aflag, aflag_arith);
104
    SAVE(oflag, oflag_arith);
105
ENDIF();
106
107
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.