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

Subversion Repositories ao486

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
 
2
3
`define CMD_DIV         #AUTOGEN_NEXT_CMD
4
`define CMD_IDIV        #AUTOGEN_NEXT_CMD
5
6
 
7
8
dec_ready_modregrm_one && { decoder[7:1], 1'b0 } == 8'hF6 && decoder[13:11] == 3'd6
9
`CMD_DIV
10
IF(decoder[0] == 1'b0); SET(dec_is_8bit); ENDIF();
11
SET(consume_modregrm_one);
12
13
 
14
15
dec_ready_modregrm_one && { decoder[7:1], 1'b0 } == 8'hF6 && decoder[13:11] == 3'd7
16
`CMD_IDIV
17
IF(decoder[0] == 1'b0); SET(dec_is_8bit); ENDIF();
18
SET(consume_modregrm_one);
19
20
 
21
22
IF(rd_cmd == `CMD_IDIV || rd_cmd == `CMD_DIV);
23
 
24
    SET(rd_dst_is_edx_eax);
25
 
26
    SET(rd_req_edx_eax, rd_decoder[0]);
27
    SET(rd_req_eax);
28
 
29
    // dst: implicit, src: rm
30
    IF(rd_modregrm_mod == 2'b11);
31
 
32
        SET(rd_src_is_rm);
33
 
34
        IF(rd_mutex_busy_eax || (rd_decoder[0] && rd_mutex_busy_edx) || rd_mutex_busy_modregrm_rm); SET(rd_waiting); ENDIF();
35
    ENDIF();
36
 
37
    // dst: implicit, src: memory
38
    IF(rd_modregrm_mod != 2'b11);
39
 
40
        IF(rd_mutex_busy_eax || (rd_decoder[0] && rd_mutex_busy_edx) || rd_mutex_busy_memory); SET(rd_waiting);
41
        ELSE();
42
 
43
            SET(rd_src_is_memory);
44
 
45
            SET(read_virtual);
46
 
47
            IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
48
        ENDIF();
49
    ENDIF();
50
ENDIF();
51
52
 
53
54
IF(exe_cmd == `CMD_IDIV || exe_cmd == `CMD_DIV);
55
 
56
    SET(exe_result, (exe_is_8bit)?          { 16'd0, div_result_remainder[7:0], div_result_quotient[7:0] } :
57
                    (exe_operand_16bit)?    { div_result_remainder[15:0], div_result_quotient[15:0] } :
58
                                            div_result_quotient);
59
    SET(exe_result2, div_result_remainder);
60
 
61
    IF(exe_div_exception || div_busy); SET(exe_waiting); ENDIF();
62
ENDIF();
63
64
 
65
66
IF(wr_cmd == `CMD_IDIV || wr_cmd == `CMD_DIV);
67
    SAVE(eax, (wr_is_8bit || wr_operand_16bit)? { eax[31:16], result[15:0] } : result);
68
 
69
    IF(~(wr_is_8bit));
70
        SAVE(edx, (wr_operand_16bit)? { edx[31:16], result[31:16] } : result2);
71
    ENDIF();
72
ENDIF();
73

powered by: WebSVN 2.1.0

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