"PLD", LTYPEPLD, APLD,
"UNDEF", LTYPEE, AUNDEF,
+ "CLZ", LTYPE2, ACLZ,
+
0
};
ASTREXD,
APLD,
-
+
AUNDEF,
+ ACLZ,
+
ALAST,
};
o1 = opbra(ABL, C_SCOND_NONE);
o1 |= (v >> 2) & 0xffffff;
break;
+ case 97: /* CLZ Rm, Rd */
+ o1 = oprrr(p->as, p->scond);
+ o1 |= p->to.reg << 12;
+ o1 |= p->from.reg;
+ break;
}
out[0] = o1;
return o | (0xe<<24) | (0x1<<20) | (0xb<<8) | (1<<4);
case ACMP+AEND: // cmp imm
return o | (0x3<<24) | (0x5<<20);
+
+ case ACLZ:
+ // CLZ doesn't support .S
+ return (o & (0xf<<28)) | (0x16f<<16) | (0xf1<<4);
}
diag("bad rrr %d", a);
prasm(curp);
{ AUNDEF, C_NONE, C_NONE, C_NONE, 96, 4, 0 },
+ { ACLZ, C_REG, C_NONE, C_REG, 97, 4, 0 },
+
{ AXXX, C_NONE, C_NONE, C_NONE, 0, 4, 0 },
};
case ATST:
case APLD:
case AUNDEF:
+ case ACLZ:
break;
}
}
// func bitLen(x Word) (n int)
TEXT ·bitLen(SB),7,$0
MOVW x+0(FP), R0
- WORD $0xe16f0f10 // CLZ R0, R0 (count leading zeros)
+ CLZ R0, R0
MOVW $32, R1
SUB.S R0, R1
MOVW R1, n+4(FP)