|
|
|
@ -65,6 +65,14 @@ void WriteStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& |
|
|
|
WriteStorage(ctx, binding, offset, value, ctx.storage_types.U32, sizeof(u32), |
|
|
|
&StorageDefinitions::U32, index_offset); |
|
|
|
} |
|
|
|
|
|
|
|
void WriteStorageByCasLoop(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, |
|
|
|
Id value, Id bit_offset, Id bit_count) { |
|
|
|
const Id pointer{StoragePointer(ctx, binding, offset, ctx.storage_types.U32, sizeof(u32), |
|
|
|
&StorageDefinitions::U32)}; |
|
|
|
ctx.OpFunctionCall(ctx.TypeVoid(), ctx.write_storage_cas_loop_func, pointer, value, bit_offset, |
|
|
|
bit_count); |
|
|
|
} |
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
void EmitLoadGlobalU8(EmitContext&) { |
|
|
|
@ -219,26 +227,42 @@ Id EmitLoadStorage128(EmitContext& ctx, const IR::Value& binding, const IR::Valu |
|
|
|
|
|
|
|
void EmitWriteStorageU8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, |
|
|
|
Id value) { |
|
|
|
WriteStorage(ctx, binding, offset, ctx.OpSConvert(ctx.U8, value), ctx.storage_types.U8, |
|
|
|
sizeof(u8), &StorageDefinitions::U8); |
|
|
|
if (ctx.profile.support_int8) { |
|
|
|
WriteStorage(ctx, binding, offset, ctx.OpSConvert(ctx.U8, value), ctx.storage_types.U8, |
|
|
|
sizeof(u8), &StorageDefinitions::U8); |
|
|
|
} else { |
|
|
|
WriteStorageByCasLoop(ctx, binding, offset, value, ctx.BitOffset8(offset), ctx.Const(8u)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void EmitWriteStorageS8(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, |
|
|
|
Id value) { |
|
|
|
WriteStorage(ctx, binding, offset, ctx.OpSConvert(ctx.S8, value), ctx.storage_types.S8, |
|
|
|
sizeof(s8), &StorageDefinitions::S8); |
|
|
|
if (ctx.profile.support_int8) { |
|
|
|
WriteStorage(ctx, binding, offset, ctx.OpSConvert(ctx.S8, value), ctx.storage_types.S8, |
|
|
|
sizeof(s8), &StorageDefinitions::S8); |
|
|
|
} else { |
|
|
|
WriteStorageByCasLoop(ctx, binding, offset, value, ctx.BitOffset8(offset), ctx.Const(8u)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void EmitWriteStorageU16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, |
|
|
|
Id value) { |
|
|
|
WriteStorage(ctx, binding, offset, ctx.OpSConvert(ctx.U16, value), ctx.storage_types.U16, |
|
|
|
sizeof(u16), &StorageDefinitions::U16); |
|
|
|
if (ctx.profile.support_int16) { |
|
|
|
WriteStorage(ctx, binding, offset, ctx.OpSConvert(ctx.U16, value), ctx.storage_types.U16, |
|
|
|
sizeof(u16), &StorageDefinitions::U16); |
|
|
|
} else { |
|
|
|
WriteStorageByCasLoop(ctx, binding, offset, value, ctx.BitOffset16(offset), ctx.Const(16u)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void EmitWriteStorageS16(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, |
|
|
|
Id value) { |
|
|
|
WriteStorage(ctx, binding, offset, ctx.OpSConvert(ctx.S16, value), ctx.storage_types.S16, |
|
|
|
sizeof(s16), &StorageDefinitions::S16); |
|
|
|
if (ctx.profile.support_int16) { |
|
|
|
WriteStorage(ctx, binding, offset, ctx.OpSConvert(ctx.S16, value), ctx.storage_types.S16, |
|
|
|
sizeof(s16), &StorageDefinitions::S16); |
|
|
|
} else { |
|
|
|
WriteStorageByCasLoop(ctx, binding, offset, value, ctx.BitOffset16(offset), ctx.Const(16u)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
void EmitWriteStorage32(EmitContext& ctx, const IR::Value& binding, const IR::Value& offset, |
|
|
|
|