gallivm: implement switch opcode
authorRoland Scheidegger <sroland@vmware.com>
Fri, 19 Apr 2013 23:46:04 +0000 (01:46 +0200)
committerRoland Scheidegger <sroland@vmware.com>
Sat, 20 Apr 2013 00:27:53 +0000 (02:27 +0200)
commit85974e5fee152c96239aa87040799a557cd789ab
tree074035c9ca771a94442f4db3acc52400fca4ff51
parent8f5d4283c0448ed2e5d2c12bb46ec70be7744a7b
gallivm: implement switch opcode

Should be able to handle all things which make this tricky to implement.
Fallthroughs, including most notably into/out of default, should be handled
correctly but are quite a mess.
If we see largely unoptimized switches in the wild should probably think
about some "real" switch optimization pass, e.g. things like this:

switch
case1
someinst
brk
case2
default
case3
someinst
brk
case4
someinst
endswitch

are legal, but the pointless case2/case3 statements not only cause condition
evaluation but will turn this into a "fake" fallthrough case (because
mask and defaultmask are already updated for case2 when default is
encountered) requiring executing code twice.
If default is at the end though, there's never any code re-execution, and
if that's not the case if there's no fallthrough in (not even a fake one)
and out of default there's no code re-execution neither.

v2: add comments, and use enum for break type instead of magic boolean.

Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
src/gallium/auxiliary/gallivm/lp_bld_tgsi.h
src/gallium/auxiliary/gallivm/lp_bld_tgsi_action.c
src/gallium/auxiliary/gallivm/lp_bld_tgsi_soa.c