Moving LoadAcquire/StoreRelease behavior up into HIR.
This commit is contained in:
@@ -874,17 +874,6 @@ Value* HIRBuilder::Load(
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::LoadAcquire(
|
||||
Value* address, TypeName type, uint32_t load_flags) {
|
||||
ASSERT_ADDRESS_TYPE(address);
|
||||
Instr* i = AppendInstr(
|
||||
OPCODE_LOAD_ACQUIRE_info, load_flags,
|
||||
AllocValue(type));
|
||||
i->set_src1(address);
|
||||
i->src2.value = i->src3.value = NULL;
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
void HIRBuilder::Store(
|
||||
Value* address, Value* value, uint32_t store_flags) {
|
||||
ASSERT_ADDRESS_TYPE(address);
|
||||
@@ -894,17 +883,6 @@ void HIRBuilder::Store(
|
||||
i->src3.value = NULL;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::StoreRelease(
|
||||
Value* address, Value* value, uint32_t store_flags) {
|
||||
ASSERT_ADDRESS_TYPE(address);
|
||||
Instr* i = AppendInstr(OPCODE_STORE_RELEASE_info, store_flags,
|
||||
AllocValue(INT8_TYPE));
|
||||
i->set_src1(address);
|
||||
i->set_src2(value);
|
||||
i->src3.value = NULL;
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
void HIRBuilder::Prefetch(
|
||||
Value* address, size_t length, uint32_t prefetch_flags) {
|
||||
ASSERT_ADDRESS_TYPE(address);
|
||||
@@ -1625,6 +1603,18 @@ Value* HIRBuilder::CompareExchange(
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::AtomicExchange(Value* address, Value* new_value) {
|
||||
ASSERT_ADDRESS_TYPE(address);
|
||||
ASSERT_INTEGER_TYPE(new_value);
|
||||
Instr* i = AppendInstr(
|
||||
OPCODE_ATOMIC_EXCHANGE_info, 0,
|
||||
AllocValue(new_value->type));
|
||||
i->set_src1(address);
|
||||
i->set_src2(new_value);
|
||||
i->src3.value = NULL;
|
||||
return i->dest;
|
||||
}
|
||||
|
||||
Value* HIRBuilder::AtomicAdd(Value* address, Value* value) {
|
||||
ASSERT_ADDRESS_TYPE(address);
|
||||
ASSERT_INTEGER_TYPE(value);
|
||||
|
||||
@@ -121,9 +121,7 @@ public:
|
||||
void StoreContext(size_t offset, Value* value);
|
||||
|
||||
Value* Load(Value* address, TypeName type, uint32_t load_flags = 0);
|
||||
Value* LoadAcquire(Value* address, TypeName type, uint32_t load_flags = 0);
|
||||
void Store(Value* address, Value* value, uint32_t store_flags = 0);
|
||||
Value* StoreRelease(Value* address, Value* value, uint32_t store_flags = 0);
|
||||
void Prefetch(Value* address, size_t length, uint32_t prefetch_flags = 0);
|
||||
|
||||
Value* Max(Value* value1, Value* value2);
|
||||
@@ -195,6 +193,7 @@ public:
|
||||
|
||||
Value* CompareExchange(Value* address,
|
||||
Value* compare_value, Value* exchange_value);
|
||||
Value* AtomicExchange(Value* address, Value* new_value);
|
||||
Value* AtomicAdd(Value* address, Value* value);
|
||||
Value* AtomicSub(Value* address, Value* value);
|
||||
|
||||
|
||||
@@ -104,9 +104,7 @@ enum Opcode {
|
||||
OPCODE_STORE_CONTEXT,
|
||||
|
||||
OPCODE_LOAD,
|
||||
OPCODE_LOAD_ACQUIRE,
|
||||
OPCODE_STORE,
|
||||
OPCODE_STORE_RELEASE,
|
||||
OPCODE_PREFETCH,
|
||||
|
||||
OPCODE_MAX,
|
||||
@@ -165,6 +163,7 @@ enum Opcode {
|
||||
OPCODE_SWIZZLE,
|
||||
|
||||
OPCODE_COMPARE_EXCHANGE,
|
||||
OPCODE_ATOMIC_EXCHANGE,
|
||||
OPCODE_ATOMIC_ADD,
|
||||
OPCODE_ATOMIC_SUB,
|
||||
|
||||
|
||||
@@ -188,24 +188,12 @@ DEFINE_OPCODE(
|
||||
OPCODE_SIG_V_V,
|
||||
OPCODE_FLAG_MEMORY);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_LOAD_ACQUIRE,
|
||||
"load_acquire",
|
||||
OPCODE_SIG_V_V,
|
||||
OPCODE_FLAG_MEMORY | OPCODE_FLAG_VOLATILE);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_STORE,
|
||||
"store",
|
||||
OPCODE_SIG_X_V_V,
|
||||
OPCODE_FLAG_MEMORY);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_STORE_RELEASE,
|
||||
"store_release",
|
||||
OPCODE_SIG_V_V_V,
|
||||
OPCODE_FLAG_MEMORY | OPCODE_FLAG_VOLATILE);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_PREFETCH,
|
||||
"prefetch",
|
||||
@@ -517,6 +505,12 @@ DEFINE_OPCODE(
|
||||
OPCODE_SIG_V_V_V_V,
|
||||
OPCODE_FLAG_VOLATILE);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_ATOMIC_EXCHANGE,
|
||||
"atomic_exchange",
|
||||
OPCODE_SIG_V_V_V,
|
||||
OPCODE_FLAG_VOLATILE);
|
||||
|
||||
DEFINE_OPCODE(
|
||||
OPCODE_ATOMIC_ADD,
|
||||
"atomic_add",
|
||||
|
||||
Reference in New Issue
Block a user