diff options
| -rw-r--r-- | runtime/Android.bp | 12 | ||||
| -rw-r--r-- | runtime/interpreter/mterp/x86/floating_point.S | 14 | ||||
| -rw-r--r-- | runtime/interpreter/mterp/x86_64/floating_point.S | 14 |
3 files changed, 40 insertions, 0 deletions
diff --git a/runtime/Android.bp b/runtime/Android.bp index d064520288..22dc208b9d 100644 --- a/runtime/Android.bp +++ b/runtime/Android.bp @@ -292,6 +292,12 @@ libart_cc_defaults { "arch/x86/thread_x86.cc", "arch/x86/fault_handler_x86.cc", ], + avx: { + asflags: ["-DMTERP_USE_AVX"], + }, + avx2: { + asflags: ["-DMTERP_USE_AVX"], + }, }, x86_64: { srcs: [ @@ -308,6 +314,12 @@ libart_cc_defaults { "monitor_pool.cc", "arch/x86/fault_handler_x86.cc", ], + avx: { + asflags: ["-DMTERP_USE_AVX"], + }, + avx2: { + asflags: ["-DMTERP_USE_AVX"], + }, }, mips: { srcs: [ diff --git a/runtime/interpreter/mterp/x86/floating_point.S b/runtime/interpreter/mterp/x86/floating_point.S index bc7c59dc69..0b3c06caf1 100644 --- a/runtime/interpreter/mterp/x86/floating_point.S +++ b/runtime/interpreter/mterp/x86/floating_point.S @@ -56,10 +56,17 @@ movzbl 2(rPC), %ecx # ecx <- BB movzbl 3(rPC), %eax # eax <- CC GET_VREG_XMM${suff} %xmm0, %ecx # %xmm0 <- 1st src +#ifdef MTERP_USE_AVX + v${instr}${suff} VREG_ADDRESS(%eax), %xmm0, %xmm0 + SET_VREG_XMM${suff} %xmm0, rINST # vAA <- %xmm0 + vpxor %xmm0, %xmm0, %xmm0 + vmovs${suff} %xmm0, VREG_REF_ADDRESS(rINST) # clear ref +#else ${instr}${suff} VREG_ADDRESS(%eax), %xmm0 SET_VREG_XMM${suff} %xmm0, rINST # vAA <- %xmm0 pxor %xmm0, %xmm0 movs${suff} %xmm0, VREG_REF_ADDRESS(rINST) # clear ref +#endif ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 %def sseBinop2Addr(instr="", suff=""): @@ -67,10 +74,17 @@ andl $$0xf, %ecx # ecx <- A GET_VREG_XMM${suff} %xmm0, %ecx # %xmm0 <- 1st src sarl $$4, rINST # rINST<- B +#ifdef MTERP_USE_AVX + v${instr}${suff} VREG_ADDRESS(rINST), %xmm0, %xmm0 + SET_VREG_XMM${suff} %xmm0, %ecx # vAA<- %xmm0 + vpxor %xmm0, %xmm0, %xmm0 + vmovs${suff} %xmm0, VREG_REF_ADDRESS(rINST) # clear ref +#else ${instr}${suff} VREG_ADDRESS(rINST), %xmm0 SET_VREG_XMM${suff} %xmm0, %ecx # vAA<- %xmm0 pxor %xmm0, %xmm0 movs${suff} %xmm0, VREG_REF_ADDRESS(rINST) # clear ref +#endif ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 %def op_add_double(): diff --git a/runtime/interpreter/mterp/x86_64/floating_point.S b/runtime/interpreter/mterp/x86_64/floating_point.S index 7fcb7424b6..599b3f4965 100644 --- a/runtime/interpreter/mterp/x86_64/floating_point.S +++ b/runtime/interpreter/mterp/x86_64/floating_point.S @@ -56,10 +56,17 @@ movzbq 2(rPC), %rcx # ecx <- BB movzbq 3(rPC), %rax # eax <- CC GET_VREG_XMM${suff} %xmm0, %rcx # %xmm0 <- 1st src +#ifdef MTERP_USE_AVX + v${instr}${suff} VREG_ADDRESS(%rax), %xmm0, %xmm0 + SET_VREG_XMM${suff} %xmm0, rINSTq # vAA <- %xmm0 + vpxor %xmm0, %xmm0, %xmm0 + vmovs${suff} %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref +#else ${instr}${suff} VREG_ADDRESS(%rax), %xmm0 SET_VREG_XMM${suff} %xmm0, rINSTq # vAA <- %xmm0 pxor %xmm0, %xmm0 movs${suff} %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref +#endif ADVANCE_PC_FETCH_AND_GOTO_NEXT 2 %def sseBinop2Addr(instr="", suff=""): @@ -67,10 +74,17 @@ andl $$0xf, %ecx # ecx <- A GET_VREG_XMM${suff} %xmm0, %rcx # %xmm0 <- 1st src sarl $$4, rINST # rINST<- B +#ifdef MTERP_USE_AVX + v${instr}${suff} VREG_ADDRESS(rINSTq), %xmm0, %xmm0 + SET_VREG_XMM${suff} %xmm0, %rcx # vAA <- %xmm0 + vpxor %xmm0, %xmm0, %xmm0 + vmovs${suff} %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref +#else ${instr}${suff} VREG_ADDRESS(rINSTq), %xmm0 SET_VREG_XMM${suff} %xmm0, %rcx # vAA <- %xmm0 pxor %xmm0, %xmm0 movs${suff} %xmm0, VREG_REF_ADDRESS(rINSTq) # clear ref +#endif ADVANCE_PC_FETCH_AND_GOTO_NEXT 1 %def op_add_double(): |