From aeb71ce166c755a09ba4a66f5e6a5d7a22149b12 Mon Sep 17 00:00:00 2001 From: Ethan Nicholas Date: Mon, 20 May 2019 09:55:44 -0400 Subject: [PATCH] switched over to using fallthrough in SkSL interpreter vector operations Bug: skia: Change-Id: Ibcbad9252f2da468549792bf7c3bb4e9a5b77805 Reviewed-on: https://skia-review.googlesource.com/c/skia/+/214380 Reviewed-by: Mike Klein Commit-Queue: Mike Klein --- src/sksl/SkSLInterpreter.cpp | 203 +++++++++++++++++++---------------- 1 file changed, 110 insertions(+), 93 deletions(-) diff --git a/src/sksl/SkSLInterpreter.cpp b/src/sksl/SkSLInterpreter.cpp index 99e7eadafa..3cf16b3c83 100644 --- a/src/sksl/SkSLInterpreter.cpp +++ b/src/sksl/SkSLInterpreter.cpp @@ -245,34 +245,46 @@ void Interpreter::disassemble(const ByteCodeFunction& f) { } } -#define VECTOR_BINARY_OP(inst, type, srcField, targetField, op) \ - case ByteCodeInstruction::inst: \ - tmp[0] = POP(); \ - sp->targetField = sp->srcField op tmp[0].srcField; \ - break; \ - case ByteCodeInstruction::inst ## 2: \ - tmp[1] = POP(); \ - tmp[0] = POP(); \ - sp[ 0].targetField = sp[ 0].srcField op tmp[1].srcField; \ - sp[-1].targetField = sp[-1].srcField op tmp[0].srcField; \ - break; \ - case ByteCodeInstruction::inst ## 3: \ - tmp[2] = POP(); \ - tmp[1] = POP(); \ - tmp[0] = POP(); \ - sp[ 0].targetField = sp[ 0].srcField op tmp[2].srcField; \ - sp[-1].targetField = sp[-1].srcField op tmp[1].srcField; \ - sp[-2].targetField = sp[-2].srcField op tmp[0].srcField; \ - break; \ - case ByteCodeInstruction::inst ## 4: \ - tmp[3] = POP(); \ - tmp[2] = POP(); \ - tmp[1] = POP(); \ - tmp[0] = POP(); \ - sp[ 0].targetField = sp[ 0].srcField op tmp[3].srcField; \ - sp[-1].targetField = sp[-1].srcField op tmp[2].srcField; \ - sp[-2].targetField = sp[-2].srcField op tmp[1].srcField; \ - sp[-3].targetField = sp[-3].srcField op tmp[0].srcField; \ +#define VECTOR_BINARY_OP(base, type, src, target, op) \ + case ByteCodeInstruction::base ## 4: \ + sp[-4].target = sp[-4].src op sp[0].src; \ + POP(); \ + /* fall through */ \ + case ByteCodeInstruction::base ## 3: \ + count = (int) ByteCodeInstruction::base - (int) inst - 1; \ + sp[count].target = sp[count].src op sp[0].src; \ + POP(); \ + /* fall through */ \ + case ByteCodeInstruction::base ## 2: \ + count = (int) ByteCodeInstruction::base - (int) inst - 1; \ + sp[count].target = sp[count].src op sp[0].src; \ + POP(); \ + /* fall through */ \ + case ByteCodeInstruction::base: \ + count = (int) ByteCodeInstruction::base - (int) inst - 1; \ + sp[count].target = sp[count].src op sp[0].src; \ + POP(); \ + break; + +#define VECTOR_BINARY_FN(base, type, src, target, fn) \ + case ByteCodeInstruction::base ## 4: \ + sp[-4].target = fn(sp[-4].src, sp[0].src); \ + POP(); \ + /* fall through */ \ + case ByteCodeInstruction::base ## 3: \ + count = (int) ByteCodeInstruction::base - (int) inst - 1; \ + sp[count].target = fn(sp[count].src, sp[0].src); \ + POP(); \ + /* fall through */ \ + case ByteCodeInstruction::base ## 2: \ + count = (int) ByteCodeInstruction::base - (int) inst - 1; \ + sp[count].target = fn(sp[count].src, sp[0].src); \ + POP(); \ + /* fall through */ \ + case ByteCodeInstruction::base: \ + count = (int) ByteCodeInstruction::base - (int) inst - 1; \ + sp[count].target = fn(sp[count].src, sp[0].src); \ + POP(); \ break; struct StackFrame { @@ -360,13 +372,24 @@ void Interpreter::run(const ByteCodeFunction& f, Value* stack, Value args[], Val VECTOR_BINARY_OP(kDivideS, int32_t, fSigned, fSigned, /) VECTOR_BINARY_OP(kDivideU, uint32_t, fUnsigned, fUnsigned, /) VECTOR_BINARY_OP(kDivideF, float, fFloat, fFloat, /) - case ByteCodeInstruction::kDup: // fall through - case ByteCodeInstruction::kDup2: // fall through - case ByteCodeInstruction::kDup3: // fall through case ByteCodeInstruction::kDup4: - count = (int) inst - (int) ByteCodeInstruction::kDup + 1; - memcpy(sp + 1, sp - count + 1, count * sizeof(Value)); - sp += count; + sp[1] = sp[-3]; + ++sp; + // fall through + case ByteCodeInstruction::kDup3: + count = (int) ByteCodeInstruction::kDup - (int) inst; + sp[1] = sp[count]; + ++sp; + // fall through + case ByteCodeInstruction::kDup2: + count = (int) ByteCodeInstruction::kDup - (int) inst; + sp[1] = sp[count]; + ++sp; + // fall through + case ByteCodeInstruction::kDup: + count = (int) ByteCodeInstruction::kDup - (int) inst; + sp[1] = sp[count]; + ++sp; break; case ByteCodeInstruction::kFloatToInt4: sp[-3].fSigned = (int) sp[-3].fFloat; @@ -404,24 +427,33 @@ void Interpreter::run(const ByteCodeFunction& f, Value* stack, Value args[], Val case ByteCodeInstruction::kUnsignedToFloat: sp[0].fFloat = (int) sp[0].fUnsigned; break; - case ByteCodeInstruction::kLoad: // fall through - case ByteCodeInstruction::kLoad2: // fall through - case ByteCodeInstruction::kLoad3: // fall through case ByteCodeInstruction::kLoad4: - count = (int) inst - (int) ByteCodeInstruction::kLoad + 1; - src = READ8(); - memcpy(sp + 1, &stack[src], count * sizeof(Value)); - sp += count; + sp[4] = stack[*ip + 3]; + // fall through + case ByteCodeInstruction::kLoad3: + sp[3] = stack[*ip + 2]; + // fall through + case ByteCodeInstruction::kLoad2: + sp[2] = stack[*ip + 1]; + // fall through + case ByteCodeInstruction::kLoad: + sp[1] = stack[*ip]; + ++ip; + sp += (int) inst - (int) ByteCodeInstruction::kLoad + 1; break; - case ByteCodeInstruction::kLoadGlobal: // fall through - case ByteCodeInstruction::kLoadGlobal2: // fall through - case ByteCodeInstruction::kLoadGlobal3: // fall through case ByteCodeInstruction::kLoadGlobal4: - count = (int) inst - (int) ByteCodeInstruction::kLoadGlobal + 1; - src = READ8(); - SkASSERT(src + count <= (int) fGlobals.size()); - memcpy(sp + 1, &fGlobals[src], count * sizeof(Value)); - sp += count; + sp[4] = fGlobals[*ip + 3]; + // fall through + case ByteCodeInstruction::kLoadGlobal3: + sp[3] = fGlobals[*ip + 2]; + // fall through + case ByteCodeInstruction::kLoadGlobal2: + sp[2] = fGlobals[*ip + 1]; + // fall through + case ByteCodeInstruction::kLoadGlobal: + sp[1] = fGlobals[*ip]; + ++ip; + sp += (int) inst - (int) ByteCodeInstruction::kLoadGlobal + 1; break; case ByteCodeInstruction::kLoadSwizzle: src = READ8(); @@ -493,34 +525,7 @@ void Interpreter::run(const ByteCodeFunction& f, Value* stack, Value args[], Val fByteCode->fExternalValues[src]->read(sp + 1); sp += count; break; - case ByteCodeInstruction::kRemainderF: - tmp[0] = POP(); - TOP().fFloat = fmodf(TOP().fFloat, tmp[0].fFloat); - break; - case ByteCodeInstruction::kRemainderF2: - tmp[1] = POP(); - tmp[0] = POP(); - sp[ 0].fFloat = fmodf(sp[ 0].fFloat, tmp[1].fFloat); - sp[-1].fFloat = fmodf(sp[-1].fFloat, tmp[0].fFloat); - break; - case ByteCodeInstruction::kRemainderF3: - tmp[2] = POP(); - tmp[1] = POP(); - tmp[0] = POP(); - sp[ 0].fFloat = fmodf(sp[ 0].fFloat, tmp[2].fFloat); - sp[-1].fFloat = fmodf(sp[-1].fFloat, tmp[1].fFloat); - sp[-2].fFloat = fmodf(sp[-2].fFloat, tmp[0].fFloat); - break; - case ByteCodeInstruction::kRemainderF4: - tmp[3] = POP(); - tmp[2] = POP(); - tmp[1] = POP(); - tmp[0] = POP(); - sp[ 0].fFloat = fmodf(sp[ 0].fFloat, tmp[3].fFloat); - sp[-1].fFloat = fmodf(sp[-1].fFloat, tmp[2].fFloat); - sp[-2].fFloat = fmodf(sp[-2].fFloat, tmp[1].fFloat); - sp[-3].fFloat = fmodf(sp[-3].fFloat, tmp[0].fFloat); - break; + VECTOR_BINARY_FN(kRemainderF, int32_t, fFloat, fFloat, fmodf) VECTOR_BINARY_OP(kRemainderS, int32_t, fSigned, fSigned, %) VECTOR_BINARY_OP(kRemainderU, uint32_t, fUnsigned, fUnsigned, %) case ByteCodeInstruction::kReturn: @@ -545,25 +550,37 @@ void Interpreter::run(const ByteCodeFunction& f, Value* stack, Value args[], Val frames.pop_back(); break; } - case ByteCodeInstruction::kStore: // fall through - case ByteCodeInstruction::kStore2: // fall through - case ByteCodeInstruction::kStore3: // fall through case ByteCodeInstruction::kStore4: - count = (int) inst - (int) ByteCodeInstruction::kStore + 1; - target = READ8(); - SkASSERT(target + count <= STACK_SIZE()); - memcpy(&stack[target], sp - count + 1, count * sizeof(Value)); - sp -= count; + stack[*ip + 3] = sp[0]; + POP(); + // fall through + case ByteCodeInstruction::kStore3: + stack[*ip + 2] = sp[0]; + POP(); + // fall through + case ByteCodeInstruction::kStore2: + stack[*ip + 1] = sp[0]; + POP(); + case ByteCodeInstruction::kStore: + stack[*ip] = sp[0]; + POP(); + ++ip; break; - case ByteCodeInstruction::kStoreGlobal: // fall through - case ByteCodeInstruction::kStoreGlobal2: // fall through - case ByteCodeInstruction::kStoreGlobal3: // fall through case ByteCodeInstruction::kStoreGlobal4: - count = (int) inst - (int) ByteCodeInstruction::kStoreGlobal + 1; - target = READ8(); - SkASSERT(target + count <= (int) fGlobals.size()); - memcpy(&fGlobals[target], sp - count + 1, count * sizeof(Value)); - sp -= count; + fGlobals[*ip + 3] = sp[0]; + POP(); + // fall through + case ByteCodeInstruction::kStoreGlobal3: + fGlobals[*ip + 2] = sp[0]; + POP(); + // fall through + case ByteCodeInstruction::kStoreGlobal2: + fGlobals[*ip + 1] = sp[0]; + POP(); + case ByteCodeInstruction::kStoreGlobal: + fGlobals[*ip] = sp[0]; + POP(); + ++ip; break; case ByteCodeInstruction::kStoreSwizzle: target = READ8();