ORRW $16252928, ZR, R21 // f5130d32
MOVD $-4260607558625, R11 // eb6b16b2
MOVD R30, R7 // e7031eaa
- // MOVKW $(3905<<0), R21 // MOVKW $3905, R21 // 35e88172
- // MOVKW $(3905<<16), R21 // MOVKW $255918080, R21 // 35e8a172
- // MOVK $(3905<<32), R21 // MOVK $16771847290880, R21 // 35e8c1f2
+ MOVKW $(3905<<0), R21 // MOVKW $3905, R21 // 35e88172
+ MOVKW $(3905<<16), R21 // MOVKW $255918080, R21 // 35e8a172
+ MOVK $(3905<<32), R21 // MOVK $16771847290880, R21 // 35e8c1f2
MOVD $0, R5 // 050080d2
// MRS $4567, R16 // f03a32d5
// MRS $32345, R6 // 26cb3fd5
o1 = c.opirr(p, p.As)
d := p.From.Offset
- if (d >> 16) != 0 {
- c.ctxt.Diag("requires uimm16\n%v", p)
+ s := movcon(d)
+ if s < 0 || s >= 4 {
+ c.ctxt.Diag("bad constant for MOVK: %#x\n%v", uint64(d), p)
}
- s := 0
- if p.From3Type() != obj.TYPE_NONE {
- if p.From3.Type != obj.TYPE_CONST {
- c.ctxt.Diag("missing bit position\n%v", p)
- }
- s = int(p.From3.Offset / 16)
- if (s*16&0xF) != 0 || s >= 4 || (o1&S64) == 0 && s >= 2 {
- c.ctxt.Diag("illegal bit position\n%v", p)
- }
+ if (o1&S64) == 0 && s >= 2 {
+ c.ctxt.Diag("illegal bit position\n%v", p)
+ }
+ if ((d >> uint(s*16)) >> 16) != 0 {
+ c.ctxt.Diag("requires uimm16\n%v",p)
}
-
rt := int(p.To.Reg)
- o1 |= uint32(((d & 0xFFFF) << 5) | int64((uint32(s)&3)<<21) | int64(rt&31))
+
+ o1 |= uint32((((d >> uint(s*16)) & 0xFFFF) << 5) | int64((uint32(s)&3)<<21) | int64(rt&31))
case 34: /* mov $lacon,R */
o1 = c.omovlit(AMOVD, p, &p.From, REGTMP)