Add runtime markers for a full-width 32x32 multiply (0x12345678 * 0x9abcdef0 = 0x242d2080) and for a wide-dividend remainder, so a 16-bit-truncated MPYS or a wrong FS1 cannot still produce the expected small results. Compute the 16x16 unsigned product in unsigned arithmetic to remove the signed-overflow annotation, and reject a regressed nuw nsw multiply in the optimized IR.
55 lines
1.8 KiB
Lua
55 lines
1.8 KiB
Lua
-- mul-check.lua -- M4 multiply/divide and -O2 loop markers.
|
|
--
|
|
-- M4_LOADER_LUA path to vendor/vt1200/dwt/loader/loader.lua
|
|
-- LOADER_END loader inspection/exit frame
|
|
--
|
|
-- Markers (0x20 bits apart):
|
|
-- 018A8000 mul(6,7) == 42
|
|
-- 018A8020 umul16(0xffff,0xffff) == 0xfffe0001
|
|
-- 018A8040 sdiv(100,7) == 14
|
|
-- 018A8060 udiv(0xfffffffe,7) == 613566756
|
|
-- 018A8080 srem(100,7) == 2
|
|
-- 018A80A0 urem(100,7) == 2
|
|
-- 018A80C0 sdiv(-100,7) == -14
|
|
-- 018A80E0 srem(-100,7) == -2
|
|
-- 018A8100 sumto(10) == 55
|
|
-- 018A8120 squares(5) == 30
|
|
-- 018A8140 mul(0x12345678,0x9abcdef0) == 0x242d2080
|
|
-- 018A8160 urem(0xfffffffe,7) == 2
|
|
|
|
dofile(os.getenv("M4_LOADER_LUA"))
|
|
|
|
local ENDF = tonumber(os.getenv("LOADER_END") or "2700")
|
|
|
|
local frames = 0
|
|
local checked = false
|
|
|
|
emu.register_frame_done(function()
|
|
frames = frames + 1
|
|
if frames == ENDF - 1 and not checked then
|
|
checked = true
|
|
local prog = manager.machine.devices[':maincpu'].spaces['program']
|
|
local m = {}
|
|
for i = 0, 11 do
|
|
m[i] = prog:read_u32(0x018A8000 + i * 0x20)
|
|
end
|
|
print(string.format(
|
|
"M4: mul=%d umul16=%d sdiv=%d udiv=%d srem=%d urem=%d sdivneg=%d sremneg=%d sumto=%d squares=%d widemul=%d widerem=%d",
|
|
m[0], m[1], m[2], m[3], m[4], m[5], m[6], m[7], m[8], m[9],
|
|
m[10], m[11]))
|
|
local want = {42, 0xfffe0001, 14, 613566756, 2, 2,
|
|
0xfffffff2, 0xfffffffe, 55, 30, 0x242d2080, 2}
|
|
local ok = true
|
|
for i = 0, 11 do
|
|
if m[i] ~= want[i + 1] then
|
|
ok = false
|
|
end
|
|
end
|
|
if ok then
|
|
print("M4 MAME: PASS")
|
|
else
|
|
print("M4 MAME: FAIL (want mul=42 umul16=4294836225 sdiv=14 udiv=613566756 srem=2 urem=2 sdivneg=-14 sremneg=-2 sumto=55 squares=30 widemul=606937216 widerem=2)")
|
|
end
|
|
end
|
|
end, "mul-check")
|