< prev index next >

src/hotspot/cpu/arm/templateTable_arm.cpp

Print this page




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);


< prev index next >