src/share/vm/shark/sharkBlock.cpp

Wed, 27 Apr 2016 01:25:04 +0800

author
aoqi
date
Wed, 27 Apr 2016 01:25:04 +0800
changeset 0
f90c822e73f8
child 6876
710a3c8b516e
permissions
-rw-r--r--

Initial load
http://hg.openjdk.java.net/jdk8u/jdk8u/hotspot/
changeset: 6782:28b50d07f6f8
tag: jdk8u25-b17

aoqi@0 1 /*
aoqi@0 2 * Copyright (c) 1999, 2013, Oracle and/or its affiliates. All rights reserved.
aoqi@0 3 * Copyright 2008, 2009, 2010 Red Hat, Inc.
aoqi@0 4 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
aoqi@0 5 *
aoqi@0 6 * This code is free software; you can redistribute it and/or modify it
aoqi@0 7 * under the terms of the GNU General Public License version 2 only, as
aoqi@0 8 * published by the Free Software Foundation.
aoqi@0 9 *
aoqi@0 10 * This code is distributed in the hope that it will be useful, but WITHOUT
aoqi@0 11 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
aoqi@0 12 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
aoqi@0 13 * version 2 for more details (a copy is included in the LICENSE file that
aoqi@0 14 * accompanied this code).
aoqi@0 15 *
aoqi@0 16 * You should have received a copy of the GNU General Public License version
aoqi@0 17 * 2 along with this work; if not, write to the Free Software Foundation,
aoqi@0 18 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
aoqi@0 19 *
aoqi@0 20 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
aoqi@0 21 * or visit www.oracle.com if you need additional information or have any
aoqi@0 22 * questions.
aoqi@0 23 *
aoqi@0 24 */
aoqi@0 25
aoqi@0 26 #include "precompiled.hpp"
aoqi@0 27 #include "interpreter/bytecodes.hpp"
aoqi@0 28 #include "shark/llvmHeaders.hpp"
aoqi@0 29 #include "shark/llvmValue.hpp"
aoqi@0 30 #include "shark/sharkBlock.hpp"
aoqi@0 31 #include "shark/sharkBuilder.hpp"
aoqi@0 32 #include "shark/sharkConstant.hpp"
aoqi@0 33 #include "shark/sharkState.hpp"
aoqi@0 34 #include "shark/sharkValue.hpp"
aoqi@0 35 #include "shark/shark_globals.hpp"
aoqi@0 36 #include "utilities/debug.hpp"
aoqi@0 37
aoqi@0 38 using namespace llvm;
aoqi@0 39
aoqi@0 40 void SharkBlock::parse_bytecode(int start, int limit) {
aoqi@0 41 SharkValue *a, *b, *c, *d;
aoqi@0 42 int i;
aoqi@0 43
aoqi@0 44 // Ensure the current state is initialized before we emit any code,
aoqi@0 45 // so that any setup code for the state is at the start of the block
aoqi@0 46 current_state();
aoqi@0 47
aoqi@0 48 // Parse the bytecodes
aoqi@0 49 iter()->reset_to_bci(start);
aoqi@0 50 while (iter()->next_bci() < limit) {
aoqi@0 51 NOT_PRODUCT(a = b = c = d = NULL);
aoqi@0 52 iter()->next();
aoqi@0 53
aoqi@0 54 if (SharkTraceBytecodes)
aoqi@0 55 tty->print_cr("%4d: %s", bci(), Bytecodes::name(bc()));
aoqi@0 56
aoqi@0 57 if (has_trap() && trap_bci() == bci()) {
aoqi@0 58 do_trap(trap_request());
aoqi@0 59 return;
aoqi@0 60 }
aoqi@0 61
aoqi@0 62 if (UseLoopSafepoints) {
aoqi@0 63 // XXX if a lcmp is followed by an if_?? then C2 maybe-inserts
aoqi@0 64 // the safepoint before the lcmp rather than before the if.
aoqi@0 65 // Maybe we should do this too. See parse2.cpp for details.
aoqi@0 66 switch (bc()) {
aoqi@0 67 case Bytecodes::_goto:
aoqi@0 68 case Bytecodes::_ifnull:
aoqi@0 69 case Bytecodes::_ifnonnull:
aoqi@0 70 case Bytecodes::_if_acmpeq:
aoqi@0 71 case Bytecodes::_if_acmpne:
aoqi@0 72 case Bytecodes::_ifeq:
aoqi@0 73 case Bytecodes::_ifne:
aoqi@0 74 case Bytecodes::_iflt:
aoqi@0 75 case Bytecodes::_ifle:
aoqi@0 76 case Bytecodes::_ifgt:
aoqi@0 77 case Bytecodes::_ifge:
aoqi@0 78 case Bytecodes::_if_icmpeq:
aoqi@0 79 case Bytecodes::_if_icmpne:
aoqi@0 80 case Bytecodes::_if_icmplt:
aoqi@0 81 case Bytecodes::_if_icmple:
aoqi@0 82 case Bytecodes::_if_icmpgt:
aoqi@0 83 case Bytecodes::_if_icmpge:
aoqi@0 84 if (iter()->get_dest() <= bci())
aoqi@0 85 maybe_add_backedge_safepoint();
aoqi@0 86 break;
aoqi@0 87
aoqi@0 88 case Bytecodes::_goto_w:
aoqi@0 89 if (iter()->get_far_dest() <= bci())
aoqi@0 90 maybe_add_backedge_safepoint();
aoqi@0 91 break;
aoqi@0 92
aoqi@0 93 case Bytecodes::_tableswitch:
aoqi@0 94 case Bytecodes::_lookupswitch:
aoqi@0 95 if (switch_default_dest() <= bci()) {
aoqi@0 96 maybe_add_backedge_safepoint();
aoqi@0 97 break;
aoqi@0 98 }
aoqi@0 99 int len = switch_table_length();
aoqi@0 100 for (int i = 0; i < len; i++) {
aoqi@0 101 if (switch_dest(i) <= bci()) {
aoqi@0 102 maybe_add_backedge_safepoint();
aoqi@0 103 break;
aoqi@0 104 }
aoqi@0 105 }
aoqi@0 106 break;
aoqi@0 107 }
aoqi@0 108 }
aoqi@0 109
aoqi@0 110 switch (bc()) {
aoqi@0 111 case Bytecodes::_nop:
aoqi@0 112 break;
aoqi@0 113
aoqi@0 114 case Bytecodes::_aconst_null:
aoqi@0 115 push(SharkValue::null());
aoqi@0 116 break;
aoqi@0 117
aoqi@0 118 case Bytecodes::_iconst_m1:
aoqi@0 119 push(SharkValue::jint_constant(-1));
aoqi@0 120 break;
aoqi@0 121 case Bytecodes::_iconst_0:
aoqi@0 122 push(SharkValue::jint_constant(0));
aoqi@0 123 break;
aoqi@0 124 case Bytecodes::_iconst_1:
aoqi@0 125 push(SharkValue::jint_constant(1));
aoqi@0 126 break;
aoqi@0 127 case Bytecodes::_iconst_2:
aoqi@0 128 push(SharkValue::jint_constant(2));
aoqi@0 129 break;
aoqi@0 130 case Bytecodes::_iconst_3:
aoqi@0 131 push(SharkValue::jint_constant(3));
aoqi@0 132 break;
aoqi@0 133 case Bytecodes::_iconst_4:
aoqi@0 134 push(SharkValue::jint_constant(4));
aoqi@0 135 break;
aoqi@0 136 case Bytecodes::_iconst_5:
aoqi@0 137 push(SharkValue::jint_constant(5));
aoqi@0 138 break;
aoqi@0 139
aoqi@0 140 case Bytecodes::_lconst_0:
aoqi@0 141 push(SharkValue::jlong_constant(0));
aoqi@0 142 break;
aoqi@0 143 case Bytecodes::_lconst_1:
aoqi@0 144 push(SharkValue::jlong_constant(1));
aoqi@0 145 break;
aoqi@0 146
aoqi@0 147 case Bytecodes::_fconst_0:
aoqi@0 148 push(SharkValue::jfloat_constant(0));
aoqi@0 149 break;
aoqi@0 150 case Bytecodes::_fconst_1:
aoqi@0 151 push(SharkValue::jfloat_constant(1));
aoqi@0 152 break;
aoqi@0 153 case Bytecodes::_fconst_2:
aoqi@0 154 push(SharkValue::jfloat_constant(2));
aoqi@0 155 break;
aoqi@0 156
aoqi@0 157 case Bytecodes::_dconst_0:
aoqi@0 158 push(SharkValue::jdouble_constant(0));
aoqi@0 159 break;
aoqi@0 160 case Bytecodes::_dconst_1:
aoqi@0 161 push(SharkValue::jdouble_constant(1));
aoqi@0 162 break;
aoqi@0 163
aoqi@0 164 case Bytecodes::_bipush:
aoqi@0 165 push(SharkValue::jint_constant(iter()->get_constant_u1()));
aoqi@0 166 break;
aoqi@0 167 case Bytecodes::_sipush:
aoqi@0 168 push(SharkValue::jint_constant(iter()->get_constant_u2()));
aoqi@0 169 break;
aoqi@0 170
aoqi@0 171 case Bytecodes::_ldc:
aoqi@0 172 case Bytecodes::_ldc_w:
aoqi@0 173 case Bytecodes::_ldc2_w: {
aoqi@0 174 SharkConstant* constant = SharkConstant::for_ldc(iter());
aoqi@0 175 assert(constant->is_loaded(), "trap should handle unloaded classes");
aoqi@0 176 push(constant->value(builder()));
aoqi@0 177 break;
aoqi@0 178 }
aoqi@0 179 case Bytecodes::_iload_0:
aoqi@0 180 case Bytecodes::_lload_0:
aoqi@0 181 case Bytecodes::_fload_0:
aoqi@0 182 case Bytecodes::_dload_0:
aoqi@0 183 case Bytecodes::_aload_0:
aoqi@0 184 push(local(0));
aoqi@0 185 break;
aoqi@0 186 case Bytecodes::_iload_1:
aoqi@0 187 case Bytecodes::_lload_1:
aoqi@0 188 case Bytecodes::_fload_1:
aoqi@0 189 case Bytecodes::_dload_1:
aoqi@0 190 case Bytecodes::_aload_1:
aoqi@0 191 push(local(1));
aoqi@0 192 break;
aoqi@0 193 case Bytecodes::_iload_2:
aoqi@0 194 case Bytecodes::_lload_2:
aoqi@0 195 case Bytecodes::_fload_2:
aoqi@0 196 case Bytecodes::_dload_2:
aoqi@0 197 case Bytecodes::_aload_2:
aoqi@0 198 push(local(2));
aoqi@0 199 break;
aoqi@0 200 case Bytecodes::_iload_3:
aoqi@0 201 case Bytecodes::_lload_3:
aoqi@0 202 case Bytecodes::_fload_3:
aoqi@0 203 case Bytecodes::_dload_3:
aoqi@0 204 case Bytecodes::_aload_3:
aoqi@0 205 push(local(3));
aoqi@0 206 break;
aoqi@0 207 case Bytecodes::_iload:
aoqi@0 208 case Bytecodes::_lload:
aoqi@0 209 case Bytecodes::_fload:
aoqi@0 210 case Bytecodes::_dload:
aoqi@0 211 case Bytecodes::_aload:
aoqi@0 212 push(local(iter()->get_index()));
aoqi@0 213 break;
aoqi@0 214
aoqi@0 215 case Bytecodes::_baload:
aoqi@0 216 do_aload(T_BYTE);
aoqi@0 217 break;
aoqi@0 218 case Bytecodes::_caload:
aoqi@0 219 do_aload(T_CHAR);
aoqi@0 220 break;
aoqi@0 221 case Bytecodes::_saload:
aoqi@0 222 do_aload(T_SHORT);
aoqi@0 223 break;
aoqi@0 224 case Bytecodes::_iaload:
aoqi@0 225 do_aload(T_INT);
aoqi@0 226 break;
aoqi@0 227 case Bytecodes::_laload:
aoqi@0 228 do_aload(T_LONG);
aoqi@0 229 break;
aoqi@0 230 case Bytecodes::_faload:
aoqi@0 231 do_aload(T_FLOAT);
aoqi@0 232 break;
aoqi@0 233 case Bytecodes::_daload:
aoqi@0 234 do_aload(T_DOUBLE);
aoqi@0 235 break;
aoqi@0 236 case Bytecodes::_aaload:
aoqi@0 237 do_aload(T_OBJECT);
aoqi@0 238 break;
aoqi@0 239
aoqi@0 240 case Bytecodes::_istore_0:
aoqi@0 241 case Bytecodes::_lstore_0:
aoqi@0 242 case Bytecodes::_fstore_0:
aoqi@0 243 case Bytecodes::_dstore_0:
aoqi@0 244 case Bytecodes::_astore_0:
aoqi@0 245 set_local(0, pop());
aoqi@0 246 break;
aoqi@0 247 case Bytecodes::_istore_1:
aoqi@0 248 case Bytecodes::_lstore_1:
aoqi@0 249 case Bytecodes::_fstore_1:
aoqi@0 250 case Bytecodes::_dstore_1:
aoqi@0 251 case Bytecodes::_astore_1:
aoqi@0 252 set_local(1, pop());
aoqi@0 253 break;
aoqi@0 254 case Bytecodes::_istore_2:
aoqi@0 255 case Bytecodes::_lstore_2:
aoqi@0 256 case Bytecodes::_fstore_2:
aoqi@0 257 case Bytecodes::_dstore_2:
aoqi@0 258 case Bytecodes::_astore_2:
aoqi@0 259 set_local(2, pop());
aoqi@0 260 break;
aoqi@0 261 case Bytecodes::_istore_3:
aoqi@0 262 case Bytecodes::_lstore_3:
aoqi@0 263 case Bytecodes::_fstore_3:
aoqi@0 264 case Bytecodes::_dstore_3:
aoqi@0 265 case Bytecodes::_astore_3:
aoqi@0 266 set_local(3, pop());
aoqi@0 267 break;
aoqi@0 268 case Bytecodes::_istore:
aoqi@0 269 case Bytecodes::_lstore:
aoqi@0 270 case Bytecodes::_fstore:
aoqi@0 271 case Bytecodes::_dstore:
aoqi@0 272 case Bytecodes::_astore:
aoqi@0 273 set_local(iter()->get_index(), pop());
aoqi@0 274 break;
aoqi@0 275
aoqi@0 276 case Bytecodes::_bastore:
aoqi@0 277 do_astore(T_BYTE);
aoqi@0 278 break;
aoqi@0 279 case Bytecodes::_castore:
aoqi@0 280 do_astore(T_CHAR);
aoqi@0 281 break;
aoqi@0 282 case Bytecodes::_sastore:
aoqi@0 283 do_astore(T_SHORT);
aoqi@0 284 break;
aoqi@0 285 case Bytecodes::_iastore:
aoqi@0 286 do_astore(T_INT);
aoqi@0 287 break;
aoqi@0 288 case Bytecodes::_lastore:
aoqi@0 289 do_astore(T_LONG);
aoqi@0 290 break;
aoqi@0 291 case Bytecodes::_fastore:
aoqi@0 292 do_astore(T_FLOAT);
aoqi@0 293 break;
aoqi@0 294 case Bytecodes::_dastore:
aoqi@0 295 do_astore(T_DOUBLE);
aoqi@0 296 break;
aoqi@0 297 case Bytecodes::_aastore:
aoqi@0 298 do_astore(T_OBJECT);
aoqi@0 299 break;
aoqi@0 300
aoqi@0 301 case Bytecodes::_pop:
aoqi@0 302 xpop();
aoqi@0 303 break;
aoqi@0 304 case Bytecodes::_pop2:
aoqi@0 305 xpop();
aoqi@0 306 xpop();
aoqi@0 307 break;
aoqi@0 308 case Bytecodes::_swap:
aoqi@0 309 a = xpop();
aoqi@0 310 b = xpop();
aoqi@0 311 xpush(a);
aoqi@0 312 xpush(b);
aoqi@0 313 break;
aoqi@0 314 case Bytecodes::_dup:
aoqi@0 315 a = xpop();
aoqi@0 316 xpush(a);
aoqi@0 317 xpush(a);
aoqi@0 318 break;
aoqi@0 319 case Bytecodes::_dup_x1:
aoqi@0 320 a = xpop();
aoqi@0 321 b = xpop();
aoqi@0 322 xpush(a);
aoqi@0 323 xpush(b);
aoqi@0 324 xpush(a);
aoqi@0 325 break;
aoqi@0 326 case Bytecodes::_dup_x2:
aoqi@0 327 a = xpop();
aoqi@0 328 b = xpop();
aoqi@0 329 c = xpop();
aoqi@0 330 xpush(a);
aoqi@0 331 xpush(c);
aoqi@0 332 xpush(b);
aoqi@0 333 xpush(a);
aoqi@0 334 break;
aoqi@0 335 case Bytecodes::_dup2:
aoqi@0 336 a = xpop();
aoqi@0 337 b = xpop();
aoqi@0 338 xpush(b);
aoqi@0 339 xpush(a);
aoqi@0 340 xpush(b);
aoqi@0 341 xpush(a);
aoqi@0 342 break;
aoqi@0 343 case Bytecodes::_dup2_x1:
aoqi@0 344 a = xpop();
aoqi@0 345 b = xpop();
aoqi@0 346 c = xpop();
aoqi@0 347 xpush(b);
aoqi@0 348 xpush(a);
aoqi@0 349 xpush(c);
aoqi@0 350 xpush(b);
aoqi@0 351 xpush(a);
aoqi@0 352 break;
aoqi@0 353 case Bytecodes::_dup2_x2:
aoqi@0 354 a = xpop();
aoqi@0 355 b = xpop();
aoqi@0 356 c = xpop();
aoqi@0 357 d = xpop();
aoqi@0 358 xpush(b);
aoqi@0 359 xpush(a);
aoqi@0 360 xpush(d);
aoqi@0 361 xpush(c);
aoqi@0 362 xpush(b);
aoqi@0 363 xpush(a);
aoqi@0 364 break;
aoqi@0 365
aoqi@0 366 case Bytecodes::_arraylength:
aoqi@0 367 do_arraylength();
aoqi@0 368 break;
aoqi@0 369
aoqi@0 370 case Bytecodes::_getfield:
aoqi@0 371 do_getfield();
aoqi@0 372 break;
aoqi@0 373 case Bytecodes::_getstatic:
aoqi@0 374 do_getstatic();
aoqi@0 375 break;
aoqi@0 376 case Bytecodes::_putfield:
aoqi@0 377 do_putfield();
aoqi@0 378 break;
aoqi@0 379 case Bytecodes::_putstatic:
aoqi@0 380 do_putstatic();
aoqi@0 381 break;
aoqi@0 382
aoqi@0 383 case Bytecodes::_iadd:
aoqi@0 384 b = pop();
aoqi@0 385 a = pop();
aoqi@0 386 push(SharkValue::create_jint(
aoqi@0 387 builder()->CreateAdd(a->jint_value(), b->jint_value()), false));
aoqi@0 388 break;
aoqi@0 389 case Bytecodes::_isub:
aoqi@0 390 b = pop();
aoqi@0 391 a = pop();
aoqi@0 392 push(SharkValue::create_jint(
aoqi@0 393 builder()->CreateSub(a->jint_value(), b->jint_value()), false));
aoqi@0 394 break;
aoqi@0 395 case Bytecodes::_imul:
aoqi@0 396 b = pop();
aoqi@0 397 a = pop();
aoqi@0 398 push(SharkValue::create_jint(
aoqi@0 399 builder()->CreateMul(a->jint_value(), b->jint_value()), false));
aoqi@0 400 break;
aoqi@0 401 case Bytecodes::_idiv:
aoqi@0 402 do_idiv();
aoqi@0 403 break;
aoqi@0 404 case Bytecodes::_irem:
aoqi@0 405 do_irem();
aoqi@0 406 break;
aoqi@0 407 case Bytecodes::_ineg:
aoqi@0 408 a = pop();
aoqi@0 409 push(SharkValue::create_jint(
aoqi@0 410 builder()->CreateNeg(a->jint_value()), a->zero_checked()));
aoqi@0 411 break;
aoqi@0 412 case Bytecodes::_ishl:
aoqi@0 413 b = pop();
aoqi@0 414 a = pop();
aoqi@0 415 push(SharkValue::create_jint(
aoqi@0 416 builder()->CreateShl(
aoqi@0 417 a->jint_value(),
aoqi@0 418 builder()->CreateAnd(
aoqi@0 419 b->jint_value(), LLVMValue::jint_constant(0x1f))), false));
aoqi@0 420 break;
aoqi@0 421 case Bytecodes::_ishr:
aoqi@0 422 b = pop();
aoqi@0 423 a = pop();
aoqi@0 424 push(SharkValue::create_jint(
aoqi@0 425 builder()->CreateAShr(
aoqi@0 426 a->jint_value(),
aoqi@0 427 builder()->CreateAnd(
aoqi@0 428 b->jint_value(), LLVMValue::jint_constant(0x1f))), false));
aoqi@0 429 break;
aoqi@0 430 case Bytecodes::_iushr:
aoqi@0 431 b = pop();
aoqi@0 432 a = pop();
aoqi@0 433 push(SharkValue::create_jint(
aoqi@0 434 builder()->CreateLShr(
aoqi@0 435 a->jint_value(),
aoqi@0 436 builder()->CreateAnd(
aoqi@0 437 b->jint_value(), LLVMValue::jint_constant(0x1f))), false));
aoqi@0 438 break;
aoqi@0 439 case Bytecodes::_iand:
aoqi@0 440 b = pop();
aoqi@0 441 a = pop();
aoqi@0 442 push(SharkValue::create_jint(
aoqi@0 443 builder()->CreateAnd(a->jint_value(), b->jint_value()), false));
aoqi@0 444 break;
aoqi@0 445 case Bytecodes::_ior:
aoqi@0 446 b = pop();
aoqi@0 447 a = pop();
aoqi@0 448 push(SharkValue::create_jint(
aoqi@0 449 builder()->CreateOr(a->jint_value(), b->jint_value()),
aoqi@0 450 a->zero_checked() && b->zero_checked()));
aoqi@0 451 break;
aoqi@0 452 case Bytecodes::_ixor:
aoqi@0 453 b = pop();
aoqi@0 454 a = pop();
aoqi@0 455 push(SharkValue::create_jint(
aoqi@0 456 builder()->CreateXor(a->jint_value(), b->jint_value()), false));
aoqi@0 457 break;
aoqi@0 458
aoqi@0 459 case Bytecodes::_ladd:
aoqi@0 460 b = pop();
aoqi@0 461 a = pop();
aoqi@0 462 push(SharkValue::create_jlong(
aoqi@0 463 builder()->CreateAdd(a->jlong_value(), b->jlong_value()), false));
aoqi@0 464 break;
aoqi@0 465 case Bytecodes::_lsub:
aoqi@0 466 b = pop();
aoqi@0 467 a = pop();
aoqi@0 468 push(SharkValue::create_jlong(
aoqi@0 469 builder()->CreateSub(a->jlong_value(), b->jlong_value()), false));
aoqi@0 470 break;
aoqi@0 471 case Bytecodes::_lmul:
aoqi@0 472 b = pop();
aoqi@0 473 a = pop();
aoqi@0 474 push(SharkValue::create_jlong(
aoqi@0 475 builder()->CreateMul(a->jlong_value(), b->jlong_value()), false));
aoqi@0 476 break;
aoqi@0 477 case Bytecodes::_ldiv:
aoqi@0 478 do_ldiv();
aoqi@0 479 break;
aoqi@0 480 case Bytecodes::_lrem:
aoqi@0 481 do_lrem();
aoqi@0 482 break;
aoqi@0 483 case Bytecodes::_lneg:
aoqi@0 484 a = pop();
aoqi@0 485 push(SharkValue::create_jlong(
aoqi@0 486 builder()->CreateNeg(a->jlong_value()), a->zero_checked()));
aoqi@0 487 break;
aoqi@0 488 case Bytecodes::_lshl:
aoqi@0 489 b = pop();
aoqi@0 490 a = pop();
aoqi@0 491 push(SharkValue::create_jlong(
aoqi@0 492 builder()->CreateShl(
aoqi@0 493 a->jlong_value(),
aoqi@0 494 builder()->CreateIntCast(
aoqi@0 495 builder()->CreateAnd(
aoqi@0 496 b->jint_value(), LLVMValue::jint_constant(0x3f)),
aoqi@0 497 SharkType::jlong_type(), true)), false));
aoqi@0 498 break;
aoqi@0 499 case Bytecodes::_lshr:
aoqi@0 500 b = pop();
aoqi@0 501 a = pop();
aoqi@0 502 push(SharkValue::create_jlong(
aoqi@0 503 builder()->CreateAShr(
aoqi@0 504 a->jlong_value(),
aoqi@0 505 builder()->CreateIntCast(
aoqi@0 506 builder()->CreateAnd(
aoqi@0 507 b->jint_value(), LLVMValue::jint_constant(0x3f)),
aoqi@0 508 SharkType::jlong_type(), true)), false));
aoqi@0 509 break;
aoqi@0 510 case Bytecodes::_lushr:
aoqi@0 511 b = pop();
aoqi@0 512 a = pop();
aoqi@0 513 push(SharkValue::create_jlong(
aoqi@0 514 builder()->CreateLShr(
aoqi@0 515 a->jlong_value(),
aoqi@0 516 builder()->CreateIntCast(
aoqi@0 517 builder()->CreateAnd(
aoqi@0 518 b->jint_value(), LLVMValue::jint_constant(0x3f)),
aoqi@0 519 SharkType::jlong_type(), true)), false));
aoqi@0 520 break;
aoqi@0 521 case Bytecodes::_land:
aoqi@0 522 b = pop();
aoqi@0 523 a = pop();
aoqi@0 524 push(SharkValue::create_jlong(
aoqi@0 525 builder()->CreateAnd(a->jlong_value(), b->jlong_value()), false));
aoqi@0 526 break;
aoqi@0 527 case Bytecodes::_lor:
aoqi@0 528 b = pop();
aoqi@0 529 a = pop();
aoqi@0 530 push(SharkValue::create_jlong(
aoqi@0 531 builder()->CreateOr(a->jlong_value(), b->jlong_value()),
aoqi@0 532 a->zero_checked() && b->zero_checked()));
aoqi@0 533 break;
aoqi@0 534 case Bytecodes::_lxor:
aoqi@0 535 b = pop();
aoqi@0 536 a = pop();
aoqi@0 537 push(SharkValue::create_jlong(
aoqi@0 538 builder()->CreateXor(a->jlong_value(), b->jlong_value()), false));
aoqi@0 539 break;
aoqi@0 540
aoqi@0 541 case Bytecodes::_fadd:
aoqi@0 542 b = pop();
aoqi@0 543 a = pop();
aoqi@0 544 push(SharkValue::create_jfloat(
aoqi@0 545 builder()->CreateFAdd(a->jfloat_value(), b->jfloat_value())));
aoqi@0 546 break;
aoqi@0 547 case Bytecodes::_fsub:
aoqi@0 548 b = pop();
aoqi@0 549 a = pop();
aoqi@0 550 push(SharkValue::create_jfloat(
aoqi@0 551 builder()->CreateFSub(a->jfloat_value(), b->jfloat_value())));
aoqi@0 552 break;
aoqi@0 553 case Bytecodes::_fmul:
aoqi@0 554 b = pop();
aoqi@0 555 a = pop();
aoqi@0 556 push(SharkValue::create_jfloat(
aoqi@0 557 builder()->CreateFMul(a->jfloat_value(), b->jfloat_value())));
aoqi@0 558 break;
aoqi@0 559 case Bytecodes::_fdiv:
aoqi@0 560 b = pop();
aoqi@0 561 a = pop();
aoqi@0 562 push(SharkValue::create_jfloat(
aoqi@0 563 builder()->CreateFDiv(a->jfloat_value(), b->jfloat_value())));
aoqi@0 564 break;
aoqi@0 565 case Bytecodes::_frem:
aoqi@0 566 b = pop();
aoqi@0 567 a = pop();
aoqi@0 568 push(SharkValue::create_jfloat(
aoqi@0 569 builder()->CreateFRem(a->jfloat_value(), b->jfloat_value())));
aoqi@0 570 break;
aoqi@0 571 case Bytecodes::_fneg:
aoqi@0 572 a = pop();
aoqi@0 573 push(SharkValue::create_jfloat(
aoqi@0 574 builder()->CreateFNeg(a->jfloat_value())));
aoqi@0 575 break;
aoqi@0 576
aoqi@0 577 case Bytecodes::_dadd:
aoqi@0 578 b = pop();
aoqi@0 579 a = pop();
aoqi@0 580 push(SharkValue::create_jdouble(
aoqi@0 581 builder()->CreateFAdd(a->jdouble_value(), b->jdouble_value())));
aoqi@0 582 break;
aoqi@0 583 case Bytecodes::_dsub:
aoqi@0 584 b = pop();
aoqi@0 585 a = pop();
aoqi@0 586 push(SharkValue::create_jdouble(
aoqi@0 587 builder()->CreateFSub(a->jdouble_value(), b->jdouble_value())));
aoqi@0 588 break;
aoqi@0 589 case Bytecodes::_dmul:
aoqi@0 590 b = pop();
aoqi@0 591 a = pop();
aoqi@0 592 push(SharkValue::create_jdouble(
aoqi@0 593 builder()->CreateFMul(a->jdouble_value(), b->jdouble_value())));
aoqi@0 594 break;
aoqi@0 595 case Bytecodes::_ddiv:
aoqi@0 596 b = pop();
aoqi@0 597 a = pop();
aoqi@0 598 push(SharkValue::create_jdouble(
aoqi@0 599 builder()->CreateFDiv(a->jdouble_value(), b->jdouble_value())));
aoqi@0 600 break;
aoqi@0 601 case Bytecodes::_drem:
aoqi@0 602 b = pop();
aoqi@0 603 a = pop();
aoqi@0 604 push(SharkValue::create_jdouble(
aoqi@0 605 builder()->CreateFRem(a->jdouble_value(), b->jdouble_value())));
aoqi@0 606 break;
aoqi@0 607 case Bytecodes::_dneg:
aoqi@0 608 a = pop();
aoqi@0 609 push(SharkValue::create_jdouble(
aoqi@0 610 builder()->CreateFNeg(a->jdouble_value())));
aoqi@0 611 break;
aoqi@0 612
aoqi@0 613 case Bytecodes::_iinc:
aoqi@0 614 i = iter()->get_index();
aoqi@0 615 set_local(
aoqi@0 616 i,
aoqi@0 617 SharkValue::create_jint(
aoqi@0 618 builder()->CreateAdd(
aoqi@0 619 LLVMValue::jint_constant(iter()->get_iinc_con()),
aoqi@0 620 local(i)->jint_value()), false));
aoqi@0 621 break;
aoqi@0 622
aoqi@0 623 case Bytecodes::_lcmp:
aoqi@0 624 do_lcmp();
aoqi@0 625 break;
aoqi@0 626
aoqi@0 627 case Bytecodes::_fcmpl:
aoqi@0 628 do_fcmp(false, false);
aoqi@0 629 break;
aoqi@0 630 case Bytecodes::_fcmpg:
aoqi@0 631 do_fcmp(false, true);
aoqi@0 632 break;
aoqi@0 633 case Bytecodes::_dcmpl:
aoqi@0 634 do_fcmp(true, false);
aoqi@0 635 break;
aoqi@0 636 case Bytecodes::_dcmpg:
aoqi@0 637 do_fcmp(true, true);
aoqi@0 638 break;
aoqi@0 639
aoqi@0 640 case Bytecodes::_i2l:
aoqi@0 641 a = pop();
aoqi@0 642 push(SharkValue::create_jlong(
aoqi@0 643 builder()->CreateIntCast(
aoqi@0 644 a->jint_value(), SharkType::jlong_type(), true), a->zero_checked()));
aoqi@0 645 break;
aoqi@0 646 case Bytecodes::_i2f:
aoqi@0 647 push(SharkValue::create_jfloat(
aoqi@0 648 builder()->CreateSIToFP(
aoqi@0 649 pop()->jint_value(), SharkType::jfloat_type())));
aoqi@0 650 break;
aoqi@0 651 case Bytecodes::_i2d:
aoqi@0 652 push(SharkValue::create_jdouble(
aoqi@0 653 builder()->CreateSIToFP(
aoqi@0 654 pop()->jint_value(), SharkType::jdouble_type())));
aoqi@0 655 break;
aoqi@0 656
aoqi@0 657 case Bytecodes::_l2i:
aoqi@0 658 push(SharkValue::create_jint(
aoqi@0 659 builder()->CreateIntCast(
aoqi@0 660 pop()->jlong_value(), SharkType::jint_type(), true), false));
aoqi@0 661 break;
aoqi@0 662 case Bytecodes::_l2f:
aoqi@0 663 push(SharkValue::create_jfloat(
aoqi@0 664 builder()->CreateSIToFP(
aoqi@0 665 pop()->jlong_value(), SharkType::jfloat_type())));
aoqi@0 666 break;
aoqi@0 667 case Bytecodes::_l2d:
aoqi@0 668 push(SharkValue::create_jdouble(
aoqi@0 669 builder()->CreateSIToFP(
aoqi@0 670 pop()->jlong_value(), SharkType::jdouble_type())));
aoqi@0 671 break;
aoqi@0 672
aoqi@0 673 case Bytecodes::_f2i:
aoqi@0 674 push(SharkValue::create_jint(
aoqi@0 675 builder()->CreateCall(
aoqi@0 676 builder()->f2i(), pop()->jfloat_value()), false));
aoqi@0 677 break;
aoqi@0 678 case Bytecodes::_f2l:
aoqi@0 679 push(SharkValue::create_jlong(
aoqi@0 680 builder()->CreateCall(
aoqi@0 681 builder()->f2l(), pop()->jfloat_value()), false));
aoqi@0 682 break;
aoqi@0 683 case Bytecodes::_f2d:
aoqi@0 684 push(SharkValue::create_jdouble(
aoqi@0 685 builder()->CreateFPExt(
aoqi@0 686 pop()->jfloat_value(), SharkType::jdouble_type())));
aoqi@0 687 break;
aoqi@0 688
aoqi@0 689 case Bytecodes::_d2i:
aoqi@0 690 push(SharkValue::create_jint(
aoqi@0 691 builder()->CreateCall(
aoqi@0 692 builder()->d2i(), pop()->jdouble_value()), false));
aoqi@0 693 break;
aoqi@0 694 case Bytecodes::_d2l:
aoqi@0 695 push(SharkValue::create_jlong(
aoqi@0 696 builder()->CreateCall(
aoqi@0 697 builder()->d2l(), pop()->jdouble_value()), false));
aoqi@0 698 break;
aoqi@0 699 case Bytecodes::_d2f:
aoqi@0 700 push(SharkValue::create_jfloat(
aoqi@0 701 builder()->CreateFPTrunc(
aoqi@0 702 pop()->jdouble_value(), SharkType::jfloat_type())));
aoqi@0 703 break;
aoqi@0 704
aoqi@0 705 case Bytecodes::_i2b:
aoqi@0 706 push(SharkValue::create_jint(
aoqi@0 707 builder()->CreateAShr(
aoqi@0 708 builder()->CreateShl(
aoqi@0 709 pop()->jint_value(),
aoqi@0 710 LLVMValue::jint_constant(24)),
aoqi@0 711 LLVMValue::jint_constant(24)), false));
aoqi@0 712 break;
aoqi@0 713 case Bytecodes::_i2c:
aoqi@0 714 push(SharkValue::create_jint(
aoqi@0 715 builder()->CreateAnd(
aoqi@0 716 pop()->jint_value(),
aoqi@0 717 LLVMValue::jint_constant(0xffff)), false));
aoqi@0 718 break;
aoqi@0 719 case Bytecodes::_i2s:
aoqi@0 720 push(SharkValue::create_jint(
aoqi@0 721 builder()->CreateAShr(
aoqi@0 722 builder()->CreateShl(
aoqi@0 723 pop()->jint_value(),
aoqi@0 724 LLVMValue::jint_constant(16)),
aoqi@0 725 LLVMValue::jint_constant(16)), false));
aoqi@0 726 break;
aoqi@0 727
aoqi@0 728 case Bytecodes::_return:
aoqi@0 729 do_return(T_VOID);
aoqi@0 730 break;
aoqi@0 731 case Bytecodes::_ireturn:
aoqi@0 732 do_return(T_INT);
aoqi@0 733 break;
aoqi@0 734 case Bytecodes::_lreturn:
aoqi@0 735 do_return(T_LONG);
aoqi@0 736 break;
aoqi@0 737 case Bytecodes::_freturn:
aoqi@0 738 do_return(T_FLOAT);
aoqi@0 739 break;
aoqi@0 740 case Bytecodes::_dreturn:
aoqi@0 741 do_return(T_DOUBLE);
aoqi@0 742 break;
aoqi@0 743 case Bytecodes::_areturn:
aoqi@0 744 do_return(T_OBJECT);
aoqi@0 745 break;
aoqi@0 746
aoqi@0 747 case Bytecodes::_athrow:
aoqi@0 748 do_athrow();
aoqi@0 749 break;
aoqi@0 750
aoqi@0 751 case Bytecodes::_goto:
aoqi@0 752 case Bytecodes::_goto_w:
aoqi@0 753 do_goto();
aoqi@0 754 break;
aoqi@0 755
aoqi@0 756 case Bytecodes::_jsr:
aoqi@0 757 case Bytecodes::_jsr_w:
aoqi@0 758 do_jsr();
aoqi@0 759 break;
aoqi@0 760
aoqi@0 761 case Bytecodes::_ret:
aoqi@0 762 do_ret();
aoqi@0 763 break;
aoqi@0 764
aoqi@0 765 case Bytecodes::_ifnull:
aoqi@0 766 do_if(ICmpInst::ICMP_EQ, SharkValue::null(), pop());
aoqi@0 767 break;
aoqi@0 768 case Bytecodes::_ifnonnull:
aoqi@0 769 do_if(ICmpInst::ICMP_NE, SharkValue::null(), pop());
aoqi@0 770 break;
aoqi@0 771 case Bytecodes::_if_acmpeq:
aoqi@0 772 b = pop();
aoqi@0 773 a = pop();
aoqi@0 774 do_if(ICmpInst::ICMP_EQ, b, a);
aoqi@0 775 break;
aoqi@0 776 case Bytecodes::_if_acmpne:
aoqi@0 777 b = pop();
aoqi@0 778 a = pop();
aoqi@0 779 do_if(ICmpInst::ICMP_NE, b, a);
aoqi@0 780 break;
aoqi@0 781 case Bytecodes::_ifeq:
aoqi@0 782 do_if(ICmpInst::ICMP_EQ, SharkValue::jint_constant(0), pop());
aoqi@0 783 break;
aoqi@0 784 case Bytecodes::_ifne:
aoqi@0 785 do_if(ICmpInst::ICMP_NE, SharkValue::jint_constant(0), pop());
aoqi@0 786 break;
aoqi@0 787 case Bytecodes::_iflt:
aoqi@0 788 do_if(ICmpInst::ICMP_SLT, SharkValue::jint_constant(0), pop());
aoqi@0 789 break;
aoqi@0 790 case Bytecodes::_ifle:
aoqi@0 791 do_if(ICmpInst::ICMP_SLE, SharkValue::jint_constant(0), pop());
aoqi@0 792 break;
aoqi@0 793 case Bytecodes::_ifgt:
aoqi@0 794 do_if(ICmpInst::ICMP_SGT, SharkValue::jint_constant(0), pop());
aoqi@0 795 break;
aoqi@0 796 case Bytecodes::_ifge:
aoqi@0 797 do_if(ICmpInst::ICMP_SGE, SharkValue::jint_constant(0), pop());
aoqi@0 798 break;
aoqi@0 799 case Bytecodes::_if_icmpeq:
aoqi@0 800 b = pop();
aoqi@0 801 a = pop();
aoqi@0 802 do_if(ICmpInst::ICMP_EQ, b, a);
aoqi@0 803 break;
aoqi@0 804 case Bytecodes::_if_icmpne:
aoqi@0 805 b = pop();
aoqi@0 806 a = pop();
aoqi@0 807 do_if(ICmpInst::ICMP_NE, b, a);
aoqi@0 808 break;
aoqi@0 809 case Bytecodes::_if_icmplt:
aoqi@0 810 b = pop();
aoqi@0 811 a = pop();
aoqi@0 812 do_if(ICmpInst::ICMP_SLT, b, a);
aoqi@0 813 break;
aoqi@0 814 case Bytecodes::_if_icmple:
aoqi@0 815 b = pop();
aoqi@0 816 a = pop();
aoqi@0 817 do_if(ICmpInst::ICMP_SLE, b, a);
aoqi@0 818 break;
aoqi@0 819 case Bytecodes::_if_icmpgt:
aoqi@0 820 b = pop();
aoqi@0 821 a = pop();
aoqi@0 822 do_if(ICmpInst::ICMP_SGT, b, a);
aoqi@0 823 break;
aoqi@0 824 case Bytecodes::_if_icmpge:
aoqi@0 825 b = pop();
aoqi@0 826 a = pop();
aoqi@0 827 do_if(ICmpInst::ICMP_SGE, b, a);
aoqi@0 828 break;
aoqi@0 829
aoqi@0 830 case Bytecodes::_tableswitch:
aoqi@0 831 case Bytecodes::_lookupswitch:
aoqi@0 832 do_switch();
aoqi@0 833 break;
aoqi@0 834
aoqi@0 835 case Bytecodes::_invokestatic:
aoqi@0 836 case Bytecodes::_invokespecial:
aoqi@0 837 case Bytecodes::_invokevirtual:
aoqi@0 838 case Bytecodes::_invokeinterface:
aoqi@0 839 do_call();
aoqi@0 840 break;
aoqi@0 841
aoqi@0 842 case Bytecodes::_instanceof:
aoqi@0 843 // This is a very common construct:
aoqi@0 844 //
aoqi@0 845 // if (object instanceof Klass) {
aoqi@0 846 // something = (Klass) object;
aoqi@0 847 // ...
aoqi@0 848 // }
aoqi@0 849 //
aoqi@0 850 // which gets compiled to something like this:
aoqi@0 851 //
aoqi@0 852 // 28: aload 9
aoqi@0 853 // 30: instanceof <Class Klass>
aoqi@0 854 // 33: ifeq 52
aoqi@0 855 // 36: aload 9
aoqi@0 856 // 38: checkcast <Class Klass>
aoqi@0 857 //
aoqi@0 858 // Handling both bytecodes at once allows us
aoqi@0 859 // to eliminate the checkcast.
aoqi@0 860 if (iter()->next_bci() < limit &&
aoqi@0 861 (iter()->next_bc() == Bytecodes::_ifeq ||
aoqi@0 862 iter()->next_bc() == Bytecodes::_ifne) &&
aoqi@0 863 (!UseLoopSafepoints ||
aoqi@0 864 iter()->next_get_dest() > iter()->next_bci())) {
aoqi@0 865 if (maybe_do_instanceof_if()) {
aoqi@0 866 iter()->next();
aoqi@0 867 if (SharkTraceBytecodes)
aoqi@0 868 tty->print_cr("%4d: %s", bci(), Bytecodes::name(bc()));
aoqi@0 869 break;
aoqi@0 870 }
aoqi@0 871 }
aoqi@0 872 // fall through
aoqi@0 873 case Bytecodes::_checkcast:
aoqi@0 874 do_instance_check();
aoqi@0 875 break;
aoqi@0 876
aoqi@0 877 case Bytecodes::_new:
aoqi@0 878 do_new();
aoqi@0 879 break;
aoqi@0 880 case Bytecodes::_newarray:
aoqi@0 881 do_newarray();
aoqi@0 882 break;
aoqi@0 883 case Bytecodes::_anewarray:
aoqi@0 884 do_anewarray();
aoqi@0 885 break;
aoqi@0 886 case Bytecodes::_multianewarray:
aoqi@0 887 do_multianewarray();
aoqi@0 888 break;
aoqi@0 889
aoqi@0 890 case Bytecodes::_monitorenter:
aoqi@0 891 do_monitorenter();
aoqi@0 892 break;
aoqi@0 893 case Bytecodes::_monitorexit:
aoqi@0 894 do_monitorexit();
aoqi@0 895 break;
aoqi@0 896
aoqi@0 897 default:
aoqi@0 898 ShouldNotReachHere();
aoqi@0 899 }
aoqi@0 900 }
aoqi@0 901 }
aoqi@0 902
aoqi@0 903 SharkState* SharkBlock::initial_current_state() {
aoqi@0 904 return entry_state()->copy();
aoqi@0 905 }
aoqi@0 906
aoqi@0 907 int SharkBlock::switch_default_dest() {
aoqi@0 908 return iter()->get_dest_table(0);
aoqi@0 909 }
aoqi@0 910
aoqi@0 911 int SharkBlock::switch_table_length() {
aoqi@0 912 switch(bc()) {
aoqi@0 913 case Bytecodes::_tableswitch:
aoqi@0 914 return iter()->get_int_table(2) - iter()->get_int_table(1) + 1;
aoqi@0 915
aoqi@0 916 case Bytecodes::_lookupswitch:
aoqi@0 917 return iter()->get_int_table(1);
aoqi@0 918
aoqi@0 919 default:
aoqi@0 920 ShouldNotReachHere();
aoqi@0 921 }
aoqi@0 922 }
aoqi@0 923
aoqi@0 924 int SharkBlock::switch_key(int i) {
aoqi@0 925 switch(bc()) {
aoqi@0 926 case Bytecodes::_tableswitch:
aoqi@0 927 return iter()->get_int_table(1) + i;
aoqi@0 928
aoqi@0 929 case Bytecodes::_lookupswitch:
aoqi@0 930 return iter()->get_int_table(2 + 2 * i);
aoqi@0 931
aoqi@0 932 default:
aoqi@0 933 ShouldNotReachHere();
aoqi@0 934 }
aoqi@0 935 }
aoqi@0 936
aoqi@0 937 int SharkBlock::switch_dest(int i) {
aoqi@0 938 switch(bc()) {
aoqi@0 939 case Bytecodes::_tableswitch:
aoqi@0 940 return iter()->get_dest_table(i + 3);
aoqi@0 941
aoqi@0 942 case Bytecodes::_lookupswitch:
aoqi@0 943 return iter()->get_dest_table(2 + 2 * i + 1);
aoqi@0 944
aoqi@0 945 default:
aoqi@0 946 ShouldNotReachHere();
aoqi@0 947 }
aoqi@0 948 }
aoqi@0 949
aoqi@0 950 void SharkBlock::do_div_or_rem(bool is_long, bool is_rem) {
aoqi@0 951 SharkValue *sb = pop();
aoqi@0 952 SharkValue *sa = pop();
aoqi@0 953
aoqi@0 954 check_divide_by_zero(sb);
aoqi@0 955
aoqi@0 956 Value *a, *b, *p, *q;
aoqi@0 957 if (is_long) {
aoqi@0 958 a = sa->jlong_value();
aoqi@0 959 b = sb->jlong_value();
aoqi@0 960 p = LLVMValue::jlong_constant(0x8000000000000000LL);
aoqi@0 961 q = LLVMValue::jlong_constant(-1);
aoqi@0 962 }
aoqi@0 963 else {
aoqi@0 964 a = sa->jint_value();
aoqi@0 965 b = sb->jint_value();
aoqi@0 966 p = LLVMValue::jint_constant(0x80000000);
aoqi@0 967 q = LLVMValue::jint_constant(-1);
aoqi@0 968 }
aoqi@0 969
aoqi@0 970 BasicBlock *ip = builder()->GetBlockInsertionPoint();
aoqi@0 971 BasicBlock *special_case = builder()->CreateBlock(ip, "special_case");
aoqi@0 972 BasicBlock *general_case = builder()->CreateBlock(ip, "general_case");
aoqi@0 973 BasicBlock *done = builder()->CreateBlock(ip, "done");
aoqi@0 974
aoqi@0 975 builder()->CreateCondBr(
aoqi@0 976 builder()->CreateAnd(
aoqi@0 977 builder()->CreateICmpEQ(a, p),
aoqi@0 978 builder()->CreateICmpEQ(b, q)),
aoqi@0 979 special_case, general_case);
aoqi@0 980
aoqi@0 981 builder()->SetInsertPoint(special_case);
aoqi@0 982 Value *special_result;
aoqi@0 983 if (is_rem) {
aoqi@0 984 if (is_long)
aoqi@0 985 special_result = LLVMValue::jlong_constant(0);
aoqi@0 986 else
aoqi@0 987 special_result = LLVMValue::jint_constant(0);
aoqi@0 988 }
aoqi@0 989 else {
aoqi@0 990 special_result = a;
aoqi@0 991 }
aoqi@0 992 builder()->CreateBr(done);
aoqi@0 993
aoqi@0 994 builder()->SetInsertPoint(general_case);
aoqi@0 995 Value *general_result;
aoqi@0 996 if (is_rem)
aoqi@0 997 general_result = builder()->CreateSRem(a, b);
aoqi@0 998 else
aoqi@0 999 general_result = builder()->CreateSDiv(a, b);
aoqi@0 1000 builder()->CreateBr(done);
aoqi@0 1001
aoqi@0 1002 builder()->SetInsertPoint(done);
aoqi@0 1003 PHINode *result;
aoqi@0 1004 if (is_long)
aoqi@0 1005 result = builder()->CreatePHI(SharkType::jlong_type(), 0, "result");
aoqi@0 1006 else
aoqi@0 1007 result = builder()->CreatePHI(SharkType::jint_type(), 0, "result");
aoqi@0 1008 result->addIncoming(special_result, special_case);
aoqi@0 1009 result->addIncoming(general_result, general_case);
aoqi@0 1010
aoqi@0 1011 if (is_long)
aoqi@0 1012 push(SharkValue::create_jlong(result, false));
aoqi@0 1013 else
aoqi@0 1014 push(SharkValue::create_jint(result, false));
aoqi@0 1015 }
aoqi@0 1016
aoqi@0 1017 void SharkBlock::do_field_access(bool is_get, bool is_field) {
aoqi@0 1018 bool will_link;
aoqi@0 1019 ciField *field = iter()->get_field(will_link);
aoqi@0 1020 assert(will_link, "typeflow responsibility");
aoqi@0 1021 assert(is_field != field->is_static(), "mismatch");
aoqi@0 1022
aoqi@0 1023 // Pop the value off the stack where necessary
aoqi@0 1024 SharkValue *value = NULL;
aoqi@0 1025 if (!is_get)
aoqi@0 1026 value = pop();
aoqi@0 1027
aoqi@0 1028 // Find the object we're accessing, if necessary
aoqi@0 1029 Value *object = NULL;
aoqi@0 1030 if (is_field) {
aoqi@0 1031 SharkValue *value = pop();
aoqi@0 1032 check_null(value);
aoqi@0 1033 object = value->generic_value();
aoqi@0 1034 }
aoqi@0 1035 if (is_get && field->is_constant() && field->is_static()) {
aoqi@0 1036 SharkConstant *constant = SharkConstant::for_field(iter());
aoqi@0 1037 if (constant->is_loaded())
aoqi@0 1038 value = constant->value(builder());
aoqi@0 1039 }
aoqi@0 1040 if (!is_get || value == NULL) {
aoqi@0 1041 if (!is_field) {
aoqi@0 1042 object = builder()->CreateInlineOop(field->holder()->java_mirror());
aoqi@0 1043 }
aoqi@0 1044 BasicType basic_type = field->type()->basic_type();
aoqi@0 1045 Type *stack_type = SharkType::to_stackType(basic_type);
aoqi@0 1046 Type *field_type = SharkType::to_arrayType(basic_type);
aoqi@0 1047 Type *type = field_type;
aoqi@0 1048 if (field->is_volatile()) {
aoqi@0 1049 if (field_type == SharkType::jfloat_type()) {
aoqi@0 1050 type = SharkType::jint_type();
aoqi@0 1051 } else if (field_type == SharkType::jdouble_type()) {
aoqi@0 1052 type = SharkType::jlong_type();
aoqi@0 1053 }
aoqi@0 1054 }
aoqi@0 1055 Value *addr = builder()->CreateAddressOfStructEntry(
aoqi@0 1056 object, in_ByteSize(field->offset_in_bytes()),
aoqi@0 1057 PointerType::getUnqual(type),
aoqi@0 1058 "addr");
aoqi@0 1059
aoqi@0 1060 // Do the access
aoqi@0 1061 if (is_get) {
aoqi@0 1062 Value* field_value;
aoqi@0 1063 if (field->is_volatile()) {
aoqi@0 1064 field_value = builder()->CreateAtomicLoad(addr);
aoqi@0 1065 field_value = builder()->CreateBitCast(field_value, field_type);
aoqi@0 1066 } else {
aoqi@0 1067 field_value = builder()->CreateLoad(addr);
aoqi@0 1068 }
aoqi@0 1069 if (field_type != stack_type) {
aoqi@0 1070 field_value = builder()->CreateIntCast(
aoqi@0 1071 field_value, stack_type, basic_type != T_CHAR);
aoqi@0 1072 }
aoqi@0 1073
aoqi@0 1074 value = SharkValue::create_generic(field->type(), field_value, false);
aoqi@0 1075 }
aoqi@0 1076 else {
aoqi@0 1077 Value *field_value = value->generic_value();
aoqi@0 1078
aoqi@0 1079 if (field_type != stack_type) {
aoqi@0 1080 field_value = builder()->CreateIntCast(
aoqi@0 1081 field_value, field_type, basic_type != T_CHAR);
aoqi@0 1082 }
aoqi@0 1083
aoqi@0 1084 if (field->is_volatile()) {
aoqi@0 1085 field_value = builder()->CreateBitCast(field_value, type);
aoqi@0 1086 builder()->CreateAtomicStore(field_value, addr);
aoqi@0 1087 } else {
aoqi@0 1088 builder()->CreateStore(field_value, addr);
aoqi@0 1089 }
aoqi@0 1090
aoqi@0 1091 if (!field->type()->is_primitive_type()) {
aoqi@0 1092 builder()->CreateUpdateBarrierSet(oopDesc::bs(), addr);
aoqi@0 1093 }
aoqi@0 1094 }
aoqi@0 1095 }
aoqi@0 1096
aoqi@0 1097 // Push the value onto the stack where necessary
aoqi@0 1098 if (is_get)
aoqi@0 1099 push(value);
aoqi@0 1100 }
aoqi@0 1101
aoqi@0 1102 void SharkBlock::do_lcmp() {
aoqi@0 1103 Value *b = pop()->jlong_value();
aoqi@0 1104 Value *a = pop()->jlong_value();
aoqi@0 1105
aoqi@0 1106 BasicBlock *ip = builder()->GetBlockInsertionPoint();
aoqi@0 1107 BasicBlock *ne = builder()->CreateBlock(ip, "lcmp_ne");
aoqi@0 1108 BasicBlock *lt = builder()->CreateBlock(ip, "lcmp_lt");
aoqi@0 1109 BasicBlock *gt = builder()->CreateBlock(ip, "lcmp_gt");
aoqi@0 1110 BasicBlock *done = builder()->CreateBlock(ip, "done");
aoqi@0 1111
aoqi@0 1112 BasicBlock *eq = builder()->GetInsertBlock();
aoqi@0 1113 builder()->CreateCondBr(builder()->CreateICmpEQ(a, b), done, ne);
aoqi@0 1114
aoqi@0 1115 builder()->SetInsertPoint(ne);
aoqi@0 1116 builder()->CreateCondBr(builder()->CreateICmpSLT(a, b), lt, gt);
aoqi@0 1117
aoqi@0 1118 builder()->SetInsertPoint(lt);
aoqi@0 1119 builder()->CreateBr(done);
aoqi@0 1120
aoqi@0 1121 builder()->SetInsertPoint(gt);
aoqi@0 1122 builder()->CreateBr(done);
aoqi@0 1123
aoqi@0 1124 builder()->SetInsertPoint(done);
aoqi@0 1125 PHINode *result = builder()->CreatePHI(SharkType::jint_type(), 0, "result");
aoqi@0 1126 result->addIncoming(LLVMValue::jint_constant(-1), lt);
aoqi@0 1127 result->addIncoming(LLVMValue::jint_constant(0), eq);
aoqi@0 1128 result->addIncoming(LLVMValue::jint_constant(1), gt);
aoqi@0 1129
aoqi@0 1130 push(SharkValue::create_jint(result, false));
aoqi@0 1131 }
aoqi@0 1132
aoqi@0 1133 void SharkBlock::do_fcmp(bool is_double, bool unordered_is_greater) {
aoqi@0 1134 Value *a, *b;
aoqi@0 1135 if (is_double) {
aoqi@0 1136 b = pop()->jdouble_value();
aoqi@0 1137 a = pop()->jdouble_value();
aoqi@0 1138 }
aoqi@0 1139 else {
aoqi@0 1140 b = pop()->jfloat_value();
aoqi@0 1141 a = pop()->jfloat_value();
aoqi@0 1142 }
aoqi@0 1143
aoqi@0 1144 BasicBlock *ip = builder()->GetBlockInsertionPoint();
aoqi@0 1145 BasicBlock *ordered = builder()->CreateBlock(ip, "ordered");
aoqi@0 1146 BasicBlock *ge = builder()->CreateBlock(ip, "fcmp_ge");
aoqi@0 1147 BasicBlock *lt = builder()->CreateBlock(ip, "fcmp_lt");
aoqi@0 1148 BasicBlock *eq = builder()->CreateBlock(ip, "fcmp_eq");
aoqi@0 1149 BasicBlock *gt = builder()->CreateBlock(ip, "fcmp_gt");
aoqi@0 1150 BasicBlock *done = builder()->CreateBlock(ip, "done");
aoqi@0 1151
aoqi@0 1152 builder()->CreateCondBr(
aoqi@0 1153 builder()->CreateFCmpUNO(a, b),
aoqi@0 1154 unordered_is_greater ? gt : lt, ordered);
aoqi@0 1155
aoqi@0 1156 builder()->SetInsertPoint(ordered);
aoqi@0 1157 builder()->CreateCondBr(builder()->CreateFCmpULT(a, b), lt, ge);
aoqi@0 1158
aoqi@0 1159 builder()->SetInsertPoint(ge);
aoqi@0 1160 builder()->CreateCondBr(builder()->CreateFCmpUGT(a, b), gt, eq);
aoqi@0 1161
aoqi@0 1162 builder()->SetInsertPoint(lt);
aoqi@0 1163 builder()->CreateBr(done);
aoqi@0 1164
aoqi@0 1165 builder()->SetInsertPoint(gt);
aoqi@0 1166 builder()->CreateBr(done);
aoqi@0 1167
aoqi@0 1168 builder()->SetInsertPoint(eq);
aoqi@0 1169 builder()->CreateBr(done);
aoqi@0 1170
aoqi@0 1171 builder()->SetInsertPoint(done);
aoqi@0 1172 PHINode *result = builder()->CreatePHI(SharkType::jint_type(), 0, "result");
aoqi@0 1173 result->addIncoming(LLVMValue::jint_constant(-1), lt);
aoqi@0 1174 result->addIncoming(LLVMValue::jint_constant(0), eq);
aoqi@0 1175 result->addIncoming(LLVMValue::jint_constant(1), gt);
aoqi@0 1176
aoqi@0 1177 push(SharkValue::create_jint(result, false));
aoqi@0 1178 }
aoqi@0 1179
aoqi@0 1180 void SharkBlock::emit_IR() {
aoqi@0 1181 ShouldNotCallThis();
aoqi@0 1182 }
aoqi@0 1183
aoqi@0 1184 SharkState* SharkBlock::entry_state() {
aoqi@0 1185 ShouldNotCallThis();
aoqi@0 1186 }
aoqi@0 1187
aoqi@0 1188 void SharkBlock::do_zero_check(SharkValue* value) {
aoqi@0 1189 ShouldNotCallThis();
aoqi@0 1190 }
aoqi@0 1191
aoqi@0 1192 void SharkBlock::maybe_add_backedge_safepoint() {
aoqi@0 1193 ShouldNotCallThis();
aoqi@0 1194 }
aoqi@0 1195
aoqi@0 1196 bool SharkBlock::has_trap() {
aoqi@0 1197 return false;
aoqi@0 1198 }
aoqi@0 1199
aoqi@0 1200 int SharkBlock::trap_request() {
aoqi@0 1201 ShouldNotCallThis();
aoqi@0 1202 }
aoqi@0 1203
aoqi@0 1204 int SharkBlock::trap_bci() {
aoqi@0 1205 ShouldNotCallThis();
aoqi@0 1206 }
aoqi@0 1207
aoqi@0 1208 void SharkBlock::do_trap(int trap_request) {
aoqi@0 1209 ShouldNotCallThis();
aoqi@0 1210 }
aoqi@0 1211
aoqi@0 1212 void SharkBlock::do_arraylength() {
aoqi@0 1213 ShouldNotCallThis();
aoqi@0 1214 }
aoqi@0 1215
aoqi@0 1216 void SharkBlock::do_aload(BasicType basic_type) {
aoqi@0 1217 ShouldNotCallThis();
aoqi@0 1218 }
aoqi@0 1219
aoqi@0 1220 void SharkBlock::do_astore(BasicType basic_type) {
aoqi@0 1221 ShouldNotCallThis();
aoqi@0 1222 }
aoqi@0 1223
aoqi@0 1224 void SharkBlock::do_return(BasicType type) {
aoqi@0 1225 ShouldNotCallThis();
aoqi@0 1226 }
aoqi@0 1227
aoqi@0 1228 void SharkBlock::do_athrow() {
aoqi@0 1229 ShouldNotCallThis();
aoqi@0 1230 }
aoqi@0 1231
aoqi@0 1232 void SharkBlock::do_goto() {
aoqi@0 1233 ShouldNotCallThis();
aoqi@0 1234 }
aoqi@0 1235
aoqi@0 1236 void SharkBlock::do_jsr() {
aoqi@0 1237 ShouldNotCallThis();
aoqi@0 1238 }
aoqi@0 1239
aoqi@0 1240 void SharkBlock::do_ret() {
aoqi@0 1241 ShouldNotCallThis();
aoqi@0 1242 }
aoqi@0 1243
aoqi@0 1244 void SharkBlock::do_if(ICmpInst::Predicate p, SharkValue* b, SharkValue* a) {
aoqi@0 1245 ShouldNotCallThis();
aoqi@0 1246 }
aoqi@0 1247
aoqi@0 1248 void SharkBlock::do_switch() {
aoqi@0 1249 ShouldNotCallThis();
aoqi@0 1250 }
aoqi@0 1251
aoqi@0 1252 void SharkBlock::do_call() {
aoqi@0 1253 ShouldNotCallThis();
aoqi@0 1254 }
aoqi@0 1255
aoqi@0 1256 void SharkBlock::do_instance_check() {
aoqi@0 1257 ShouldNotCallThis();
aoqi@0 1258 }
aoqi@0 1259
aoqi@0 1260 bool SharkBlock::maybe_do_instanceof_if() {
aoqi@0 1261 ShouldNotCallThis();
aoqi@0 1262 }
aoqi@0 1263
aoqi@0 1264 void SharkBlock::do_new() {
aoqi@0 1265 ShouldNotCallThis();
aoqi@0 1266 }
aoqi@0 1267
aoqi@0 1268 void SharkBlock::do_newarray() {
aoqi@0 1269 ShouldNotCallThis();
aoqi@0 1270 }
aoqi@0 1271
aoqi@0 1272 void SharkBlock::do_anewarray() {
aoqi@0 1273 ShouldNotCallThis();
aoqi@0 1274 }
aoqi@0 1275
aoqi@0 1276 void SharkBlock::do_multianewarray() {
aoqi@0 1277 ShouldNotCallThis();
aoqi@0 1278 }
aoqi@0 1279
aoqi@0 1280 void SharkBlock::do_monitorenter() {
aoqi@0 1281 ShouldNotCallThis();
aoqi@0 1282 }
aoqi@0 1283
aoqi@0 1284 void SharkBlock::do_monitorexit() {
aoqi@0 1285 ShouldNotCallThis();
aoqi@0 1286 }

mercurial