data.isa (8304:16911ff780d3) data.isa (8305:a624d67b642c)
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating

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

46 calcGECode = '''
47 CondCodesGE = resTemp;
48 '''
49
50 calcQCode = '''
51 CpsrQ = (resTemp & 1) << 27;
52 '''
53
1// -*- mode:c++ -*-
2
3// Copyright (c) 2010 ARM Limited
4// All rights reserved
5//
6// The license below extends only to copyright in the software and shall
7// not be construed as granting a license to any other intellectual
8// property including but not limited to intellectual property relating

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

46 calcGECode = '''
47 CondCodesGE = resTemp;
48 '''
49
50 calcQCode = '''
51 CpsrQ = (resTemp & 1) << 27;
52 '''
53
54 calcCcCode = '''
55 uint16_t _ic, _iv, _iz, _in;
56 _in = (resTemp >> %(negBit)d) & 1;
57 _iz = (resTemp == 0);
58 _iv = %(ivValue)s & 1;
59 _ic = %(icValue)s & 1;
54 def createCcCode(negBit, carry, overflow):
55 code = ""
56 code += '''
57 uint16_t _iz, _in;
58 _in = (resTemp >> %d) & 1;
59 _iz = (resTemp == 0);
60 CondCodesNZ = (_in << 1) | _iz;
61 DPRINTF(Arm, "(in, iz) = (%%d, %%d)\\n", _in, _iz);
62 ''' % negBit
63 if overflow and overflow != "none":
64 code += '''
65 uint16_t _iv;
66 _iv = %s & 1;
67 CondCodesV = _iv;
68 DPRINTF(Arm, "(iv) = (%%d)\\n", _iv);
69 ''' % overflow
70 if carry and carry != "none":
71 code += '''
72 uint16_t _ic;
73 _ic = %s & 1;
74 CondCodesC = _ic;
75 DPRINTF(Arm, "(ic) = (%%d)\\n", _ic);
76 ''' % carry
77 return code
60
78
61 CondCodesNZ = (_in << 1) | _iz;
62 CondCodesC = _ic;
63 CondCodesV = _iv;
64
65 DPRINTF(Arm, "(in, iz, ic, iv) = (%%d, %%d, %%d, %%d)\\n",
66 _in, _iz, _ic, _iv);
67 '''
68
69 # Dict of code to set the carry flag. (imm, reg, reg-reg)
70 oldC = 'CondCodesC'
79 # Dict of code to set the carry flag. (imm, reg, reg-reg)
80 oldC = 'CondCodesC'
71 oldV = 'CondCodesV'
72 carryCode = {
81 carryCode = {
73 "none": (oldC, oldC, oldC),
74 "llbit": (oldC, oldC, oldC),
82 "none": ("none", "none", "none"),
83 "llbit": ("none", "none", "none"),
75 "saturate": ('0', '0', '0'),
76 "overflow": ('0', '0', '0'),
77 "ge": ('0', '0', '0'),
78 "add": ('findCarry(32, resTemp, Op1, secondOp)',
79 'findCarry(32, resTemp, Op1, secondOp)',
80 'findCarry(32, resTemp, Op1, secondOp)'),
81 "sub": ('findCarry(32, resTemp, Op1, ~secondOp)',
82 'findCarry(32, resTemp, Op1, ~secondOp)',
83 'findCarry(32, resTemp, Op1, ~secondOp)'),
84 "rsb": ('findCarry(32, resTemp, secondOp, ~Op1)',
85 'findCarry(32, resTemp, secondOp, ~Op1)',
86 'findCarry(32, resTemp, secondOp, ~Op1)'),
87 "logic": ('(rotC ? bits(secondOp, 31) : %s)' % oldC,
88 'shift_carry_imm(Op2, shiftAmt, shiftType, %s)' % oldC,
89 'shift_carry_rs(Op2, Shift<7:0>, shiftType, %s)' % oldC)
90 }
91 # Dict of code to set the overflow flag.
92 overflowCode = {
84 "saturate": ('0', '0', '0'),
85 "overflow": ('0', '0', '0'),
86 "ge": ('0', '0', '0'),
87 "add": ('findCarry(32, resTemp, Op1, secondOp)',
88 'findCarry(32, resTemp, Op1, secondOp)',
89 'findCarry(32, resTemp, Op1, secondOp)'),
90 "sub": ('findCarry(32, resTemp, Op1, ~secondOp)',
91 'findCarry(32, resTemp, Op1, ~secondOp)',
92 'findCarry(32, resTemp, Op1, ~secondOp)'),
93 "rsb": ('findCarry(32, resTemp, secondOp, ~Op1)',
94 'findCarry(32, resTemp, secondOp, ~Op1)',
95 'findCarry(32, resTemp, secondOp, ~Op1)'),
96 "logic": ('(rotC ? bits(secondOp, 31) : %s)' % oldC,
97 'shift_carry_imm(Op2, shiftAmt, shiftType, %s)' % oldC,
98 'shift_carry_rs(Op2, Shift<7:0>, shiftType, %s)' % oldC)
99 }
100 # Dict of code to set the overflow flag.
101 overflowCode = {
93 "none": oldV,
94 "llbit": oldV,
102 "none": "none",
103 "llbit": "none",
95 "saturate": '0',
96 "overflow": '0',
97 "ge": '0',
98 "add": 'findOverflow(32, resTemp, Op1, secondOp)',
99 "sub": 'findOverflow(32, resTemp, Op1, ~secondOp)',
100 "rsb": 'findOverflow(32, resTemp, secondOp, ~Op1)',
104 "saturate": '0',
105 "overflow": '0',
106 "ge": '0',
107 "add": 'findOverflow(32, resTemp, Op1, secondOp)',
108 "sub": 'findOverflow(32, resTemp, Op1, ~secondOp)',
109 "rsb": 'findOverflow(32, resTemp, secondOp, ~Op1)',
101 "logic": oldV
110 "logic": "none"
102 }
103
104 secondOpRe = re.compile("secondOp")
105 immOp2 = "imm"
106 regOp2 = "shift_rm_imm(Op2, shiftAmt, shiftType, OptShiftRmCondCodesC)"
107 regRegOp2 = "shift_rm_rs(Op2, Shift<7:0>, shiftType, 0)"
108
109 def buildImmDataInst(mnem, code, flagType = "logic", suffix = "Imm", \
110 buildCc = True, buildNonCc = True, instFlags = []):
111 cCode = carryCode[flagType]
112 vCode = overflowCode[flagType]
113 negBit = 31
114 if flagType == "llbit":
115 negBit = 63
116 if flagType == "saturate":
117 immCcCode = calcQCode
118 elif flagType == "ge":
119 immCcCode = calcGECode
120 else:
111 }
112
113 secondOpRe = re.compile("secondOp")
114 immOp2 = "imm"
115 regOp2 = "shift_rm_imm(Op2, shiftAmt, shiftType, OptShiftRmCondCodesC)"
116 regRegOp2 = "shift_rm_rs(Op2, Shift<7:0>, shiftType, 0)"
117
118 def buildImmDataInst(mnem, code, flagType = "logic", suffix = "Imm", \
119 buildCc = True, buildNonCc = True, instFlags = []):
120 cCode = carryCode[flagType]
121 vCode = overflowCode[flagType]
122 negBit = 31
123 if flagType == "llbit":
124 negBit = 63
125 if flagType == "saturate":
126 immCcCode = calcQCode
127 elif flagType == "ge":
128 immCcCode = calcGECode
129 else:
121 immCcCode = calcCcCode % {
122 "icValue": secondOpRe.sub(immOp2, cCode[0]),
123 "ivValue": secondOpRe.sub(immOp2, vCode),
124 "negBit": negBit
125 }
130 immCcCode = createCcCode(negBit, secondOpRe.sub(immOp2, cCode[0]),
131 secondOpRe.sub(immOp2, vCode))
132
126 immCode = secondOpRe.sub(immOp2, code)
127 immIop = InstObjParams(mnem, mnem.capitalize() + suffix, "DataImmOp",
128 {"code" : immCode,
129 "predicate_test": pickPredicate(immCode)}, instFlags)
130 immIopCc = InstObjParams(mnem + "s", mnem.capitalize() + suffix + "Cc",
131 "DataImmOp",
132 {"code" : immCode + immCcCode,
133 "predicate_test": pickPredicate(immCode + immCcCode)}, instFlags)

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

144 subst(immIopCc)
145
146 def buildRegDataInst(mnem, code, flagType = "logic", suffix = "Reg", \
147 buildCc = True, buildNonCc = True, isRasPop = "0", \
148 isBranch = "0", instFlags = []):
149 cCode = carryCode[flagType]
150 vCode = overflowCode[flagType]
151 negBit = 31
133 immCode = secondOpRe.sub(immOp2, code)
134 immIop = InstObjParams(mnem, mnem.capitalize() + suffix, "DataImmOp",
135 {"code" : immCode,
136 "predicate_test": pickPredicate(immCode)}, instFlags)
137 immIopCc = InstObjParams(mnem + "s", mnem.capitalize() + suffix + "Cc",
138 "DataImmOp",
139 {"code" : immCode + immCcCode,
140 "predicate_test": pickPredicate(immCode + immCcCode)}, instFlags)

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

151 subst(immIopCc)
152
153 def buildRegDataInst(mnem, code, flagType = "logic", suffix = "Reg", \
154 buildCc = True, buildNonCc = True, isRasPop = "0", \
155 isBranch = "0", instFlags = []):
156 cCode = carryCode[flagType]
157 vCode = overflowCode[flagType]
158 negBit = 31
159 regCcCode = ""
152 if flagType == "llbit":
153 negBit = 63
154 if flagType == "saturate":
155 regCcCode = calcQCode
156 elif flagType == "ge":
157 regCcCode = calcGECode
158 else:
160 if flagType == "llbit":
161 negBit = 63
162 if flagType == "saturate":
163 regCcCode = calcQCode
164 elif flagType == "ge":
165 regCcCode = calcGECode
166 else:
159 regCcCode = calcCcCode % {
160 "icValue": secondOpRe.sub(regOp2, cCode[1]),
161 "ivValue": secondOpRe.sub(regOp2, vCode),
162 "negBit": negBit
163 }
167 regCcCode = createCcCode(negBit,secondOpRe.sub(regOp2, cCode[1]),
168 secondOpRe.sub(regOp2, vCode))
169
164 regCode = secondOpRe.sub(regOp2, code)
170 regCode = secondOpRe.sub(regOp2, code)
171
172 # If we end up needing CondCodesC then remove any trace of the OptShift
173 if re.search('(?<!OptShiftRm)CondCodesC(?!.*=)', regCode + regCcCode):
174 regCode = re.sub('OptShiftRmCondCodesC', 'CondCodesC', regCode)
175 regCcCode = re.sub('OptShiftRmCondCodesC', 'CondCodesC', regCcCode)
176
165 regIop = InstObjParams(mnem, mnem.capitalize() + suffix, "DataRegOp",
166 {"code" : regCode, "is_ras_pop" : isRasPop,
167 "is_branch" : isBranch,
168 "predicate_test": pickPredicate(regCode)}, instFlags)
169 regIopCc = InstObjParams(mnem + "s", mnem.capitalize() + suffix + "Cc",
170 "DataRegOp",
171 {"code" : regCode + regCcCode,
172 "predicate_test": pickPredicate(regCode + regCcCode),

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

192 negBit = 31
193 if flagType == "llbit":
194 negBit = 63
195 if flagType == "saturate":
196 regRegCcCode = calcQCode
197 elif flagType == "ge":
198 regRegCcCode = calcGECode
199 else:
177 regIop = InstObjParams(mnem, mnem.capitalize() + suffix, "DataRegOp",
178 {"code" : regCode, "is_ras_pop" : isRasPop,
179 "is_branch" : isBranch,
180 "predicate_test": pickPredicate(regCode)}, instFlags)
181 regIopCc = InstObjParams(mnem + "s", mnem.capitalize() + suffix + "Cc",
182 "DataRegOp",
183 {"code" : regCode + regCcCode,
184 "predicate_test": pickPredicate(regCode + regCcCode),

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

204 negBit = 31
205 if flagType == "llbit":
206 negBit = 63
207 if flagType == "saturate":
208 regRegCcCode = calcQCode
209 elif flagType == "ge":
210 regRegCcCode = calcGECode
211 else:
200 regRegCcCode = calcCcCode % {
201 "icValue": secondOpRe.sub(regRegOp2, cCode[2]),
202 "ivValue": secondOpRe.sub(regRegOp2, vCode),
203 "negBit": negBit
204 }
212 regRegCcCode = createCcCode(negBit,
213 secondOpRe.sub(regRegOp2, cCode[2]),
214 secondOpRe.sub(regRegOp2, vCode))
215
205 regRegCode = secondOpRe.sub(regRegOp2, code)
206 regRegIop = InstObjParams(mnem, mnem.capitalize() + suffix,
207 "DataRegRegOp",
208 {"code" : regRegCode,
209 "predicate_test": pickPredicate(regRegCode)})
210 regRegIopCc = InstObjParams(mnem + "s",
211 mnem.capitalize() + suffix + "Cc",
212 "DataRegRegOp",

--- 621 unchanged lines hidden ---
216 regRegCode = secondOpRe.sub(regRegOp2, code)
217 regRegIop = InstObjParams(mnem, mnem.capitalize() + suffix,
218 "DataRegRegOp",
219 {"code" : regRegCode,
220 "predicate_test": pickPredicate(regRegCode)})
221 regRegIopCc = InstObjParams(mnem + "s",
222 mnem.capitalize() + suffix + "Cc",
223 "DataRegRegOp",

--- 621 unchanged lines hidden ---