type RTArr = [[stride(4)]] array<f32>;

type RTArr_1 = [[stride(4)]] array<f32>;

struct ResultMatrix {
  numbers : RTArr_1;
}

type RTArr_2 = [[stride(4)]] array<f32>;

struct FirstMatrix {
  numbers : RTArr_1;
}

struct SecondMatrix {
  numbers : RTArr_1;
}

struct Uniforms {
  NAN : f32;
  sizeA : i32;
  sizeB : i32;
}

var<private> gl_GlobalInvocationID : vec3<u32>;

[[group(0), binding(2)]] var<storage, read_write> resultMatrix : ResultMatrix;

[[group(0), binding(0)]] var<storage, read> firstMatrix : FirstMatrix;

[[group(0), binding(1)]] var<storage, read> secondMatrix : SecondMatrix;

[[group(0), binding(3)]] var<uniform> x_46 : Uniforms;

fn binaryOperation_f1_f1_(a : ptr<function, f32>, b : ptr<function, f32>) -> f32 {
  var x_26 : f32;
  let x_13 : f32 = *(b);
  if ((x_13 == 0.0)) {
    return 1.0;
  }
  let x_21 : f32 = *(b);
  if (!((round((x_21 - (2.0 * floor((x_21 / 2.0))))) == 1.0))) {
    let x_29 : f32 = *(a);
    let x_31 : f32 = *(b);
    x_26 = pow(abs(x_29), x_31);
  } else {
    let x_34 : f32 = *(a);
    let x_36 : f32 = *(a);
    let x_38 : f32 = *(b);
    x_26 = (sign(x_34) * pow(abs(x_36), x_38));
  }
  let x_41 : f32 = x_26;
  return x_41;
}

fn main_1() {
  var index : i32;
  var a_1 : i32;
  var param : f32;
  var param_1 : f32;
  let x_54 : u32 = gl_GlobalInvocationID.x;
  index = bitcast<i32>(x_54);
  a_1 = -10;
  let x_63 : i32 = index;
  param = -4.0;
  param_1 = -3.0;
  let x_68 : f32 = binaryOperation_f1_f1_(&(param), &(param_1));
  resultMatrix.numbers[x_63] = x_68;
  return;
}

[[stage(compute), workgroup_size(1, 1, 1)]]
fn main([[builtin(global_invocation_id)]] gl_GlobalInvocationID_param : vec3<u32>) {
  gl_GlobalInvocationID = gl_GlobalInvocationID_param;
  main_1();
}
