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

Subversion Repositories ao486

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
 
2
3
`define CMD_IMUL        #AUTOGEN_NEXT_CMD
4
 
5
`define CMDEX_IMUL_modregrm     4'd0
6
`define CMDEX_IMUL_modregrm_imm 4'd1
7
8
 
9
10
(dec_ready_modregrm_one && ({ decoder[7:1], 1'b0 } == 8'hF6 && decoder[13:11] == 3'd5)) || (dec_ready_2byte_modregrm && decoder[7:0] == 8'hAF)
11
`CMD_IMUL
12
SET(dec_cmdex, `CMDEX_IMUL_modregrm);
13
IF(decoder[0] == 1'b0); SET(dec_is_8bit); ENDIF();
14
SET(consume_modregrm_one);
15
16
 
17
18
dec_ready_modregrm_imm && (decoder[7:0] == 8'h69 || decoder[7:0] == 8'h6B)
19
`CMD_IMUL
20
SET(dec_cmdex, `CMDEX_IMUL_modregrm_imm);
21
SET(consume_modregrm_imm);
22
23
 
24
25
IF(rd_cmd == `CMD_IMUL && rd_cmdex == `CMDEX_IMUL_modregrm_imm);
26
 
27
    SET(rd_dst_is_reg);
28
 
29
    SET(rd_req_eflags);
30
    SET(rd_req_reg);
31
 
32
    IF(rd_decoder[1:0] == 2'b11);   SET(rd_dst_is_modregrm_imm_se);
33
    ELSE();                         SET(rd_dst_is_modregrm_imm);
34
    ENDIF();
35
 
36
    // dst: reg(only write), src1: rm, src2: imm
37
    IF(rd_modregrm_mod == 2'b11);
38
 
39
        SET(rd_src_is_rm);
40
 
41
        //no need to wait for dst(modregrm_reg)
42
        IF(rd_mutex_busy_modregrm_rm); SET(rd_waiting); ENDIF();
43
    ENDIF();
44
 
45
    // dst: reg(only write), src1: memory, src2: imm
46
    IF(rd_modregrm_mod != 2'b11);
47
 
48
        SET(rd_src_is_memory);
49
 
50
        IF(rd_mutex_busy_memory); SET(rd_waiting);
51
        ELSE();
52
            SET(read_virtual);
53
 
54
            IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
55
        ENDIF();
56
    ENDIF();
57
ENDIF();
58
59
 
60
61
wire rd_imul_modregrm_mutex_busy;
62
 
63
assign rd_imul_modregrm_mutex_busy =
64
    (  rd_decoder[3]  && rd_mutex_busy_modregrm_reg) ||
65
    (~(rd_decoder[3]) && rd_mutex_busy_eax);
66
67
 
68
69
IF(rd_cmd == `CMD_IMUL && rd_cmdex == `CMDEX_IMUL_modregrm);
70
 
71
    SET(rd_dst_is_reg,          rd_decoder[3]);
72
    SET(rd_dst_is_edx_eax,    ~(rd_decoder[3]));
73
 
74
    SET(rd_req_eflags);
75
    SET(rd_req_reg,          rd_decoder[3]);
76
    SET(rd_req_edx_eax,      ~(rd_decoder[3]) && rd_decoder[0]);
77
    SET(rd_req_eax,          ~(rd_decoder[3]));
78
 
79
    // dst: reg/implicit, src: rm
80
    IF(rd_modregrm_mod == 2'b11);
81
 
82
        SET(rd_src_is_rm);
83
 
84
        IF(rd_imul_modregrm_mutex_busy || rd_mutex_busy_modregrm_rm); SET(rd_waiting); ENDIF();
85
    ENDIF();
86
 
87
    // dst: reg/implicit, src: memory
88
    IF(rd_modregrm_mod != 2'b11);
89
 
90
        IF(rd_imul_modregrm_mutex_busy || rd_mutex_busy_memory); SET(rd_waiting);
91
        ELSE();
92
            SET(rd_src_is_memory);
93
 
94
            SET(read_virtual);
95
 
96
            IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
97
        ENDIF();
98
    ENDIF();
99
ENDIF();
100
101
 
102
103
IF(exe_cmd == `CMD_IMUL);
104
 
105
    SET(exe_result,  mult_result[31:0]);
106
    SET(exe_result2, mult_result[63:32]);
107
 
108
    IF(mult_busy); SET(exe_waiting); ENDIF();
109
ENDIF();
110
111
 
112
113
IF(wr_cmd == `CMD_IMUL);
114
    SET(write_regrm, wr_dst_is_reg);
115
 
116
    IF(wr_dst_is_edx_eax);
117
        SAVE(eax, (wr_is_8bit || wr_operand_16bit)? { eax[31:16], result[15:0] } : result);
118
 
119
        IF(~(wr_is_8bit));
120
            SAVE(edx, (wr_operand_16bit)? { edx[31:16], result[31:16] } : result2);
121
        ENDIF();
122
    ENDIF();
123
 
124
    SAVE(zflag, zflag_result);
125
    SAVE(sflag, sflag_result);
126
    SAVE(pflag, pflag_result);
127
 
128
    SAVE(aflag, 1'b0);
129
    SAVE(cflag, wr_mult_overflow);
130
    SAVE(oflag, wr_mult_overflow);
131
ENDIF();
132
133
 
134
 

powered by: WebSVN 2.1.0

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