[Vm-dev] VM Maker: Cog-eem.442.mcz
commits at source.squeak.org
commits at source.squeak.org
Fri Oct 1 21:38:43 UTC 2021
Eliot Miranda uploaded a new version of Cog to project VM Maker:
http://source.squeak.org/VMMaker/Cog-eem.442.mcz
==================== Summary ====================
Name: Cog-eem.442
Author: eem
Time: 1 October 2021, 2:38:40.891132 pm
UUID: 91994ee1-d997-4095-9167-2d1b2d6254a0
Ancestors: Cog-eem.441
Sionara fromIEEE64BitWord:; Kon'nichiwa fromIEEE64Bit:
=============== Diff against Cog-eem.441 ===============
Item was changed:
----- Method: GdbARMAlien>>handleBasicDoubleArithmetic:at: (in category 'floating-point emulation') -----
handleBasicDoubleArithmetic: instr at: pc
"Emulate a basic math - add/sub/mul/div - VFP instruction."
| rn rd rm vn vm |
rn := instr >> 16 bitAnd: 15.
rd := instr >> 12 bitAnd: 15.
rm := instr bitAnd: 15.
+ vn := Float fromIEEE64Bit: (self perform: (self registerStateGetters at: rn + 18)). "Assume accesses fp regs"
+ vm := Float fromIEEE64Bit: (self perform: (self registerStateGetters at: rm + 18)). "Assume accesses fp regs"
- vn := Float fromIEEE64BitWord: (self perform: (self registerStateGetters at: rn + 18)). "Assume accesses fp regs"
- vm := Float fromIEEE64BitWord: (self perform: (self registerStateGetters at: rm + 18)). "Assume accesses fp regs"
"simplest to match the entire instruction pattern rather than mess around shifting and masking and merging"
(instr bitAnd: 16rFF00FF0)
caseOf: {
[16rE200B00 "FMULD"] ->
[| r |
r := vn * vm.
self perform: (self registerStateSetters at: rd + 18) with: r asIEEE64BitWord].
[16rE300B00 "FADDD"] ->
[| r |
r := vn + vm.
self perform: (self registerStateSetters at: rd + 18) with: r asIEEE64BitWord].
[16rE300B40 "FSUBD"] ->
[| r |
r := vn - vm.
self perform: (self registerStateSetters at: rd + 18) with: r asIEEE64BitWord].
[16rE800B00"FDIVD"] ->
[| r |
r := vn / vm.
self perform: (self registerStateSetters at: rd + 18) with: r asIEEE64BitWord].}
otherwise: [self reportPrimitiveFailure].
self pc: pc + 4!
Item was changed:
----- Method: GdbARMAlien>>handleExtendedDoubleArithmetic:at: (in category 'floating-point emulation') -----
handleExtendedDoubleArithmetic: instr at: pc
"Emulate an extended math - cmp/sqrt/sitod - VFP instruction."
| rn rd rm vn vm vd |
rn := instr >> 16 bitAnd: 15.
rd := instr >> 12 bitAnd: 15.
rm := instr bitAnd: 15.
+ vn := Float fromIEEE64Bit: (self perform: (self registerStateGetters at: rn + 18)). "Assume accesses fp regs"
+ vm := Float fromIEEE64Bit: (self perform: (self registerStateGetters at: rm + 18)). "Assume accesses fp regs"
- vn := Float fromIEEE64BitWord: (self perform: (self registerStateGetters at: rn + 18)). "Assume accesses fp regs"
- vm := Float fromIEEE64BitWord: (self perform: (self registerStateGetters at: rm + 18)). "Assume accesses fp regs"
"simplest to match the entire instruction pattern rather than mess around shifting and masking and merging"
(instr bitAnd: 16rFF00FF0)
caseOf: {
[16rEB80B80 "FCMPD"] ->
["read rd, compare with rm (ignore rn) and set FPSCR NZCV flags. Sigh"
+ vd := Float fromIEEE64Bit: (self perform: (self registerStateGetters at: rd + 18)).
- vd := Float fromIEEE64BitWord: (self perform: (self registerStateGetters at: rd + 18)).
self break].
[16rEB80BC0 "FSITOD"] ->
[| r |
r := vm asFloat.
self perform: (self registerStateSetters at: rd + 18) with: r asIEEE64BitWord].
[16rEB10BC0 "FSQRTD"] ->
[| r |
r := vm sqrt.
self perform: (self registerStateSetters at: rd + 18) with: r asIEEE64BitWord].
}
otherwise: [self reportPrimitiveFailure].
self pc: pc + 4!
Item was changed:
----- Method: GdbARMAlien>>handleOneRegTransferDoubleArithmetic:at: (in category 'floating-point emulation') -----
handleOneRegTransferDoubleArithmetic: instr at: pc
"Emulate a one-register transfer VFP instruction."
| rn rd rm vn vm |
rn := instr >> 16 bitAnd: 15.
rd := instr >> 12 bitAnd: 15.
rm := instr bitAnd: 15.
+ vn := Float fromIEEE64Bit: (self perform: (self registerStateGetters at: rn + 18)). "Assume accesses fp regs"
+ vm := Float fromIEEE64Bit: (self perform: (self registerStateGetters at: rm + 18)). "Assume accesses fp regs"
- vn := Float fromIEEE64BitWord: (self perform: (self registerStateGetters at: rn + 18)). "Assume accesses fp regs"
- vm := Float fromIEEE64BitWord: (self perform: (self registerStateGetters at: rm + 18)). "Assume accesses fp regs"
(instr >> 18 bitAnd: 31)
caseOf: {
[8 "FMULD"] ->
[| r |
r := vn * vm.
self perform: (self registerStateSetters at: rd + 18) with: r asIEEE64BitWord].
[12"FADDD/FSUBD"] ->
[self shouldBeImplemented].
[32"FDIVD"] ->
[self shouldBeImplemented].
[45"FCMPD"] ->
[self shouldBeImplemented]. }
otherwise: [self reportPrimitiveFailure].
self pc: pc + 4!
More information about the Vm-dev
mailing list