Skip to content

Commit a45cd94

Browse files
committed
Implement double-to-integer conversions for s390x
luajit2 currently does not link on s390x because double-to-integer conversion functions are missing. lj_vm_num2u64() is slightly different, because the hardware indicates overflow differently. Implement them similarly to how x86_64 does it.
1 parent ccdd329 commit a45cd94

2 files changed

Lines changed: 49 additions & 0 deletions

File tree

dynasm/dasm_s390x.lua

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,14 @@ local function parse_mask2(mask)
542542
end
543543
end
544544

545+
local function parse_condition_mask(mask)
546+
local m = parse_number(mask)
547+
if m >= 0 and m <= 15 then
548+
return m
549+
end
550+
werror("Mask value should be 0-15: ", m)
551+
end
552+
545553
local function parse_label(label, def)
546554
local prefix = sub(label, 1, 2)
547555
-- =>label (pc label reference)
@@ -728,6 +736,7 @@ map_op = {
728736
clclu_3 = "eb000000008fRSY-a",
729737
clfi_2 = "c20f00000000RIL-a",
730738
clg_2 = "e30000000021RXY-a",
739+
clgdbr_3 = "0000b3ad0000RRF-e",
731740
clgf_2 = "e30000000031RXY-a",
732741
clgfi_2 = "c20e00000000RIL-a",
733742
clgfr_2 = "0000b9310000RRE",
@@ -965,6 +974,7 @@ map_op = {
965974
lnxr_2 = "0000b3610000RRE",
966975
loc_3 = "eb00000000f2RSY-b",
967976
locg_3 = "eb00000000e2RSY-b",
977+
locgr_3 = "0000b9e20000RRF-c",
968978
lpdbr_2 = "0000b3100000RRE",
969979
lpdfr_2 = "0000b3700000RRE",
970980
lpdr_2 = "000000002000RR",
@@ -1329,6 +1339,10 @@ local function parse_template(params, template, nparams, pos)
13291339
wputhw(op1)
13301340
op2 = op2 + shl(parse_reg(params[1]), 4) + shl(parse_reg(params[2]), 12) + parse_reg(params[3]) + shl(parse_mask(params[4]), 8)
13311341
wputhw(op2)
1342+
elseif p == "RRF-c" then
1343+
wputhw(op1)
1344+
op2 = op2 + shl(parse_reg(params[1]), 4) + parse_reg(params[2]) + shl(parse_condition_mask(params[3]), 12)
1345+
wputhw(op2)
13321346
elseif p == "RRF-e" then
13331347
wputhw(op1)
13341348
op2 = op2 + shl(parse_reg(params[1]), 4) + shl(parse_mask(params[2]), 12) + parse_reg(params[3])

src/vm_s390x.dasc

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2147,6 +2147,41 @@ static void build_subroutines(BuildCtx *ctx)
21472147
| stg r0, 0
21482148
| stg r0, 0
21492149
|
2150+
|// int64_t lj_vm_num2int_check(double x)
2151+
|->vm_num2int_check:
2152+
| llihh r2, 0x8000
2153+
| oilh r2, 0x8000
2154+
| cfdbr r1, 5, f0
2155+
| llgfr r0, r1
2156+
| cdfbr f2, r1
2157+
| cdbr f2, f0
2158+
| locgr r2, r0, 8
2159+
| br r14
2160+
|
2161+
|// int64_t lj_vm_num2i64(double x)
2162+
|->vm_num2i64:
2163+
| cgdbr r2, 5, f0
2164+
| br r14
2165+
|
2166+
|// uint64_t lj_vm_num2u64(double x)
2167+
|->vm_num2u64:
2168+
| llihh r0, 0x8000
2169+
| oill r0, 1
2170+
| clgdbr r1, 5, f0
2171+
| cgdbr r2, 5, f0 // Overflow: (1 << 63) - 1 or 1 << 63
2172+
| agr r0, r2 // Add (1 << 63) + 1
2173+
| clgfi r0, 2 // Overflow: 0 or 1
2174+
| locgr r2, r1, 4
2175+
| br r14
2176+
|
2177+
|// int32_t lj_vm_tobit(double x)
2178+
|->vm_tobit:
2179+
| bfpconst_tobit f2, r2
2180+
| adbr f0, f2
2181+
| lgdr r2, f0
2182+
| lgfr r2, r2
2183+
| br r14
2184+
|
21502185
|//-----------------------------------------------------------------------
21512186
|//-- Assertions ---------------------------------------------------------
21522187
|//-----------------------------------------------------------------------

0 commit comments

Comments
 (0)