From eb33409e8fa98627d9401c5f381b61cb4c819dc1 Mon Sep 17 00:00:00 2001 From: Manjunath Matti Date: Wed, 13 Nov 2024 06:06:23 +0000 Subject: [PATCH 1/4] Add support for load immediate on condition instructions --- src/hotspot/cpu/s390/assembler_s390.hpp | 12 +++++++++++- src/hotspot/cpu/s390/assembler_s390.inline.hpp | 5 +++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/hotspot/cpu/s390/assembler_s390.hpp b/src/hotspot/cpu/s390/assembler_s390.hpp index c98c100a06842..e177981b5eb44 100644 --- a/src/hotspot/cpu/s390/assembler_s390.hpp +++ b/src/hotspot/cpu/s390/assembler_s390.hpp @@ -637,6 +637,11 @@ class Assembler : public AbstractAssembler { #define LCDBR_ZOPC (unsigned int)(179 << 24 | 19 << 16) #define LCXBR_ZOPC (unsigned int)(179 << 24 | 67 << 16) + // Load Halfword Immediate on Condition + #define LOCHI_ZOPC (unsigned long)(0xECL << 40 | 0x42L) + #define LOCHHI_ZOPC (unsigned long)(0xECL << 40 | 0x4EL) + #define LOCGHI_ZOPC (unsigned long)(0xECL << 40 | 0x46L) + // Add // RR, signed #define AR_ZOPC (unsigned int)(26 << 8) @@ -987,7 +992,7 @@ class Assembler : public AbstractAssembler { #define BASR_ZOPC (unsigned int)(13 << 8) #define BCT_ZOPC (unsigned int)(70 << 24) #define BCTR_ZOPC (unsigned int)(6 << 8) -#define BCTG_ZOPC (unsigned int)(227L << 40 | 70) +#define BCTG_ZOPC (unsigned long)(227L << 40 | 70) #define BCTGR_ZOPC (unsigned long)(0xb946 << 16) // Absolute #define BC_ZOPC (unsigned int)(71 << 24) @@ -2065,6 +2070,11 @@ class Assembler : public AbstractAssembler { inline void z_llilh(Register r1, int64_t i2); // r1 = i2_imm16 ; uint64 <- (uint16<<16) inline void z_llill(Register r1, int64_t i2); // r1 = i2_imm16 ; uint64 <- uint16 + // load halfword immediate on condition + inline void z_lochi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[32-64] = i2_imm16 ; int32 <- int16 + inline void z_lochhi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[ 0-31] = i2_imm16 ; int32 <- int16 + inline void z_locghi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[ 0-63] = i2_imm16 ; int64 <- int16 + // insert immediate inline void z_ic( Register r1, int64_t d2, Register x2, Register b2); // insert character inline void z_icy( Register r1, int64_t d2, Register x2, Register b2); // insert character diff --git a/src/hotspot/cpu/s390/assembler_s390.inline.hpp b/src/hotspot/cpu/s390/assembler_s390.inline.hpp index 78ce87ddeb767..0f409de34ab97 100644 --- a/src/hotspot/cpu/s390/assembler_s390.inline.hpp +++ b/src/hotspot/cpu/s390/assembler_s390.inline.hpp @@ -245,6 +245,11 @@ inline void Assembler::z_stcm (Register r1, int64_t m3, int64_t d2, Register b2) inline void Assembler::z_stcmy(Register r1, int64_t m3, int64_t d2, Register b2) { emit_48( STCMY_ZOPC | regt(r1, 8, 48) | uimm4(m3, 12, 48) | rsymask_48(d2, b2)); } inline void Assembler::z_stcmh(Register r1, int64_t m3, int64_t d2, Register b2) { emit_48( STCMH_ZOPC | regt(r1, 8, 48) | uimm4(m3, 12, 48) | rsymask_48(d2, b2)); } +// load halfword immediate on condition +inline void Assembler::z_lochi(Register r1, int64_t i2, branch_condition m3) { emit_48( LOCHI_ZOPC | reg(r1, 8, 48) | simm16(i2, 16, 48) | uimm4(m3, 12, 48)); } +inline void Assembler::z_lochhi(Register r1, int64_t i2, branch_condition m3) { emit_48( LOCHHI_ZOPC | reg(r1, 8, 48) | simm16(i2, 16, 48) | uimm4(m3, 12, 48)); } +inline void Assembler::z_locghi(Register r1, int64_t i2, branch_condition m3) { emit_48( LOCGHI_ZOPC | reg(r1, 8, 48) | simm16(i2, 16, 48) | uimm4(m3, 12, 48)); } + // memory-immediate instructions (8-bit immediate) inline void Assembler::z_cli( int64_t d1, Register b1, int64_t i2) { emit_32( CLI_ZOPC | rsmask_32( d1, b1) | uimm8(i2, 8, 32)); } inline void Assembler::z_mvi( int64_t d1, Register b1, int64_t i2) { emit_32( MVI_ZOPC | rsmask_32( d1, b1) | imm8(i2, 8, 32)); } From c1e13655a0c8a237a01d378788f08b5ca689ecf2 Mon Sep 17 00:00:00 2001 From: Manjunath Matti Date: Wed, 13 Nov 2024 06:13:48 +0000 Subject: [PATCH 2/4] Update --- src/hotspot/cpu/s390/assembler_s390.hpp | 2 +- src/hotspot/cpu/s390/macroAssembler_s390.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/hotspot/cpu/s390/assembler_s390.hpp b/src/hotspot/cpu/s390/assembler_s390.hpp index e177981b5eb44..ffe31d41ac09b 100644 --- a/src/hotspot/cpu/s390/assembler_s390.hpp +++ b/src/hotspot/cpu/s390/assembler_s390.hpp @@ -993,7 +993,7 @@ class Assembler : public AbstractAssembler { #define BCT_ZOPC (unsigned int)(70 << 24) #define BCTR_ZOPC (unsigned int)(6 << 8) #define BCTG_ZOPC (unsigned long)(227L << 40 | 70) -#define BCTGR_ZOPC (unsigned long)(0xb946 << 16) +#define BCTGR_ZOPC (unsigned int)(0xb946 << 16) // Absolute #define BC_ZOPC (unsigned int)(71 << 24) #define BAL_ZOPC (unsigned int)(69 << 24) diff --git a/src/hotspot/cpu/s390/macroAssembler_s390.cpp b/src/hotspot/cpu/s390/macroAssembler_s390.cpp index 9e1c5cbced364..15c88e228fc98 100644 --- a/src/hotspot/cpu/s390/macroAssembler_s390.cpp +++ b/src/hotspot/cpu/s390/macroAssembler_s390.cpp @@ -3287,7 +3287,7 @@ void MacroAssembler::lookup_secondary_supers_table(Register r_sub_klass, z_bru(L_done); // pass whatever result we got from a slow path bind(L_failure); - // TODO: use load immediate on condition and z_bru above will not be required + z_lghi(r_result, 1); bind(L_done); From 31709a7d2162b51ccdda35f9921a33d9de4eb859 Mon Sep 17 00:00:00 2001 From: "Manjunath S Matti." <57791838+mmatti-sw@users.noreply.github.com> Date: Thu, 28 Nov 2024 12:39:23 +0530 Subject: [PATCH 3/4] Update src/hotspot/cpu/s390/assembler_s390.hpp Update the comments as suggested by Amit Kumar Co-authored-by: Amit Kumar --- src/hotspot/cpu/s390/assembler_s390.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hotspot/cpu/s390/assembler_s390.hpp b/src/hotspot/cpu/s390/assembler_s390.hpp index ffe31d41ac09b..349859e102fcc 100644 --- a/src/hotspot/cpu/s390/assembler_s390.hpp +++ b/src/hotspot/cpu/s390/assembler_s390.hpp @@ -2071,9 +2071,9 @@ class Assembler : public AbstractAssembler { inline void z_llill(Register r1, int64_t i2); // r1 = i2_imm16 ; uint64 <- uint16 // load halfword immediate on condition - inline void z_lochi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[32-64] = i2_imm16 ; int32 <- int16 - inline void z_lochhi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[ 0-31] = i2_imm16 ; int32 <- int16 - inline void z_locghi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[ 0-63] = i2_imm16 ; int64 <- int16 + inline void z_lochi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[32-63] = i2_simm16 ; int32 <- int16 + inline void z_lochhi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[ 0-31] = i2_simm16 ; int32 <- int16 + inline void z_locghi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[ 0-63] = i2_simm16 ; int64 <- int16 // insert immediate inline void z_ic( Register r1, int64_t d2, Register x2, Register b2); // insert character From 9f5f39675892a335f5426ed528d5c4182d291d6f Mon Sep 17 00:00:00 2001 From: Manjunath Matti Date: Mon, 2 Dec 2024 04:50:35 +0000 Subject: [PATCH 4/4] Updated based on review comments from Lutz. --- src/hotspot/cpu/s390/assembler_s390.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/hotspot/cpu/s390/assembler_s390.hpp b/src/hotspot/cpu/s390/assembler_s390.hpp index 349859e102fcc..f4f7e5cc6f27f 100644 --- a/src/hotspot/cpu/s390/assembler_s390.hpp +++ b/src/hotspot/cpu/s390/assembler_s390.hpp @@ -992,8 +992,8 @@ class Assembler : public AbstractAssembler { #define BASR_ZOPC (unsigned int)(13 << 8) #define BCT_ZOPC (unsigned int)(70 << 24) #define BCTR_ZOPC (unsigned int)(6 << 8) -#define BCTG_ZOPC (unsigned long)(227L << 40 | 70) -#define BCTGR_ZOPC (unsigned int)(0xb946 << 16) +#define BCTG_ZOPC (unsigned long)(227L << 40 | 70) +#define BCTGR_ZOPC (unsigned int)(0xb946 << 16) // Absolute #define BC_ZOPC (unsigned int)(71 << 24) #define BAL_ZOPC (unsigned int)(69 << 24) @@ -2071,7 +2071,7 @@ class Assembler : public AbstractAssembler { inline void z_llill(Register r1, int64_t i2); // r1 = i2_imm16 ; uint64 <- uint16 // load halfword immediate on condition - inline void z_lochi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[32-63] = i2_simm16 ; int32 <- int16 + inline void z_lochi( Register r1, int64_t i2, branch_condition m3); // load immediate r1[32-63] = i2_simm16 ; int32 <- int16 inline void z_lochhi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[ 0-31] = i2_simm16 ; int32 <- int16 inline void z_locghi(Register r1, int64_t i2, branch_condition m3); // load immediate r1[ 0-63] = i2_simm16 ; int64 <- int16