Mercurial > hg > graal-compiler
comparison graal/GraalCompiler/src/com/sun/c1x/target/amd64/AMD64LIRGenerator.java @ 2519:f6125fb5bfbc
Removed intrinsics.
author | Thomas Wuerthinger <thomas@wuerthinger.net> |
---|---|
date | Wed, 27 Apr 2011 16:25:32 +0200 |
parents | 4fdef1464592 |
children | 2f271a85d104 |
comparison
equal
deleted
inserted
replaced
2516:a384fac3fd34 | 2519:f6125fb5bfbc |
---|---|
447 Util.unimplemented(); | 447 Util.unimplemented(); |
448 } | 448 } |
449 } | 449 } |
450 | 450 |
451 @Override | 451 @Override |
452 protected void genCompareAndSwap(Intrinsic x, CiKind kind) { | |
453 assert x.numberOfArguments() == 5 : "wrong number of arguments: " + x.numberOfArguments(); | |
454 // Argument 0 is the receiver. | |
455 LIRItem obj = new LIRItem(x.argumentAt(1), this); // object | |
456 LIRItem offset = new LIRItem(x.argumentAt(2), this); // offset of field | |
457 LIRItem val = new LIRItem(x.argumentAt(4), this); // replace field with val if matches cmp | |
458 | |
459 assert obj.instruction.kind.isObject() : "invalid type"; | |
460 | |
461 assert val.instruction.kind == kind : "invalid type"; | |
462 | |
463 // get address of field | |
464 obj.loadItem(); | |
465 offset.loadNonconstant(); | |
466 CiAddress addr; | |
467 if (offset.result().isConstant()) { | |
468 addr = new CiAddress(kind, obj.result(), (int) ((CiConstant) offset.result()).asLong()); | |
469 } else { | |
470 addr = new CiAddress(kind, obj.result(), offset.result()); | |
471 } | |
472 | |
473 // Compare operand needs to be in RAX. | |
474 CiValue cmp = force(x.argumentAt(3), AMD64.rax.asValue(kind)); | |
475 val.loadItem(); | |
476 | |
477 CiValue pointer = newVariable(CiKind.Word); | |
478 lir.lea(addr, pointer); | |
479 | |
480 if (kind.isObject()) { // Write-barrier needed for Object fields. | |
481 // Do the pre-write barrier : if any. | |
482 preGCWriteBarrier(pointer, false, null); | |
483 } | |
484 | |
485 if (kind.isObject()) { | |
486 lir.casObj(pointer, cmp, val.result()); | |
487 } else if (kind.isInt()) { | |
488 lir.casInt(pointer, cmp, val.result()); | |
489 } else if (kind.isLong()) { | |
490 lir.casLong(pointer, cmp, val.result()); | |
491 } else { | |
492 Util.shouldNotReachHere(); | |
493 } | |
494 | |
495 // generate conditional move of boolean result | |
496 CiValue result = createResultVariable(x); | |
497 lir.cmove(Condition.EQ, CiConstant.INT_1, CiConstant.INT_0, result); | |
498 if (kind.isObject()) { // Write-barrier needed for Object fields. | |
499 // Seems to be precise | |
500 postGCWriteBarrier(pointer, val.result()); | |
501 } | |
502 } | |
503 | |
504 @Override | |
505 protected void genMathIntrinsic(Intrinsic x) { | |
506 assert x.numberOfArguments() == 1 : "wrong type"; | |
507 | |
508 CiValue calcInput = load(x.argumentAt(0)); | |
509 | |
510 switch (x.intrinsic()) { | |
511 case java_lang_Math$abs: | |
512 lir.abs(calcInput, createResultVariable(x), ILLEGAL); | |
513 break; | |
514 case java_lang_Math$sqrt: | |
515 lir.sqrt(calcInput, createResultVariable(x), ILLEGAL); | |
516 break; | |
517 case java_lang_Math$sin: | |
518 setResult(x, callRuntimeWithResult(CiRuntimeCall.ArithmeticSin, null, calcInput)); | |
519 break; | |
520 case java_lang_Math$cos: | |
521 setResult(x, callRuntimeWithResult(CiRuntimeCall.ArithmeticCos, null, calcInput)); | |
522 break; | |
523 case java_lang_Math$tan: | |
524 setResult(x, callRuntimeWithResult(CiRuntimeCall.ArithmeticTan, null, calcInput)); | |
525 break; | |
526 case java_lang_Math$log: | |
527 setResult(x, callRuntimeWithResult(CiRuntimeCall.ArithmeticLog, null, calcInput)); | |
528 break; | |
529 case java_lang_Math$log10: | |
530 setResult(x, callRuntimeWithResult(CiRuntimeCall.ArithmeticLog10, null, calcInput)); | |
531 break; | |
532 default: | |
533 Util.shouldNotReachHere("Unknown math intrinsic"); | |
534 } | |
535 } | |
536 | |
537 @Override | |
538 public void visitConvert(Convert x) { | 452 public void visitConvert(Convert x) { |
539 CiValue input = load(x.value()); | 453 CiValue input = load(x.value()); |
540 CiVariable result = newVariable(x.kind); | 454 CiVariable result = newVariable(x.kind); |
541 // arguments of lirConvert | 455 // arguments of lirConvert |
542 GlobalStub globalStub = null; | 456 GlobalStub globalStub = null; |