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

Subversion Repositories ao486

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

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 alfik
 
2
3
`define CMD_CMPXCHG     #AUTOGEN_NEXT_CMD
4
5
 
6
7
dec_ready_2byte_modregrm && { decoder[7:1], 1'b0 } == 8'hB0
8
prefix_group_1_lock && `DEC_MODREGRM_IS_MOD_11
9
`CMD_CMPXCHG
10
IF(decoder[0] == 1'b0); SET(dec_is_8bit); ENDIF();
11
SET(consume_modregrm_one);
12
13
 
14
15
IF(rd_cmd == `CMD_CMPXCHG);
16
 
17
    SET(rd_src_is_reg);
18
 
19
    SET(rd_req_eflags);
20
    SET(rd_req_eax);
21
 
22
    // dst: reg, src: reg
23
    IF(rd_modregrm_mod == 2'b11);
24
 
25
        IF(rd_mutex_busy_modregrm_reg || rd_mutex_busy_modregrm_rm); SET(rd_waiting);
26
        ELSE();
27
 
28
            SET(rd_dst_is_rm);
29
 
30
            SET(rd_req_rm);
31
        ENDIF();
32
    ENDIF();
33
 
34
    // dst: memory, src: reg
35
    IF(rd_modregrm_mod != 2'b11);
36
 
37
        IF(rd_mutex_busy_modregrm_reg || rd_mutex_busy_memory); SET(rd_waiting);
38
        ELSE();
39
            SET(rd_dst_is_memory);
40
 
41
            SET(rd_req_memory);
42
 
43
            SET(read_rmw_virtual);
44
 
45
            IF(~(read_for_rd_ready)); SET(rd_waiting); ENDIF();
46
        ENDIF();
47
    ENDIF();
48
ENDIF();
49
50
 
51
52
//------------------------------- CMPXCHG
53
wire        e_cmpxchg_eq;
54
wire [32:0] e_cmpxchg_sub;
55
wire [31:0] e_cmpxchg_result;
56
 
57
assign e_cmpxchg_eq =
58
    (exe_is_8bit       && eax[7:0]  == dst[7:0]) ||
59
    (exe_operand_16bit && eax[15:0] == dst[15:0]) ||
60
    (exe_operand_32bit && eax[31:0] == dst[31:0]);
61
 
62
assign e_cmpxchg_sub = eax - dst;
63
 
64
assign e_cmpxchg_result = (e_cmpxchg_eq)? src : e_cmpxchg_sub[31:0];
65
66
 
67
68
IF(exe_cmd == `CMD_CMPXCHG);
69
 
70
    SET(exe_arith_index, (`ARITH_VALID | `ARITH_SUB));
71
 
72
    SET(exe_result,  e_cmpxchg_result);
73
    SET(exe_result2, dst);
74
    SET(exe_result_signals, { 4'd0, e_cmpxchg_eq });
75
 
76
    SET(exe_cmpxchg_switch);
77
    SET(exe_cmpxchg_switch_carry, e_cmpxchg_sub[32]);
78
 
79
    IF(exe_mutex_current[`MUTEX_EAX_BIT]); SET(exe_waiting); ENDIF();
80
ENDIF();
81
82
 
83
84
IF(wr_cmd == `CMD_CMPXCHG);
85
 
86
    IF(result_signals[0]); // eq -> write dst
87
 
88
        IF(wr_dst_is_memory && ~(write_for_wr_ready)); SET(wr_waiting); ENDIF();
89
 
90
        SET(write_regrm,             wr_dst_is_rm);
91
        SET(write_rmw_virtual,       wr_dst_is_memory);
92
 
93
        SAVE(zflag, `TRUE);
94
        SAVE(sflag, `FALSE);
95
        SAVE(pflag, `TRUE);
96
 
97
        SAVE(aflag, `FALSE);
98
        SAVE(cflag, `FALSE);
99
        SAVE(oflag, `FALSE);
100
    ELSE();
101
 
102
        SAVE(eax, (wr_is_8bit)? { eax[31:8], result2[7:0] } : (wr_operand_16bit)? { eax[31:16], result2[15:0] } : result2);
103
 
104
        SAVE(zflag, zflag_result);
105
        SAVE(sflag, sflag_result);
106
        SAVE(pflag, pflag_result);
107
 
108
        SAVE(aflag, aflag_arith);
109
        SAVE(cflag, cflag_arith);
110
        SAVE(oflag, oflag_arith);
111
    ENDIF();
112
ENDIF();
113

powered by: WebSVN 2.1.0

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