l.add(movf, reg, regsize)
}
- // save/restore FCC0
+ // Add condition flag register fcc0-fcc7
+ sv := ""
+ rs := ""
+ last := 7
+ for i := 0; i <= last; i++ {
+ msb := 7 + (i * 8)
+ lsb := 0 + (i * 8)
+
+ // MOVV FCCx, R4,
+ // BSTRINSV $msb, R4, $lsb, R5
+ sv += fmt.Sprintf("%s FCC%d, R4\n", mov, i)
+ sv += fmt.Sprintf("BSTRINSV $%d, R4, $%d, R5\n", msb, lsb)
+
+ // BSTRPICKV $msb, R5, $lsb, R4
+ // MOVV R4, FCCx
+ rs += fmt.Sprintf("BSTRPICKV $%d, R5, $%d, R4\n", msb, lsb)
+ rs += fmt.Sprintf("%s R4, FCC%d", mov, i)
+ if i != last {
+ rs += fmt.Sprintf("\n")
+ }
+ }
l.addSpecial(
- mov+" FCC0, R4\n"+mov+" R4, %d(R3)",
- mov+" %d(R3), R4\n"+mov+" R4, FCC0",
+ sv+mov+" R5, %d(R3)",
+ mov+" %d(R3), R5\n"+rs,
regsize)
// allocate frame, save PC of interrupted instruction (in LR)
MOVD F30, 456(R3)
MOVD F31, 464(R3)
MOVV FCC0, R4
- MOVV R4, 472(R3)
+ BSTRINSV $7, R4, $0, R5
+ MOVV FCC1, R4
+ BSTRINSV $15, R4, $8, R5
+ MOVV FCC2, R4
+ BSTRINSV $23, R4, $16, R5
+ MOVV FCC3, R4
+ BSTRINSV $31, R4, $24, R5
+ MOVV FCC4, R4
+ BSTRINSV $39, R4, $32, R5
+ MOVV FCC5, R4
+ BSTRINSV $47, R4, $40, R5
+ MOVV FCC6, R4
+ BSTRINSV $55, R4, $48, R5
+ MOVV FCC7, R4
+ BSTRINSV $63, R4, $56, R5
+ MOVV R5, 472(R3)
CALL ·asyncPreempt2(SB)
- MOVV 472(R3), R4
+ MOVV 472(R3), R5
+ BSTRPICKV $7, R5, $0, R4
MOVV R4, FCC0
+ BSTRPICKV $15, R5, $8, R4
+ MOVV R4, FCC1
+ BSTRPICKV $23, R5, $16, R4
+ MOVV R4, FCC2
+ BSTRPICKV $31, R5, $24, R4
+ MOVV R4, FCC3
+ BSTRPICKV $39, R5, $32, R4
+ MOVV R4, FCC4
+ BSTRPICKV $47, R5, $40, R4
+ MOVV R4, FCC5
+ BSTRPICKV $55, R5, $48, R4
+ MOVV R4, FCC6
+ BSTRPICKV $63, R5, $56, R4
+ MOVV R4, FCC7
MOVD 464(R3), F31
MOVD 456(R3), F30
MOVD 448(R3), F29