semaphores.py (6486:33faa9915d16) semaphores.py (6512:b19a86a6d424)
1# Copyright (c) 2007 The Hewlett-Packard Development Company
2# All rights reserved.
3#
4# Redistribution and use of this software in source and binary forms,
5# with or without modification, are permitted provided that the
6# following conditions are met:
7#
8# The software must be used only for Non-Commercial Use which means any

--- 84 unchanged lines hidden (view full) ---

93 ldstl t1, seg, riprel, disp
94 sub t0, rax, t1, flags=(OF, SF, ZF, AF, PF, CF)
95
96 mov t1, t1, reg, flags=(CZF,)
97 stul t1, seg, riprel, disp
98 mov rax, rax, t1, flags=(nCZF,)
99};
100
1# Copyright (c) 2007 The Hewlett-Packard Development Company
2# All rights reserved.
3#
4# Redistribution and use of this software in source and binary forms,
5# with or without modification, are permitted provided that the
6# following conditions are met:
7#
8# The software must be used only for Non-Commercial Use which means any

--- 84 unchanged lines hidden (view full) ---

93 ldstl t1, seg, riprel, disp
94 sub t0, rax, t1, flags=(OF, SF, ZF, AF, PF, CF)
95
96 mov t1, t1, reg, flags=(CZF,)
97 stul t1, seg, riprel, disp
98 mov rax, rax, t1, flags=(nCZF,)
99};
100
101def macroop CMPXCHG8B_M {
102 lea t1, seg, sib, disp, dataSize=asz
103 ldst t2, seg, [1, t0, t1], 0
104 ldst t3, seg, [1, t0, t1], dsz
105
106 sub t0, rax, t2, flags=(ZF,)
107 br label("doneComparing"), flags=(nCZF,)
108 sub t0, rdx, t3, flags=(ZF,)
109doneComparing:
110
111 # If they're equal, set t3:t2 to rbx:rcx to write to memory
112 mov t2, t2, rbx, flags=(CZF,)
113 mov t3, t3, rcx, flags=(CZF,)
114
115 # If they're not equal, set rdx:rax to the value from memory.
116 mov rax, rax, t2, flags=(nCZF,)
117 mov rdx, rdx, t3, flags=(nCZF,)
118
119 # Write to memory
120 st t3, seg, [1, t0, t1], dsz
121 st t2, seg, [1, t0, t1], 0
122};
123
124def macroop CMPXCHG8B_P {
125 rdip t7
126 lea t1, seg, riprel, disp, dataSize=asz
127 ldst t2, seg, [1, t0, t1], 0
128 ldst t3, seg, [1, t0, t1], dsz
129
130 sub t0, rax, t2, flags=(ZF,)
131 br label("doneComparing"), flags=(nCZF,)
132 sub t0, rdx, t3, flags=(ZF,)
133doneComparing:
134
135 # If they're equal, set t3:t2 to rbx:rcx to write to memory
136 mov t2, t2, rbx, flags=(CZF,)
137 mov t3, t3, rcx, flags=(CZF,)
138
139 # If they're not equal, set rdx:rax to the value from memory.
140 mov rax, rax, t2, flags=(nCZF,)
141 mov rdx, rdx, t3, flags=(nCZF,)
142
143 # Write to memory
144 st t3, seg, [1, t0, t1], dsz
145 st t2, seg, [1, t0, t1], 0
146};
147
148def macroop CMPXCHG8B_LOCKED_M {
149 lea t1, seg, sib, disp, dataSize=asz
150 ldstl t2, seg, [1, t0, t1], 0
151 ldstl t3, seg, [1, t0, t1], dsz
152
153 sub t0, rax, t2, flags=(ZF,)
154 br label("doneComparing"), flags=(nCZF,)
155 sub t0, rdx, t3, flags=(ZF,)
156doneComparing:
157
158 # If they're equal, set t3:t2 to rbx:rcx to write to memory
159 mov t2, t2, rbx, flags=(CZF,)
160 mov t3, t3, rcx, flags=(CZF,)
161
162 # If they're not equal, set rdx:rax to the value from memory.
163 mov rax, rax, t2, flags=(nCZF,)
164 mov rdx, rdx, t3, flags=(nCZF,)
165
166 # Write to memory
167 stul t3, seg, [1, t0, t1], dsz
168 stul t2, seg, [1, t0, t1], 0
169};
170
171def macroop CMPXCHG8B_LOCKED_P {
172 rdip t7
173 lea t1, seg, riprel, disp, dataSize=asz
174 ldstl t2, seg, [1, t0, t1], 0
175 ldstl t3, seg, [1, t0, t1], dsz
176
177 sub t0, rax, t2, flags=(ZF,)
178 br label("doneComparing"), flags=(nCZF,)
179 sub t0, rdx, t3, flags=(ZF,)
180doneComparing:
181
182 # If they're equal, set t3:t2 to rbx:rcx to write to memory
183 mov t2, t2, rbx, flags=(CZF,)
184 mov t3, t3, rcx, flags=(CZF,)
185
186 # If they're not equal, set rdx:rax to the value from memory.
187 mov rax, rax, t2, flags=(nCZF,)
188 mov rdx, rdx, t3, flags=(nCZF,)
189
190 # Write to memory
191 stul t3, seg, [1, t0, t1], dsz
192 stul t2, seg, [1, t0, t1], 0
193};
194
195def macroop XADD_M_R {
196 ldst t1, seg, sib, disp
197 add t2, t1, reg, flags=(OF,SF,ZF,AF,PF,CF)
198 st t2, seg, sib, disp
199 mov reg, reg, t1
200};
201
202def macroop XADD_P_R {

--- 21 unchanged lines hidden (view full) ---

224
225def macroop XADD_R_R {
226 add t2, regm, reg, flags=(OF,SF,ZF,AF,PF,CF)
227 mov regm, regm, reg
228 mov reg, reg, t2
229};
230
231'''
101def macroop XADD_M_R {
102 ldst t1, seg, sib, disp
103 add t2, t1, reg, flags=(OF,SF,ZF,AF,PF,CF)
104 st t2, seg, sib, disp
105 mov reg, reg, t1
106};
107
108def macroop XADD_P_R {

--- 21 unchanged lines hidden (view full) ---

130
131def macroop XADD_R_R {
132 add t2, regm, reg, flags=(OF,SF,ZF,AF,PF,CF)
133 mov regm, regm, reg
134 mov reg, reg, t2
135};
136
137'''
138
139cmpxchg8bCode = '''
140def macroop CMPXCHG8B_%(suffix)s {
141 %(rdip)s
142 lea t1, seg, %(sib)s, disp, dataSize=asz
143 ldst%(l)s t2, seg, [1, t0, t1], 0
144 ldst%(l)s t3, seg, [1, t0, t1], dsz
145
146 sub t0, rax, t2, flags=(ZF,)
147 br label("doneComparing"), flags=(nCZF,)
148 sub t0, rdx, t3, flags=(ZF,)
149doneComparing:
150
151 # If they're equal, set t3:t2 to rbx:rcx to write to memory
152 mov t2, t2, rbx, flags=(CZF,)
153 mov t3, t3, rcx, flags=(CZF,)
154
155 # If they're not equal, set rdx:rax to the value from memory.
156 mov rax, rax, t2, flags=(nCZF,)
157 mov rdx, rdx, t3, flags=(nCZF,)
158
159 # Write to memory
160 st%(ul)s t3, seg, [1, t0, t1], dsz
161 st%(ul)s t2, seg, [1, t0, t1], 0
162};
163'''
164
165microcode += cmpxchg8bCode % {"rdip": "", "sib": "sib",
166 "l": "", "ul": "",
167 "suffix": "M"}
168microcode += cmpxchg8bCode % {"rdip": "rdip t7", "sib": "riprel",
169 "l": "", "ul": "",
170 "suffix": "P"}
171microcode += cmpxchg8bCode % {"rdip": "", "sib": "sib",
172 "l": "l", "ul": "ul",
173 "suffix": "LOCKED_M"}
174microcode += cmpxchg8bCode % {"rdip": "rdip t7", "sib": "riprel",
175 "l": "l", "ul": "ul",
176 "suffix": "LOCKED_P"}
177
232#let {{
233# class XCHG(Inst):
234# "GenFault ${new UnimpInstFault}"
235#}};
178#let {{
179# class XCHG(Inst):
180# "GenFault ${new UnimpInstFault}"
181#}};