|
@@ -685,6 +685,27 @@ static void atom_op_div(atom_exec_context *ctx, int *ptr, int arg)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void atom_op_div32(atom_exec_context *ctx, int *ptr, int arg)
|
|
|
+{
|
|
|
+ uint64_t val64;
|
|
|
+ uint8_t attr = U8((*ptr)++);
|
|
|
+ uint32_t dst, src;
|
|
|
+ SDEBUG(" src1: ");
|
|
|
+ dst = atom_get_dst(ctx, arg, attr, ptr, NULL, 1);
|
|
|
+ SDEBUG(" src2: ");
|
|
|
+ src = atom_get_src(ctx, attr, ptr);
|
|
|
+ if (src != 0) {
|
|
|
+ val64 = dst;
|
|
|
+ val64 |= ((uint64_t)ctx->ctx->divmul[1]) << 32;
|
|
|
+ do_div(val64, src);
|
|
|
+ ctx->ctx->divmul[0] = lower_32_bits(val64);
|
|
|
+ ctx->ctx->divmul[1] = upper_32_bits(val64);
|
|
|
+ } else {
|
|
|
+ ctx->ctx->divmul[0] = 0;
|
|
|
+ ctx->ctx->divmul[1] = 0;
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
static void atom_op_eot(atom_exec_context *ctx, int *ptr, int arg)
|
|
|
{
|
|
|
/* functionally, a nop */
|
|
@@ -1176,7 +1197,9 @@ static struct {
|
|
|
atom_op_debug, 0}, {
|
|
|
atom_op_processds, 0}, {
|
|
|
atom_op_mul32, ATOM_ARG_PS}, {
|
|
|
- atom_op_mul32, ATOM_ARG_WS},
|
|
|
+ atom_op_mul32, ATOM_ARG_WS}, {
|
|
|
+ atom_op_div32, ATOM_ARG_PS}, {
|
|
|
+ atom_op_div32, ATOM_ARG_WS},
|
|
|
};
|
|
|
|
|
|
static int amdgpu_atom_execute_table_locked(struct atom_context *ctx, int index, uint32_t * params)
|