Reviewers: Jakob, danno,
Message:
As previous discuss, I split the refine of ClampXToUint8 into a separate CL.
Currently the change seems to be safe. Actually the original version in
ClampToUint8 also leaves the high bit unchanged like below and only the low
byte
change leads to false data dependency.
setcc(negative, reg); // 1 if negative, 0 if positive.
dec_b(reg); // 0 if negative, 255 if positive.
Description:
Refactor a bit ClampXToUint8
BUG=
Please review this at https://codereview.chromium.org/211383008/
SVN Base: git://github.com/v8/v8.git@master
Affected files (+14, -18 lines):
M src/ia32/macro-assembler-ia32.cc
M src/x64/macro-assembler-x64.cc
Index: src/ia32/macro-assembler-ia32.cc
diff --git a/src/ia32/macro-assembler-ia32.cc
b/src/ia32/macro-assembler-ia32.cc
index
0235a13894bd08bcf84d9d9f8f06cf4009ed26a2..1e7320545390f64fe27c4c7d8ea2af4097d3ae91
100644
--- a/src/ia32/macro-assembler-ia32.cc
+++ b/src/ia32/macro-assembler-ia32.cc
@@ -220,16 +220,14 @@ void MacroAssembler::ClampDoubleToUint8(XMMRegister
input_reg,
j(zero, &done, Label::kNear);
cmp(result_reg, Immediate(0x1));
j(overflow, &conv_failure, Label::kNear);
- mov(result_reg, Immediate(0));
- setcc(sign, result_reg);
- sub(result_reg, Immediate(1));
- and_(result_reg, Immediate(255));
+ sar(result_reg, 31);
+ not_(result_reg); // No zero extension seems to be safe here.
jmp(&done, Label::kNear);
bind(&conv_failure);
- Move(result_reg, Immediate(0));
+ sar(result_reg, 31);
ucomisd(input_reg, scratch_reg);
- j(below, &done, Label::kNear);
- Move(result_reg, Immediate(255));
+ j(above_equal, &done, Label::kNear);
+ Set(result_reg, Immediate(0));
bind(&done);
}
@@ -238,8 +236,8 @@ void MacroAssembler::ClampUint8(Register reg) {
Label done;
test(reg, Immediate(0xFFFFFF00));
j(zero, &done, Label::kNear);
- setcc(negative, reg); // 1 if negative, 0 if positive.
- dec_b(reg); // 0 if negative, 255 if positive.
+ sar(reg, 31);
+ not_(reg); // No zero extension seems to be safe here.
bind(&done);
}
Index: src/x64/macro-assembler-x64.cc
diff --git a/src/x64/macro-assembler-x64.cc b/src/x64/macro-assembler-x64.cc
index
b5b7324be0af31dbe9e1a0b0b760d9c17190a282..d62cdceef9fb67a70df1a3fd33ad25c34a8f082d
100644
--- a/src/x64/macro-assembler-x64.cc
+++ b/src/x64/macro-assembler-x64.cc
@@ -3139,8 +3139,8 @@ void MacroAssembler::ClampUint8(Register reg) {
Label done;
testl(reg, Immediate(0xFFFFFF00));
j(zero, &done, Label::kNear);
- setcc(negative, reg); // 1 if negative, 0 if positive.
- decb(reg); // 0 if negative, 255 if positive.
+ sarl(reg, Immediate(31));
+ notl(reg); // No zero extension seems to be safe here.
bind(&done);
}
@@ -3156,16 +3156,14 @@ void MacroAssembler::ClampDoubleToUint8(XMMRegister
input_reg,
j(zero, &done, Label::kNear);
cmpl(result_reg, Immediate(1));
j(overflow, &conv_failure, Label::kNear);
- movl(result_reg, Immediate(0));
- setcc(sign, result_reg);
- subl(result_reg, Immediate(1));
- andl(result_reg, Immediate(255));
+ sarl(result_reg, Immediate(31));
+ notl(result_reg); // No zero extension seems to be safe here.
jmp(&done, Label::kNear);
bind(&conv_failure);
- Set(result_reg, 0);
+ sarl(result_reg, Immediate(31));
ucomisd(input_reg, temp_xmm_reg);
- j(below, &done, Label::kNear);
- Set(result_reg, 255);
+ j(above_equal, &done, Label::kNear);
+ Set(result_reg, 0);
bind(&done);
}
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.