From 76cb3b36be85667750fca6ce15dd5661b4abe47e Mon Sep 17 00:00:00 2001 From: Rerumu Date: Wed, 29 Jun 2022 23:55:08 -0400 Subject: [PATCH] Add `i64` sign extension for `i8` and `i16` --- codegen/luau/runtime/runtime.lua | 32 ++++++++++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/codegen/luau/runtime/runtime.lua b/codegen/luau/runtime/runtime.lua index b64820b..c032476 100644 --- a/codegen/luau/runtime/runtime.lua +++ b/codegen/luau/runtime/runtime.lua @@ -14,8 +14,8 @@ local function to_i32(num) if num >= 0x80000000 then return num - 0x100000000 else - return num -end + return num + end end local function no_op(num) @@ -442,6 +442,34 @@ do end end + function extend.i64_i8(num) + local data_1, _ = num_into_u32(num) + + data_1 = bit_and(data_1, 0xFF) + + if data_1 >= 0x80 then + local temp = num_from_u32(-data_1 + 0x100, 0) + + return num_negate(temp) + else + return num_from_u32(data_1, 0) + end + end + + function extend.i64_i16(num) + local data_1, _ = num_into_u32(num) + + data_1 = bit_and(data_1, 0xFFFF) + + if data_1 >= 0x8000 then + local temp = num_from_u32(-data_1 + 0x10000, 0) + + return num_negate(temp) + else + return num_from_u32(data_1, 0) + end + end + function extend.i64_i32(num) if num >= 0x80000000 then local temp = num_from_u32(-num + 0x100000000, 0)