|
|
@ -31,6 +31,7 @@ std::pair<Id, Id> ExtractArgs(EmitContext& ctx, Id offset, u32 mask, u32 count) |
|
|
} // Anonymous namespace
|
|
|
} // Anonymous namespace
|
|
|
|
|
|
|
|
|
Id EmitLoadSharedU8(EmitContext& ctx, Id offset) { |
|
|
Id EmitLoadSharedU8(EmitContext& ctx, Id offset) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 1); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{ |
|
|
const Id pointer{ |
|
|
ctx.OpAccessChain(ctx.shared_u8, ctx.shared_memory_u8, ctx.u32_zero_value, offset)}; |
|
|
ctx.OpAccessChain(ctx.shared_u8, ctx.shared_memory_u8, ctx.u32_zero_value, offset)}; |
|
|
@ -42,6 +43,7 @@ Id EmitLoadSharedU8(EmitContext& ctx, Id offset) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Id EmitLoadSharedS8(EmitContext& ctx, Id offset) { |
|
|
Id EmitLoadSharedS8(EmitContext& ctx, Id offset) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 1); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{ |
|
|
const Id pointer{ |
|
|
ctx.OpAccessChain(ctx.shared_u8, ctx.shared_memory_u8, ctx.u32_zero_value, offset)}; |
|
|
ctx.OpAccessChain(ctx.shared_u8, ctx.shared_memory_u8, ctx.u32_zero_value, offset)}; |
|
|
@ -53,6 +55,7 @@ Id EmitLoadSharedS8(EmitContext& ctx, Id offset) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Id EmitLoadSharedU16(EmitContext& ctx, Id offset) { |
|
|
Id EmitLoadSharedU16(EmitContext& ctx, Id offset) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 2); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u16, ctx.shared_memory_u16, offset, 1)}; |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u16, ctx.shared_memory_u16, offset, 1)}; |
|
|
return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, pointer)); |
|
|
return ctx.OpUConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, pointer)); |
|
|
@ -63,6 +66,7 @@ Id EmitLoadSharedU16(EmitContext& ctx, Id offset) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Id EmitLoadSharedS16(EmitContext& ctx, Id offset) { |
|
|
Id EmitLoadSharedS16(EmitContext& ctx, Id offset) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 2); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u16, ctx.shared_memory_u16, offset, 1)}; |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u16, ctx.shared_memory_u16, offset, 1)}; |
|
|
return ctx.OpSConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, pointer)); |
|
|
return ctx.OpSConvert(ctx.U32[1], ctx.OpLoad(ctx.U16, pointer)); |
|
|
@ -73,6 +77,7 @@ Id EmitLoadSharedS16(EmitContext& ctx, Id offset) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Id EmitLoadSharedU32(EmitContext& ctx, Id offset) { |
|
|
Id EmitLoadSharedU32(EmitContext& ctx, Id offset) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 4); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32, ctx.shared_memory_u32, offset, 2)}; |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32, ctx.shared_memory_u32, offset, 2)}; |
|
|
return ctx.OpLoad(ctx.U32[1], pointer); |
|
|
return ctx.OpLoad(ctx.U32[1], pointer); |
|
|
@ -82,6 +87,7 @@ Id EmitLoadSharedU32(EmitContext& ctx, Id offset) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Id EmitLoadSharedU64(EmitContext& ctx, Id offset) { |
|
|
Id EmitLoadSharedU64(EmitContext& ctx, Id offset) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 8); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x2, ctx.shared_memory_u32x2, offset, 3)}; |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x2, ctx.shared_memory_u32x2, offset, 3)}; |
|
|
return ctx.OpLoad(ctx.U32[2], pointer); |
|
|
return ctx.OpLoad(ctx.U32[2], pointer); |
|
|
@ -97,6 +103,7 @@ Id EmitLoadSharedU64(EmitContext& ctx, Id offset) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
Id EmitLoadSharedU128(EmitContext& ctx, Id offset) { |
|
|
Id EmitLoadSharedU128(EmitContext& ctx, Id offset) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 16); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x4, ctx.shared_memory_u32x4, offset, 4)}; |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x4, ctx.shared_memory_u32x4, offset, 4)}; |
|
|
return ctx.OpLoad(ctx.U32[4], pointer); |
|
|
return ctx.OpLoad(ctx.U32[4], pointer); |
|
|
@ -113,6 +120,7 @@ Id EmitLoadSharedU128(EmitContext& ctx, Id offset) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void EmitWriteSharedU8(EmitContext& ctx, Id offset, Id value) { |
|
|
void EmitWriteSharedU8(EmitContext& ctx, Id offset, Id value) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 1); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{ |
|
|
const Id pointer{ |
|
|
ctx.OpAccessChain(ctx.shared_u8, ctx.shared_memory_u8, ctx.u32_zero_value, offset)}; |
|
|
ctx.OpAccessChain(ctx.shared_u8, ctx.shared_memory_u8, ctx.u32_zero_value, offset)}; |
|
|
@ -123,6 +131,7 @@ void EmitWriteSharedU8(EmitContext& ctx, Id offset, Id value) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void EmitWriteSharedU16(EmitContext& ctx, Id offset, Id value) { |
|
|
void EmitWriteSharedU16(EmitContext& ctx, Id offset, Id value) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 2); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u16, ctx.shared_memory_u16, offset, 1)}; |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u16, ctx.shared_memory_u16, offset, 1)}; |
|
|
ctx.OpStore(pointer, ctx.OpUConvert(ctx.U16, value)); |
|
|
ctx.OpStore(pointer, ctx.OpUConvert(ctx.U16, value)); |
|
|
@ -132,6 +141,7 @@ void EmitWriteSharedU16(EmitContext& ctx, Id offset, Id value) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value) { |
|
|
void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 4); |
|
|
Id pointer{}; |
|
|
Id pointer{}; |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
pointer = Pointer(ctx, ctx.shared_u32, ctx.shared_memory_u32, offset, 2); |
|
|
pointer = Pointer(ctx, ctx.shared_u32, ctx.shared_memory_u32, offset, 2); |
|
|
@ -144,6 +154,7 @@ void EmitWriteSharedU32(EmitContext& ctx, Id offset, Id value) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value) { |
|
|
void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 8); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x2, ctx.shared_memory_u32x2, offset, 3)}; |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x2, ctx.shared_memory_u32x2, offset, 3)}; |
|
|
ctx.OpStore(pointer, value); |
|
|
ctx.OpStore(pointer, value); |
|
|
@ -159,6 +170,7 @@ void EmitWriteSharedU64(EmitContext& ctx, Id offset, Id value) { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value) { |
|
|
void EmitWriteSharedU128(EmitContext& ctx, Id offset, Id value) { |
|
|
|
|
|
offset = ctx.BoundSharedOffset(offset, 16); |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
if (ctx.uses_explicit_workgroup_layout) { |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x4, ctx.shared_memory_u32x4, offset, 4)}; |
|
|
const Id pointer{Pointer(ctx, ctx.shared_u32x4, ctx.shared_memory_u32x4, offset, 4)}; |
|
|
ctx.OpStore(pointer, value); |
|
|
ctx.OpStore(pointer, value); |
|
|
|