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

Subversion Repositories ao486

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
 
2
3
`define CMD_POP         #AUTOGEN_NEXT_CMD
4
 
5
`define CMDEX_POP_implicit          4'd0
6
`define CMDEX_POP_modregrm_STEP_0   4'd1
7
`define CMDEX_POP_modregrm_STEP_1   4'd2
8
9
 
10
11
dec_ready_one && { decoder[7:3], 3'b0 } == 8'h58
12
`CMD_POP
13
SET(dec_cmdex, `CMDEX_POP_implicit);
14
SET(consume_one);
15
16
 
17
18
dec_ready_modregrm_one && decoder[7:0] == 8'h8F && decoder[13:11] == 3'd0
19
`CMD_POP
20
SET(dec_cmdex, `CMDEX_POP_modregrm_STEP_0);
21
SET(consume_modregrm_one);
22
SET(dec_is_complex);
23
24
 
25
26
`CMDEX_POP_modregrm_STEP_0
27
LAST(`CMDEX_POP_modregrm_STEP_1);
28
29
 
30
31
IF(rd_cmd == `CMD_POP && rd_cmdex == `CMDEX_POP_implicit);
32
 
33
    SET(address_stack_pop);
34
 
35
    SET(rd_src_is_memory);
36
    SET(rd_dst_is_implicit_reg);
37
 
38
    SET(rd_req_esp);
39
    SET(rd_req_implicit_reg);
40
 
41
    IF(rd_mutex_busy_memory || rd_mutex_busy_esp); SET(rd_waiting);
42
    ELSE();
43
        SET(read_virtual);
44
 
45
        IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
46
    ENDIF();
47
ENDIF();
48
49
 
50
51
IF(rd_cmd == `CMD_POP && rd_cmdex == `CMDEX_POP_modregrm_STEP_0);
52
 
53
    SET(address_stack_pop);
54
 
55
    SET(rd_src_is_memory);
56
 
57
    SET(rd_req_esp);
58
 
59
    IF(rd_mutex_busy_memory || rd_mutex_busy_esp); SET(rd_waiting);
60
    ELSE();
61
        SET(read_virtual);
62
 
63
        IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
64
    ENDIF();
65
ENDIF();
66
67
 
68
69
IF(rd_cmd == `CMD_POP && rd_cmdex == `CMDEX_POP_modregrm_STEP_1);
70
 
71
    // dst: reg
72
    IF(rd_modregrm_mod == 2'b11);
73
        // no need to wait
74
        SET(rd_dst_is_rm);
75
 
76
        SET(rd_req_rm);
77
    ENDIF();
78
 
79
    // dst: memory
80
    IF(rd_modregrm_mod != 2'b11);
81
        SET(rd_dst_is_memory);
82
 
83
        SET(rd_req_memory);
84
 
85
        SET(write_virtual_check);
86
 
87
        IF(~(write_virtual_check_ready)); SET(rd_waiting); ENDIF();
88
    ENDIF();
89
ENDIF();
90
91
 
92
93
IF(exe_cmd == `CMD_POP && exe_cmdex == `CMDEX_POP_implicit);
94
 
95
    SET(offset_pop);
96
 
97
    SET(exe_result, src);
98
 
99
ENDIF();
100
101
 
102
103
IF(exe_cmd == `CMD_POP && exe_cmdex == `CMDEX_POP_modregrm_STEP_0);
104
 
105
    SET(offset_pop);
106
 
107
    SAVE(exe_buffer, src);
108
ENDIF();
109
110
 
111
112
IF(exe_cmd == `CMD_POP && exe_cmdex == `CMDEX_POP_modregrm_STEP_1);
113
 
114
    SET(offset_pop);
115
 
116
    SET(exe_result, exe_buffer);
117
ENDIF();
118
119
 
120
121
IF(wr_cmd == `CMD_POP && wr_cmdex == `CMDEX_POP_implicit);
122
    SET(write_regrm);
123
 
124
    SAVE(esp, wr_stack_esp);
125
ENDIF();
126
127
 
128
129
IF(wr_cmd == `CMD_POP && wr_cmdex == `CMDEX_POP_modregrm_STEP_0);
130
    SET(wr_not_finished);
131
 
132
    SAVE(esp, wr_stack_esp);
133
 
134
    SET(wr_make_esp_speculative);
135
ENDIF();
136
137
 
138
139
IF(wr_cmd == `CMD_POP && wr_cmdex == `CMDEX_POP_modregrm_STEP_1);
140
    IF(wr_dst_is_memory && ~(write_for_wr_ready)); SET(wr_waiting); ENDIF();
141
 
142
    SET(write_regrm,     wr_dst_is_rm);
143
    SET(write_virtual,   wr_dst_is_memory);
144
 
145
    IF(~(wr_dst_is_memory) || write_for_wr_ready);
146
        SET(wr_make_esp_commit);
147
    ENDIF();
148
ENDIF();
149

powered by: WebSVN 2.1.0

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