summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--runtime/Android.bp12
-rw-r--r--runtime/interpreter/mterp/x86/floating_point.S14
-rw-r--r--runtime/interpreter/mterp/x86_64/floating_point.S14
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():