eg_asm.c revision 4a47662beaa2092447939db7880531fb706afedd
150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie/* 250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * Copyright 2010 Jerome Glisse <glisse@freedesktop.org> 350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * 450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * Permission is hereby granted, free of charge, to any person obtaining a 550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * copy of this software and associated documentation files (the "Software"), 650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * to deal in the Software without restriction, including without limitation 750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * on the rights to use, copy, modify, merge, publish, distribute, sub 850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * license, and/or sell copies of the Software, and to permit persons to whom 950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * the Software is furnished to do so, subject to the following conditions: 1050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * 1150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * The above copyright notice and this permission notice (including the next 1250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * paragraph) shall be included in all copies or substantial portions of the 1350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * Software. 1450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * 1550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 1650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL 1850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, 1950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR 2050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE 2150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie * USE OR OTHER DEALINGS IN THE SOFTWARE. 2250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie */ 239c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include <stdio.h> 249c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include <errno.h> 2550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie#include "util/u_memory.h" 269c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_pipe.h" 279c284b5cae916a083d17d1039d2f2da128b47882Jerome Glisse#include "r600_asm.h" 2850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie#include "eg_sq.h" 2950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie#include "r600_opcodes.h" 30fa86fc564aea4e40c89f6fc889e6a5bf817634b3Jerome Glisse#include "evergreend.h" 3150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 324a47662beaa2092447939db7880531fb706afeddMarek Olšákint eg_bytecode_cf_build(struct r600_bytecode *bc, struct r600_bytecode_cf *cf) 3350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie{ 3450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie unsigned id = cf->id; 3550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 3650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie switch (cf->inst) { 3750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case (EG_V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU << 3): 388813842121d46d1be476807c98b0ba0b771f0c91Christian König case (EG_V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP_AFTER << 3): 398813842121d46d1be476807c98b0ba0b771f0c91Christian König case (EG_V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_POP2_AFTER << 3): 4050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case (EG_V_SQ_CF_ALU_WORD1_SQ_CF_INST_ALU_PUSH_BEFORE << 3): 4150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie bc->bytecode[id++] = S_SQ_CF_ALU_WORD0_ADDR(cf->addr >> 1) | 428273921b7a41251f3f5a87df995913cb291902caHenri Verbeet S_SQ_CF_ALU_WORD0_KCACHE_MODE0(cf->kcache[0].mode) | 438273921b7a41251f3f5a87df995913cb291902caHenri Verbeet S_SQ_CF_ALU_WORD0_KCACHE_BANK0(cf->kcache[0].bank) | 448273921b7a41251f3f5a87df995913cb291902caHenri Verbeet S_SQ_CF_ALU_WORD0_KCACHE_BANK1(cf->kcache[1].bank); 4550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie bc->bytecode[id++] = S_SQ_CF_ALU_WORD1_CF_INST(cf->inst >> 3) | 468273921b7a41251f3f5a87df995913cb291902caHenri Verbeet S_SQ_CF_ALU_WORD1_KCACHE_MODE1(cf->kcache[1].mode) | 478273921b7a41251f3f5a87df995913cb291902caHenri Verbeet S_SQ_CF_ALU_WORD1_KCACHE_ADDR0(cf->kcache[0].addr) | 488273921b7a41251f3f5a87df995913cb291902caHenri Verbeet S_SQ_CF_ALU_WORD1_KCACHE_ADDR1(cf->kcache[1].addr) | 4950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_ALU_WORD1_BARRIER(1) | 5050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_ALU_WORD1_COUNT((cf->ndw / 2) - 1); 5150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie break; 5250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_WORD1_SQ_CF_INST_TEX: 5350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_WORD1_SQ_CF_INST_VTX: 5450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie bc->bytecode[id++] = S_SQ_CF_WORD0_ADDR(cf->addr >> 1); 5550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie bc->bytecode[id++] = S_SQ_CF_WORD1_CF_INST(cf->inst) | 5650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_WORD1_BARRIER(1) | 5750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_WORD1_COUNT((cf->ndw / 4) - 1); 5850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie break; 5950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT: 6050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_ALLOC_EXPORT_WORD1_SQ_CF_INST_EXPORT_DONE: 6150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie bc->bytecode[id++] = S_SQ_CF_ALLOC_EXPORT_WORD0_RW_GPR(cf->output.gpr) | 6250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_ALLOC_EXPORT_WORD0_ELEM_SIZE(cf->output.elem_size) | 6350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_ALLOC_EXPORT_WORD0_ARRAY_BASE(cf->output.array_base) | 6450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_ALLOC_EXPORT_WORD0_TYPE(cf->output.type); 657779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie bc->bytecode[id] = S_SQ_CF_ALLOC_EXPORT_WORD1_BURST_COUNT(cf->output.burst_count - 1) | 668ca3b140eb53fd8063337a5a2a54a35987d597bcChristian König S_SQ_CF_ALLOC_EXPORT_WORD1_SWIZ_SEL_X(cf->output.swizzle_x) | 6750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_ALLOC_EXPORT_WORD1_SWIZ_SEL_Y(cf->output.swizzle_y) | 6850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_ALLOC_EXPORT_WORD1_SWIZ_SEL_Z(cf->output.swizzle_z) | 6950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_ALLOC_EXPORT_WORD1_SWIZ_SEL_W(cf->output.swizzle_w) | 7050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_ALLOC_EXPORT_WORD1_BARRIER(cf->output.barrier) | 717779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie S_SQ_CF_ALLOC_EXPORT_WORD1_CF_INST(cf->output.inst); 7289dc31a28d8e5607989ec11cfd29310c1c97f6acHenri Verbeet if (bc->chip_class == EVERGREEN) /* no EOP on cayman */ 737779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie bc->bytecode[id] |= S_SQ_CF_ALLOC_EXPORT_WORD1_END_OF_PROGRAM(cf->output.end_of_program); 747779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie id++; 757779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie 7650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie break; 7750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_WORD1_SQ_CF_INST_JUMP: 7850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_WORD1_SQ_CF_INST_ELSE: 7950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_WORD1_SQ_CF_INST_POP: 8050526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_START_NO_AL: 8150526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_END: 8250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_CONTINUE: 8350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie case EG_V_SQ_CF_WORD1_SQ_CF_INST_LOOP_BREAK: 84f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse case EG_V_SQ_CF_WORD1_SQ_CF_INST_CALL_FS: 85f609b2ab0342d77a8beca9efb5fbc5b66ff98295Jerome Glisse case EG_V_SQ_CF_WORD1_SQ_CF_INST_RETURN: 867779f6d1dffde2c0501e44adc342e52803de08d4Dave Airlie case CM_V_SQ_CF_WORD1_SQ_CF_INST_END: 8750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie bc->bytecode[id++] = S_SQ_CF_WORD0_ADDR(cf->cf_addr >> 1); 8850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie bc->bytecode[id++] = S_SQ_CF_WORD1_CF_INST(cf->inst) | 8950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie S_SQ_CF_WORD1_BARRIER(1) | 9029b491bd033dd97e5afa3ca0058c50f28c01f39dJerome Glisse S_SQ_CF_WORD1_COND(cf->cond) | 9129b491bd033dd97e5afa3ca0058c50f28c01f39dJerome Glisse S_SQ_CF_WORD1_POP_COUNT(cf->pop_count); 9250526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie 9350526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie break; 9450526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie default: 9550526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie R600_ERR("unsupported CF instruction (0x%X)\n", cf->inst); 9650526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return -EINVAL; 9750526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie } 9850526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie return 0; 9950526e094f4c66957c7f74c190c35903bc82fb62Dave Airlie} 100