handle OpSRem

This commit is contained in:
Jin Zhou 2018-05-24 01:17:47 -04:00 committed by Hans-Kristian Arntzen
parent e792cd6160
commit 6b144cc609
2 changed files with 59 additions and 1 deletions

View File

@ -0,0 +1,44 @@
; SPIR-V
; Version: 1.0
; Generator: Khronos Glslang Reference Front End; 2
; Bound: 23
; Schema: 0
OpCapability Shader
%1 = OpExtInstImport "GLSL.std.450"
OpMemoryModel Logical GLSL450
OpEntryPoint Fragment %main "main" %FragColor %vA %vB
OpExecutionMode %main OriginUpperLeft
OpSource ESSL 310
OpName %main "main"
OpName %FragColor "FragColor"
OpName %vA "vA"
OpName %vB "vB"
OpDecorate %FragColor RelaxedPrecision
OpDecorate %FragColor Location 0
OpDecorate %vA Flat
OpDecorate %vA Location 0
OpDecorate %vB Flat
OpDecorate %vB Location 1
OpDecorate %22 RelaxedPrecision
%void = OpTypeVoid
%3 = OpTypeFunction %void
%float = OpTypeFloat 32
%v4float = OpTypeVector %float 4
%_ptr_Output_v4float = OpTypePointer Output %v4float
%FragColor = OpVariable %_ptr_Output_v4float Output
%int = OpTypeInt 32 1
%v4int = OpTypeVector %int 4
%_ptr_Input_v4int = OpTypePointer Input %v4int
%vA = OpVariable %_ptr_Input_v4int Input
%vB = OpVariable %_ptr_Input_v4int Input
%main = OpFunction %void None %3
%5 = OpLabel
%14 = OpLoad %v4int %vA
%16 = OpLoad %v4int %vB
%17 = OpLoad %v4int %vA
%18 = OpLoad %v4int %vB
%19 = OpSRem %v4int %17 %18
%20 = OpConvertSToF %v4float %19
OpStore %FragColor %20
OpReturn
OpFunctionEnd

View File

@ -6665,8 +6665,22 @@ void CompilerGLSL::emit_instruction(const Instruction &instruction)
break;
case OpSRem:
BOP_CAST(%, SPIRType::Int);
{
uint32_t result_type = ops[0];
uint32_t result_id = ops[1];
uint32_t op0 = ops[2];
uint32_t op1 = ops[3];
// Needs special handling.
bool forward = should_forward(op0) && should_forward(op1);
auto expr = join(to_enclosed_expression(op0), " - ", to_enclosed_expression(op1), " * ", "(",
to_enclosed_expression(op0), " / ", to_enclosed_expression(op1), ")");
emit_op(result_type, result_id, expr, forward);
inherit_expression_dependencies(result_id, op0);
inherit_expression_dependencies(result_id, op1);
break;
}
case OpSDiv:
BOP_CAST(/, SPIRType::Int);