From 8407ac0eca109d466b388d04b29f12f21265a1e0 Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Wed, 19 Jan 2011 02:05:12 +0100 Subject: [PATCH] Add volatile XLOADs. --- lib/dump.lua | 2 +- src/lj_ir.h | 3 ++- src/lj_opt_mem.c | 5 ++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/dump.lua b/lib/dump.lua index d79ae8b6..555b4b45 100644 --- a/lib/dump.lua +++ b/lib/dump.lua @@ -234,7 +234,7 @@ local litname = { t[mode] = s return s end}), - ["XLOAD "] = { [0] = "", "R", "U", "RU", }, + ["XLOAD "] = { [0] = "", "R", "V", "RV", "U", "RU", "VU", "RVU", }, ["CONV "] = setmetatable({}, { __index = function(t, mode) local s = irtype[band(mode, 31)] s = irtype[band(shr(mode, 5), 31)].."."..s diff --git a/src/lj_ir.h b/src/lj_ir.h index d3104017..68901325 100644 --- a/src/lj_ir.h +++ b/src/lj_ir.h @@ -206,7 +206,8 @@ IRFLDEF(FLENUM) /* XLOAD mode, stored in op2. */ #define IRXLOAD_READONLY 1 /* Load from read-only data. */ -#define IRXLOAD_UNALIGNED 2 /* Unaligned load. */ +#define IRXLOAD_VOLATILE 2 /* Load from volatile data. */ +#define IRXLOAD_UNALIGNED 4 /* Unaligned load. */ /* CONV mode, stored in op2. */ #define IRCONV_SRCMASK 0x001f /* Source IRType. */ diff --git a/src/lj_opt_mem.c b/src/lj_opt_mem.c index 9c22362b..cad85bb7 100644 --- a/src/lj_opt_mem.c +++ b/src/lj_opt_mem.c @@ -669,6 +669,8 @@ TRef LJ_FASTCALL lj_opt_fwd_xload(jit_State *J) if ((fins->op2 & IRXLOAD_READONLY)) goto cselim; + if ((fins->op2 & IRXLOAD_VOLATILE)) + goto doemit; /* Search for conflicting stores. */ ref = J->chain[IR_XSTORE]; @@ -721,7 +723,8 @@ cselim: xr = IR(xref); goto retry; /* Retry with the reassociated reference. */ } - return lj_ir_emit(J); +doemit: + return EMITFOLD; } /* XSTORE elimination. */