blob: bb648bf3f2cab6abb5bc7139faff28ee63e3e6ac [file] [log] [blame]
buzbeee88dfbf2012-03-05 11:19:57 -08001/*
2 * Copyright (C) 2012 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17namespace art {
18
buzbee408ad162012-06-06 16:45:18 -070019static bool genArithOpFloat(CompilationUnit *cUnit, Instruction::Code opcode,
Bill Buzbeea114add2012-05-03 15:00:40 -070020 RegLocation rlDest, RegLocation rlSrc1,
21 RegLocation rlSrc2) {
Ian Rogersb5d09b22012-03-06 22:14:17 -080022 X86OpCode op = kX86Nop;
23 RegLocation rlResult;
jeffhaofdffdf82012-07-11 16:08:43 -070024 int tempReg;
buzbeee88dfbf2012-03-05 11:19:57 -080025
Ian Rogersb5d09b22012-03-06 22:14:17 -080026 /*
27 * Don't attempt to optimize register usage since these opcodes call out to
28 * the handlers.
29 */
buzbee408ad162012-06-06 16:45:18 -070030 switch (opcode) {
Ian Rogersb5d09b22012-03-06 22:14:17 -080031 case Instruction::ADD_FLOAT_2ADDR:
32 case Instruction::ADD_FLOAT:
33 op = kX86AddssRR;
34 break;
35 case Instruction::SUB_FLOAT_2ADDR:
36 case Instruction::SUB_FLOAT:
37 op = kX86SubssRR;
38 break;
39 case Instruction::DIV_FLOAT_2ADDR:
40 case Instruction::DIV_FLOAT:
41 op = kX86DivssRR;
42 break;
43 case Instruction::MUL_FLOAT_2ADDR:
44 case Instruction::MUL_FLOAT:
45 op = kX86MulssRR;
46 break;
jeffhao573b4292012-07-30 16:37:41 -070047 case Instruction::NEG_FLOAT: {
jeffhaofdffdf82012-07-11 16:08:43 -070048 // TODO: Make this an XorpsRM where the memory location holds 0x80000000
49 rlSrc1 = loadValue(cUnit, rlSrc1, kFPReg);
50 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
51 tempReg = oatAllocTemp(cUnit);
jeffhao83025762012-08-02 11:08:56 -070052 loadConstantNoClobber(cUnit, tempReg, 0x80000000);
jeffhao573b4292012-07-30 16:37:41 -070053 int rDest = rlResult.lowReg;
54 int rSrc1 = rlSrc1.lowReg;
55 if (rDest == rSrc1) {
56 rSrc1 = oatAllocTempFloat(cUnit);
57 opRegCopy(cUnit, rSrc1, rDest);
58 }
59 newLIR2(cUnit, kX86MovdxrRR, rDest, tempReg);
60 newLIR2(cUnit, kX86XorpsRR, rDest, rSrc1);
jeffhao292188d2012-05-17 15:45:04 -070061 storeValue(cUnit, rlDest, rlResult);
62 return false;
jeffhao573b4292012-07-30 16:37:41 -070063 }
Ian Rogersb5d09b22012-03-06 22:14:17 -080064 case Instruction::REM_FLOAT_2ADDR:
65 case Instruction::REM_FLOAT: {
buzbee408ad162012-06-06 16:45:18 -070066 return genArithOpFloatPortable(cUnit, opcode, rlDest, rlSrc1, rlSrc2);
buzbeee88dfbf2012-03-05 11:19:57 -080067 }
Ian Rogersb5d09b22012-03-06 22:14:17 -080068 default:
69 return true;
70 }
71 rlSrc1 = loadValue(cUnit, rlSrc1, kFPReg);
72 rlSrc2 = loadValue(cUnit, rlSrc2, kFPReg);
73 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
74 int rDest = rlResult.lowReg;
75 int rSrc1 = rlSrc1.lowReg;
76 int rSrc2 = rlSrc2.lowReg;
jeffhao573b4292012-07-30 16:37:41 -070077 if (rDest == rSrc2) {
jeffhao4abb1a92012-06-08 17:02:08 -070078 rSrc2 = oatAllocTempFloat(cUnit);
79 opRegCopy(cUnit, rSrc2, rDest);
80 }
Ian Rogersb5d09b22012-03-06 22:14:17 -080081 opRegCopy(cUnit, rDest, rSrc1);
82 newLIR2(cUnit, op, rDest, rSrc2);
83 storeValue(cUnit, rlDest, rlResult);
buzbeee88dfbf2012-03-05 11:19:57 -080084
Ian Rogersb5d09b22012-03-06 22:14:17 -080085 return false;
buzbeee88dfbf2012-03-05 11:19:57 -080086}
87
buzbee408ad162012-06-06 16:45:18 -070088static bool genArithOpDouble(CompilationUnit *cUnit, Instruction::Code opcode,
buzbeee88dfbf2012-03-05 11:19:57 -080089 RegLocation rlDest, RegLocation rlSrc1,
Ian Rogersb5d09b22012-03-06 22:14:17 -080090 RegLocation rlSrc2) {
91 X86OpCode op = kX86Nop;
92 RegLocation rlResult;
jeffhaofdffdf82012-07-11 16:08:43 -070093 int tempReg;
buzbeee88dfbf2012-03-05 11:19:57 -080094
buzbee408ad162012-06-06 16:45:18 -070095 switch (opcode) {
Ian Rogersb5d09b22012-03-06 22:14:17 -080096 case Instruction::ADD_DOUBLE_2ADDR:
97 case Instruction::ADD_DOUBLE:
98 op = kX86AddsdRR;
99 break;
100 case Instruction::SUB_DOUBLE_2ADDR:
101 case Instruction::SUB_DOUBLE:
102 op = kX86SubsdRR;
103 break;
104 case Instruction::DIV_DOUBLE_2ADDR:
105 case Instruction::DIV_DOUBLE:
106 op = kX86DivsdRR;
107 break;
108 case Instruction::MUL_DOUBLE_2ADDR:
109 case Instruction::MUL_DOUBLE:
110 op = kX86MulsdRR;
111 break;
jeffhao573b4292012-07-30 16:37:41 -0700112 case Instruction::NEG_DOUBLE: {
jeffhaofdffdf82012-07-11 16:08:43 -0700113 // TODO: Make this an XorpdRM where the memory location holds 0x8000000000000000
114 rlSrc1 = loadValueWide(cUnit, rlSrc1, kFPReg);
115 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
116 tempReg = oatAllocTemp(cUnit);
jeffhao83025762012-08-02 11:08:56 -0700117 loadConstantNoClobber(cUnit, tempReg, 0x80000000);
jeffhao573b4292012-07-30 16:37:41 -0700118 int rDest = S2D(rlResult.lowReg, rlResult.highReg);
119 int rSrc1 = S2D(rlSrc1.lowReg, rlSrc1.highReg);
120 if (rDest == rSrc1) {
121 rSrc1 = oatAllocTempDouble(cUnit) | FP_DOUBLE;
122 opRegCopy(cUnit, rSrc1, rDest);
123 }
124 newLIR2(cUnit, kX86MovdxrRR, rDest, tempReg);
125 newLIR2(cUnit, kX86PsllqRI, rDest, 32);
126 newLIR2(cUnit, kX86XorpsRR, rDest, rSrc1);
jeffhao292188d2012-05-17 15:45:04 -0700127 storeValueWide(cUnit, rlDest, rlResult);
128 return false;
jeffhao573b4292012-07-30 16:37:41 -0700129 }
Ian Rogersb5d09b22012-03-06 22:14:17 -0800130 case Instruction::REM_DOUBLE_2ADDR:
131 case Instruction::REM_DOUBLE: {
buzbee408ad162012-06-06 16:45:18 -0700132 return genArithOpDoublePortable(cUnit, opcode, rlDest, rlSrc1, rlSrc2);
buzbeee88dfbf2012-03-05 11:19:57 -0800133 }
Ian Rogersb5d09b22012-03-06 22:14:17 -0800134 default:
135 return true;
136 }
137 rlSrc1 = loadValueWide(cUnit, rlSrc1, kFPReg);
138 DCHECK(rlSrc1.wide);
139 rlSrc2 = loadValueWide(cUnit, rlSrc2, kFPReg);
140 DCHECK(rlSrc2.wide);
141 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
142 DCHECK(rlDest.wide);
143 DCHECK(rlResult.wide);
144 int rDest = S2D(rlResult.lowReg, rlResult.highReg);
145 int rSrc1 = S2D(rlSrc1.lowReg, rlSrc1.highReg);
146 int rSrc2 = S2D(rlSrc2.lowReg, rlSrc2.highReg);
jeffhao4abb1a92012-06-08 17:02:08 -0700147 if (rDest == rSrc2) {
148 rSrc2 = oatAllocTempDouble(cUnit) | FP_DOUBLE;
149 opRegCopy(cUnit, rSrc2, rDest);
150 }
Ian Rogersb5d09b22012-03-06 22:14:17 -0800151 opRegCopy(cUnit, rDest, rSrc1);
152 newLIR2(cUnit, op, rDest, rSrc2);
153 storeValueWide(cUnit, rlDest, rlResult);
154 return false;
buzbeee88dfbf2012-03-05 11:19:57 -0800155}
156
buzbee408ad162012-06-06 16:45:18 -0700157static bool genConversion(CompilationUnit *cUnit, Instruction::Code opcode,
158 RegLocation rlDest, RegLocation rlSrc) {
jeffhao5121e0b2012-05-08 18:23:38 -0700159 RegisterClass rcSrc = kFPReg;
Ian Rogersb5d09b22012-03-06 22:14:17 -0800160 X86OpCode op = kX86Nop;
161 int srcReg;
162 RegLocation rlResult;
163 switch (opcode) {
164 case Instruction::INT_TO_FLOAT:
jeffhao5121e0b2012-05-08 18:23:38 -0700165 rcSrc = kCoreReg;
Ian Rogersb5d09b22012-03-06 22:14:17 -0800166 op = kX86Cvtsi2ssRR;
167 break;
168 case Instruction::DOUBLE_TO_FLOAT:
jeffhao5121e0b2012-05-08 18:23:38 -0700169 rcSrc = kFPReg;
Ian Rogersb5d09b22012-03-06 22:14:17 -0800170 op = kX86Cvtsd2ssRR;
171 break;
172 case Instruction::FLOAT_TO_DOUBLE:
jeffhao5121e0b2012-05-08 18:23:38 -0700173 rcSrc = kFPReg;
Ian Rogersb5d09b22012-03-06 22:14:17 -0800174 op = kX86Cvtss2sdRR;
175 break;
176 case Instruction::INT_TO_DOUBLE:
jeffhao5121e0b2012-05-08 18:23:38 -0700177 rcSrc = kCoreReg;
Ian Rogersb5d09b22012-03-06 22:14:17 -0800178 op = kX86Cvtsi2sdRR;
179 break;
jeffhao292188d2012-05-17 15:45:04 -0700180 case Instruction::FLOAT_TO_INT: {
jeffhao41005dd2012-05-09 17:58:52 -0700181 rlSrc = loadValue(cUnit, rlSrc, kFPReg);
182 srcReg = rlSrc.lowReg;
jeffhao41005dd2012-05-09 17:58:52 -0700183 oatClobberSReg(cUnit, rlDest.sRegLow);
184 rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true);
jeffhao292188d2012-05-17 15:45:04 -0700185 int tempReg = oatAllocTempFloat(cUnit);
jeffhao41005dd2012-05-09 17:58:52 -0700186
187 loadConstant(cUnit, rlResult.lowReg, 0x7fffffff);
188 newLIR2(cUnit, kX86Cvtsi2ssRR, tempReg, rlResult.lowReg);
189 newLIR2(cUnit, kX86ComissRR, srcReg, tempReg);
jeffhao292188d2012-05-17 15:45:04 -0700190 LIR* branchPosOverflow = newLIR2(cUnit, kX86Jcc8, 0, kX86CondA);
191 LIR* branchNaN = newLIR2(cUnit, kX86Jcc8, 0, kX86CondP);
192 newLIR2(cUnit, kX86Cvttss2siRR, rlResult.lowReg, srcReg);
193 LIR* branchNormal = newLIR1(cUnit, kX86Jmp8, 0);
194 branchNaN->target = newLIR0(cUnit, kPseudoTargetLabel);
195 newLIR2(cUnit, kX86Xor32RR, rlResult.lowReg, rlResult.lowReg);
196 branchPosOverflow->target = newLIR0(cUnit, kPseudoTargetLabel);
197 branchNormal->target = newLIR0(cUnit, kPseudoTargetLabel);
jeffhao41005dd2012-05-09 17:58:52 -0700198 storeValue(cUnit, rlDest, rlResult);
199 return false;
jeffhao292188d2012-05-17 15:45:04 -0700200 }
201 case Instruction::DOUBLE_TO_INT: {
jeffhao41005dd2012-05-09 17:58:52 -0700202 rlSrc = loadValueWide(cUnit, rlSrc, kFPReg);
203 srcReg = rlSrc.lowReg;
jeffhao41005dd2012-05-09 17:58:52 -0700204 oatClobberSReg(cUnit, rlDest.sRegLow);
205 rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true);
jeffhao4abb1a92012-06-08 17:02:08 -0700206 int tempReg = oatAllocTempDouble(cUnit) | FP_DOUBLE;
jeffhao41005dd2012-05-09 17:58:52 -0700207
208 loadConstant(cUnit, rlResult.lowReg, 0x7fffffff);
209 newLIR2(cUnit, kX86Cvtsi2sdRR, tempReg, rlResult.lowReg);
210 newLIR2(cUnit, kX86ComisdRR, srcReg, tempReg);
jeffhao292188d2012-05-17 15:45:04 -0700211 LIR* branchPosOverflow = newLIR2(cUnit, kX86Jcc8, 0, kX86CondA);
212 LIR* branchNaN = newLIR2(cUnit, kX86Jcc8, 0, kX86CondP);
213 newLIR2(cUnit, kX86Cvttsd2siRR, rlResult.lowReg, srcReg);
214 LIR* branchNormal = newLIR1(cUnit, kX86Jmp8, 0);
215 branchNaN->target = newLIR0(cUnit, kPseudoTargetLabel);
216 newLIR2(cUnit, kX86Xor32RR, rlResult.lowReg, rlResult.lowReg);
217 branchPosOverflow->target = newLIR0(cUnit, kPseudoTargetLabel);
218 branchNormal->target = newLIR0(cUnit, kPseudoTargetLabel);
jeffhao41005dd2012-05-09 17:58:52 -0700219 storeValue(cUnit, rlDest, rlResult);
220 return false;
jeffhao292188d2012-05-17 15:45:04 -0700221 }
Ian Rogersb5d09b22012-03-06 22:14:17 -0800222 case Instruction::LONG_TO_DOUBLE:
Ian Rogersb5d09b22012-03-06 22:14:17 -0800223 case Instruction::LONG_TO_FLOAT:
jeffhao41005dd2012-05-09 17:58:52 -0700224 // These can be implemented inline by using memory as a 64-bit source.
225 // However, this can't be done easily if the register has been promoted.
226 UNIMPLEMENTED(WARNING) << "inline l2[df] " << PrettyMethod(cUnit->method_idx, *cUnit->dex_file);
227 case Instruction::FLOAT_TO_LONG:
Ian Rogersb5d09b22012-03-06 22:14:17 -0800228 case Instruction::DOUBLE_TO_LONG:
buzbee408ad162012-06-06 16:45:18 -0700229 return genConversionPortable(cUnit, opcode, rlDest, rlSrc);
Ian Rogersb5d09b22012-03-06 22:14:17 -0800230 default:
231 return true;
232 }
buzbee408ad162012-06-06 16:45:18 -0700233 if (rlSrc.wide) {
jeffhao5121e0b2012-05-08 18:23:38 -0700234 rlSrc = loadValueWide(cUnit, rlSrc, rcSrc);
Ian Rogersb5d09b22012-03-06 22:14:17 -0800235 srcReg = S2D(rlSrc.lowReg, rlSrc.highReg);
236 } else {
jeffhao5121e0b2012-05-08 18:23:38 -0700237 rlSrc = loadValue(cUnit, rlSrc, rcSrc);
Ian Rogersb5d09b22012-03-06 22:14:17 -0800238 srcReg = rlSrc.lowReg;
239 }
buzbee408ad162012-06-06 16:45:18 -0700240 if (rlDest.wide) {
Ian Rogersb5d09b22012-03-06 22:14:17 -0800241 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
242 newLIR2(cUnit, op, S2D(rlResult.lowReg, rlResult.highReg), srcReg);
243 storeValueWide(cUnit, rlDest, rlResult);
244 } else {
Ian Rogersb5d09b22012-03-06 22:14:17 -0800245 rlResult = oatEvalLoc(cUnit, rlDest, kFPReg, true);
246 newLIR2(cUnit, op, rlResult.lowReg, srcReg);
247 storeValue(cUnit, rlDest, rlResult);
248 }
249 return false;
buzbeee88dfbf2012-03-05 11:19:57 -0800250}
251
buzbee408ad162012-06-06 16:45:18 -0700252static bool genCmpFP(CompilationUnit *cUnit, Instruction::Code code, RegLocation rlDest,
Ian Rogersb5d09b22012-03-06 22:14:17 -0800253 RegLocation rlSrc1, RegLocation rlSrc2) {
Ian Rogersb5d09b22012-03-06 22:14:17 -0800254 bool single = (code == Instruction::CMPL_FLOAT) || (code == Instruction::CMPG_FLOAT);
255 bool unorderedGt = (code == Instruction::CMPG_DOUBLE) || (code == Instruction::CMPG_FLOAT);
256 int srcReg1;
257 int srcReg2;
258 if (single) {
Ian Rogersb5d09b22012-03-06 22:14:17 -0800259 rlSrc1 = loadValue(cUnit, rlSrc1, kFPReg);
260 srcReg1 = rlSrc1.lowReg;
jeffhao644d5312012-05-03 19:04:49 -0700261 rlSrc2 = loadValue(cUnit, rlSrc2, kFPReg);
262 srcReg2 = rlSrc2.lowReg;
Ian Rogersb5d09b22012-03-06 22:14:17 -0800263 } else {
Ian Rogersb5d09b22012-03-06 22:14:17 -0800264 rlSrc1 = loadValueWide(cUnit, rlSrc1, kFPReg);
265 srcReg1 = S2D(rlSrc1.lowReg, rlSrc1.highReg);
Ian Rogersb5d09b22012-03-06 22:14:17 -0800266 rlSrc2 = loadValueWide(cUnit, rlSrc2, kFPReg);
267 srcReg2 = S2D(rlSrc2.lowReg, rlSrc2.highReg);
268 }
jeffhao41005dd2012-05-09 17:58:52 -0700269 oatClobberSReg(cUnit, rlDest.sRegLow);
Ian Rogersc6f3bb82012-03-21 20:40:33 -0700270 RegLocation rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true);
271 loadConstantNoClobber(cUnit, rlResult.lowReg, unorderedGt ? 1 : 0);
Ian Rogersb5d09b22012-03-06 22:14:17 -0800272 if (single) {
273 newLIR2(cUnit, kX86UcomissRR, srcReg1, srcReg2);
274 } else {
275 newLIR2(cUnit, kX86UcomisdRR, srcReg1, srcReg2);
276 }
277 LIR* branch = NULL;
278 if (unorderedGt) {
Ian Rogersb41b33b2012-03-20 14:22:54 -0700279 branch = newLIR2(cUnit, kX86Jcc8, 0, kX86CondPE);
Ian Rogersb5d09b22012-03-06 22:14:17 -0800280 }
jeffhao703f2cd2012-07-13 17:25:52 -0700281 // If the result reg can't be byte accessed, use a jump and move instead of a set.
282 if (rlResult.lowReg >= 4) {
283 LIR* branch2 = NULL;
284 if (unorderedGt) {
285 branch2 = newLIR2(cUnit, kX86Jcc8, 0, kX86CondA);
286 newLIR2(cUnit, kX86Mov32RI, rlResult.lowReg, 0x0);
287 } else {
288 branch2 = newLIR2(cUnit, kX86Jcc8, 0, kX86CondBe);
289 newLIR2(cUnit, kX86Mov32RI, rlResult.lowReg, 0x1);
290 }
291 branch2->target = newLIR0(cUnit, kPseudoTargetLabel);
292 } else {
293 newLIR2(cUnit, kX86Set8R, rlResult.lowReg, kX86CondA /* above - unsigned > */);
294 }
Ian Rogersb5d09b22012-03-06 22:14:17 -0800295 newLIR2(cUnit, kX86Sbb32RI, rlResult.lowReg, 0);
296 if (unorderedGt) {
297 branch->target = newLIR0(cUnit, kPseudoTargetLabel);
298 }
jeffhao644d5312012-05-03 19:04:49 -0700299 storeValue(cUnit, rlDest, rlResult);
Ian Rogersb5d09b22012-03-06 22:14:17 -0800300 return false;
buzbeee88dfbf2012-03-05 11:19:57 -0800301}
302
jeffhao4b771a02012-07-25 15:07:21 -0700303void genFusedFPCmpBranch(CompilationUnit* cUnit, BasicBlock* bb, MIR* mir,
304 bool gtBias, bool isDouble) {
305 LIR* labelList = cUnit->blockLabelList;
306 LIR* taken = &labelList[bb->taken->id];
307 LIR* notTaken = &labelList[bb->fallThrough->id];
308 LIR* branch = NULL;
309 RegLocation rlSrc1;
310 RegLocation rlSrc2;
311 if (isDouble) {
312 rlSrc1 = oatGetSrcWide(cUnit, mir, 0);
313 rlSrc2 = oatGetSrcWide(cUnit, mir, 2);
314 rlSrc1 = loadValueWide(cUnit, rlSrc1, kFPReg);
315 rlSrc2 = loadValueWide(cUnit, rlSrc2, kFPReg);
316 newLIR2(cUnit, kX86UcomisdRR, S2D(rlSrc1.lowReg, rlSrc1.highReg),
317 S2D(rlSrc2.lowReg, rlSrc2.highReg));
318 } else {
319 rlSrc1 = oatGetSrc(cUnit, mir, 0);
320 rlSrc2 = oatGetSrc(cUnit, mir, 1);
321 rlSrc1 = loadValue(cUnit, rlSrc1, kFPReg);
322 rlSrc2 = loadValue(cUnit, rlSrc2, kFPReg);
323 newLIR2(cUnit, kX86UcomissRR, rlSrc1.lowReg, rlSrc2.lowReg);
324 }
325 ConditionCode ccode = static_cast<ConditionCode>(mir->dalvikInsn.arg[0]);
326 switch (ccode) {
327 case kCondEq:
328 if (gtBias) {
329 branch = newLIR2(cUnit, kX86Jcc8, 0, kX86CondPE);
330 branch->target = notTaken;
331 }
332 break;
333 case kCondNe:
334 if (!gtBias) {
335 branch = newLIR2(cUnit, kX86Jcc8, 0, kX86CondPE);
336 branch->target = taken;
337 }
338 break;
339 case kCondLt:
340 if (gtBias) {
341 branch = newLIR2(cUnit, kX86Jcc8, 0, kX86CondPE);
342 branch->target = notTaken;
343 }
344 ccode = kCondCs;
345 break;
346 case kCondLe:
347 if (gtBias) {
348 branch = newLIR2(cUnit, kX86Jcc8, 0, kX86CondPE);
349 branch->target = notTaken;
350 }
351 ccode = kCondLs;
352 break;
353 case kCondGt:
354 if (gtBias) {
355 branch = newLIR2(cUnit, kX86Jcc8, 0, kX86CondPE);
356 branch->target = taken;
357 }
358 ccode = kCondHi;
359 break;
360 case kCondGe:
361 if (gtBias) {
362 branch = newLIR2(cUnit, kX86Jcc8, 0, kX86CondPE);
363 branch->target = taken;
364 }
365 ccode = kCondCc;
366 break;
367 default:
368 LOG(FATAL) << "Unexpected ccode: " << (int)ccode;
369 }
370 opCondBranch(cUnit, ccode, taken);
371}
372
buzbeee88dfbf2012-03-05 11:19:57 -0800373} // namespace art