diff options
author | Razvan A Lupusoru <razvan.a.lupusoru@intel.com> | 2014-01-23 09:41:45 -0800 |
---|---|---|
committer | Razvan A Lupusoru <razvan.a.lupusoru@intel.com> | 2014-01-24 15:14:12 -0800 |
commit | e27b3bf2c1044bfbfbe874affd3758a73009c6c6 (patch) | |
tree | 94c9f51228c0c1720712493dc455235bf15c7b54 /compiler/llvm/compiler_llvm.cc | |
parent | 26a302b2bb07d754b958a4013116946fbbd78c62 (diff) | |
download | android_art-e27b3bf2c1044bfbfbe874affd3758a73009c6c6.tar.gz android_art-e27b3bf2c1044bfbfbe874affd3758a73009c6c6.tar.bz2 android_art-e27b3bf2c1044bfbfbe874affd3758a73009c6c6.zip |
Support GenSelect for x86
kMirOpSelect is an extended MIR that has been generated in order
to remove trivial diamond shapes where the conditional is an
if-eqz or if-nez and on each of the paths there is a move or
const bytecode with same destination register.
This patch enables x86 to generate code for this extended MIR.
A) Handling the constant specialization of kMirOpSelect:
1) When the true case is zero and result_reg is not same as src_reg:
xor result_reg, result_reg
cmp $0, src_reg
mov t1, $false_case
cmovnz result_reg, t1
2) When the false case is zero and result_reg is not same as src_reg:
xor result_reg, result_reg
cmp $0, src_reg
mov t1, $true_case
cmovz result_reg, t1
3) All other cases (we do compare first to set eflags):
cmp $0, src_reg
mov result_reg, $true_case
mov t1, $false_case
cmovnz result_reg, t1
B) Handling the move specialization of kMirOpSelect:
1) When true case is already in place:
cmp $0, src_reg
cmovnz result_reg, false_reg
2) When false case is already in place:
cmp $0, src_reg
cmovz result_reg, true_reg
3) When neither cases are in place:
cmp $0, src_reg
mov result_reg, true_reg
cmovnz result_reg, false_reg
Change-Id: Ic7c50823208fe82019916476a0a77c6a271679fe
Signed-off-by: Razvan A Lupusoru <razvan.a.lupusoru@intel.com>
Diffstat (limited to 'compiler/llvm/compiler_llvm.cc')
0 files changed, 0 insertions, 0 deletions