fpop.isa (5788:6d4161a36ca1) fpop.isa (6345:f9ae7c3a036c)
1// Copyright (c) 2007 The Hewlett-Packard Development Company
2// All rights reserved.
3//
4// Redistribution and use of this software in source and binary forms,
5// with or without modification, are permitted provided that the
6// following conditions are met:
7//
8// The software must be used only for Non-Commercial Use which means any

--- 85 unchanged lines hidden (view full) ---

94 {
95 protected:
96 void buildMe();
97
98 public:
99 %(class_name)s(ExtMachInst _machInst,
100 const char * instMnem,
101 bool isMicro, bool isDelayed, bool isFirst, bool isLast,
1// Copyright (c) 2007 The Hewlett-Packard Development Company
2// All rights reserved.
3//
4// Redistribution and use of this software in source and binary forms,
5// with or without modification, are permitted provided that the
6// following conditions are met:
7//
8// The software must be used only for Non-Commercial Use which means any

--- 85 unchanged lines hidden (view full) ---

94 {
95 protected:
96 void buildMe();
97
98 public:
99 %(class_name)s(ExtMachInst _machInst,
100 const char * instMnem,
101 bool isMicro, bool isDelayed, bool isFirst, bool isLast,
102 RegIndex _src1, RegIndex _src2, RegIndex _dest,
102 InstRegIndex _src1, InstRegIndex _src2, InstRegIndex _dest,
103 uint8_t _dataSize, int8_t _spm);
104
105 %(class_name)s(ExtMachInst _machInst,
106 const char * instMnem,
103 uint8_t _dataSize, int8_t _spm);
104
105 %(class_name)s(ExtMachInst _machInst,
106 const char * instMnem,
107 RegIndex _src1, RegIndex _src2, RegIndex _dest,
107 InstRegIndex _src1, InstRegIndex _src2, InstRegIndex _dest,
108 uint8_t _dataSize, int8_t _spm);
109
110 %(BasicExecDeclare)s
111 };
112}};
113
114def template MicroFpOpConstructor {{
115
116 inline void %(class_name)s::buildMe()
117 {
118 %(constructor)s;
119 }
120
121 inline %(class_name)s::%(class_name)s(
122 ExtMachInst machInst, const char * instMnem,
108 uint8_t _dataSize, int8_t _spm);
109
110 %(BasicExecDeclare)s
111 };
112}};
113
114def template MicroFpOpConstructor {{
115
116 inline void %(class_name)s::buildMe()
117 {
118 %(constructor)s;
119 }
120
121 inline %(class_name)s::%(class_name)s(
122 ExtMachInst machInst, const char * instMnem,
123 RegIndex _src1, RegIndex _src2, RegIndex _dest,
123 InstRegIndex _src1, InstRegIndex _src2, InstRegIndex _dest,
124 uint8_t _dataSize, int8_t _spm) :
125 %(base_class)s(machInst, "%(mnemonic)s", instMnem,
126 false, false, false, false,
127 _src1, _src2, _dest, _dataSize, _spm,
128 %(op_class)s)
129 {
130 buildMe();
131 }
132
133 inline %(class_name)s::%(class_name)s(
134 ExtMachInst machInst, const char * instMnem,
135 bool isMicro, bool isDelayed, bool isFirst, bool isLast,
124 uint8_t _dataSize, int8_t _spm) :
125 %(base_class)s(machInst, "%(mnemonic)s", instMnem,
126 false, false, false, false,
127 _src1, _src2, _dest, _dataSize, _spm,
128 %(op_class)s)
129 {
130 buildMe();
131 }
132
133 inline %(class_name)s::%(class_name)s(
134 ExtMachInst machInst, const char * instMnem,
135 bool isMicro, bool isDelayed, bool isFirst, bool isLast,
136 RegIndex _src1, RegIndex _src2, RegIndex _dest,
136 InstRegIndex _src1, InstRegIndex _src2, InstRegIndex _dest,
137 uint8_t _dataSize, int8_t _spm) :
138 %(base_class)s(machInst, "%(mnemonic)s", instMnem,
139 isMicro, isDelayed, isFirst, isLast,
140 _src1, _src2, _dest, _dataSize, _spm,
141 %(op_class)s)
142 {
143 buildMe();
144 }

--- 106 unchanged lines hidden (view full) ---

251 "class_name" : self.className,
252 "flags" : self.microFlagsText(microFlags),
253 "src1" : self.src1, "src2" : self.src2,
254 "dest" : self.dest,
255 "dataSize" : self.dataSize,
256 "spm" : self.spm}
257
258 class Movfp(FpOp):
137 uint8_t _dataSize, int8_t _spm) :
138 %(base_class)s(machInst, "%(mnemonic)s", instMnem,
139 isMicro, isDelayed, isFirst, isLast,
140 _src1, _src2, _dest, _dataSize, _spm,
141 %(op_class)s)
142 {
143 buildMe();
144 }

--- 106 unchanged lines hidden (view full) ---

251 "class_name" : self.className,
252 "flags" : self.microFlagsText(microFlags),
253 "src1" : self.src1, "src2" : self.src2,
254 "dest" : self.dest,
255 "dataSize" : self.dataSize,
256 "spm" : self.spm}
257
258 class Movfp(FpOp):
259 def __init__(self, dest, src1, flags=0, spm=0, \
259 def __init__(self, dest, src1, spm=0, \
260 SetStatus=False, dataSize="env.dataSize"):
260 SetStatus=False, dataSize="env.dataSize"):
261 super(Movfp, self).__init__(dest, src1, flags, \
261 super(Movfp, self).__init__(dest, src1, "InstRegIndex(0)", \
262 spm, SetStatus, dataSize)
263 code = 'FpDestReg.uqw = FpSrcReg1.uqw;'
264 else_code = 'FpDestReg.uqw = FpDestReg.uqw;'
265 cond_check = "checkCondition(ccFlagBits, src2)"
266
267 class Xorfp(FpOp):
268 code = 'FpDestReg.uqw = FpSrcReg1.uqw ^ FpSrcReg2.uqw;'
269
270 class Sqrtfp(FpOp):
271 code = 'FpDestReg = sqrt(FpSrcReg2);'
272
273 # Conversion microops
274 class ConvOp(FpOp):
275 abstract = True
276 def __init__(self, dest, src1):
262 spm, SetStatus, dataSize)
263 code = 'FpDestReg.uqw = FpSrcReg1.uqw;'
264 else_code = 'FpDestReg.uqw = FpDestReg.uqw;'
265 cond_check = "checkCondition(ccFlagBits, src2)"
266
267 class Xorfp(FpOp):
268 code = 'FpDestReg.uqw = FpSrcReg1.uqw ^ FpSrcReg2.uqw;'
269
270 class Sqrtfp(FpOp):
271 code = 'FpDestReg = sqrt(FpSrcReg2);'
272
273 # Conversion microops
274 class ConvOp(FpOp):
275 abstract = True
276 def __init__(self, dest, src1):
277 super(ConvOp, self).__init__(dest, src1, "(int)FLOATREG_MICROFP0")
277 super(ConvOp, self).__init__(dest, src1, \
278 "InstRegIndex(FLOATREG_MICROFP0)")
278
279 # These probably shouldn't look at the ExtMachInst directly to figure
280 # out what size to use and should instead delegate that to the macroop's
281 # constructor. That would be more efficient, and it would make the
282 # microops a little more modular.
283 class cvtf_i2d(ConvOp):
284 code = '''
285 X86IntReg intReg = SSrcReg1;

--- 27 unchanged lines hidden (view full) ---

313 code = 'FpDestReg = FpSrcReg1 / FpSrcReg2;'
314
315 class subfp(FpOp):
316 code = 'FpDestReg = FpSrcReg1 - FpSrcReg2;'
317
318 class Compfp(FpOp):
319 def __init__(self, src1, src2, spm=0, setStatus=False, \
320 dataSize="env.dataSize"):
279
280 # These probably shouldn't look at the ExtMachInst directly to figure
281 # out what size to use and should instead delegate that to the macroop's
282 # constructor. That would be more efficient, and it would make the
283 # microops a little more modular.
284 class cvtf_i2d(ConvOp):
285 code = '''
286 X86IntReg intReg = SSrcReg1;

--- 27 unchanged lines hidden (view full) ---

314 code = 'FpDestReg = FpSrcReg1 / FpSrcReg2;'
315
316 class subfp(FpOp):
317 code = 'FpDestReg = FpSrcReg1 - FpSrcReg2;'
318
319 class Compfp(FpOp):
320 def __init__(self, src1, src2, spm=0, setStatus=False, \
321 dataSize="env.dataSize"):
321 super(Compfp, self).__init__("(int)FLOATREG_MICROFP0", \
322 super(Compfp, self).__init__("InstRegIndex(FLOATREG_MICROFP0)", \
322 src1, src2, spm, setStatus, dataSize)
323 # This class sets the condition codes in rflags according to the
324 # rules for comparing floating point.
325 code = '''
326 // ZF PF CF
327 // Unordered 1 1 1
328 // Greater than 0 0 0
329 // Less than 0 0 1

--- 12 unchanged lines hidden ---
323 src1, src2, spm, setStatus, dataSize)
324 # This class sets the condition codes in rflags according to the
325 # rules for comparing floating point.
326 code = '''
327 // ZF PF CF
328 // Unordered 1 1 1
329 // Greater than 0 0 0
330 // Less than 0 0 1

--- 12 unchanged lines hidden ---