1593 1594 1595 void TemplateTable::lushr() { 1596 transition(itos, ltos); 1597 const Register shift_cnt = R4_tmp; 1598 const Register val_lo = R2_tmp; 1599 const Register val_hi = R3_tmp; 1600 1601 __ pop_l(val_lo, val_hi); 1602 __ andr(shift_cnt, R0_tos, 63); 1603 __ long_shift(R0_tos_lo, R1_tos_hi, val_lo, val_hi, lsr, shift_cnt); 1604 } 1605 1606 1607 void TemplateTable::fop2(Operation op) { 1608 transition(ftos, ftos); 1609 #ifdef __SOFTFP__ 1610 __ mov(R1, R0_tos); 1611 __ pop_i(R0); 1612 switch (op) { 1613 case add: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fadd_glibc), R0, R1); break; 1614 case sub: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fsub_glibc), R0, R1); break; 1615 case mul: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fmul), R0, R1); break; 1616 case div: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fdiv), R0, R1); break; 1617 case rem: __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), R0, R1); break; 1618 default : ShouldNotReachHere(); 1619 } 1620 #else 1621 const FloatRegister arg1 = S1_tmp; 1622 const FloatRegister arg2 = S0_tos; 1623 1624 switch (op) { 1625 case add: __ pop_f(arg1); __ add_float(S0_tos, arg1, arg2); break; 1626 case sub: __ pop_f(arg1); __ sub_float(S0_tos, arg1, arg2); break; 1627 case mul: __ pop_f(arg1); __ mul_float(S0_tos, arg1, arg2); break; 1628 case div: __ pop_f(arg1); __ div_float(S0_tos, arg1, arg2); break; 1629 case rem: 1630 #ifndef __ABI_HARD__ 1631 __ pop_f(arg1); 1632 __ fmrs(R0, arg1); 1633 __ fmrs(R1, arg2); 1634 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), R0, R1); 1635 __ fmsr(S0_tos, R0); 1636 #else 1637 __ mov_float(S1_reg, arg2); 1638 __ pop_f(S0); 1639 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem)); 1640 #endif // !__ABI_HARD__ 1641 break; 1642 default : ShouldNotReachHere(); 1643 } 1644 #endif // __SOFTFP__ 1645 } 1646 1647 1648 void TemplateTable::dop2(Operation op) { 1649 transition(dtos, dtos); 1650 #ifdef __SOFTFP__ 1651 __ mov(R2, R0_tos_lo); 1652 __ mov(R3, R1_tos_hi); 1653 __ pop_l(R0, R1); 1654 switch (op) { 1655 // __aeabi_XXXX_glibc: Imported code from glibc soft-fp bundle for calculation accuracy improvement. See CR 6757269. 1656 case add: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dadd_glibc), R0, R1, R2, R3); break; 1657 case sub: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dsub_glibc), R0, R1, R2, R3); break; 1658 case mul: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dmul), R0, R1, R2, R3); break; 1659 case div: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_ddiv), R0, R1, R2, R3); break; 1660 case rem: __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), R0, R1, R2, R3); break; 1661 default : ShouldNotReachHere(); 1662 } 1663 #else 1664 const FloatRegister arg1 = D1_tmp; 1665 const FloatRegister arg2 = D0_tos; 1666 1667 switch (op) { 1668 case add: __ pop_d(arg1); __ add_double(D0_tos, arg1, arg2); break; 1669 case sub: __ pop_d(arg1); __ sub_double(D0_tos, arg1, arg2); break; 1670 case mul: __ pop_d(arg1); __ mul_double(D0_tos, arg1, arg2); break; 1671 case div: __ pop_d(arg1); __ div_double(D0_tos, arg1, arg2); break; 1672 case rem: 1673 #ifndef __ABI_HARD__ 1674 __ pop_d(arg1); 1675 __ fmrrd(R0, R1, arg1); 1676 __ fmrrd(R2, R3, arg2); 1677 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), R0, R1, R2, R3); | 1593 1594 1595 void TemplateTable::lushr() { 1596 transition(itos, ltos); 1597 const Register shift_cnt = R4_tmp; 1598 const Register val_lo = R2_tmp; 1599 const Register val_hi = R3_tmp; 1600 1601 __ pop_l(val_lo, val_hi); 1602 __ andr(shift_cnt, R0_tos, 63); 1603 __ long_shift(R0_tos_lo, R1_tos_hi, val_lo, val_hi, lsr, shift_cnt); 1604 } 1605 1606 1607 void TemplateTable::fop2(Operation op) { 1608 transition(ftos, ftos); 1609 #ifdef __SOFTFP__ 1610 __ mov(R1, R0_tos); 1611 __ pop_i(R0); 1612 switch (op) { 1613 // __aeabi_XXXX_extlib: Optional wrapper around SoftFloat-3e 1614 // for calculation accuracy improvement. See CR 6757269, JDK-8215902. 1615 case add: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fadd_extlib), R0, R1); break; 1616 case sub: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fsub_extlib), R0, R1); break; 1617 case mul: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fmul), R0, R1); break; 1618 case div: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_fdiv), R0, R1); break; 1619 case rem: __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), R0, R1); break; 1620 default : ShouldNotReachHere(); 1621 } 1622 #else 1623 const FloatRegister arg1 = S1_tmp; 1624 const FloatRegister arg2 = S0_tos; 1625 1626 switch (op) { 1627 case add: __ pop_f(arg1); __ add_float(S0_tos, arg1, arg2); break; 1628 case sub: __ pop_f(arg1); __ sub_float(S0_tos, arg1, arg2); break; 1629 case mul: __ pop_f(arg1); __ mul_float(S0_tos, arg1, arg2); break; 1630 case div: __ pop_f(arg1); __ div_float(S0_tos, arg1, arg2); break; 1631 case rem: 1632 #ifndef __ABI_HARD__ 1633 __ pop_f(arg1); 1634 __ fmrs(R0, arg1); 1635 __ fmrs(R1, arg2); 1636 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem), R0, R1); 1637 __ fmsr(S0_tos, R0); 1638 #else 1639 __ mov_float(S1_reg, arg2); 1640 __ pop_f(S0); 1641 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::frem)); 1642 #endif // !__ABI_HARD__ 1643 break; 1644 default : ShouldNotReachHere(); 1645 } 1646 #endif // __SOFTFP__ 1647 } 1648 1649 1650 void TemplateTable::dop2(Operation op) { 1651 transition(dtos, dtos); 1652 #ifdef __SOFTFP__ 1653 __ mov(R2, R0_tos_lo); 1654 __ mov(R3, R1_tos_hi); 1655 __ pop_l(R0, R1); 1656 switch (op) { 1657 // __aeabi_XXXX_extlib: Optional wrapper around SoftFloat-3e 1658 // for calculation accuracy improvement. See CR 6757269, JDK-8215902. 1659 case add: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dadd_extlib), R0, R1, R2, R3); break; 1660 case sub: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dsub_extlib), R0, R1, R2, R3); break; 1661 case mul: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_dmul), R0, R1, R2, R3); break; 1662 case div: __ call_VM_leaf(CAST_FROM_FN_PTR(address, __aeabi_ddiv), R0, R1, R2, R3); break; 1663 case rem: __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), R0, R1, R2, R3); break; 1664 default : ShouldNotReachHere(); 1665 } 1666 #else 1667 const FloatRegister arg1 = D1_tmp; 1668 const FloatRegister arg2 = D0_tos; 1669 1670 switch (op) { 1671 case add: __ pop_d(arg1); __ add_double(D0_tos, arg1, arg2); break; 1672 case sub: __ pop_d(arg1); __ sub_double(D0_tos, arg1, arg2); break; 1673 case mul: __ pop_d(arg1); __ mul_double(D0_tos, arg1, arg2); break; 1674 case div: __ pop_d(arg1); __ div_double(D0_tos, arg1, arg2); break; 1675 case rem: 1676 #ifndef __ABI_HARD__ 1677 __ pop_d(arg1); 1678 __ fmrrd(R0, R1, arg1); 1679 __ fmrrd(R2, R3, arg2); 1680 __ call_VM_leaf(CAST_FROM_FN_PTR(address, SharedRuntime::drem), R0, R1, R2, R3); |