#include <metal_stdlib>

using namespace metal;

template<typename T, size_t N>
struct tint_array {
    const constant T& operator[](size_t i) const constant { return elements[i]; }
    device T& operator[](size_t i) device { return elements[i]; }
    const device T& operator[](size_t i) const device { return elements[i]; }
    thread T& operator[](size_t i) thread { return elements[i]; }
    const thread T& operator[](size_t i) const thread { return elements[i]; }
    threadgroup T& operator[](size_t i) threadgroup { return elements[i]; }
    const threadgroup T& operator[](size_t i) const threadgroup { return elements[i]; }
    T elements[N];
};

struct ResultMatrix {
  /* 0x0000 */ tint_array<float, 1> numbers;
};

struct FirstMatrix {
  tint_array<float, 1> numbers;
};

struct SecondMatrix {
  tint_array<float, 1> numbers;
};

struct Uniforms {
  float tint_symbol;
  int sizeA;
  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(thread uint3* const tint_symbol_2, device ResultMatrix* const tint_symbol_3) {
  int index = 0;
  int a_1 = 0;
  float param = 0.0f;
  float param_1 = 0.0f;
  uint const x_54 = (*(tint_symbol_2))[0];
  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));
  (*(tint_symbol_3)).numbers[x_63] = x_68;
  return;
}

void tint_symbol_1_inner(uint3 gl_GlobalInvocationID_param, thread uint3* const tint_symbol_4, device ResultMatrix* const tint_symbol_5) {
  *(tint_symbol_4) = gl_GlobalInvocationID_param;
  main_1(tint_symbol_4, tint_symbol_5);
}

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

