human
Give me a the Python program you requested given the following:
Complete the below
def call_xxgemm(context, builder, x_type, x_shapes, x_data, y_type, y_shapes, y_data, out_type, out_shapes, out_data):

    ''''Call the BLAS matrix * matrix product function for the given arguments.'
    '''
assistant
#Here is the Python program you requested.
    fnty = ir.FunctionType(ir.IntType(32), [ll_char, ll_char, ll_char, intp_t, intp_t, intp_t, ll_void_p, ll_void_p, intp_t, ll_void_p, intp_t, ll_void_p, ll_void_p, intp_t])
    fn = builder.module.get_or_insert_function(fnty, name='numba_xxgemm')
    (m, k) = x_shapes
    (_k, n) = y_shapes
    dtype = x_type.dtype
    alpha = make_constant_slot(context, builder, dtype, 1.0)
    beta = make_constant_slot(context, builder, dtype, 0.0)
    trans = ir.Constant(ll_char, ord('t'))
    notrans = ir.Constant(ll_char, ord('n'))
    def get_array_param(ty, shapes, data):
        return ((notrans if (ty.layout == out_type.layout) else trans), (shapes[1] if (ty.layout == 'C') else shapes[0]), builder.bitcast(data, ll_void_p))
    (transa, lda, data_a) = get_array_param(y_type, y_shapes, y_data)
    (transb, ldb, data_b) = get_array_param(x_type, x_shapes, x_data)
    (_, ldc, data_c) = get_array_param(out_type, out_shapes, out_data)
    kind = get_blas_kind(dtype)
    kind_val = ir.Constant(ll_char, ord(kind))
    res = builder.call(fn, (kind_val, transa, transb, n, m, k, builder.bitcast(alpha, ll_void_p), data_a, lda, data_b, ldb, builder.bitcast(beta, ll_void_p), data_c, ldc))
    check_blas_return(context, builder, res)