#include <metal_stdlib>

using namespace metal;
struct ResultMatrix {
  /* 0x0000 */ float numbers[1];
};
struct FirstMatrix {
  /* 0x0000 */ float numbers[1];
};
struct SecondMatrix {
  /* 0x0000 */ float numbers[1];
};
struct Uniforms {
  /* 0x0000 */ float tint_symbol;
  /* 0x0004 */ int sizeA;
  /* 0x0008 */ int sizeB;
};

float binaryOperation_f1_f1_(thread float* const a, thread float* const b) {
  float x_26 = 0.0f;
  float const x_13 = *(b);
  if ((x_13 == 0.0f)) {
    return 1.0f;
  }
  float const x_21 = *(b);
  if (!((rint((x_21 - (2.0f * floor((x_21 / 2.0f))))) == 1.0f))) {
    float const x_29 = *(a);
    float const x_31 = *(b);
    x_26 = pow(fabs(x_29), x_31);
  } else {
    float const x_34 = *(a);
    float const x_36 = *(a);
    float const x_38 = *(b);
    x_26 = (sign(x_34) * pow(fabs(x_36), x_38));
  }
  float const x_41 = x_26;
  return x_41;
}

void main_1(device ResultMatrix& resultMatrix, thread uint3* const tint_symbol_2) {
  int index = 0;
  int a_1 = 0;
  float param = 0.0f;
  float param_1 = 0.0f;
  uint const x_54 = (*(tint_symbol_2)).x;
  index = as_type<int>(x_54);
  a_1 = -10;
  int const x_63 = index;
  param = -4.0f;
  param_1 = -3.0f;
  float const x_68 = binaryOperation_f1_f1_(&(param), &(param_1));
  resultMatrix.numbers[x_63] = x_68;
  return;
}

void tint_symbol_1_inner(device ResultMatrix& resultMatrix, uint3 gl_GlobalInvocationID_param, thread uint3* const tint_symbol_3) {
  *(tint_symbol_3) = gl_GlobalInvocationID_param;
  main_1(resultMatrix, tint_symbol_3);
}

kernel void tint_symbol_1(uint3 gl_GlobalInvocationID_param [[thread_position_in_grid]], device ResultMatrix& resultMatrix [[buffer(0)]]) {
  thread uint3 tint_symbol_4 = 0u;
  tint_symbol_1_inner(resultMatrix, gl_GlobalInvocationID_param, &(tint_symbol_4));
  return;
}

