mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2025-01-12 12:16:04 +08:00
e8a387fb5f
Operand sizes used for simulation of MSP430 hardware multiply operations are not aligned with the sizes used on the target, resulting in the simulator storing signed operands with too much precision. Additionally, simulation of unsigned multiplication is missing explicit casts to prevent any implicit sign extension. gcc.c-torture/execute/pr91450-1.c uses unsigned widening multiplication of 32-bit operands -4 and 2, to produce a 64-bit result: 0xffff fffc * 0x2 = 0x1 ffff fff8 If -4 is stored in 64-bit precision, then the multiplication is essentially signed and the result is -8 in 64-bit precision (0xffff ffff ffff fffc), which is not correct. sim/msp430/ChangeLog: * msp430-sim.c (put_op): For unsigned multiplication, explicitly cast operands to the unsigned type before multiplying. * msp430-sim.h (struct msp430_cpu_state): Fix types used to store hwmult operands. sim/testsuite/sim/msp430/ChangeLog: * mpyull_hwmult.s: New test.
50 lines
1.5 KiB
C
50 lines
1.5 KiB
C
/* Simulator for TI MSP430 and MSP430x processors.
|
|
|
|
Copyright (C) 2012-2020 Free Software Foundation, Inc.
|
|
Contributed by Red Hat, Inc.
|
|
|
|
This file is part of simulators.
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program. If not, see <http://www.gnu.org/licenses/>. */
|
|
|
|
#ifndef _MSP430_SIM_H_
|
|
#define _MSP430_SIM_H_
|
|
|
|
typedef enum { UNSIGN_32, SIGN_32, UNSIGN_MAC_32, SIGN_MAC_32 } hwmult_type;
|
|
typedef enum { UNSIGN_64, SIGN_64 } hw32mult_type;
|
|
|
|
struct msp430_cpu_state
|
|
{
|
|
int regs[16];
|
|
int cio_breakpoint;
|
|
int cio_buffer;
|
|
|
|
hwmult_type hwmult_type;
|
|
unsigned16 hwmult_op1;
|
|
unsigned16 hwmult_op2;
|
|
unsigned32 hwmult_result;
|
|
signed32 hwmult_signed_result;
|
|
unsigned32 hwmult_accumulator;
|
|
signed32 hwmult_signed_accumulator;
|
|
|
|
hw32mult_type hw32mult_type;
|
|
unsigned32 hw32mult_op1;
|
|
unsigned32 hw32mult_op2;
|
|
unsigned64 hw32mult_result;
|
|
};
|
|
|
|
#define HWMULT(SD, FIELD) MSP430_CPU (SD)->state.FIELD
|
|
|
|
#endif
|